Skip to content

App bootstrap: TV manifest, StoganetApp, ServiceLocator skeleton#2

Merged
koinsaari merged 1 commit into
mainfrom
feat/app-bootstrap
May 31, 2026
Merged

App bootstrap: TV manifest, StoganetApp, ServiceLocator skeleton#2
koinsaari merged 1 commit into
mainfrom
feat/app-bootstrap

Conversation

@koinsaari
Copy link
Copy Markdown
Contributor

@koinsaari koinsaari commented May 31, 2026

Summary

  • Lock Android TV manifest essentials before feature work: leanback required, networking permissions, allowBackup=false (encrypted token blob must not leave the device), splash theme, LEANBACK_LAUNCHER intent.
  • Add StoganetApp (Application class) that plants Timber on debug and owns a ServiceLocator — the manual DI container that subsequent PRs will populate with TokenStore, AuthInterceptor, repositories, etc.
  • Slim the theme to dark-only TV Material; delete the wizard-generated Color.kt / Type.kt.
  • Expand strings.xml with every user-visible string the MVP screens will need.
  • Add backup_rules.xml + data_extraction_rules.xml so neither cloud backup nor device-to-device transfer can exfiltrate the (later) Tink-encrypted token store.

Test plan

  • ./gradlew :app:assembleDebug — passes
  • ./gradlew detekt — clean
  • ./gradlew :app:installDebug on the Android TV emulator → app launches, system splash visible briefly, then "Stoganet TV" centered on black. App appears in the leanback launcher.

@claude
Copy link
Copy Markdown

claude Bot commented May 31, 2026

Claude finished @koinsaari's task in 1m 48s —— View job


PR Review: App bootstrap: TV manifest, StoganetApp, ServiceLocator skeleton

  • Gather context (REVIEW.md, CLAUDE.md, changed files)
  • Analyze all changed files
  • Post review findings
  • Set commit status (skipped — token lacks statuses:write)

Findings

🔴 Important — Hardcoded user-visible string in MainActivity.kt

Bootstrap() in app/src/main/java/com/stoganet/tv/MainActivity.kt (line ~35) passes a raw string literal directly to Text:

Text("Stoganet TV")

REVIEW.md lists this as "always Important if violated": every user-visible string must live in res/values/strings.xml. The string resource app_name already exists (currently "Stoganet"); either use that or add a dedicated string (e.g. bootstrap_label).

Fix this →


🟡 Nit — app_name / placeholder text mismatch

strings.xml changed app_name to "Stoganet", but the placeholder still reads "Stoganet TV". Once the hardcoded string is replaced with stringResource(R.string.app_name) both will align. Low priority since Bootstrap() is a temporary scaffold.


Everything else looks good

Area Verdict
allowBackup=false ✅ Correctly prevents the encrypted token blob from leaving the device
backup_rules.xml / data_extraction_rules.xml ✅ Empty full-backup + root-domain exclusion blocks all backup vectors
leanback required="true", LEANBACK_LAUNCHER ✅ Manifest invariants from CLAUDE.md preserved
INTERNET + ACCESS_NETWORK_STATE permissions ✅ Required before the network stack is wired up
StoganetApp — Timber debug-only ✅ No log output in release
installSplashScreen() before super.onCreate() ✅ Correct order per the SplashScreen API contract
ServiceLocator stores applicationContext ✅ Avoids Activity context memory leak
Dark-only MaterialTheme ✅ Appropriate for Android TV; no light-mode leakage
No telemetry / analytics
No AuthInterceptor / TokenStore / UiState in this PR ✅ N/A

One 🔴 Important finding (hardcoded string); blocking until fixed.

…leton

Lock manifest essentials before feature work: leanback required, networking
permissions, allowBackup=false (token blob never leaves device), splash theme,
LEANBACK_LAUNCHER intent. StoganetApp owns a ServiceLocator and plants Timber
on debug. Theme slimmed to dark-only; wizard color/typography deleted. Strings
expanded for all MVP screens.
@koinsaari koinsaari force-pushed the feat/app-bootstrap branch from 24e2c9a to d1dc322 Compare May 31, 2026 17:03
@claude
Copy link
Copy Markdown

claude Bot commented May 31, 2026

Claude finished @koinsaari's task in 1m 10s —— View job


PR Review: App bootstrap: TV manifest, StoganetApp, ServiceLocator skeleton

  • Gather context (REVIEW.md, CLAUDE.md)
  • Read changed files and current branch state
  • Analyze findings
  • Post review
  • Set commit status

No blocking issues.

The 🔴 Important finding from the previous review pass has been resolved: Text("Stoganet TV")Text(stringResource(R.string.app_name)), and strings.xml now defines app_name as "Stoganet TV" — both the nit and the Important are cleared.

Full findings

Area Verdict
Hardcoded string in Bootstrap() ✅ Fixed — now stringResource(R.string.app_name)
app_name / placeholder mismatch ✅ Resolved — strings.xml reads "Stoganet TV"
allowBackup=false ✅ Prevents encrypted token blob from leaving the device
backup_rules.xml / data_extraction_rules.xml ✅ Full-backup excluded; root domain excluded from cloud backup and device-transfer
leanback required="true", LEANBACK_LAUNCHER ✅ Manifest invariants from CLAUDE.md preserved
INTERNET + ACCESS_NETWORK_STATE ✅ Required before the network stack is wired up
StoganetApp — Timber debug-only ✅ No log output in release builds
installSplashScreen() before super.onCreate() ✅ Correct order per SplashScreen API contract
ServiceLocator uses context.applicationContext ✅ Avoids Activity context memory leak
Dark-only MaterialTheme ✅ Appropriate for Android TV; no light-mode leakage
No telemetry / analytics
No AuthInterceptor / TokenStore / UiState ✅ N/A for this PR

Ready to merge. ✅

@koinsaari koinsaari merged commit 6e543ea into main May 31, 2026
5 checks passed
@koinsaari koinsaari deleted the feat/app-bootstrap branch May 31, 2026 17:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant