Jellyfin for Android TV 0.20 is here! This release brings redesigned settings, improved video playback and subtitle support, better integration with external players, and plenty of enhancements across the app. Read about the highlights in our blog post or explore the full changelog below.
If you appreciate my work, you can show your support with a donation through Buy Me a Coffee or GitHub sponsors. Your support helps me continue improving and growing the app. Thank you!
🌟 Highlights
- Add option to always burn in subtitles when transcoding #4459, by @GertSallaerts
- Require Android 6 at minimum (API 23) #4836, by @nielsvanvelzen
- Use Jellyfin 10.11 based SDK #5037, by @nielsvanvelzen
- Support Advanced SubStation Alpha direct play #5121, by @nielsvanvelzen
- Add new settings UI #5198, by @nielsvanvelzen
- Allow selecting external video player app #5280, by @nielsvanvelzen
- Add user-defined AVC/HEVC codec level override #5520, by @johnpc
- Add photo player presentation delay to settings as user preference #5722, by @hraabis
- Add user preferences to force enable or disable common HDR formats #5743, by @clowncracker
💥 Crash fixes
- Use android plugin for AboutLibraries generation #5206, by @nielsvanvelzen
- Fix missing focus in new player UI #5513, by @nielsvanvelzen
- Fix NullPointerException when display.getHdrCapabilities() returns null #5718, by @nielsvanvelzen
- Fix Live TV guide crash when channel loading fails #5801, by @andrew749
- Use strong reference to licenses resource #5809, by @nielsvanvelzen
- Fix crash when mirroring libraries and collection folders using remote control #5829, by @nielsvanvelzen
- Fix crash when returning to Home while a video is playing #5841, by @HaraldNordgren
- Add additional null checks to PlaybackController.findBestDisplayMode #5882, by @nielsvanvelzen
🔧 Bugfixes
- Remove redundant TargetApi annotations #5142, by @nielsvanvelzen
- Fix range control calculation when minimum is not 0 #5263, by @nielsvanvelzen
- Remove value override from RangeControl #5264, by @nielsvanvelzen
- Don't overwrite displayPreferencesId in ItemRowAdapterHelper.retrieveUserViews #5296, by @nielsvanvelzen
- Fix rememberPreference not saving for AsyncPreferenceStore #5297, by @nielsvanvelzen
- Use DialogBase for InAppScreensaver #5305, by @nielsvanvelzen
- Fix initial focus on visibility change in DialogBase #5306, by @nielsvanvelzen
- Remove drop shadows from BrowseGridFragment #5370, by @TheMejmun
- Correct video start delay setting not showing decimal values in settings #5376, by @JagerSprinkles
- Fix non-enum preferences not persisting to server #5406, by @skalthoff
- Fix dismissing in-app screensaver with remote #5493, by @nielsvanvelzen
- Change heading from 'Refresh Switching' to 'Resume Preroll' #5498, by @bin101
- Fix interaction tracking in popover composable #5512, by @nielsvanvelzen
- Fix back button only working once #5540, by @johnpc
- Fix missing GH_TOKEN environment variable #5545, by @nielsvanvelzen
- Persist router backstack #5627, by @nielsvanvelzen
- Fix presenter focus on old Android versions #5639, by @nielsvanvelzen
- Fix contextmenu on new item cards #5708, by @nielsvanvelzen
- fix favorites order #5720, by @BlackstormFirst
- Migrate to GH_PROJECTS_TOKEN #5795, by @nielsvanvelzen
- Only show played progress for video and book items #5805, by @nielsvanvelzen
- Don't declare TrueHD under the fMP4 HLS profile #5821, by @mvletter
- Fix focus issues in leanback UI on older platforms #5840, by @nielsvanvelzen
- Fix wrong embedded subtitle track selected when ASS tracks are present #5862, by @sebv004
- Fix Previous episode button showing on the first episode of series #5881, by @bagodees
- Use AtomicFile in AuthenticationStore #5883, by @nielsvanvelzen
- Automatically focus grid within EnhancedBrowseFragment #5884, by @nielsvanvelzen
- Fix ExpandableTextView within ItemListFragment not working #5886, by @nielsvanvelzen
- Fix maxLifecycle in home & search fragments #5916, by @nielsvanvelzen
🔃 Maintenance
- Use compose dialog for DialogBase #5204, by @nielsvanvelzen
- Clean up settings UI #5243, by @nielsvanvelzen
- Cleanup navigation destinations #5496, by @nielsvanvelzen
- Replace deprecated bundleOf() usages #5626, by @nielsvanvelzen
- Use ticks extension in MediaContentProvider #5839, by @nielsvanvelzen
🏗️ Enhancements
- Change seekbar seeking to be relative to the current position #4937, by @Syquel
- Show placeholder thumbnail while Trickplay thumbnail loads #4946, by @tal-sarid
- Fix issue playing multiple items remotely #5017, by @flip-dots
- Add support for multiple badges for media with hybrid HDR or HDR with fallback #5038, by @hwneh
- Enable Proguard for release builds #5053, by @nielsvanvelzen
- Add badge composable #5143, by @nielsvanvelzen
- Update issue templates #5180, by @nielsvanvelzen
- Add navigation support to settings #5205, by @nielsvanvelzen
- Migrate telemetry settings to compose #5215, by @nielsvanvelzen
- Add ability to unblur backdrops #5216, by @akhilmulpurii
- Migrate developer settings to compose #5222, by @nielsvanvelzen
- Migrate licenses to compose #5225, by @nielsvanvelzen
- Migrate authentication settings to compose #5226, by @nielsvanvelzen
- Migrate server/user settings to compose #5231, by @nielsvanvelzen
- Use new settings from login screen #5232, by @nielsvanvelzen
- Remove account manager migration #5233, by @nielsvanvelzen
- Add ListControl as base for ListButton #5247, by @nielsvanvelzen
- Add RangeControl composable and use color tokens for Seekbar #5248, by @nielsvanvelzen
- Remove brief descriptions from settings screens #5251, by @nielsvanvelzen
- Migrate playback settings to compose #5252, by @nielsvanvelzen
- Use dedicated screen for about section in settings #5262, by @nielsvanvelzen
- Add FMP4 support for transcodes #5269, by @nielsvanvelzen
- Migrate subtitle customization settings to compose #5270, by @nielsvanvelzen
- Add option to not advertise software codecs as supported #5275, by @luca-schlecker
- Update README build instructions #5279, by @nielsvanvelzen
- Remove shortcut preferences #5281, by @nielsvanvelzen
- Migrate screensaver customization settings to compose #5282, by @nielsvanvelzen
- Remove premieresEnabled and mediaManagementEnabled preferences #5285, by @nielsvanvelzen
- Add design tokens #5289, by @nielsvanvelzen
- Remove profile picture from ClockUserView #5290, by @nielsvanvelzen
- Migrate customization settings to compose #5292, by @nielsvanvelzen
- Migrate home settings to compose #5295, by @nielsvanvelzen
- Use ListMessage for errors and remove unused server/user preferences UI #5298, by @nielsvanvelzen
- Migrate library display settings to compose #5299, by @nielsvanvelzen
- Migrate live tv guide settings to compose #5301, by @nielsvanvelzen
- Add explanation about branches to README #5302, by @nielsvanvelzen
- Add animations to settings UI #5304, by @nielsvanvelzen
- Add shared transitions to RouterContent #5307, by @nielsvanvelzen
- Migrate advanced playback settings to compose #5309, by @nielsvanvelzen
- Remove old preference UI #5310, by @nielsvanvelzen
- Show progress and duration in video player #5311, by @nielsvanvelzen
- Use color tokens for settings UI #5313, by @nielsvanvelzen
- Use space tokens in settings UI #5315, by @nielsvanvelzen
- Update to AGP 9 #5340, by @nielsvanvelzen
- Recreate LegacyImageCardView with compose #5343, by @nielsvanvelzen
- Add media toasts to new video player #5353, by @nielsvanvelzen
- Update progress styling in NowPlayingView #5364, by @nielsvanvelzen
- Update badge styling in ItemCardBaseItemOverlay #5365, by @nielsvanvelzen
- Remove unused defaultRatingType setting #5378, by @nielsvanvelzen
- Specify JDK version for CI in .tools-versions file #5381, by @nielsvanvelzen
- Add media type API to set proper content type in audio attributes #5385, by @nielsvanvelzen
- Fix item names not showing when showCardInfoOverlay is set #5390, by @nielsvanvelzen
- Remove unused NumberSpinnerView #5395, by @nielsvanvelzen
- Show additional parts for episodes #5408, by @galaterro
- Add timed events API for playback #5440, by @nielsvanvelzen
- Refactor PlayerBackendEventListener to abstract class #5449, by @nielsvanvelzen
- Add timed event blocks and support for negative positions #5450, by @nielsvanvelzen
- Add next media preloading #5452, by @nielsvanvelzen
- Fix - Season cards always showing series poster instead of season image #5479, by @WizardOfYendor1
- Refactor MainActivity to use compose as basis #5495, by @nielsvanvelzen
- Improve interaction management for in-app screensaver #5503, by @nielsvanvelzen
- Add configurable playback buffer size setting #5515, by @GeiserX
- Remember subtitle language between videos #5519, by @johnpc
- Add playback info overlay to display codec, bitrate, and play method #5521, by @johnpc
- Return state from rememberPlayerProgress #5541, by @nielsvanvelzen
- Add playback completion verification in external players #5556, by @RealGreenDragon
- Actually enable R8 minification #5559, by @LTe
- Move Live TV row click handling to HomeRowsFragment #5570, by @nielsvanvelzen
- Promote some developer settings #5587, by @nielsvanvelzen
- Add VIMU external subtitles support #5602, by @dieselw0w
- Refactor: Extract MediaCodecQuery interface and AVC codec module #5604, by @johnpc
- Update naming in some places #5605, by @nielsvanvelzen
- Add stricter external video player API implementations #5625, by @nielsvanvelzen
- Move around various settings #5633, by @nielsvanvelzen
- Implement auto-detection for audio passthrough and allow overrides #5645, by @BlackstormFirst
- Refactor: Extract HEVC and AV1 codec modules #5646, by @johnpc
- Allow Shield Dolby Vision Profile 7 direct playback #5652, by @ps-kl
- InfoRow badges: differentiate between EAC3 and TrueHD Atmos, fix DTS-HD check #5665, by @854562
- sort person items chronologically (latest release first) #5666, by @Mehvix
- Add AndroidVersion helper for readable, mockable SDK version checks #5672, by @johnpc
- Declutter JellyfinApplication #5675, by @nielsvanvelzen
- Add new button to shuffle all songs #5694, by @vladski-i
- Show server splash screen on launch. #5697, by @DerrickDW
- Add TV show sort by latest episode #5707, by @Charlie284
- Add focus restoration to router #5719, by @nielsvanvelzen
- Remove contributors file #5753, by @nielsvanvelzen
- Build release assets before publishing #5759, by @nielsvanvelzen
- Bump compile SDK to 37 (Android 17) #5763, by @nielsvanvelzen
- Add triage workflow to add pull requests to review project #5764, by @nielsvanvelzen
- Press up to close player overlay #5773, by @nielsvanvelzen
- Add PopOverMenu composable #5784, by @nielsvanvelzen
- Automatically focus on selected option in settings #5797, by @nielsvanvelzen
- Add next up date cutoff setting #5799, by @leonida92
- Add Seasons and Series navigation rows to season browse page #5828, by @johnpc
- Fix external player intent extras and result handling #5835, by @RealGreenDragon
- Increase maximum subtitle size to 48 #5848, by @nielsvanvelzen
- Support dpad navigation in photo player #5849, by @nielsvanvelzen
- Add marker support to RangeControl #5850, by @nielsvanvelzen
- Add setting to disable tvprovider integration #5851, by @nielsvanvelzen
- Fix season titles in Recently Added #5857, by @Meloakartas
- Add badge for 3D movies #5866, by @mpitropov
💡 Other changes
- Update pull request template #5112, by @nielsvanvelzen
- Fix Gradle wrapper #5941, by @nielsvanvelzen
📈 Dependency updates
- aboutlibraries → v15.3.0 (#5888, #5768, #5663, #5603, #5583, #5516, #5258, #5007)
- acra → v5.14.2 (#5864)
- actions/checkout action → v7 - autoclosed (#5661, #5209, #5175, #5163)
- actions/setup-java action → v6 (#5792, #5775, #5655, #5217)
- actions/stale action → v11 (#5721, #5211)
- actions/upload-artifact action → v7.0.1 (#5525, #5445, #5242)
- android.gradle → v9.5.1 (#5925, #5831, #5698, #5578, #5549, #5529, #5453, #5416)
- androidx.activity → v1.13.0 (#5467, #5409, #5254, #5213, #5171)
- androidx.activity:activity → v1.12.3 (#5373)
- androidx.appcompat:appcompat → v1.8.0 (#5762)
- androidx.compose → v1.12.1 (#5811, #5760, #5676, #5657, #5598, #5580, #5552, #5486, #5466, #5442, #5410, #5372, #5336, #5214, #5169)
- androidx.constraintlayout:constraintlayout → v2.2.2 (#5726)
- androidx.core:core-ktx → v1.19.1 (#5853, #5623, #5468)
- androidx.fragment → v1.9.1 (#5852, #5761)
- androidx.lifecycle → v2.11.0 (#5659, #5172)
- androidx.media3 → v1.11.1 (#5815, #5741, #5590, #5491, #5473, #5393, #5359, #5255)
- androidx.navigation3:navigation3-ui → v1.1.7 (#5778, #5757, #5727, #5678, #5658, #5599, #5551, #5522, #5412)
- androidx.window:window → v1.5.1 (#5170, #4965)
- androidx.work:work-runtime → v2.11.2 (#5487, #5371, #5043)
- appleboy/ssh-action action → v1.2.4 (#5192, #5108)
- CI dependencies (#5924, #5890, #5870, #5808, #5730, #5690, #5677, #5640, #5624, #5617, #5600, #5415, #5355, #5348)
- coil → v3.6.3 (#5832, #5793, #5779, #5643, #5441)
- com.android.tools.build:gradle → v8.13.2 (#5235, #5131)
- com.mikepenz:aboutlibraries-core → v14.1.0 (#5566)
- github/codeql-action action → v4.39.1 (#5906, #5858, #5833, #5770, #5758, #5737, #5728, #5615, #5592, #5581, #5565, #5531, #5492, #5478, #5472, #5457, #5451, #5433, #5391, #5383, #5327, #5250, #5241, #5218, #5203, #5167, #5144, #5072)
- Gradle → v9.9.0 (#5937, #5903, #5871, #5859, #5766, #5742, #5662, #5591, #5558, #5477, #5455, #5374, #5339, #5165, #5065)
- gradle/actions action → v6.4.0 (#5863, #5631, #5437)
- io.github.peerless2012:ass-media → v0.5.1 (#5750, #5723)
- io.mockk:mockk → v1.14.12 (#5939, #5612, #5360, #5224)
- jellyfin.sdk → v1.8.11 (#5629)
- koin → v4.2.2 (#5650, #5523, #5474)
- kotest → v6.2.6 (#5889, #5813, #5752, #5701, #5686, #5653, #5508, #5497, #5484, #5483, #5469, #5463, #5443, #5388, #5367, #5351, #5345, #5201, #5166)
- Kotlin → v2.4.21 (#5872, #5803, #5695, #5622, #5584, #5553, #5471, #5389, #5246)
- org.jellyfin.media3:media3-ffmpeg-decoder → v1.9.0+1 (#5288)
- org.jellyfin.sdk:jellyfin-core → v1.8.12 (#5713, #5606, #5601, #5514, #5501, #5344, #5244, #5202, #5164)
- org.jetbrains.kotlinx:kotlinx-serialization-json → v1.12.0 (#5904, #5524, #5347)
- ubuntu → v26 (#5834)
Contributors
- @nielsvanvelzen
- @johnpc
- @RealGreenDragon
- @BlackstormFirst
- @GertSallaerts
- @Syquel
- @tal-sarid
- @flip-dots
- @hwneh
- @akhilmulpurii
- @luca-schlecker
- @TheMejmun
- @JagerSprinkles
- @skalthoff
- @galaterro
- @WizardOfYendor1
- @bin101
- @GeiserX
- @LTe
- @dieselw0w
- @ps-kl
- @854562
- @Mehvix
- @vladski-i
- @DerrickDW
- @Charlie284
- @hraabis
- @clowncracker
- @leonida92
- @andrew749
- @mvletter
- @HaraldNordgren
- @Meloakartas
- @sebv004
- @mpitropov
- @bagodees