All projects

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.

A TV showing the MinarOS prayer-times dashboard with the current time, a countdown to the next adhan and a table of salah times

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

  • Boot screen with the MinarOS logo and a notice that the system boot has completed and the display is starting
    Auto-start on boot
  • Welcome screen asking for a Mosque ID, with a Save Display button
    One-time setup with a Mosque ID
  • Prayer-times dashboard showing the clock, Hijri date, countdown to Dhuhr adhan and adhan and iqamah times for each salah
    Live prayer-times display
  • Settings screen with the Mosque ID field and a display orientation option
    Settings and orientation
  • About screen describing MinarOS as an operating system for mosques
    About