DataVision is a heavily customized fork of the open-source TV Bro browser, rebuilt as an Android TV data-dashboard kiosk app. It displays any web page fullscreen on an Android TV for long-term unattended operation — ideal for data dashboards, monitoring walls and digital signage.
- Package name:
im.xcode.datavision - Version: 1.0.0
- Rendering engine: GeckoView (bundled, no system WebView required)
- Default dashboard URL: none (a first-launch wizard guides you through configuration)
- Fullscreen display of the configured dashboard page on launch; all browser UI is hidden (address bar, menus, tabs, virtual cursor menu)
- First launch without a configured URL opens Settings automatically
- On every subsequent launch the last visited page is restored
- Changing the dashboard URL in Settings forces the new URL to open on next launch (one-time, then "restore last page" behavior resumes)
- An on-screen hint is shown on first launch (long press MENU/BACK to exit)
- Automatic retries on load failure: 5s → 10s → 30s backoff, then every 30s (retries the current page URL)
- Instant reload of the current page when network connectivity returns
- Optional periodic auto-reload ("auto reload interval" in Settings, minutes, 0 = off)
- TV displays often report high density (e.g. 240dpi), which makes web viewports scale up.
DensityOneContextWrapperforces GeckoView's rendering density to 1.0 so the web viewport maps 1:1 to physical pixels (equivalent to Chrome at 100% zoom). The app's own UI keeps the native density.
- On launch the app checks
latest_version.jsonin this repository (release channel). When a new version is found, a changelog dialog is shown; the APK matching the device CPU architecture is downloaded and installed - Enabled by default for sideloaded installs; can be disabled in Settings → Version
- The dashboard host is automatically exempted from ad blocking so chart/data components are never broken
- TV Bro logo and quick-link shortcuts removed from the internal home page
- Chinese localization for all kiosk-related UI texts
- Screen kept awake while kiosk is active
| Action | How |
|---|---|
| Exit kiosk mode | Long press BACK or MENU on the remote (~1s) — Settings opens directly |
| Change dashboard URL | Exit kiosk → Settings → Kiosk mode URL → save → restart when prompted |
| Re-enter kiosk | Automatic on next app launch (no manual step) |
| Disable TV screensaver | Must be disabled in the TV system settings, or via ADB: adb shell settings put secure screensaver_enabled 0 (an app cannot block the system screensaver) |
Requirements: Android SDK + JDK (Gradle Wrapper downloads dependencies automatically).
# Release build + ABI splits (recommended)
.\gradlew.bat :app:assembleGenericGeckoIncludedRelease -PenableAbiSplits
# Sign with the local debug keystore (quick testing only)
powershell -ExecutionPolicy Bypass -File .\tools\sign_apks.ps1Artifacts are written to app\build\outputs\apk\genericGeckoIncluded\release\:
| File | Architecture | Size |
|---|---|---|
app-generic-geckoIncluded-arm64-v8a-release.apk |
arm64 (most TVs) | ~179 MB |
app-generic-geckoIncluded-armeabi-v7a-release.apk |
arm32 | ~143 MB |
app-generic-geckoIncluded-x86_64-release.apk |
x86_64 (emulators) | ~196 MB |
Notes:
- Without
-PenableAbiSplitsa universal APK (~495 MB) containing all ABIs is produced - The
geckoExcludedflavor (~3 MB) relies on the system WebView and does not support the DPI fix; it is generally not recommended - For real distribution use a release keystore (
KEYSTORE_PATHetc., seebuild.gradle.kts); updates require the same signing key
A GitHub Actions release pipeline is included (.github/workflows/release.yml):
- Configure
KEYSTORE_BASE64,KEYSTORE_PASSWORD,KEY_ALIAS,KEY_PASSWORDin Settings → Secrets - Actions → Release → Run workflow, enter the version (e.g.
1.1.0) - The pipeline builds, signs, creates the Release and uploads the APKs (file names end with
-arm64-v8a.apketc. so the updater can match the device architecture) - After releasing, update
latest_version.jsonin the repo root: pointlatestVersionCode/latestVersionNameat the new version, update download URLs and changelog, push to main - Installed devices pick up the new version on next launch and prompt to update
Important: versionCode in build.gradle.kts must be incremented accordingly, otherwise the update check will not trigger.
| File | Purpose |
|---|---|
app\common\...\Config.kt |
Kiosk settings (mode switch, dashboard URL, auto-reload interval) |
app\...\activity\main\MainActivity.kt |
Kiosk lifecycle, key-based exit, network recovery, launch restore |
app\gecko\...\GeckoWebEngine.kt |
Applies the density wrapper at GeckoView creation points |
app\gecko\...\DensityOneContextWrapper.kt |
DPI fix core (density=1.0 context wrapper) |
app\gecko\...\delegates\MyNavigationDelegate.kt |
Auto retry on load failure (exponential backoff) |
app\...\dialogs\settings\MainSettingsView.kt |
Kiosk settings UI |
app\src\main\assets\pages\home\index.html |
Internal home page (logo/quick links removed) |
app\src\main\res\values-zh\strings.xml |
Chinese localization of kiosk texts |
| Script | Purpose |
|---|---|
sign_apks.ps1 |
Batch-sign release APKs with the local debug keystore (auto-detects the SDK) |
list_apks.ps1 |
List build artifacts with sizes |
find_sdk.ps1 |
Locate the local Android SDK / build-tools |
verify_url_in_apk.ps1 |
Verify that a given string (e.g. a default dashboard URL) is baked into an APK |
This project is derived from the TV Bro sources. Per TV Bro's BSD-derived license: derived apps must not use the name "TV Bro", the original icon or the original application id, and must state the attribution in the UI. This app shows "Based on TV Bro sources" on its About page with a link to the original project.
- Original project: https://github.com/truefedex/tv-bro