A growing collection of Android utility features, built with Jetpack Compose, Room, and MVVM architecture.
Each utility lives in its own self-contained feature module under feature/, sharing a common database, theme, and core UI components from core/.
| Feature | Description |
|---|---|
| Todo | Create, complete, and delete tasks with persistent local storage |
More utilities will be added here as the app grows.
The project follows MVVM + Repository pattern with a feature-based package structure.
app/src/main/java/web/athma/sadhane/
├── MainActivity.kt # Single Activity — bootstraps deps, hosts all screens
├── core/
│ ├── data/
│ │ └── database/
│ │ └── SadhaneDatabase.kt # Shared Room database (all feature entities registered here)
│ └── ui/
│ ├── theme/ # App-wide Material3 theme, colors, typography
│ └── components/ # Reusable UI: CoreViewModel, AppAlertDialog, DialogState
└── feature/
└── todoApp/
├── data/ # Todo entity, DAO, Repository
└── ui/ # TodoScreen, TodoViewModel, TodoViewModelFactory
UI (Composable) → ViewModel → Repository → DAO → Room Database
↑ |
└──────────── Flow ────────────┘
- Room handles persistence; DAOs return
Flow<T>for reactive updates. - Repository is the single source of truth — ViewModels never call DAOs directly.
- ViewModel holds UI state and exposes actions; it survives configuration changes.
- CoreViewModel is Activity-scoped and shared across all features for global UI (e.g. confirmation dialogs).
- Language: Kotlin
- UI: Jetpack Compose + Material Design 3
- Database: Room (SQLite) with KSP code generation
- Async: Kotlin Coroutines + Flow
- Architecture: MVVM + Repository pattern
- Min SDK: 24 | Target SDK: 34
- Clone the repository.
- Open in Android Studio Hedgehog (2023.1.1) or later.
- Let Gradle sync and download dependencies.
- Run on a device or emulator with API 24+.
No API keys or external services are required — all data is stored locally on the device.
- Create a new package under
feature/yourFeatureName/. - Add
data/with your Room entity, DAO, and Repository. - Register the entity in
SadhaneDatabaseand bump the databaseversion. - Add
ui/with your Screen composable, ViewModel, and ViewModelFactory. - Wire up dependencies in
MainActivityand add the screen to the content area. - Document public classes and functions with KDoc.