spirit 2978250086
CI / build (push) Waiting to run
CI / lint (push) Waiting to run
feat: Complete analytics admin UI panel
- Analytics toggle (enable/disable)
- Event count display
- Export JSON button (copies to clipboard)
- Export CSV button (copies to clipboard)
- Clear data button with confirmation dialog
- Persist analytics enabled state in DataStore
2026-02-03 23:06:21 +00:00

Android Kiosk Browser

A customizable locked-down browser for Android kiosk and digital signage deployments.

Features

Core (v1.0)

  • Fullscreen WebView — Immersive mode, no address bar or browser chrome
  • URL Whitelist — Only allow configured domains with proper boundary matching
  • Lock Task Mode — Disables home/back/recent buttons
  • Admin PIN Exit — PIN-protected escape from kiosk mode (triple-tap top-left)
  • Auto-launch on Boot — Starts automatically when device powers on
  • Idle Timeout — Returns to homepage after inactivity

Security (v1.1)

  • PIN Hashing 🔐 — PINs stored as salted SHA-256 hashes, not plain text
  • Whitelist Bypass Protection — Proper domain boundary checking

Remote Management (v1.1)

  • Remote Configuration 📡 — Fetch settings from a JSON endpoint (polls every 5 min)
  • Digital Signage Mode 🖼️ — Auto-rotate through multiple URLs at configurable intervals
  • Usage Analytics 📊 — Track page views, sessions, and admin access (local SQLite)

UX

  • Error Handling — Graceful network error pages with retry button
  • Loading Indicator — Progress bar during page loads

Tech Stack

  • Kotlin
  • Android WebView
  • Lock Task Mode (API 21+)
  • DataStore Preferences
  • Room Database (analytics)
  • Material Design 3

Requirements

  • Android 5.0+ (API 21)
  • For Lock Task Mode: Device Owner provisioning

Building

./gradlew assembleDebug

APK output: app/build/outputs/apk/debug/app-debug.apk

Device Setup

To enable Lock Task Mode (full kiosk lockdown):

adb shell dpm set-device-owner farm.hobbs.kioskbrowser/.KioskDeviceAdminReceiver

Admin Access

Triple-tap the top-left corner of the screen to access admin settings.

Default PIN: 1234 (change this after setup!)

Configuration

Local Settings (Admin Panel)

Section Settings
Basic Homepage URL, allowed domains, idle timeout
Remote Config Config URL, poll interval
Digital Signage Enable, URL list, rotation interval
Security Change admin PIN
Analytics View/export/clear usage data

Remote Configuration (JSON)

Host a JSON file at a URL and point the kiosk to it:

{
  "homepage": "https://example.com",
  "whitelist": "example.com,*.example.com",
  "idle_timeout": "300",
  "signage_urls": [
    "https://example.com/slide1",
    "https://example.com/slide2"
  ],
  "signage_interval": "30"
}

Testing

Run unit tests:

./gradlew test

See TESTING.md for the full QA checklist.

Documentation

Roadmap

  • MVP (whitelist, admin PIN, idle timeout)
  • PIN hashing (SHA-256)
  • Remote configuration
  • Digital signage mode
  • Usage analytics
  • Scheduled content (time-based configs)
  • Multiple device profiles
  • Fleet management dashboard
  • OTA updates
  • Custom branding

License

MIT License — hobbs.farm


Built by the hobbs.farm team: Pluto 🪐, Spirit 👻, Margaret 🌸

Project tracking: Vikunja | Code: Gitea

S
Description
Android Kiosk Browser - Customizable restricted browser for kiosk/digital signage use
Readme 96 KiB
Languages
Kotlin 94.9%
HTML 5.1%