Client project · Android TV
MinarOS Screen
Android TV kiosk app that turns a mosque's screen into a live prayer-times display. It starts on boot, works offline and is fully controllable with a TV remote.

Overview
MinarOS Screen is an Android TV app that runs MinarOS’s prayer-times dashboard on TV screens inside mosques. It shows the current time, the Hijri date, a countdown to the next adhan and the full adhan and iqamah timetable. I built it as a freelance project for MinarOS, a UK mosque-management platform, and it is in use at mosques today.
My role
I was the freelance Android developer on the project and built the TV app for the client, who provides the web dashboard it displays.
Problem
MinarOS, a UK mosque-management platform, needed its prayer-times dashboard to run on TV screens inside mosques. The screens had to run unattended all day, come back on their own after power cuts or network drops, and be set up with nothing but a TV remote.
Approach & architecture
- Jetpack Compose + Compose for TV for the native screens: splash, welcome (Mosque ID entry), settings and about.
- A three-state flow in the main activity (splash → welcome → display) with animated transitions.
- Android lock-task mode pins the TV to the app so it runs in kiosk mode.
- A fullscreen, persistent WebView loads each mosque’s dashboard, with a JavaScript bridge for offline support.
- A thin data layer on SharedPreferences stores the Mosque ID, orientation and cached data.
- Package-by-feature structure in a single module, keeping each screen self-contained.
Key features
- Kiosk mode (Android lock-task) with a fullscreen dashboard for each mosque
- Offline-first caching of dashboard data
- Auto-start when the TV powers on
- Full TV remote / D-pad navigation
- Landscape, portrait and reverse-portrait orientation
- Always-on display
- Automatic reload when the network comes back
- Side drawer with refresh, settings, about and exit
Challenges & learnings
Offline caching through a JavaScript bridge. Mosque Wi-Fi isn’t always reliable, but the screen should never go blank. I added a @JavascriptInterface bridge that intercepts the dashboard’s fetch() and XMLHttpRequest responses and caches them natively, then serves the cached JSON whenever the TV is offline.
Designing for a TV remote. There’s no touchscreen, so every screen has to work with a D-pad. I used focus-aware composables, FocusRequester to put focus in the right place automatically, and custom scroll handling so the remote moves through content predictably.
Running unattended. The display has to recover without anyone touching it. A BroadcastReceiver launches the app as soon as the TV boots, a keep-screen-on flag stops it from sleeping, and a ConnectivityManager network callback reloads the dashboard automatically when the connection returns.
Screens mounted in different ways. Some mosques mount their TVs sideways. The app supports landscape, portrait and reverse-portrait modes, and remembers the choice for each device.
Screenshots

Auto-start on boot 
One-time setup with a Mosque ID 
Live prayer-times display 
Settings and orientation 
About