diff --git a/docs/TROUBLESHOOTING.md b/docs/TROUBLESHOOTING.md index 84a845644..43a29d312 100644 --- a/docs/TROUBLESHOOTING.md +++ b/docs/TROUBLESHOOTING.md @@ -48,6 +48,10 @@ Things that bit us or contributors, so they don't bite you. Commands use `tools/ no way back from the shell on a set with no Wireless debugging, and switching USB debugging off stops `adbd` too, so plan one sitting rather than two: switch debugging off at the end, replug the adapter, and confirm Ethernet before handing the TV back. The launcher never needs debugging. + A Chromecast with Google TV 4K (`sabrina`, `UTTC.250917.004`) kept its USB Ethernet adapter with + USB debugging on: `eth0` stayed listed, and Ethernet connected with debugging still on. It printed + `host_connected=false` while the adapter was present as `eth0`, so there `host_connected=false` was + no proof the adapter was gone ([its list](../examples/google-chromecast-gtv-4k/debloat.txt)). - **Close port 5555 when you're done**: plaintext, and a shell for anyone on the LAN when `ro.adb.secure=0`. Steps in the README FAQ. - **The TV sits on a separate VLAN or IoT network** and `tools/tv.py` times out although debugging is on: the router keeps the computer from reaching it. Add a temporary firewall rule from your diff --git a/docs/watch-next.md b/docs/watch-next.md index 0e7a66713..73fc0be59 100644 --- a/docs/watch-next.md +++ b/docs/watch-next.md @@ -13,6 +13,18 @@ and preview channels. They live in the TV provider, behind `TvContract.WatchNext when it passes one. Read the whole table and filter in code. - **Some apps publish nothing.** Rows exist only if the app writes them and marks them searchable, and some apps do neither, so query on the target TV before relying on an app. + Query from an app that holds `READ_TV_LISTINGS`, not from the shell: the shell lacks it, so + `content query --uri content://android.media.tv/watch_next_program` (or `channel`, + `preview_program`) prints `No result found.` and cannot tell whether any app publishes rows. +- **Seen on a Chromecast with Google TV 4K** (Google TV 14, `UTTC.250917.004`): a test build + holding `READ_TV_LISTINGS` and querying without a selection saw 6 channels and 51 preview + programs, all from YouTube and Spotify, and no Watch Next rows. Poster URIs were `https://` (one + Spotify poster aside, `android.resource://`), so a reader needs network access to show most of + them; `intent_uri` held `intent:` URIs. Plex (`com.plexapp.android` 2026.20.0, which requests + `WRITE_EPG_DATA`) had no channel, preview or Watch Next rows visible. Without + `ACCESS_ALL_EPG_DATA` a reader sees only its own rows plus rows marked `searchable`, so Plex rows + that are not searchable would be invisible too: the probe cannot tell "publishes nothing" from + "publishes only non-searchable rows". Source: `createSqlParams()` in `packages/providers/TvProvider/src/com/android/providers/tv/TvProvider.java` (AOSP) holds the `READ_TV_LISTINGS` and `searchable` logic; both permissions are defined in that diff --git a/examples/google-chromecast-gtv-4k/debloat.txt b/examples/google-chromecast-gtv-4k/debloat.txt index 3999cdfd8..11139a6cb 100644 --- a/examples/google-chromecast-gtv-4k/debloat.txt +++ b/examples/google-chromecast-gtv-4k/debloat.txt @@ -1,5 +1,6 @@ # Chromecast with Google TV 4K (2020, device sabrina, product sabrina_prod_stable), 2 GB RAM # Google TV 14 (SDK 34), build UTTC.250917.004 (14193937) +# Second unit: Canada, same build, one day of use (2026-10-22). Notes under "Second unit" below. # # Apply: TV_HOST= tools/disable.sh examples/google-chromecast-gtv-4k/debloat.txt # Undo: TV_HOST= tools/restore.sh examples/google-chromecast-gtv-4k/debloat.txt com.google.android.apps.tv.launcherx @@ -51,6 +52,40 @@ # settings put secure screensaver_components com.gathin.tvhome/.ClockDream # - Animation scales already ship at 0.5x on this build. # +# Second unit. The list's telemetry and preloaded-app groups were applied (the screensaver pair and +# setupwraith were kept), plus a few apps by choice; +# after a reboot the disabled list was unchanged. Private DNS validated, and YouTube and Plex loaded +# their profiles. Power and Ethernet came through one USB-C hub. +# - On Ethernet the Wireless debugging toggle flipped straight back off: unplug the cable, join Wi-Fi +# and pair as above. Wireless debugging also went off at every reboot (Wi-Fi drops during boot) and +# had to be switched on again by hand; the pairing was kept and the stock adb reconnected on its own. +# Port 5555 from `adb tcpip` lasted until the next reboot. +# - The hub stayed powered with USB debugging on: `ip link` still listed eth0 (NO-CARRIER only because +# the cable was out), while `dumpsys usb` printed host_connected=false and sys.usb.config was "none", +# so host_connected=false was no proof the hub was gone. With USB debugging still on, plugging the +# Ethernet cable back in brought the Chromecast up on Ethernet, and tools/adb-closed.py then reported +# 5555 refused (not checked whether that came from a restart or from Wireless debugging going off). +# - The remote ("Chromecast Remote", 18d1:9450; /odm/usr/keylayout/Vendor_18d1_Product_9450.kl is not +# readable from the shell) shows YouTube and Netflix as KEY_UNKNOWN in `getevent -lt`, with MSC_SCAN +# 000c0077 and 000c0078: the usages the Google TV Streamer list maps to BUTTON_3 (190) and +# BUTTON_4 (191). +# - Home by redirect: launcherx and setupwraith left enabled for casting, stock_home_redirect set to +# com.google.android.apps.tv.launcherx, HomeKeyService enabled by hand. launcher/build-and-install.sh +# with STOCK_LAUNCHER=none installs, then stops at its Home check, as expected while launcherx is +# Home. Home pressed in an app landed on the new launcher. After a reboot the TV stayed on the Google +# TV home: it is drawn before Android binds HomeKeyService, so no window change reaches the redirect +# (#698 and #1024 work on this). +# - With the redirect on, the YouTube button did nothing although launcherx was enabled. The redirect +# opens the launcher with ACTION_MAIN + CATEGORY_HOME, so this is consistent with #698's explanation +# (this launcher becomes the Home process and launcherx loses its Android 14 exemption for background +# activity starts, BAL_BLOCK), but no BAL_BLOCK line was captured in logcat. app_keys +# "190:com.google.android.youtube.tv" and "191:" in a theme, handled by HomeKeyService, +# worked with both buttons on the real remote. (Seen on a build with a local boot check added to +# HomeKeyService; the redirect's intent was main's.) +# - Holding Volume Up on the real remote still ramped with HomeKeyService filtering keys (key_filter at +# its default) and Button Mapper's accessibility service enabled as well. Not checked with +# HomeKeyService alone. +# # Kept on purpose: Google Assistant (com.google.android.katniss), Cast receiver # (com.google.android.apps.mediashell), phone remote (com.google.android.tv.remote.service), Play Store / # Play Services, Gboard, Bluetooth, com.google.android.tv.dfuservice (remote firmware updates).