- Jetpack
- Compose - Define your UI programmatically with composable functions that describe its shape and data dependencies.
- Hilt - Extend the functionality of Dagger Hilt to enable dependency injection.
- Lifecycle - Build lifecycle-aware components that can adjust behavior based on the current lifecycle state
- Room - Create, store, and manage persistent data backed by a SQLite database.
- ViewModel - Store and manage UI-related data in a lifecycle conscious.
- App Startup - initialize components at app startup.
- Clean Architecture (multi module)
- MVVM pattern
- Kotlin
- Coroutines
- Flows
- Serialization
- Type Safety Navigation
- Material Design 3
- Single Activity
- StaggeredVerticalGrid
- Gradle Version Catalog
- Retrofit2
- Coil-Compose
- Timber
- Haze
- SharedElement
- Kover
βββ app
βββ core
βΒ Β βββ common
βΒ Β βββ data
βΒ Β βββ database
βΒ Β βββ datastore
βΒ Β βββ designsystem
βΒ Β βββ domain
βΒ Β βββ model
βΒ Β βββ network
βββ feature
Β Β βββ bottombar
Β Β βββ detail
Β Β βββ favorite
Β Β βββ list
Β Β βββ main
Β Β βββ setting
The file structure is similar to Now in Android, but to follow Clean Architecture, the domain layer does not reference the data layer.
graph TD
A[Main NavHost] --> B[BottomBar]
A --> C[Detail]
B --> D[Bottom NavHost]
D --> E[List]
D --> F[Favorite]
D --> G[Setting]
Even though using nested NavHosts makes things more complex, this approach was chosen to achieve screen transition animations similar to those between Activities.
(One NavHost needs to manage how to hide the bottom navigation and apply animations during screen transitions.)