Repository navigation
Add TV app detail and Browse, and redesign the TV app - #239
Merged
Merged
Conversation
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.
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.
TV Browse (
feature/browse/tv)TV design pass
SectionHeader, one subtitle style,IconBadgeicons 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-permissionsdetail/— permission item mapping and text.core:app-indexbrowse/— 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-ktx1.1.0 (approved).Test plan
spotlessCheck detektDebug lintDebugand:app:assembleDebug :tv:assembleDebug; the PR's lint alerts (plurals, hardcoded path, modifier factory, Palette version) are fixed/verifyreview (bug, convention, security) on the first two commits: no findings🤖 Generated with Claude Code