When browsing a season, show a 'Seasons' row listing the other seasons
of the same series and a 'Series' row linking back to the parent series,
so users can navigate to sibling seasons or the show from within a season.
* refactor: extract HEVC and AV1 codec modules
Follows up on #5604 by extracting the HEVC and AV1 codec detection logic
out of MediaCodecCapabilitiesTest into their own modules. After this
change MediaCodecCapabilitiesTest is a thin delegation facade with no
logic of its own.
SDK version branching uses the shared AndroidVersion helper (#5672) so
the checks read clearly at the call site and can be mocked in tests via
AndroidVersion.sdkInt, rather than a codec-local DeviceSdk wrapper. The
same helper replaces the remaining raw SDK_INT check in MediaCodecQuery.
* fix: use media3 MimeTypes constants to avoid InlinedApi lint
MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION requires API 24 but min SDK is
23. Hoisting it into a const val tripped the InlinedApi lint check.
Switch to the media3 library MimeTypes constants (plain strings, no API
gate), matching how Av1CodecCapabilities already references them.
- Extract codec query logic into MediaCodecQuery concrete class (no interface
since there's only one implementation)
- Extract AVC level mapping into AvcCodecCapabilities module with unit tests
- Remove unused context parameter from MediaCodecCapabilitiesTest
- Remove obsolete SDK_INT < M check (min SDK is now 23)
- Fix detekt nesting issues by extracting helper methods and using Sequence
Reduces API response payload for home screen rows by excluding heavy
fields (MediaSources, MediaStreams, Chapters, Trickplay) that aren't
needed for display. Full item data is fetched when user selects an item.
Benchmark: Cold start to home screen fully loaded (Nvidia Shield)
- Baseline: ~5200ms
- With this change: ~3800ms
- Improvement: 27% faster
Measurement methodology: Time from MainActivity START to last
'Creating items' log entry, averaged over 3 runs per configuration.
AppNavigationHost used LaunchedEffect(currentAction) to react to navigation
changes, but LaunchedEffect only re-runs when its key actually changes.
Since GoBack is a singleton object, pressing back multiple times emits the
same value — so the effect ran the first time but ignored every subsequent
back press.
Switched to collecting the flow directly with LaunchedEffect(Unit) {
flow.collect {} }, which runs on every emission even when the value is the
same object.
* Fix subtitle settings reset on NextUp screen
When the NextUp screen transitions to the next episode, it creates a new
PlaybackController which loses the subtitle settings. This is because
mCurrentOptions is null on fresh playback.
The fix mirrors the existing audio language handling:
- Save the subtitle language code when user changes subtitles
- Restore it by finding matching stream when starting fresh playback
Fixesjellyfin/jellyfin-androidtv#5436
* Remove debug logging
* Fix videoQueueManager injection in setSubtitleIndex helper function
---------
Co-authored-by: Niels van Velzen <git@ndat.nl>