MagicWatch
An Android companion for daily Islamic practice — prayer times, an always-on clock, and a Persian calendar

An Android app for the things you do every day, built so that they work without a network connection.
What it is
Prayer times, an alarm that plays the azan, Quran audio, and a clock that stays visible on the lock screen. The parts that matter to me most are the least flashy: prayer times are computed on the device from your coordinates, so they are correct in the mountains, and the calendar is my own Jalali implementation, because the system’s own date handling does not do what an Iranian user expects.
What it does
- Prayer times computed locally — not fetched from an API that may be down, or slow, or wrong. Several calculation methods, and the result is cached so it works offline.
- Azan playback through Media3, with the reciters I actually use, and the volume behaviour that an azan needs rather than the behaviour a music player has.
- Quran audio streaming, per surah, with a reciter of your choice.
- An always-on lock-screen clock with double-tap to wake and pixel-shift burn-in protection, because a clock that damages your screen is worse than no clock.
- A floating clock that sits above other apps.
- A daily task list with scheduled reminders, and a weather panel.
- A Persian calendar written from scratch — conversion, month and weekday names, and it drives every date in the app.
The numbers
| 62 | Kotlin files |
| 3 | layers kept separate: data, domain, presentation |
| 4 | prayer-time calculation methods supported |
Why it’s worth a look
Clean Architecture is a described pattern, and seeing it hold up in a real app is more informative than the diagram. Here it earned its place for a specific reason: prayer-time calculation has several methods, and the calculation logic is genuinely independent of whether the result came from a database, a cache, or an API. Keeping that behind an interface meant I could change the storage without touching the logic.
The always-on display is the other part worth reading. Burn-in protection on a lock screen is not a feature, it is a requirement, and the correct solution — moving the clock’s position slightly every minute — is easy to skip and very visible when it is missing.
Current state
- Azan audio files are bundled, which is why the app is large.
- There are no instrumented or UI tests. The layers are separated, which is a prerequisite for testing them, but the tests are not written.

