Akvo is a native Android water reminder. It helps users set a daily hydration goal, turn it into a balanced routine, log water intake, review history, and receive actionable reminders.
The project focuses on a calm, functional Material Design 3 experience backed by a small, explicit, and testable architecture.
- Material Design 3 UI built entirely with Jetpack Compose
- Guided onboarding that generates a balanced hydration plan from a goal and routine window
- Quick water logging, progress tracking, and daily history with entry deletion
- Local notifications with Drank and Snooze actions
- Reminder restoration after device restart and app update
- Runtime notification-permission handling for Android 13+
- Persistent settings with DataStore and hydration history with Room
- Light and dark theme support, plus Compose previews for key states
- Kotlin
- Jetpack Compose and Material 3
- AndroidX Lifecycle and ViewModel
- Kotlin Coroutines and Flow
- Room with schema export and migration tests
- DataStore Preferences
- AlarmManager, BroadcastReceiver, and NotificationCompat
- KSP for Room code generation
- JUnit 4, kotlinx-coroutines-test, Room Testing, Espresso, and Compose UI Testing
The app uses a deliberately small, dependency-injected layered architecture. Dependencies are assembled manually in AppContainer, keeping setup transparent without adding a DI framework for a single-module app.
Compose UI / ViewModels
|
Application use cases
|
Domain models, ports, and services
|
Android adapters: Room, DataStore, AlarmManager, notifications
Key design choices:
- Domain-first contracts: repositories, clock, time zone, reminder scheduler, and notification-permission checker are interfaces owned by the domain.
- Explicit side effects: scheduling and notification concerns live in Android adapters, outside UI and business rules.
- Testability: time, IDs, persistence, scheduling, and permissions can be replaced with fakes in tests.
- Safe reminder reconciliation: settings changes replace or cancel schedules consistently; scheduling failures leave reminders disabled and retry cleanup.
- Coroutine correctness: cancellation is never presented to the user as an operation failure.
app/src/main/java/com/probablyworks/Akvo/
├── domain/ # Models, repository contracts, and business services
├── application/ # Use cases and reminder coordination
├── data/ # Room, DataStore, alarms, notifications, and receivers
├── ui/ # Compose screens, ViewModels, state, and design system
└── di/ # Manual application container
- Android Studio
- JDK 11 or newer
- Android SDK with API 37 installed
- Android 13 (API 33) or newer device/emulator
- Clone the repository and open it in Android Studio.
- Let Gradle sync the project.
- Select a device or emulator running Android 13+.
- Run the
appconfiguration.
From the command line:
./gradlew installDebugRun local unit tests:
./gradlew testRun Android Lint:
./gradlew lintDebugRun instrumented tests on a connected device/emulator:
./gradlew connectedDebugAndroidTestAkvo is a portfolio project and does not provide medical guidance. Daily goals are user-defined; the app only distributes that goal across the selected routine.