Shared refactoring for Media3 integration#5147
Shared refactoring for Media3 integration#5147sztomek merged 5 commits intomedia3/05-legacy-servicefrom
Conversation
Generated by 🚫 Danger |
There was a problem hiding this comment.
Pull request overview
Prep work to support wiring a Media3 MediaSession into the app by refactoring shared playback components and aligning callback / player behavior with Media3 controller expectations (while defaulting MEDIA3_SESSION to off).
Changes:
- Default
MEDIA3_SESSIONfeature flag tofalseand refactor playback plumbing to be reusable across legacy + Media3 paths. - Add Media3-focused behavior updates: forwarding player metadata handling/interception, callback resolution of podcast/episode metadata, and Cast state guarding.
- Tighten/adjust automotive browse tree + converters and update/expand unit tests around the new behavior.
Reviewed changes
Copilot reviewed 18 out of 18 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| modules/services/utils/src/main/java/au/com/shiftyjelly/pocketcasts/utils/featureflag/Feature.kt | Defaults Media3 session feature flag to off. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/SleepTimerHandler.kt | New shared sleep-timer handler extracted for reuse. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/LegacyPlaybackService.kt | Delegates sleep timer to handler and adds onTaskRemoved behavior. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/MediaSessionActions.kt | Adds suspend variants for MediaSession-driven actions and refactors search-play path. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/MediaEventQueue.kt | Changes to accept a scope provider instead of a direct scope. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/MediaSessionManager.kt | Updates queue construction to match MediaEventQueue API change. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/Media3SessionCallback.kt | Adds episode/podcast resolution for media items, adds command helpers, refines media-button behavior. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/Media3LibrarySessionCallback.kt | Enriches playback resumption with metadata and artwork; sets automotive connected flag. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/PocketCastsForwardingPlayer.kt | Switches artwork to ByteArray, avoids double-invoked transport callbacks, intercepts Media3 controller playlist calls, adds clearMetadata(). |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/CastStatePlayer.kt | Adds “has received update” guard to avoid non-sensical initial state. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/BrowseTreeProvider.kt | Tightens visibility and removes Up Next from root browse tree; makes playlist helpers visible for testing. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/auto/MediaItemCompatConverter.kt | Uses artist instead of subtitle for compat subtitle mapping. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/PocketCastsForwardingPlayerTest.kt | Updates/expands tests for transport callback precedence and Media3 interception behavior. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/MediaEventQueueTest.kt | Updates tests for new MediaEventQueue(scopeProvider=...) API. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/Media3SessionCallbackTest.kt | Expands tests for suspend action routing, rating support, media item resolution, and media-button handling. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/Media3LibrarySessionCallbackTest.kt | Expands resumption tests to assert metadata/artwork and automotive flag behavior. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/CastStatePlayerTest.kt | Updates expectations for new initial idle state behavior. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/auto/MediaItemCompatConverterTest.kt | Updates test to reflect artist usage. |
You can also share your feedback on Copilot code review. Take the survey.
7992866 to
08ef9b3
Compare
1777fc2 to
c2754bf
Compare
|
Version |
da8949c to
bc1dd94
Compare
c2754bf to
830ac23
Compare
There was a problem hiding this comment.
Pull request overview
Refactors shared playback/service components as prep work for wiring Media3 sessions into the app, with the MEDIA3_SESSION feature flag now defaulting to false.
Changes:
- Default
Feature.MEDIA3_SESSIONtofalseand adjust playback/Media3-related plumbing accordingly. - Extract shared
SleepTimerHandlerand simplifyLegacyPlaybackServiceby delegating sleep-timer behavior (plus addonTaskRemovedhandling). - Update Media3 session callbacks / forwarding player behavior and expand/adjust unit tests for the new interception + metadata resolution paths.
Reviewed changes
Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| modules/services/utils/src/main/java/au/com/shiftyjelly/pocketcasts/utils/featureflag/Feature.kt | Defaults MEDIA3_SESSION to false. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/SleepTimerHandler.kt | New shared sleep timer handler extracted from service logic. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/LegacyPlaybackService.kt | Delegates sleep timer behavior to handler; adds onTaskRemoved; small refactors. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/PocketCastsForwardingPlayer.kt | Fixes transport callback precedence; intercepts Media3 controller protocol methods; adds metadata clearing. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/MediaSessionManager.kt | Updates MediaEventQueue construction to use a scope provider. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/MediaSessionActions.kt | Adds suspend variants and reworks search/play logic to support Media3 callbacks. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/MediaEventQueue.kt | Switches to scopeProvider for queue timing jobs. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/Media3SessionCallback.kt | Adds episode/podcast resolution for media items; refactors command handling; updates media button behavior. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/Media3LibrarySessionCallback.kt | Enriches playback resumption metadata and adds automotive connected flag side-effect. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/CastStatePlayer.kt | Adds “hasReceivedUpdate” guard to avoid non-idle state before first cast update. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/BrowseTreeProvider.kt | Tightens visibility; removes Up Next from root; tweaks listening history handling; exposes internals for testing. |
| modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/playback/auto/MediaItemCompatConverter.kt | Uses artist instead of subtitle for compat subtitle mapping. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/PocketCastsForwardingPlayerTest.kt | Updates/extends tests for callback precedence and Media3 interception paths. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/MediaEventQueueTest.kt | Updates tests for scopeProvider API. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/Media3SessionCallbackTest.kt | Updates tests for suspend action routing, media button handling, and resolved media items. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/Media3LibrarySessionCallbackTest.kt | Updates tests for metadata-enriched resumption + automotive flag behavior. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/CastStatePlayerTest.kt | Updates tests for idle-before-first-update behavior. |
| modules/services/repositories/src/test/java/au/com/shiftyjelly/pocketcasts/repositories/playback/auto/MediaItemCompatConverterTest.kt | Updates test to expect artist mapping. |
bc1dd94 to
3327e0e
Compare
830ac23 to
c99a9d6
Compare
3327e0e to
09906b3
Compare
c99a9d6 to
c227601
Compare
c227601 to
938eaf4
Compare
a03231c to
b3edfd8
Compare
- Store Flow job in SleepTimerHandler.observe() and cancel in dispose() - Add onError handler to RxJava Observable.interval subscription - Return empty list instead of null from LegacyPlaybackService.onSearch Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The eventHorizonValue property doesn't exist on SourceView yet at this point in the branch stack. Use the existing analyticsValue property. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Split dispose() into cancelTimer() and dispose() so stopping the timer doesn't kill the state Flow observer - Cancel existing observeJob before starting a new one to prevent leaks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract shared resolveArtworkUri and buildEpisodeMediaItem helpers - Remove duplicated code between Media3SessionCallback and Media3LibrarySessionCallback - Add blank URL protection in resolveArtworkUri
938eaf4 to
52001a3
Compare
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Description
Prep work for wiring the Media3 session into the app. This refactors shared playback components so the next PR can plug them in cleanly, with no behavior change when the MEDIA3_SESSION flag is off (now defaulting to false).
Key changes: extract SleepTimerHandler for reuse across legacy and Media3 services, add suspend variants to MediaSessionActions, switch PocketCastsForwardingPlayer from Bitmap to ByteArray artwork and fix double-invoked transport callbacks, add a hasReceivedUpdate guard to CastStatePlayer, and enrich Media3SessionCallback/Media3LibrarySessionCallback with podcast/episode resolution for media item and playback resumption. LegacyPlaybackService is simplified by delegating sleep timer logic to the new handler and gains an onTaskRemoved override. BrowseTreeProvider visibility is tightened to internal and Up Next is removed from the root browse tree.
Testing Instructions
Just review the code pls
Checklist
./gradlew spotlessApplyto automatically apply formatting/linting)modules/services/localization/src/main/res/values/strings.xml