We're excited to announce the release of Jellyfin for Android 2.7! This release introduces one of the largest updates to the app so far, with a completely redesigned downloads experience, revamped Android Auto support, major playback improvements, and many bug fixes and quality-of-life enhancements.
Read the full blog post or look through the full changelog below.
ποΈ Enhancements
- Add long press event for speeding up playing #1020, by @Ank1996
- Load media session artwork from content provider #1558, by @Maxr1998
- Implement DownloadManagement app feature in nativeshell #1627, by @nielsvanvelzen
- Update workflows & issue template config #1630, by @nielsvanvelzen
- Add chapter skipping support to exoplayer client #1646, by @CeruleanRed
- Migrate to media3 #1655, by @nielsvanvelzen
- Update coil dependency from 2.7.0 to 3.2.0 #1669, by @cameocoder
- Use kotlin time over manual math for tick conversions #1680, by @CeruleanRed
- Add button for ask-to-skip media segments #1685, by @CeruleanRed
- Update app build script for Gradle 9 compatibility #1738, by @nielsvanvelzen
- Remove direct dependencies on OkHttp/Okio #1740, by @nielsvanvelzen
- Target SDK 36 (Android 16) #1756, by @nielsvanvelzen
- Update SDK to 1.7.0-beta.4 #1757, by @nielsvanvelzen
- Enable per-app language preferences #1821, by @TheMrMilchmann
- Port video title format from web client #1824, by @rodis120
- Add CodecProfile conditions to DeviceProfileBuilder so video codec profiles are correctly restricted from direct playing (ExoPlayer only) #1889, by @comp500
- Add horizontal seek gesture support with overlay feedback #1895, by @SJJ-dot
- Retry playback with fallback on source errors #1932, by @kfarnung
- Migrate downloads UI to Compose #1948, by @Maxr1998
- Add Trickplay view over the seekbar in ExoPlayer #1951, by @tal-sarid
- Update app title in fastlane metadata #1955, by @nielsvanvelzen
- Dynamically query device H264 max level for WebView device profile #1956, by @stumpylog
- Add android auto support #1972, by @nielsvanvelzen
- Replace loadUrl("javascript:...") with evaluateJavascript in WebViewFragment #1980, by @jim-daf
- Add audiobook support to Android Auto #1984, by @nielsvanvelzen
- Improve letter navigation in Android Auto #1985, by @nielsvanvelzen
- Add fallback icons to Android Auto items #1986, by @nielsvanvelzen
- Update naming in some places #1991, by @nielsvanvelzen
- Make playlists a top-level item in Android Auto #1993, by @nielsvanvelzen
- Add item expansion to Android Auto to play entire album/playlist/etc #1994, by @nielsvanvelzen
- Rewrite download support #2015, by @nielsvanvelzen
- Use Android TV linter configuration #2016, by @nielsvanvelzen
- Improve audiobook support to Android Auto #2017, by @jordanmichaelrushing
- Download primary image for offline files and store files in database #2019, by @nielsvanvelzen
- Move Android versions to catalog #2023, by @nielsvanvelzen
- Use .tools-versions file for Java version in GitHub workflows #2024, by @nielsvanvelzen
- Sign APK/AAB via Gradle build #2025, by @nielsvanvelzen
- Request download folder if unset #2029, by @nielsvanvelzen
- Show message when there are no downloads #2030, by @nielsvanvelzen
- Reduce API calls when starting playback on Android Auto #2032, by @nielsvanvelzen
- Play downloaded audio in external app #2034, by @nielsvanvelzen
- Use DefaultMediaSourceFactory instead of manually picking factories #2038, by @Maxr1998
- Add multi-select deletion to downloads #2048, by @nielsvanvelzen
- Use native video player by default #2050, by @nielsvanvelzen
- Show warning when download location is inaccessible #2052, by @nielsvanvelzen
- Support voice controlled playback on Android Auto #2059, by @nielsvanvelzen
- Lock gesture until drag ends in PlayerGestureHelper #2072, by @nielsvanvelzen
- Remove automatic landscape mode #2085, by @nielsvanvelzen
- Fallback to suggested music when no search results are found in Android Auto voice search #2089, by @nielsvanvelzen
- Revert "Remove automatic landscape mode" #2095, by @nielsvanvelzen
- Opt-out of Android 16 restricted resizability behavior #2096, by @nielsvanvelzen
π§ Bugfixes
- Fix episode autoplay preference having no effect #1479, by @lfranke42
- Fix syntax error in native shell JavaScript #1643, by @nielsvanvelzen
- Fix integrated player control under camera cutout #1648, by @miikaforma
- Revert NativePlayer.seek to use ticks and rename to seekTicks #1694, by @CeruleanRed
- Remove repeated string in AVAILABLE_VIDEO_CODECS #1731, by @gert7
- Fix some languages using wrong code #1778, by @nielsvanvelzen
- Remove duplicate hebrew translations #1779, by @nielsvanvelzen
- Fix logo drawn behind status bar #1818, by @nielsvanvelzen
- fix: + button in edit images in android app #1878, by @jagadam97
- Fix NetworkOnMainThreadExceptions due to usage of Jellyfin SDK on main thread #1888, by @comp500
- Fix Live TV stream end calls not releasing tuner on HDHR devices when used with Jellyfin Server 10.11.x #1892, by @VTRunner
- Remove return from apphost #1900, by @nielsvanvelzen
- Fix title overflow in Player and Item Details screens in Portrait Mode on Mobile Phones #1920, by @DevGitPit
- Fix bluetooth media keys for local video playback #1973, by @mherceg
- Fix Android Auto navigation for artists and audiobooks #1992, by @nielsvanvelzen
- Use artists API for querying artists in Android Auto #1996, by @nielsvanvelzen
- Fix missing translations in SearchLibraryPage #2018, by @nielsvanvelzen
- Fix database migration for existing installs #2027, by @nielsvanvelzen
- Handle null locale when web settings language is not configured #2028, by @BotBlake
- Fix default download method not showing in settings #2033, by @nielsvanvelzen
- Use transaction for queued downloads query #2036, by @nielsvanvelzen
- Fix external subtitle selection #2037, by @Maxr1998
- Fix media session crash when playing audio #2045, by @nielsvanvelzen
- Fix crash when double tapping connect button #2046, by @nielsvanvelzen
- Fix PiP behavior #2049, by @nielsvanvelzen
- Fix allowed network types not showing default value #2051, by @nielsvanvelzen
- Show Google Cast streaming quality setting on Chromecast-capable builds #2065, by @JDStriker456
- Fix some textual issues in DownloadNotificationManager #2080, by @nielsvanvelzen
- Fix subtitle switching for downloaded files #2081, by @nielsvanvelzen
- Fix player title positioning #2086, by @nielsvanvelzen
π Refactoring
- Fix various linter and compiler warnings #1657, by @nielsvanvelzen
- Remove dead code #1981, by @nielsvanvelzen
- Change UserEntity.userId to UUID #1983, by @nielsvanvelzen
π‘ Everything else
- Add in app download functionality #1404, by @7ritn
- Add opus to MP4 direct play profile #1463, by @thedreaddpirate
- Prevent destruction of session, so that an app restart can reconnect (chromecast). #1469, by @Tukajo
- Switch to binary-only Gradle distribution #1472, by @3flex
- Fix deprecations in build scripts #1473, by @3flex
- Update to Kotlin 2.0.20 #1474, by @3flex
- Configure Room with Gradle plugin #1475, by @3flex
- Add .kotlin directory to gitignore #1476, by @3flex
- Implement media segment support #1507, by @jakobkukla
- feat(external-player): add mpvkt #1531, by @s12f
- Compile against SDK 35 (Android 15) #1556, by @Maxr1998
- Add individual progress in download notification #1623, by @7ritn
- Add auto migration for Room #1628, by @7ritn
- rework issue forms #1634, by @BotBlake
- Revert "Update dependency com.google.devtools.ksp to v2.2.0-2.0.2" #1699, by @nielsvanvelzen
- Revert "Update Kotlin to v2.2.0" #1700, by @nielsvanvelzen
- Better handle exiting on zero seconds for external players #1773, by @RonDen-DidIt
- Add configurable playback buffer size for integrated player #1946, by @GeiserX
- Remove LeakCanary #1975, by @nielsvanvelzen
- Update pull request template #1976, by @nielsvanvelzen
- Update merge conflict workflow #2020, by @nielsvanvelzen
π Dependency updates
- Update detekt by renovate[bot] v1.23.8 #1579, v1.23.7 #1094
- Update gradle by renovate[bot] v9 #1741, v8.14.3 #1713, v8.14.2 #1670, v8.14.1 #1652, v8.14 #1621, v8.13 #1592, v8.12.1 #1548, v8.11.1 #1436
- Update android.plugin by renovate[bot] v9.3.1 #2090, v9 #1970, v8.13.2 #1871, v8.13.1 #1848, v8.13.0 #1769, v8.12.1 #1762, v8.12.0 #1739, v8.11.1 #1692, v8.10.1 #1659, v8.10.0 #1605, v8.9.0 #1575, v8.8.0 #1438
- Update io.mockk:mockk-android by renovate[bot] v1.14.9 #1918, v1.14.7 #1872, v1.14.6 #1802, v1.14.5 - autoclosed #1722, v1.14.4 #1686, v1.14.3 #1684, v1.14.2 #1596, v1.13.16 #1446
- Update dependency io.coil-kt:coil-base to v2.7.0 #1449, by renovate[bot]
- Update androidx.lifecycle by renovate[bot] v2.9.4 #1792, v2.9.3 #1768, v2.9.2 #1721, v2.9.1 #1664, v2.9.0 #1626, v2.8.7 #1455
- Update androidx.activity:activity by renovate[bot] v1.11.0 #1788, v1.10.1 #1591, v1.10.0 #1456
- Update androidx.fragment:fragment-ktx by renovate[bot] v1.8.9 #1748, v1.8.8 - autoclosed #1666, v1.8.7 #1650, v1.8.6 #1576, v1.8.5 #1460
- Update dependency ubuntu to v24 #1524, by renovate[bot]
- Update gradle/actions action by renovate[bot] v6 #1971, v5 #1803, v4 #1525
- Update androidx.test:runner by renovate[bot] v1.7.0 #1736, v1.6.2 #1526
- Update compose to v1.7.6 #1545, by renovate[bot]
- Update com.google.devtools.ksp by renovate[bot] v2.3.10 #2073, v2.3.9 #1997, v2.3.7 #1961, v2.3.6 - autoclosed #1916, v2.3.4 #1835, v2.3.0 #1827, v2.2.20-2.0.4 #1808, v2.2.20-2.0.3 #1786, v2.2.10-2.0.2 #1753, v2.2.0-2.0.2 - autoclosed #1701, v2.2.0-2.0.2 #1695, v2.1.21-2.0.2 #1674, v2.1.21-2.0.1 #1640, v2.1.20-2.0.1 #1572, v2.1.0-1.0.29 #1546
- Update de.mannodermaus.android-junit5 by renovate[bot] v2.0.1 #1917, v2 #1884, v1.14.0.0 #1816, v1.13.4.0 #1780, v1.13.1.0 #1703, v1.13.0.0 #1676, v1.12.2.0 #1644, v1.12.0.0 #1620, v1.11.3.0 #1547
- Update compose.material to v1.7.6 #1549, by renovate[bot]
- Update com.android.tools:desugar_jdk_libs by renovate[bot] v2.1.5 #1595, v2.1.4 #1550
- Update androidx.compose.foundation:foundation by renovate[bot] v1.8.3 #1683, v1.8.2 #1651, v1.7.6 #1551
- Update androidx.constraintlayout:constraintlayout by renovate[bot] v2.2.2 #2100, v2.2.1 #1594, v2.2.0 #1552
- Update junit5 monorepo by renovate[bot] v5.13.1 #1672, v5.13.0 #1661, v5.12.2 #1580, v5.11.4 #1553
- Update androidx.core:core by renovate[bot] v1.17.0 #1752, v1.16.0 #1619, v1.15.0 #1554
- Update androidx.webkit:webkit by renovate[bot] v1.14.0 #1668, v1.13.0 #1597, v1.12.1 #1555
- Update koin by renovate[bot] v4.1.1 #1774, v4.1.0 #1673, v4.0.4 #1617, v4 (major) #1559
- Update playservices by renovate[bot] v22.1.0 #1635, v22 (major) #1561
- Update Kotlin by renovate[bot] v2.4.10 #2078, v2.4.0 #2014, v2.2.21 #1826, v2.2.20 #1782, v2.2.10 #1750, v2.2.0 - autoclosed #1702, v2.2.0 #1688, v2.1.21 #1638, v2.1.10 #1562
- Update androidx.room by renovate[bot] v2.7.2 #1682, v2.7.1 #1618
- Update com.squareup.okio:okio by renovate[bot] v3.15.0 #1710, v3.14.0 #1698, v3.13.0 #1678, v3.12.0 #1658, v3.11.0 #1624
- Update androidx.compose by renovate[bot] v1.9.4 #1825, v1.9.3 #1814, v1.9.2 #1795, v1.9.1 #1785, v1.9.0 #1751, v1.8.3 #1681, v1.8.2 #1649
- Update github/codeql-action action by renovate[bot] v4.36.3 #2067, v4 #1807, v3.30.5 #1796, v3.29.10 #1761, v3.29.5 #1733, v3.29.4 #1727, v3.29.2 #1708, v3.29.1 #1696, v3.28.19 #1663
- Update dependency androidx.appcompat:appcompat to v1.7.1 #1665, by renovate[bot]
- Update androidx.mediarouter:mediarouter by renovate[bot] v1.8.1 #1711, v1.8.0 #1667
- Update junit to v5.13.2 #1691, by renovate[bot]
- Update dependency org.jetbrains.kotlinx:kotlinx-serialization-json to v1.9.0 #1697, by renovate[bot]
- Update junit-framework monorepo by renovate[bot] v6.1.2 #2077, v6.1.1 #2068, v6.1.0 #2001, v6.0.3 #1919, v6.0.2 #1885, v6.0.1 #1800, v6 (major) #1801, v5.13.4 #1724, v5.13.3 #1714
- Update coil by renovate[bot] v3.4.0 #1962, v3.3.0 #1728
- Update dependency androidx.test.espresso:espresso-core to v3.7.0 #1737, by renovate[bot]
- Update actions/checkout action by renovate[bot] v7 #2058, v6 #1876, v5 #1747
- Update dependency androidx.media:media to v1.7.1 - autoclosed #1749, by renovate[bot]
- Update org.jellyfin.sdk:jellyfin-core by renovate[bot] v1.7.1 #1806, v1.7.0 #1797, v1.7.0-beta.6 #1775, v1.7.0-beta.5 #1758
- Update kotest by renovate[bot] v6.2.3 #2092, v6.2.2 #2074, v6.2.1 #2057, v6.1.11 #1967, v6.0.7 #1856, v6.0.4 #1815, v6 (major) #1760
- Update actions/setup-java action to v5 #1765, by renovate[bot]
- Update dependency com.google.android.material:material to v1.13.0 #1776, by renovate[bot]
- Update actions/stale action by renovate[bot] v11 - autoclosed #2102, v10.1.0 #1798, v10 #1777
- Update Gradle by renovate[bot] v9.6.1 #2056, v9.5.1 #1998, v9.5.0 #1965, v9.2.1 - autoclosed #1831, v9.1.0 #1793
- Update actions/upload-artifact action by renovate[bot] v7 #1969, v6 #1880, v5 #1829
- Update dependency androidx.core:core-splashscreen to v1.2.0 #1838, by renovate[bot]
- Update burnett01/rsync-deployments action to v8 #1881, by renovate[bot]
- Update mockk to v1.14.11 #2013, by renovate[bot]
- Update CI dependencies #1440, by renovate[bot]
- Update Kotlin #1527, by renovate[bot]
- Update CI dependencies #1544, by renovate[bot]
- Update CI dependencies #1564, by renovate[bot]
- Update CI dependencies #1603, by renovate[bot]
- Update Kotlin #1604, by renovate[bot]
- Update androidx.compose #1616, by renovate[bot]
- Update CI dependencies #1642, by renovate[bot]
- Update CI dependencies #1677, by renovate[bot]
- Update androidx.media3 #1718, by renovate[bot]
- Update CI dependencies #1743, by renovate[bot]
- Update CI dependencies #1767, by renovate[bot]
- Update CI dependencies #1832, by renovate[bot]
- Update Kotlin #1883, by renovate[bot]
- Update CI dependencies #1890, by renovate[bot]
- Update CI dependencies #1960, by renovate[bot]
- Update Kotlin #1968, by renovate[bot]
- Update CI dependencies #1999, by renovate[bot]
- Update CI dependencies #2012, by renovate[bot]
- Update CI dependencies #2053, by renovate[bot]
- Update CI dependencies #2075, by renovate[bot]
- Update CI dependencies #2091, by renovate[bot]
- Update CI dependencies #2101, by renovate[bot]
Contributors
- @nielsvanvelzen
- @3flex
- @Maxr1998
- @CeruleanRed
- @7ritn
- @BotBlake
- @comp500
- @Ank1996
- @thedreaddpirate
- @Tukajo
- @lfranke42
- @jakobkukla
- @s12f
- @miikaforma
- @cameocoder
- @gert7
- @RonDen-DidIt
- @TheMrMilchmann
- @rodis120
- @jagadam97
- @VTRunner
- @SJJ-dot
- @DevGitPit
- @kfarnung
- @GeiserX
- @tal-sarid
- @stumpylog
- @mherceg
- @jim-daf
- @jordanmichaelrushing
- @JDStriker456