From 4622f14e1d5e427f358cb905949fd462c3db93a2 Mon Sep 17 00:00:00 2001 From: Niels van Velzen Date: Wed, 12 Aug 2026 19:22:41 +0200 Subject: [PATCH] Require Android 6 at minimum (API 23) --- .../jellyfin/mobile/bridge/NativeInterface.kt | 2 +- .../jellyfin/mobile/utils/AndroidVersion.kt | 8 ----- .../org/jellyfin/mobile/utils/Constants.kt | 5 +-- .../org/jellyfin/mobile/utils/SystemUtils.kt | 34 +++++++++---------- gradle/libs.versions.toml | 2 +- 5 files changed, 19 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/jellyfin/mobile/bridge/NativeInterface.kt b/app/src/main/java/org/jellyfin/mobile/bridge/NativeInterface.kt index a61539cf..60eb104d 100644 --- a/app/src/main/java/org/jellyfin/mobile/bridge/NativeInterface.kt +++ b/app/src/main/java/org/jellyfin/mobile/bridge/NativeInterface.kt @@ -57,7 +57,7 @@ class NativeInterface(private val context: Context) : KoinComponent { val clientInfo = apiClient.clientInfo buildJsonObject { - put("deviceId", deviceInfo.id.toString()) + put("deviceId", deviceInfo.id) // normalize the name by removing special characters // and making sure it's at least 1 character long // otherwise the webui will fail to send it to the server diff --git a/app/src/main/java/org/jellyfin/mobile/utils/AndroidVersion.kt b/app/src/main/java/org/jellyfin/mobile/utils/AndroidVersion.kt index 92a58fb2..053a0487 100644 --- a/app/src/main/java/org/jellyfin/mobile/utils/AndroidVersion.kt +++ b/app/src/main/java/org/jellyfin/mobile/utils/AndroidVersion.kt @@ -10,14 +10,6 @@ import android.os.Build * @see Build.VERSION.SDK_INT */ object AndroidVersion { - /** - * Checks whether the current Android version is at least Android 6 Marshmallow, API 23. - * - * @see Build.VERSION_CODES.M - */ - inline val isAtLeastM: Boolean - get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - /** * Checks whether the current Android version is at least Android 7 Nougat, API 24. * diff --git a/app/src/main/java/org/jellyfin/mobile/utils/Constants.kt b/app/src/main/java/org/jellyfin/mobile/utils/Constants.kt index 315e63a4..197862f9 100644 --- a/app/src/main/java/org/jellyfin/mobile/utils/Constants.kt +++ b/app/src/main/java/org/jellyfin/mobile/utils/Constants.kt @@ -62,10 +62,7 @@ object Constants { const val PLAYBACK_MANAGER_COMMAND_VOL_DOWN = "volumeDown" // Notification - val PENDING_INTENT_FLAGS = PendingIntent.FLAG_UPDATE_CURRENT or when { - AndroidVersion.isAtLeastM -> PendingIntent.FLAG_IMMUTABLE - else -> 0 - } + const val PENDING_INTENT_FLAGS = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE const val MEDIA_NOTIFICATION_CHANNEL_ID = "org.jellyfin.mobile.media.NOW_PLAYING" const val DOWNLOAD_NOTIFICATION_CHANNEL_ID = "org.jellyfin.mobile.download.DOWNLOAD_PROGRESS" diff --git a/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt b/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt index 902b84f2..918540fe 100644 --- a/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt +++ b/app/src/main/java/org/jellyfin/mobile/utils/SystemUtils.kt @@ -33,26 +33,24 @@ import java.util.UUID import kotlin.coroutines.resume fun WebViewFragment.requestNoBatteryOptimizations(rootView: CoordinatorLayout) { - if (AndroidVersion.isAtLeastM) { - val powerManager = requireContext().getSystemService(Activity.POWER_SERVICE) as PowerManager - if ( - !appPreferences.ignoreBatteryOptimizations && - !powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID) - ) { - Snackbar.make(rootView, R.string.battery_optimizations_message, Snackbar.LENGTH_INDEFINITE).apply { - setAction(android.R.string.ok) { - try { - val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS) - startActivity(intent) - } catch (e: ActivityNotFoundException) { - Timber.e(e) - } - - // Ignore after the user interacted with the snackbar at least once - appPreferences.ignoreBatteryOptimizations = true + val powerManager = requireContext().getSystemService(Activity.POWER_SERVICE) as PowerManager + if ( + !appPreferences.ignoreBatteryOptimizations && + !powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID) + ) { + Snackbar.make(rootView, R.string.battery_optimizations_message, Snackbar.LENGTH_INDEFINITE).apply { + setAction(android.R.string.ok) { + try { + val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS) + startActivity(intent) + } catch (e: ActivityNotFoundException) { + Timber.e(e) } - show() + + // Ignore after the user interacted with the snackbar at least once + appPreferences.ignoreBatteryOptimizations = true } + show() } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c5b509c6..0fe38ac4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] # Android android-compileSdk = "36" -android-minSdk = "21" +android-minSdk = "23" android-targetSdk = "36" # Plugins