Skip to content

Add TV app detail and Browse, and redesign the TV app - #239

Merged
MartinStyk merged 24 commits into
developfrom
feature/tv-app-detail
Oct 22, 2026
Merged

MartinStyk merged 24 commits into
developfrom
feature/tv-app-detail

Conversation

@MartinStyk

@MartinStyk MartinStyk commented Oct 22, 2026 •

Copy link
Copy Markdown
Owner

Summary

Follow-up to #238: the TV app now has the full app detail and Browse, plus a design pass across the whole TV app.

TV app detail (feature/app-detail/tv)

Everything the phone shows: a hub, then General info, Permissions, Components, Certificates, Device requirements, Native libraries, Split APKs, and the manifest.

  • Hub: a fixed profile column (icon, name, wrapped package name, badges, App info / Play Store) beside a 3-column grid of section cards, with "Worth knowing" below. Everything fits one screen; focus starts on the first card.
  • Cards show data as label–value lines: version / target API / size / updated, granted and requested permissions with a protection-level bar, component counts with the phone's icons, the signer with a compact fingerprint, and requirement counts.
  • Sections are list-detail: focusing a row explains it in a pane on the right, with the phone's icon, a status tag, and code boxes for identifiers and hashes. The pane scrolls with Up/Down when it overflows.
  • Exported activities and receivers start on OK, like the phone's launch action.
  • Screens sit on a soft glow in the app icon's color (AndroidX Palette, with grain so it doesn't band on dark screens).

TV Browse (feature/browse/tv)

  • Dimension cards with their most common values and option counts.
  • Searchable option cards; signing certificates switch between SHA-256, SHA-1, MD5, publisher, and country, and fingerprint cards name their publisher.
  • The apps in a bucket next to a panel explaining the permission, or the certificate's subject, issuer, validity, algorithm strength, and self-signing.

TV design pass

  • Type: TV sizes pinned about an eighth below TV Material, matching the Google TV home screen; components keep semantic roles.
  • App list: a fixed header (title, count, Search / Sort / Filters) over 16:9 app tiles tinted with each app's color, showing the sort value in a pill. Tiles grow with large system fonts. The same tile is used in search and Browse.
  • Consistency: one teal SectionHeader, one subtitle style, IconBadge icons on cards and rows, and quiet focus (thin border and lift, no glow).

Shared code moved to core

So both apps say the same thing and every string is translated once:

  • core:apps — insight and badges, component, certificate, requirement, split APK, native library, and install source text; isLaunchable.
  • core:app-permissions detail/ — permission item mapping and text.
  • core:app-index browse/ — dimensions, bucket lookup, labeler, summaries, options and matching, bucket detail (with subject, issuer, and validity).
  • core:design-system — transitions, permission/requirement icon maps, app accent color, focus helpers (Modifier.restorableFocus, MinimalFocusScroll), and TV components (AppCard, CodeBox, IconBadge, InfoCard, InfoListItem, ScrollablePanel, SectionHeader, SegmentedBar, Tag, AccentBackdrop).

New dependency: androidx.palette:palette-ktx 1.1.0 (approved).

Test plan

  • spotlessCheck detektDebug lintDebug and :app:assembleDebug :tv:assembleDebug; the PR's lint alerts (plurals, hardcoded path, modifier factory, Palette version) are fixed
  • /verify review (bug, convention, security) on the first two commits: no findings
  • TV emulator (Television 4K, API 36): hub and every section, starting a component, focus restore after back, Browse for permissions and signing certificates, app list sorting, search, filters, tiles at 1.3× and 1.5× font scale
  • Split APKs screen — no app on the emulator has splits
  • Phone app on a device after the shared-text and browse moves — the phone was disconnected
  • The TV app has no splash screen: Google TV draws no app splash, and a custom loading screen was tried and dropped

🤖 Generated with Claude Code

feature/app-detail/tv now shows everything the phone shows: a hub with
App info and Play Store, "Worth knowing", and a card per section, plus
General info, Permissions, Components, Certificates, Device requirements,
Native libraries, Split APKs, and the manifest.

- Sections are list-detail: focusing a row explains it in a pane on the
  right, which scrolls with Up/Down when its content overflows.
- The hub and sections sit on a glow taken from the app icon (AndroidX
  Palette, with grain so the gradient does not band on dark screens).
- Hub cards show data: version and API stats, a protection-level bar,
  component counts, and the signing fingerprint.
- Rows and panes use the phone's icons, a status tag, and code boxes for
  identifiers and hashes.
- Exported activities and receivers start on OK, like the phone's launch
  action.

Every explanation both apps show moves to core so it is written and
translated once: insight, badges, component, certificate, requirement,
split APK, native library, and install source text to core:apps, and
permission detail mapping and text to core:app-permissions. The launch
predicate moves to core:apps as isLaunchable.

