Перший native Android TV аплет для Universal Media Portal.
- читає
Universal App ManifestзBuildConfig.MANIFEST_URL; - має fallback на
app/src/main/assets/universal-showcase.manifest.json; - має імпортований fixture
app/src/main/assets/river-city-public-media.manifest.jsonзі складного demo project; - показує manifest-driven screens, tabs, branded hero, rails, live/app/search/subscription blocks і details screen;
- підтримує D-pad focus для TV-пульта;
- програє
mp4,hlsіdashчерез AndroidX Media3; - передає captions і DRM config у Media3 для direct playback, якщо manifest це описує;
- для
youtubeтаexternalвикористовує platform intent policy; - підтримує app-specific offline cache для direct
mp4,hls,dash; - має development auth/unlock gate для gated content і subscription blocks;
- має search query state для manifest-driven search screens;
- підтримує app shortcut policy через package/deep link/web fallback;
- зберігає локальну resume position для direct playback;
- відправляє opt-in playback telemetry, якщо manifest має
analytics.enabled=trueіeventEndpoint; - підтримує custom deep links
universalmedia://open?contentId=...іuniversalmedia://play?contentId=...; - має compact phone layout для USB smoke-тестів на фізичному телефоні;
- не читає CMS напряму і не зберігає secrets у manifest.
cd android-tv-applet
./gradlew test assembleDebugRelease readiness smoke:
./tools/validate-release-inputs.sh
./tools/prepare-hosting-package.sh local-smoke
./tools/validate-hosting-package.sh --allow-placeholder-assetlinks
./gradlew testDebugUnitTest assembleDebug bundleRelease \
-PAPP_LINK_HOST=apps.example.com \
-PMANIFEST_URL=https://apps.example.com/universal-media/android-tv/stable/manifest.json
./tools/validate-release-aab.shUse strict ./tools/validate-hosting-package.sh only after replacing assetlinks.json with the Play App Signing SHA-256 fingerprint.
Release AAB smoke artifact:
app/build/outputs/bundle/release/app-release.aab
GitHub Actions workflow template:
google-play-publication/templates/github-actions/android-ci.yml
Move it to .github/workflows/android-ci.yml only when the GitHub token has workflow scope.
У Android Studio відкрий папку:
D:\Project\Specification_Universal_Media_Portal\android-tv-applet
Після Gradle Sync можна запускати конфігурацію app на Android TV emulator, Google TV device або звичайному Android device для smoke-перевірки.
Для підключення до live publish endpoint:
./gradlew assembleDebug -PMANIFEST_URL="http://10.0.2.2:3000/api/app-manifest/current?project=demo-youtube-channel"На фізичному Android TV/телефоні заміни host на адресу dev-сервера в LAN, наприклад http://192.168.2.234:3000/....
Для перевірки конкретного bundled manifest:
./gradlew assembleDebug -PASSET_MANIFEST=river-city-public-media.manifest.jsonДля release-style build із HTTPS manifest і App Links host:
./gradlew assembleDebug \
-PMANIFEST_URL="https://apps.example.com/universal-media/android-tv/stable/manifest.json" \
-PAPP_LINK_HOST="apps.example.com"Default bundled manifest universal-showcase.manifest.json є "wide coverage" fixture: він покриває showcaseHub, liveNowGuide, appLauncher, searchKeyboardResults, bundleOffer, прямий playback, live stream, camera/WebRTC fallback, YouTube/external fallback і subscription/provider blocks.
- Acceptance criteria: docs/acceptance-criteria.md
- Runtime contract: docs/runtime-contract.md
- TV emulator setup: docs/tv-emulator-setup.md
- Physical Google TV device setup: docs/physical-google-tv-device-setup.md
- Architecture decision: ../docs/adr/0048-android-tv-applet-manifest-runtime.md
- Telemetry/resume decision: ../docs/adr/0049-android-tv-telemetry-and-resume-runtime.md
- Rich manifest fixture decision: ../docs/adr/0051-android-rich-manifest-fixture-and-screen-navigation.md
Telemetry is non-blocking. If eventEndpoint is missing or unavailable, playback continues.
adb shell am start -W -a android.intent.action.VIEW -d 'universalmedia://open?contentId=demo-hls' app.universalmedia.androidtv
adb shell am start -W -a android.intent.action.VIEW -d 'universalmedia://play?contentId=demo-hls' app.universalmedia.androidtvOn Windows from WSL, use the Windows SDK ADB when the phone is attached to Windows:
/mnt/c/Users/Main/AppData/Local/Android/Sdk/platform-tools/adb.exe shell am start -W -a android.intent.action.VIEW -d 'universalmedia://open?contentId=demo-hls' app.universalmedia.androidtv- DRM потребує production license server policy; secrets не кладуться в APK або public manifest.
- Google Play Billing purchase flow ще треба підключити до реальних Play Console products.
- Production OAuth provider ще не підключений; поточний auth/unlock gate є runtime enforcement hook для тестів.
- YouTube native SDK не доданий; поточна політика відкриває YouTube/external handler.
- Offline cache поки manual app-specific cache без quota/eviction scheduler.