---
title: TV Onboarding & Prerequisites Guide
status: active
owner: Likith Teja G
created: 2026-07-17
last_updated: 2026-07-17
audience: field installer / hotel IT
purpose: The single "start here" doc to put TripGZio on a hotel-room TV — from vetting the device, through taking ownership, to post-install hardening and recovery. Distributed publicly on apps.tripgzio.com.
---

# TripGZio TV — Onboarding & Prerequisites Guide

> **TL;DR:** One walkthrough to put TripGZio on a room TV: **vet the device → make it factory-fresh → UPDATE the WebView first → install the APK → take device-ownership → set density → pair → SET A PER-DEVICE PIN → verify → know your recovery**. Read Step 0 before you touch anything — the two things that waste a whole install are an old WebView (black screen) and a captive-portal Wi-Fi (a locked TV can't clear a login page). Recovery is the [Break-Glass Runbook](BREAK-GLASS-RUNBOOK.md) — keep it saved offline.

---

## The 3 deployment methods (pick per room)

| Method | Lockdown | Needs | Use when |
|---|---|---|---|
| **1. Full kiosk** (recommended) | Device-owner + lock-task; our app is Home, stock launcher disabled, guest can only leave via the PIN escape | Factory-fresh TV (no accounts) | Real in-room guest kiosk |
| **2. Curated / OTT-allowlisted** | Device-owner; lock-task allowlist includes Netflix/YouTube — guest roams a curated set, always returns to our Home | Factory-fresh TV | Guests want OTT + you still want control (this is how the field build behaves today) |
| **3. App-only** | None — just installed alongside everything | Any TV you can sideload to | Pilots, BYO HDMI sticks, TVs you can't factory-reset |

Methods 1 & 2 are the same install; the difference is the lock-task allowlist. Method 3 skips ownership entirely.

---

## Step 0 — Prerequisites & device vetting (do this FIRST)

**Minimum specs** (full table on the portal):
- **Android 11+** (genuine), **WebView/Chrome engine 111+**, **security patch 2023+**, **2 GB RAM** (3–4 GB for 4K OTT), **≥5 Mbps/TV** (15–25 for 4K), outbound **443** to `*.tripgzio.com`.
- On anything older the app shows **only the logo on a black screen** — the app is fine, the rendering engine is too old.

**Vet unknown boxes (5 checks):** reject no-name "Android 14 / 8GB+128GB" boxes (I96, X96, T95, H96, MXQ) — they spoof the version string. The tell is the **security patch date** (an old date like "Mar 2019" = counterfeit regardless of the version shown). See [Device Compatibility & Vetting](tv-device-compatibility.md).

**Recommended fleet strategy:** put one genuine modern Android stick (Xiaomi Mi TV Stick 4K, Fire TV Stick, Chromecast/Google TV) behind every TV via HDMI — one device type, one install, predictable engine.

**Two traps that waste an install — fix before ownership:**
1. **WebView update is a chicken-and-egg.** A locked kiosk disables the Play Store, so you **must update Android System WebView (Play Store → search "Android System WebView" → Update) BEFORE** you take ownership. Skip this and the guest UI is a black screen you can't fix without un-owning.
2. **Captive-portal Wi-Fi** (hotel networks with a web login page) — a locked WebView can't clear a portal. Put TVs on a **portal-free VLAN or MAC-allowlisted SSID**, or use Ethernet. This is the #1 real-world field blocker.

---

## Step 1 — Make the TV factory-fresh

Device-ownership can **only** be set on a TV with **no Google/other accounts** and no existing device owner — otherwise `dpm set-device-owner` refuses.

- New TV: usually already account-free after first-boot (skip sign-in).
- Used TV: **factory reset** (Settings → System → Reset), then during setup **skip all account sign-in**. Remove any leftover accounts in Settings → Accounts.

---

## Step 2 — Enable ADB

On the TV: Settings → System → About → click **Build** 7× to unlock Developer options → Developer options → enable **USB debugging** and **Wireless debugging** (note the IP:port). Then from your PC:

```bash
adb connect <TV_IP>:5555      # accept the on-TV "Allow debugging?" prompt
adb devices                   # should list the TV as "device"
```

---

## Step 3–5 — Install, take ownership, set density (one script)

The provisioning script does install + ownership + disable stock launcher + set Home + density in one shot:

```powershell
.\setup-kiosk-tv.ps1 -TvIp "<TV_IP>" -ApkPath "..\dist\tripgzio-webapp-v1.8.0-release.apk"
```

Or download the latest APK from **apps.tripgzio.com** and run it manually:

```bash
adb install -r tripgzio-webapp.apk
adb shell dpm set-device-owner com.tripgzio.webapp/com.gigglezen.tvlauncher.KioskDeviceAdminReceiver
adb shell cmd package set-home-activity com.tripgzio.webapp/com.gigglezen.tvlauncher.MainActivity
adb shell wm density 160          # un-zoom the WebView on 720p/1080p panels (skip on native-4K windows)
```

**Updating an already-owned TV later** is in-place and preserves ownership (same signing cert): `adb install -r tripgzio-webapp.apk`. Rolling back is a version downgrade → `adb install -r -d <older>.apk`.

---

## Step 6 — Pair the TV to a room

The TV shows a pairing screen. On the staff **Dashboard → Devices**, generate the 6-digit code for the room and enter it on the TV (D-pad). The TV then loads that room's guest experience.

---

## Step 7 — POST-INSTALL hardening (do NOT skip)

1. **🔴 Set a per-device admin PIN.** Every TV ships on the default `000000`, and the staff-escape combo + default PIN are public knowledge. Set a unique PIN at **Dashboard → Devices → (key icon)** on **every** TV before it faces guests. Without this, anyone who knows the escape can reach settings.
2. **Set the room Wi-Fi config** (Dashboard → Branding) so the in-room Wi-Fi card + QR render.
3. **Confirm branding** (hotel logo/name, not TripGZio) shows on the activation/standby screens.

**Staff escape (how to reach settings on a locked TV):** D-pad **UP DOWN UP DOWN OK UP DOWN** within 5s → enter the admin PIN → menu (Open WiFi/Settings · Reload · **Advanced** · Cancel). The risky actions (Full Settings, Remove Device Owner) are under **Advanced** behind a second PIN. There is **no MENU-key combo**.

---

## Step 8 — Verification checklist (before the TV leaves your hands)

- [ ] `adb shell dpm list-owners` shows our receiver (ownership took).
- [ ] Guest can't reach the stock launcher (Home/Back stay in TripGZio).
- [ ] An OTT app (Netflix/YouTube) launches **and returns to our Home** on exit.
- [ ] **Escape L1 works**: the D-pad combo + PIN opens the staff menu (test it now, not in the field).
- [ ] **Safe-mode L2**: if the web ever dies it drops to the recovery screen (don't force it, just know it exists).
- [ ] **Reboot** the TV → it comes back **locked** into TripGZio.
- [ ] Per-device PIN set (Step 7.1).

---

## Recovery — if a TV gets stuck

Full ladder in the [Break-Glass Runbook](BREAK-GLASS-RUNBOOK.md) (save it offline before deploying). Short version:
- **L1** D-pad escape combo + PIN → WiFi/Settings/Advanced.
- **L2** auto safe-mode (crash-loop drops to a recovery screen).
- **L3** `adb shell am force-stop com.tripgzio.webapp`.
- **L4** retire/un-own: in-app **Advanced → Remove Device Owner** (PIN-gated, red confirm) — the trusted un-own that avoids FRP.
- **L5** physical factory reset (last resort; can trip Factory Reset Protection — read the runbook first).

> Note: factory reset from Settings is **blocked** while our app is device-owner ("Action not allowed") — un-own via L4 first, then reset.

---

## Recommendations

- **One device type per fleet** (a genuine HDMI Android stick) — predictable engine, one install path.
- **Ethernet for fixed installs**; a **portal-free SSID/VLAN** for Wi-Fi.
- **Update WebView before ownership** on every unit.
- **Set the per-device PIN** at provisioning time, always.
- **At scale (>~20 TVs):** manual `adb install -r` per TV becomes the bottleneck — an OTA self-updater / MDM (Android Enterprise) is the path; not built yet.

---

**Related:** [Break-Glass Runbook](BREAK-GLASS-RUNBOOK.md) · [Device Compatibility](tv-device-compatibility.md) · [RUNGUIDE (field-ops excerpt)](RUNGUIDE.md) · provisioning script `setup-kiosk-tv.ps1`