core:design-system gains shared transitions, permission and requirement
icon maps, the app accent color, focus helpers, and TV components
(AppCard, CodeBox, InfoCard, InfoListItem, ScrollablePanel, SegmentedBar,
Stat, Tag, AccentBackdrop). The TV app card moves there from
feature/apps/tv.
feature/browse/tv replaces the Browse placeholder with the phone's three
levels:
- Dimension cards with their most common values and option counts.
- Searchable option cards; signing certificates switch between SHA-256,
  SHA-1, MD5, publisher, and country, and each fingerprint card names
  its publisher.
- The apps in one bucket as a grid, next to a panel that explains the
  permission's protection level or the certificate's subject, issuer,
  validity, algorithm strength, and self-signing.

The browse dimensions, bucket lookup, labeler, hub summaries, option
building and matching, and bucket detail move from feature/browse/phone
to core:app-index browse/, together with their strings in every locale,
so phone and TV agree. Certificate options and details now carry the
signer's subject, issuer, and validity.
Minimal focus scrolling only revealed the focused App info button, so after scrolling down the app name and icon stayed off screen. Focusing the action row now scrolls the hub to the top.
Titles, body, and labels were raised about 2sp above the TV Material defaults, which are already sized for viewing across a room, and screen titles used headline styles one or two steps too large. The scale now matches TV Material, screen titles use headlineSmall, the app detail name uses headlineLarge with a smaller icon, and list rows put the label above a smaller value.
The value used titleLarge, the largest text on the screen, and the explanation matched it in size. The value now uses titleMedium and the explanation bodyMedium, so the pane reads value first, explanation second.
Cards, list rows, the detail pane, and the Browse header show their icon in a tinted circle (IconBadge), replacing two private copies. Focused cards and rows glow in their accent color with a thinner border, and tags use the tonal container color instead of flat grey.
The glow distracted from the content. Cards keep a thin border with a faint, tighter glow; list rows drop the glow since their white focus fill already marks focus.
Focused cards now show only their thin accent border and slight lift.
The section cards move from a three-column grid to a horizontal Details row, and the insights to a Worth knowing row, so the hero header stays on screen while browsing the sections. The package name line drops to titleMedium.
The Components card now uses the phone's icon tiles with a count badge in a 2x2 grid, dimming kinds the app has none of. The component kind icons move to one shared file in the TV module.
TV text was still about a third larger than the system UI. The TV type scale is now TV Material times TV_TYPE_SCALE (0.875), so components keep semantic roles instead of each picking a smaller style. The hub hero icon, cards, and spacing shrink to match, and the Components card lists each kind with its count instead of phone-style tiles.
Replace the scaled helper with the resulting sizes so the type scale reads as plain values.
Stat values used headlineSmall, which made the General information and Permissions figures dominate their cards. They now use titleLarge.
Comment thread gradle/libs.versions.toml Fixed
The hub now shows the app's identity and actions in a fixed left column and all six sections in a three-column grid, so nothing is off screen and the full width is used. Cards stack their icon above the title and list facts as label-value lines; the Stat component is gone. The package name wraps at its dots, and the grid leaves room for a focused card's scale.
CodeBox gains a compact variant with small monospace text and tighter padding. The hub's certificate card uses it so the hash no longer outweighs the card title; detail panes keep the full size.
AppCard becomes a 16:9 tile tinted with the app's color, with the icon, an optional value pill, the name, and the package, so the list fits four columns and shows each app's sort value at a glance. The app list keeps its title, count, and Search, Sort, and Filters in a header that no longer scrolls away. WideCard is removed.
The tile's 16:9 shape is now a minimum height, so the name and package no longer clip at large font scales; at normal sizes tiles look the same.
One SectionHeader (teal titleMedium) replaces four different heading styles across Filters, the app list, the hub, and the detail lists. Screen subtitles use bodyMedium everywhere, and the Browse dimension cards use stacked headers so their titles fit one line.
Opening an app now lands on General information instead of the App info button; returning from a section still restores the last focused card.
- Make RestorableFocus a Modifier extension (Modifier.restorableFocus) instead of a factory method (ModifierFactoryExtensionFunction).
- Turn the required and optional feature counts into plurals (PluralsCandidate).
- Use a placeholder data directory in the general info preview (SdCardPath).
- Update androidx.palette to 1.1.0 (GradleDependency).

Also let the requirement count tags wrap and truncate long fact values instead of their labels, and drop an import left unused when the component icons moved.
Dangerous permissions no longer tint the whole card amber; the granted count and the bar's dangerous segment still show them in amber.
@MartinStyk MartinStyk changed the title Add TV app detail and Browse Add TV app detail and Browse, and redesign the TV app Oct 22, 2026
@MartinStyk
MartinStyk merged commit 7fc8d8b into develop Oct 22, 2026
6 of 7 checks passed
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.

2 participants