Skip to content

Redesign check video page as a side-by-side comparison - #51

Merged
LukeNeedham merged 6 commits into
mainfrom
claude/check-video-page-redesign-bjx3g8
Sep 17, 2026
Merged

LukeNeedham merged 6 commits into
mainfrom
claude/check-video-page-redesign-bjx3g8

Conversation

@LukeNeedham

Copy link
Copy Markdown
Owner

Summary

Redesigns the check video page (shown after recording a new video for a day that already has one) so the user can compare both videos before deciding what to keep, instead of only reviewing the new recording:

  • Both the existing and newly recorded video play side by side, each labelled "EXISTING" / "NEW" above it.
  • A prompt reads "Tap the video you want to keep" — tapping either video keeps it and discards the other.
  • Retake button discards the new video and returns to the record screen.
  • Close button keeps the existing video and discards the new one.
  • Each video has its own mute/unmute button, so the two can be listened to independently.
  • Pressing and holding either video pauses both, so they can be compared on a still frame; releasing resumes both.

Implementation notes

  • VideosDao gains discardMediaStoreVideo(uri) to delete a freshly recorded (and not kept) video from MediaStore.
  • CheckVideoViewModel now exposes both existingVideo and newVideo, with keepNewVideo() / discardNewVideo() replacing the old single acceptVideo().
  • Simultaneous playback of two videos needed a second ExoPlayer instance, since the app normally shares a single player app-wide. VideoPlayerExo's playback/sync logic was factored into a shared internal composable, reused by a new VideoPlayerExoStandalone (backed by a dedicated, per-composable player via rememberStandaloneExoPlayer). VideoPlayer gained a usesDedicatedPlayer flag to opt into this; all existing call sites are unaffected (default false).
  • New CheckVideoTile component (ui/feature/record/check/component/) renders one video's label + player + tap/press gestures.

Test plan

  • ./gradlew :app:compileDebugKotlin
  • ./gradlew :app:assembleDebug
  • Manual verification on device/emulator: record a video for a day that already has one, confirm both videos play side by side, muting/unmuting each independently, press-and-hold pausing both, retake discarding the new recording, close keeping the existing video, and tapping either video keeping that one.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LYC2q5uA9JHmk6TNaeZe9X


Generated by Claude Code

Show the newly recorded video next to the existing one for that day so the
user can pick which to keep, instead of only reviewing the new recording.
Tapping either video keeps it and discards the other; retake discards the
new video and returns to recording; close keeps the existing video. Each
video has its own mute toggle and both pause together on press-and-hold.

Side-by-side simultaneous playback needed a second ExoPlayer instance
alongside the app's single shared player, so VideoPlayerExo's playback/sync
logic is factored out and reused by a new dedicated-player variant.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LYC2q5uA9JHmk6TNaeZe9X
@github-actions

github-actions Bot commented Sep 16, 2026 •

Copy link
Copy Markdown

App apk at:
https://github.com/LukeNeedham/VideoDiary/releases/download/claude-check-video-page-redesign-bjx3g8-157-1/app-debug.apk

  • Triggered by: PR Commit 4a06b4397265f297285e06b46a472b7089329add
  • Built at: 17/09/2026 15:18:58

Playing two videos side by side needs two dedicated ExoPlayer instances,
on top of the single app-wide shared player still holding the calendar's
last video - three concurrent decoders was enough to exhaust the default
256MB heap on some devices. Stop the shared player while this page is
active; it's fully reconfigured when the calendar is next shown anyway.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LYC2q5uA9JHmk6TNaeZe9X
…pages

The video comparison row was sized to its actual (half-height, since two
videos share the width) content instead of the standard aspect-ratio-driven
slot, so the remaining space handed to the bottom bar was much larger than
on every other video page. Render the two videos inside VideoToolbarLayout
like every other screen, centered in that same fixed-height slot, so the
bottom bar - and its buttons - are back to the usual size.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LYC2q5uA9JHmk6TNaeZe9X
… big retake

Replace tap-to-select and the labels above each video with a dedicated
"CHOOSE" button under each one naming it (EXISTING/NEW); selecting a video
is now only ever this explicit action. Mute becomes a plain flat icon
(matching the record page's bottom bar) directly under each video, and
unmuting one video forcibly mutes the other, since only one should be
audible at a time. Retake is now a full-width prominent button instead of
a small icon.

Also remove the close icon button: backing out of the page now keeps the
existing video (the same outcome the close button gave) and returns
straight to the calendar, rather than the default back behaviour of
returning to the record page.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LYC2q5uA9JHmk6TNaeZe9X
Reusing VideoToolbarLayout reserved the same fixed video-slot height as a
single full-width video, leaving only that page's usual slim bottom bar
allowance - nowhere near enough room for a mute icon, two-line choose
button and big retake button per side, so most of it was clipped or
invisible on device. Size the video row to its actual (half-height, since
two videos share the width) content instead, and hand the freed-up space
to the controls below.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LYC2q5uA9JHmk6TNaeZe9X
Tighten the gap between each video and its mute button (they now sit
right underneath), while keeping a deliberate 30dp gap before the choose
button below it. Give the top prompt more breathing room from the status
bar and the videos below it. Lowercase and shrink the "Choose" caption so
"EXISTING"/"NEW" reads as the primary label, and make the choose/retake
buttons more prominent with a stronger glass fill; the retake button also
gains its icon, via a new optional icon slot on GlassButton.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LYC2q5uA9JHmk6TNaeZe9X
@LukeNeedham
LukeNeedham merged commit 385ec1b into main Sep 17, 2026
1 check 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