This is a modern Alarm clock Android Native application called ⏰ Snoozeloo. The development of this app was motivated and was part of the Mobile Dev Campus Monthly Challenge (from Philipp Lackner) for November of 2024.
- Creation and Edit of multiple One-time alarm entries.
- Killing the app does not stop alarm triggering.
- Rebooting the Android device does not stop alarm triggering.
- Bedtime recommendations for optimal sleep
- Dark mode supported.
- Android Native
- 100% Kotlin
- 100% Jetpack Compose
- Kotlin Coroutines and Flows
- Broadcast Receivers
- Boot Broadcast Receivers
- AlarmManager: precise scheduling for Alarm tasks
- Push Notifications
- Dynamic Permissions handling: POST_NOTIFICATIONS and USE_FULL_SCREEN_INTENT
- Unit tests applied to TimeHelper
- Single module architecture
- Single Activity architecture
- MVVM presentation pattern with UI States when editing an Alarm
- MVI unidirectional data flow from Actions to State
- Sealed interfaces for Actions and Destinations files
- Dependency Injection applied with Koin
- Dependency Inversion Principle (DIP) from data to presentation layers
- Single Source of Truth in a Room database
- Reactive Navigation (Flow listening)
- Dark mode supported
- Jetpack Compose No-type Args navigation
- Jetpack Compose Deep Linking navigation
- Bespoke TimeCard (copied from Material3 TimePicker's source)
- Delete Alarm entry with a side swipe from RTL
- 12H and 24H support
- SavedStateHandle persistence for the Alarm editing
- Room DB (on KSP)
| Splash | Alarm List | Existing Alarm Editing |
|---|---|---|
![]() |
![]() |
![]() |
| New Alarm Editing | Alarm Time Setting | Alarm Ringing |
|---|---|---|
![]() |
![]() |
![]() |
This project is structured in a single module divided by the following 5 packages:
common/
data/
di/
domain/
ui/
- Java 17+
- The latest Android Studio Ladybug or above (for easy install use JetBrains Toolbox)
- Minimum SDK: 28 (Android 9)
- Target SDK: 35 (Android 15)
- Kotlin 2.0.21
Run ./gradlew build
Check LICENSE from the project.
Check CONTRIBUTING.md from the project.





