Repository navigation
Conversation
Introduce the Cinema player layout (PlayerLayout.CINEMA) behind an opt-in preference under Settings -> Appearance -> Player Layout, defaulting to GLASS_PILL. Cinema mode features borderless glyphs over dual directional scrim gradients, an edge-to-edge 3 dp seekbar pinned to the bottom of the screen with expanded touch targets, single-line title top-left, compact monospace timecode right-aligned above the seekbar, 2.5-second auto-hide timeout, and full RTL start/end mirroring while preserving per-region button arrangements from the Control Layout Editor. Verified - git diff --check clean - Unit tests added in PlayerLayoutTest - Local build skipped due to missing local Android SDK (relying on CI)
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Reviewer's GuideThis PR introduces a persisted, opt-in Cinema player layout alongside the unchanged Glass Pill default. The implementation branches the existing Compose player controls and seekbar at the layout boundary, adding scrims, RTL mirroring, Cinema-specific placement and auto-hide behavior, an edge-to-edge 3 dp seekbar with a 36 dp touch region, and compact tappable timecode while reusing existing control sets, seeking gestures, chapter rendering, and cache bands. Sequence diagram for Cinema player layout renderingsequenceDiagram
actor User
User->>Settings: Select PlayerLayout.CINEMA
Settings->>AppearancePreferences: playerLayout.set
PlayerControls->>AppearancePreferences: collectAsState
PlayerControls->>PlayerControls: Apply Cinema layout
PlayerControls->>SeekbarWithTimers: Render edge-to-edge seekbar
SeekbarWithTimers->>StandardSeekbar: Render 3 dp visual track
PlayerControls->>CompactTimecode: Render tappable timecode
PlayerControls->>PlayerControls: Use LocalLayoutDirection.current
PlayerControls->>PlayerControls: Hide controls after 2500 ms
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 064a74d92f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| val clickEvent = LocalPlayerButtonsClickEvent.current | ||
| val interactionSource = remember { MutableInteractionSource() } | ||
| val currentText = Utils.prettyTime(position.toInt(), false) | ||
| val totalText = Utils.prettyTime(duration.toInt(), isInverted) |
There was a problem hiding this comment.
Use the remaining duration in the Cinema timecode
When duration inversion is enabled, this formats the full duration as the inverted value, so the timecode shows the negative total runtime instead of the remaining time. The existing timer computes position - duration before formatting; use that value here as well.
Useful? React with 👍 / 👎.
| } | ||
| CompositionLocalProvider( | ||
| LocalLayoutDirection provides LayoutDirection.Ltr, | ||
| LocalLayoutDirection provides layoutDirection, |
There was a problem hiding this comment.
Keep navigation-bar insets physical when enabling RTL
On an RTL device with a side navigation-bar inset and “Show navigation bar with controls” enabled, the existing inset branches calculate physical left/right padding in LTR, then apply those values as start/end under this RTL provider. This swaps the inset sides, so controls and the seekbar can overlap the navigation bar or reserve space on the wrong edge; resolve the padding for the active layout direction.
AGENTS.md reference: AGENTS.md:L110-L115
Useful? React with 👍 / 👎.
…ontrols Fix three compile errors in Seekbar.kt and PlayerControlsPreferencesScreen.kt: - Pass slotModifier to trackContent to resolve RowScope.weight in row container - Hoist stringResource for layout labels outside non-composable labelOf lambda - Add missing spacing import in PlayerControlsPreferencesScreen Verified - git diff --check clean
Deploying mpvium with
|
| Latest commit: |
4b149bd
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://28172621.mpvium.pages.dev |
| Branch Preview URL: | https://feat-player-cinema-layout.mpvium.pages.dev |
Summary
PlayerLayout.CINEMA, defaultGLASS_PILL) selectable in Settings → Appearance → Player Layout.LocalLayoutDirectionin Cinema mode while preserving strict LTR locking in Glass Pill.topLeftControls,topRightControls,bottomLeftControls,bottomRightControls,portraitBottomControls) and the Control Layout Editor.Before / After
How measured
Unmeasured; structural player layout and UI styling behind an opt-in preference.
Verification
git diff --checkpassed cleanly.cinema_layout_design_proposal.md.PlayerLayoutTest.kt.res/values/strings.xmlandSearchablePreference.kt.CHANGELOG.mdupdated under Unreleased (Added)..opencode/skills/commit-messages/scripts/check-commit-msg.sh.ANDROID_HOMEunset); verified via GitHub Actions CI.Risks
None; opt-in preference defaulting to
GLASS_PILL(current layout unchanged).Summary by Sourcery
Add an opt-in Cinema player layout while preserving the existing Glass Pill experience and customizable controls.
New Features:
Enhancements:
Documentation:
Tests: