๐ Real Estate App with MVVM Clean Architecture RxJava3+Coroutines Flow, Static Code Analysis, Dagger Hilt, Dynamic Features
About
Sample project that build with MVVM clean architecture and various cool techs including RxJava3 and Coroutines Flow, Dynamic Feature modules as base of BottomNavigationView or ViewPager2, with both OfflineFirst and OfflineLast approaches as database Single Source of Truth Merge Adapter, ViewBinders for setting inner RecyclerViews, RecycledViewPools, SavedStateHandle, and more.
Unit tests are written with JUnit4, JUnit5, MockK, Truth, MockWebServer. Data(including for both RxJava and Coroutines tests for Room and Retrofit), Domain, and ViewModel tests in Home module are written with Test Driven Development.
Flow | RxJava3 | Pagination |
---|---|---|
Dashboard | Notification | Account |
---|---|---|
๐ค Overview
- Gradle Kotlin DSL is used for setting up gradle files with
buildSrc
folder and extensions. - KtLint, Detekt, and Git Hooks is used for checking, and formatting code and validating code before commits.
- Dagger Hilt, Dynamic Feature Modules with Navigation Components, ViewModel, Retrofit, Room, RxJava, Coroutines libraries and dependencies are set up.
features
andlibraries
folders are used to include android libraries and dynamic feature modules- In core module dagger hilt dependencies and
@EntryPoint
is created - Data module uses Retrofit and Room to provide Local and Remote data sources
- Room database has many-to-many and one-to many relation with Junction/Association table.
- Repository provides offline and remote sources and mappers, local save, delete and fetch functions
- Domain module uses useCase classes to implement business logic to fetch and forward data
- ViewModel uses LiveData with data-binding to display LOADING, and ERROR or SUCCESS states.
- Home dynamic feature module has a ViewPager2 that hosts property lists
- Dashboard module contains list with different type of layouts using ViewBinder classes, and Recommendations based on users history and ConcatAdapter to merge different type of Adapters.
Built With ๐
Some of the popular libraries and MVVM clean architecture used with offline-first and offline-last with Room database and Retrofit as data source
-
Kotlin - First class and official programming language for Android development.
-
Coroutines - Threads on steroids for Kotlin
-
Flow - A cold asynchronous data stream that sequentially emits values and completes normally or with an exception.
-
RxJava3 - Newest version of famous reactive programming library for Java, and other languages
-
Android JetPack - Collection of libraries that help you design robust, testable, and maintainable apps.
- LiveData - Data objects that notify views when the underlying database changes.
- ViewModel - Stores UI-related data that isn't destroyed on UI changes.
- DataBinding - Generates a binding class for each XML layout file present in that module and allows you to more easily write code that interacts with views.
- Navigation Components Navigate fragments as never easier before
- Dynamic Feature Modules Dynamic modules for adding or removing based on preference
- SavedStateHandle A handle to saved state passed down to androidx.lifecycle.ViewModel. You should use SavedStateViewModelFactory if you want to receive this object in ViewModel's constructor.
- Room Persistence library provides an abstraction layer over SQLite to allow for more robust database access while harnessing the full power of SQLite.
-
Material Components for Android - Modular and customizable Material Design UI components for Android.
-
- Hilt-Dagger - Standard library to incorporate Dagger dependency injection into an Android application.
- Hilt-ViewModel - DI for injecting
ViewModel
.
-
Retrofit - A type-safe HTTP client for Android and Java.
-
Glide - Image loading library.
-
ConcatAdapter RecyclerView adapter which enables you to sequentially combine multiple adapters to be displayed in a single RecyclerView.
-
Lottie - Animation library from AirBnB
-
MpChart - โก๏ธ MPAndroidChart is a powerful & easy to use chart library for Android โก๏ธ
-
Chucker - OkHttp interceptor providing a UI for inspecting and sharing their content.
-
Architecture
- Clean Architecture
- MVVM + MVI
- Offline first/last with Room an Retrofit
- Dynamic feature modules
-
Tests
- Unit Tests (JUnit5) (JUnit4)
- MockWebServer Mock server for testing Api requests with OkHttp and Retrofit
- Mockk Mockking library for Kotlin
- Truth Assertion library
- FlowTestObserver RxJava style test observer for testing Flow
- LiveDataTestObserve RxJava style test observer for LiveData
-
Gradle
- Gradle Kotlin DSL
- Custom tasks
- Plugins (Ktlint, Detekt, SafeArgs), Git Hooks
Modularaization, Library and Feature Modules
Uses both library modules and dynamic feature modules
Architecture
Uses concepts of clean architecture