Skip to content

feat(mms): add video recording, compression, and MMS send pipeline#5

Open
Paul75 wants to merge 12 commits into
Azyrn:mainfrom
Paul75:main
Open

feat(mms): add video recording, compression, and MMS send pipeline#5
Paul75 wants to merge 12 commits into
Azyrn:mainfrom
Paul75:main

Conversation

@Paul75

@Paul75 Paul75 commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Add end-to-end video message support:

  • CameraX overlay with SD recording (480p), 30s limit, auto-stop
  • Buffer-to-buffer transcode pipeline at 48kbps (~340KB from 1.3MB)
  • MMS send via content provider with FileProvider cache for local display
  • ExoPlayer-based video dialog with custom controls, progress bar, replay
  • Video thumbnails with play icon in inbox thread list
  • Camera button UX: tap opens attachment menu, long press starts recording
  • Recording countdown progress bar (green→yellow→red)
  • Settings: add 700KB option to MMS image size list

Paul BOREL added 12 commits July 10, 2026 13:39
Add end-to-end video message support:
- CameraX overlay with SD recording (480p), 30s limit, auto-stop
- Buffer-to-buffer transcode pipeline at 48kbps (~340KB from 1.3MB)
- MMS send via content provider with FileProvider cache for local display
- ExoPlayer-based video dialog with custom controls, progress bar, replay
- Video thumbnails with play icon in inbox thread list
- Camera button UX: tap opens attachment menu, long press starts recording
- Recording countdown progress bar (green→yellow→red)
- Settings: add 700KB option to MMS image size list
…to video recording overlay

- Ready phase: camera preview before recording starts, user can flip
  camera and adjust zoom before committing to record
- Tap play button to start recording (vs instant start before)
- Flip camera button: toggles front/back, rebinds camera
- Pause/resume recording with accurate timer (tracks paused duration)
- Zoom slider (vertical, left side) with zoom ratio label
- 30s auto-stop timer respects paused time
- Shows '1x' pill button next to flip camera when minZoomRatio < 1.0
- Tap toggles between 1.0x (normal) and minZoomRatio (ultra-wide)
- Button background: semi-transparent when normal, opaque white when active
- Also logs zoom range on camera bind for debugging
…oomState

- Reduces logcat spam from hundreds of zoom range logs per second
- Only logs and updates min/max zoom when values actually change
…o overlay

- Enumerate all Camera2 IDs with facing and focal length
- Find ultra-wide by back-facing + focal < 3.0mm
- Build custom CameraSelector targeting the ultra-wide ID
- Toggle between normal (DEFAULT_BACK_CAMERA) and ultra-wide via CameraSelector
- Logs all camera IDs on bind for debugging
…tigation

Logs all capture request/result/session keys per camera, filtered
for zte/mediatek/mtk namespace. Debug-only, will be removed.
… only

Controls (close, play/pause, progress bar) no longer dismiss the dialog
when tapped. Only tapping the video area itself closes it.
MediaExtractor.selectTrack() is exclusive — selecting the audio track
deselects the video track, causing the decoder to receive zero input.
The entire transcode pipeline was non-functional and silently returned
the original uncompressed video.

Fix: use two separate MediaExtractor instances — one for video decoding,
one for audio passthrough. Also buffer early audio samples until the
muxer starts so no audio data is lost at the beginning of the file.

Bug found via code review before device testing.
The .clickable modifier on AndroidView intercepted all touch events
including the seek bar, making it impossible to navigate the video.
Removed so touches pass through to PlayerView. Users dismiss via
close button (X) or back gesture.
The seek bar was a read-only LinearProgressIndicator that could not
be dragged. Replaced with a Slider that seeks on release via
onValueChangeFinished. Added isSeeking flag to prevent the polling
LaunchedEffect from overwriting the position during drag.
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