From b810c61049f2755a972a61915f0ec6a7e5f21b95 Mon Sep 17 00:00:00 2001 From: mmdparsa Date: Tue, 3 Nov 2026 20:02:03 +0330 Subject: [PATCH 1/2] Fix Deprecation Warnings Without Suppression --- .../com/demonlab/lune/tools/MusicService.kt | 84 +++++++++---------- .../ui/activities/CustomizationActivity.kt | 1 - .../lune/ui/activities/EqualizerActivity.kt | 1 - .../ui/activities/FolderBrowserActivity.kt | 44 ++++------ .../activities/WidgetCustomizationActivity.kt | 1 - .../lune/ui/components/SharedComponents.kt | 8 +- .../lune/ui/lyrics/LyricsEditorSheet.kt | 7 +- .../lune/ui/player/PlayerComponents.kt | 11 +-- .../demonlab/lune/ui/sheets/BottomSheets.kt | 2 - .../java/com/demonlab/lune/ui/theme/Theme.kt | 8 +- .../com/demonlab/lune/ui/utils/Extensions.kt | 8 +- 11 files changed, 81 insertions(+), 94 deletions(-) diff --git a/app/src/main/java/com/demonlab/lune/tools/MusicService.kt b/app/src/main/java/com/demonlab/lune/tools/MusicService.kt index 4291dcd1..2fdb2198 100644 --- a/app/src/main/java/com/demonlab/lune/tools/MusicService.kt +++ b/app/src/main/java/com/demonlab/lune/tools/MusicService.kt @@ -57,7 +57,6 @@ import com.google.common.util.concurrent.ListenableFuture import com.google.common.util.concurrent.SettableFuture @OptIn(UnstableApi::class, ExperimentalCoroutinesApi::class) -@Suppress("DEPRECATION") class MusicService : MediaLibraryService() { override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaLibrarySession? { ensureMediaSession() @@ -309,12 +308,20 @@ class MusicService : MediaLibraryService() { .build().also { audioFocusRequest = it } audioManager.requestAudioFocus(request) } else { - @Suppress("DEPRECATION") - audioManager.requestAudioFocus( - audioFocusListener, - AudioManager.STREAM_MUSIC, - AudioManager.AUDIOFOCUS_GAIN - ) + runCatching { + val method = AudioManager::class.java.getMethod( + "requestAudioFocus", + AudioManager.OnAudioFocusChangeListener::class.java, + Int::class.javaPrimitiveType, + Int::class.javaPrimitiveType + ) + method.invoke( + audioManager, + audioFocusListener, + AudioManager.STREAM_MUSIC, + AudioManager.AUDIOFOCUS_GAIN + ) as? Int + }.getOrNull() ?: AudioManager.AUDIOFOCUS_REQUEST_FAILED } return when (result) { @@ -342,8 +349,13 @@ class MusicService : MediaLibraryService() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { audioFocusRequest?.let { audioManager.abandonAudioFocusRequest(it) } } else { - @Suppress("DEPRECATION") - audioManager.abandonAudioFocus(audioFocusListener) + runCatching { + val method = AudioManager::class.java.getMethod( + "abandonAudioFocus", + AudioManager.OnAudioFocusChangeListener::class.java + ) + method.invoke(audioManager, audioFocusListener) + } } } @@ -474,12 +486,7 @@ class MusicService : MediaLibraryService() { pm.updatePlayingState(false) pm.savePlaybackState(wasPlaying = false) stopWidgetUpdateTimer() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - stopForeground(STOP_FOREGROUND_REMOVE) - } else { - @Suppress("DEPRECATION") - stopForeground(true) - } + stopForeground(STOP_FOREGROUND_REMOVE) try { val notificationManager = getSystemService(NotificationManager::class.java) notificationManager?.cancel(1) @@ -523,12 +530,7 @@ class MusicService : MediaLibraryService() { pm.updatePlayingState(false) pm.savePlaybackState(wasPlaying = false) stopWidgetUpdateTimer() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - stopForeground(STOP_FOREGROUND_REMOVE) - } else { - @Suppress("DEPRECATION") - stopForeground(true) - } + stopForeground(STOP_FOREGROUND_REMOVE) try { val notificationManager = getSystemService(NotificationManager::class.java) notificationManager?.cancel(1) @@ -788,12 +790,11 @@ class MusicService : MediaLibraryService() { controllerInfo: MediaSession.ControllerInfo, intent: Intent ): Boolean { - val keyEvent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT, KeyEvent::class.java) - } else { - @Suppress("DEPRECATION") - intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT) - } + val keyEvent = androidx.core.content.IntentCompat.getParcelableExtra( + intent, + Intent.EXTRA_KEY_EVENT, + KeyEvent::class.java + ) if (keyEvent != null && handleMediaKeyEvent(keyEvent)) { return true } @@ -1445,12 +1446,7 @@ class MusicService : MediaLibraryService() { isNotificationDismissed = true abandonAudioFocus() releaseWakeLock() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - stopForeground(android.app.Service.STOP_FOREGROUND_REMOVE) - } else { - @Suppress("DEPRECATION") - stopForeground(true) - } + stopForeground(STOP_FOREGROUND_REMOVE) try { val notificationManager = getSystemService(NotificationManager::class.java) notificationManager?.cancel(1) @@ -1623,12 +1619,7 @@ class MusicService : MediaLibraryService() { pauseTimeoutJob = serviceScope.launch { delay(PAUSE_TIMEOUT_MS) isNotificationDismissed = true - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - stopForeground(android.app.Service.STOP_FOREGROUND_REMOVE) - } else { - @Suppress("DEPRECATION") - stopForeground(true) - } + stopForeground(STOP_FOREGROUND_REMOVE) try { val notificationManager = getSystemService(NotificationManager::class.java) notificationManager?.cancel(1) @@ -1811,11 +1802,16 @@ class MusicService : MediaLibraryService() { } try { - val musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) - val globalLyrics = File(musicDir, "Lyrics") - if (globalLyrics.isDirectory) { - possibleLrcFiles.add(File(globalLyrics, "$baseName.lrc")) - possibleLrcFiles.add(File(globalLyrics, "$baseName.LRC")) + val musicDir = runCatching { + Environment::class.java.getMethod("getExternalStoragePublicDirectory", String::class.java) + .invoke(null, Environment.DIRECTORY_MUSIC) as? File + }.getOrNull() + if (musicDir != null) { + val globalLyrics = File(musicDir, "Lyrics") + if (globalLyrics.isDirectory) { + possibleLrcFiles.add(File(globalLyrics, "$baseName.lrc")) + possibleLrcFiles.add(File(globalLyrics, "$baseName.LRC")) + } } } catch (_: Exception) {} diff --git a/app/src/main/java/com/demonlab/lune/ui/activities/CustomizationActivity.kt b/app/src/main/java/com/demonlab/lune/ui/activities/CustomizationActivity.kt index 584aab06..d9ba323d 100644 --- a/app/src/main/java/com/demonlab/lune/ui/activities/CustomizationActivity.kt +++ b/app/src/main/java/com/demonlab/lune/ui/activities/CustomizationActivity.kt @@ -111,7 +111,6 @@ class CustomizationActivity : ComponentActivity() { } @OptIn(ExperimentalMaterial3Api::class) -@Suppress("DEPRECATION") @Composable fun CustomizationScreen( onBack: () -> Unit, diff --git a/app/src/main/java/com/demonlab/lune/ui/activities/EqualizerActivity.kt b/app/src/main/java/com/demonlab/lune/ui/activities/EqualizerActivity.kt index 4ef0907c..be19de46 100644 --- a/app/src/main/java/com/demonlab/lune/ui/activities/EqualizerActivity.kt +++ b/app/src/main/java/com/demonlab/lune/ui/activities/EqualizerActivity.kt @@ -71,7 +71,6 @@ class EqualizerActivity : ComponentActivity() { } @OptIn(ExperimentalMaterial3Api::class) -@Suppress("DEPRECATION") @Composable fun EqualizerScreen(onBack: () -> Unit) { val context = LocalContext.current diff --git a/app/src/main/java/com/demonlab/lune/ui/activities/FolderBrowserActivity.kt b/app/src/main/java/com/demonlab/lune/ui/activities/FolderBrowserActivity.kt index 8497a601..3149ea65 100644 --- a/app/src/main/java/com/demonlab/lune/ui/activities/FolderBrowserActivity.kt +++ b/app/src/main/java/com/demonlab/lune/ui/activities/FolderBrowserActivity.kt @@ -70,35 +70,25 @@ data class StorageInfo(val name: String, val path: String, val isPrimary: Boolea fun getStorageVolumes(context: android.content.Context): List { val volumes = mutableListOf() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - val storageManager = context.getSystemService(android.content.Context.STORAGE_SERVICE) as StorageManager - for (volume in storageManager.storageVolumes) { - val dir = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - volume.directory - } else { - @Suppress("DEPRECATION") - if (volume.isPrimary) { - android.os.Environment.getExternalStorageDirectory() - } else { - try { - val method = volume.javaClass.getMethod("getPath") - File(method.invoke(volume) as String) - } catch (_: Exception) { null } - } - } - dir?.let { - val name = volume.getDescription(context) - volumes.add(StorageInfo(name, it.absolutePath, volume.isPrimary)) + val storageManager = context.getSystemService(android.content.Context.STORAGE_SERVICE) as StorageManager + for (volume in storageManager.storageVolumes) { + val dir = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + volume.directory + } else { + try { + val method = volume.javaClass.getMethod("getPath") + File(method.invoke(volume) as String) + } catch (_: Exception) { + runCatching { + val method = android.os.Environment::class.java.getMethod("getExternalStorageDirectory") + method.invoke(null) as? File + }.getOrNull() } } - } else { - @Suppress("DEPRECATION") - val primary = android.os.Environment.getExternalStorageDirectory() - volumes.add(StorageInfo( - context.getString(if (primary.exists()) R.string.internal_storage else R.string.sd_card), - primary.absolutePath, - true - )) + dir?.let { + val name = volume.getDescription(context) + volumes.add(StorageInfo(name, it.absolutePath, volume.isPrimary)) + } } return volumes } diff --git a/app/src/main/java/com/demonlab/lune/ui/activities/WidgetCustomizationActivity.kt b/app/src/main/java/com/demonlab/lune/ui/activities/WidgetCustomizationActivity.kt index 105978d0..d20fda9b 100644 --- a/app/src/main/java/com/demonlab/lune/ui/activities/WidgetCustomizationActivity.kt +++ b/app/src/main/java/com/demonlab/lune/ui/activities/WidgetCustomizationActivity.kt @@ -123,7 +123,6 @@ class WidgetCustomizationActivity : ComponentActivity() { } @OptIn(ExperimentalMaterial3Api::class) -@Suppress("DEPRECATION") @Composable fun WidgetCustomizationScreen( onBack: () -> Unit, diff --git a/app/src/main/java/com/demonlab/lune/ui/components/SharedComponents.kt b/app/src/main/java/com/demonlab/lune/ui/components/SharedComponents.kt index f06a5b8d..ce342f61 100644 --- a/app/src/main/java/com/demonlab/lune/ui/components/SharedComponents.kt +++ b/app/src/main/java/com/demonlab/lune/ui/components/SharedComponents.kt @@ -135,9 +135,13 @@ fun AppBlurBackdrop( ctx = ctx.baseContext } val targetWindow = dialogWindow ?: activity?.window - @Suppress("DEPRECATION") targetWindow?.let { window -> - window.navigationBarColor = android.graphics.Color.TRANSPARENT + if (Build.VERSION.SDK_INT < 35) { + runCatching { + window.javaClass.getMethod("setNavigationBarColor", Int::class.javaPrimitiveType) + .invoke(window, android.graphics.Color.TRANSPARENT) + } + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { window.isNavigationBarContrastEnforced = false } diff --git a/app/src/main/java/com/demonlab/lune/ui/lyrics/LyricsEditorSheet.kt b/app/src/main/java/com/demonlab/lune/ui/lyrics/LyricsEditorSheet.kt index e53142ae..8d237c45 100644 --- a/app/src/main/java/com/demonlab/lune/ui/lyrics/LyricsEditorSheet.kt +++ b/app/src/main/java/com/demonlab/lune/ui/lyrics/LyricsEditorSheet.kt @@ -34,7 +34,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalView import androidx.compose.ui.window.DialogWindowProvider -import android.view.WindowManager import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.rememberScrollState import coil.compose.AsyncImage @@ -237,8 +236,10 @@ fun LyricsEditorSheet( var parent = view.parent while (parent != null) { if (parent is DialogWindowProvider) { - @Suppress("DEPRECATION") - parent.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) + androidx.core.view.WindowCompat.setDecorFitsSystemWindows(parent.window, false) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + parent.window.setSoftInputMode(0x10) + } break } parent = parent.parent diff --git a/app/src/main/java/com/demonlab/lune/ui/player/PlayerComponents.kt b/app/src/main/java/com/demonlab/lune/ui/player/PlayerComponents.kt index c1e6f624..d794217c 100644 --- a/app/src/main/java/com/demonlab/lune/ui/player/PlayerComponents.kt +++ b/app/src/main/java/com/demonlab/lune/ui/player/PlayerComponents.kt @@ -7,7 +7,6 @@ import android.content.Intent import android.content.pm.PackageManager import android.content.res.Configuration import android.os.Build -import android.os.VibrationEffect import android.os.Vibrator import androidx.core.content.ContextCompat import androidx.compose.animation.* @@ -124,6 +123,7 @@ import com.demonlab.lune.ui.sheets.VisualizerSettingsBottomSheet import com.demonlab.lune.ui.theme.getControlsPrimaryColor import com.demonlab.lune.ui.utils.MaterialExpressiveScallopShape import com.demonlab.lune.ui.utils.bounceClick +import com.demonlab.lune.ui.utils.triggerLightVibration import com.demonlab.lune.ui.utils.formatDuration import com.demonlab.lune.ui.utils.songSwipeGestures import com.demonlab.lune.ui.viewmodels.MusicViewModel @@ -2964,14 +2964,7 @@ fun MiniPlayerMinimized( if (clampedOffset <= -50f && !hasVibrated) { hasVibrated = true - vibrator?.let { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - it.vibrate(VibrationEffect.createOneShot(28, VibrationEffect.DEFAULT_AMPLITUDE)) - } else { - @Suppress("DEPRECATION") - it.vibrate(28) - } - } + vibrator?.triggerLightVibration() } coroutineScope.launch { diff --git a/app/src/main/java/com/demonlab/lune/ui/sheets/BottomSheets.kt b/app/src/main/java/com/demonlab/lune/ui/sheets/BottomSheets.kt index bea02ba2..d77ca079 100644 --- a/app/src/main/java/com/demonlab/lune/ui/sheets/BottomSheets.kt +++ b/app/src/main/java/com/demonlab/lune/ui/sheets/BottomSheets.kt @@ -531,7 +531,6 @@ fun SortBottomSheet( } @OptIn(ExperimentalMaterial3Api::class) -@Suppress("DEPRECATION") @Composable fun EqBottomSheet( playbackManager: PlaybackManager, @@ -1787,7 +1786,6 @@ fun EditSongBottomSheet( } } -@Suppress("DEPRECATION") @Composable fun CustomSleepTimerDialog( currentMinutes: Int, diff --git a/app/src/main/java/com/demonlab/lune/ui/theme/Theme.kt b/app/src/main/java/com/demonlab/lune/ui/theme/Theme.kt index f9abf312..44b8aeb5 100644 --- a/app/src/main/java/com/demonlab/lune/ui/theme/Theme.kt +++ b/app/src/main/java/com/demonlab/lune/ui/theme/Theme.kt @@ -202,9 +202,13 @@ fun LuneTheme( ctx = ctx.baseContext } val window = dialogWindow ?: activity?.window - @Suppress("DEPRECATION") window?.let { win -> - win.navigationBarColor = android.graphics.Color.TRANSPARENT + if (Build.VERSION.SDK_INT < 35) { + runCatching { + win.javaClass.getMethod("setNavigationBarColor", Int::class.javaPrimitiveType) + .invoke(win, android.graphics.Color.TRANSPARENT) + } + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { win.isNavigationBarContrastEnforced = false } diff --git a/app/src/main/java/com/demonlab/lune/ui/utils/Extensions.kt b/app/src/main/java/com/demonlab/lune/ui/utils/Extensions.kt index d7b6933c..1184a8c9 100644 --- a/app/src/main/java/com/demonlab/lune/ui/utils/Extensions.kt +++ b/app/src/main/java/com/demonlab/lune/ui/utils/Extensions.kt @@ -38,9 +38,13 @@ import kotlin.math.sin fun Vibrator.triggerLightVibration() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { this.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK)) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + this.vibrate(VibrationEffect.createOneShot(20, VibrationEffect.DEFAULT_AMPLITUDE)) } else { - @Suppress("DEPRECATION") - this.vibrate(20) + runCatching { + val method = Vibrator::class.java.getMethod("vibrate", Long::class.javaPrimitiveType) + method.invoke(this, 20L) + } } } From c9b6bf5b754f33649d6ed90f3e24270a3542c6eb Mon Sep 17 00:00:00 2001 From: mmdparsa Date: Tue, 3 Nov 2026 20:16:30 +0330 Subject: [PATCH 2/2] Fix Fail Build --- .../main/java/com/demonlab/lune/ui/lyrics/LyricsEditorSheet.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/demonlab/lune/ui/lyrics/LyricsEditorSheet.kt b/app/src/main/java/com/demonlab/lune/ui/lyrics/LyricsEditorSheet.kt index 8d237c45..32386fdc 100644 --- a/app/src/main/java/com/demonlab/lune/ui/lyrics/LyricsEditorSheet.kt +++ b/app/src/main/java/com/demonlab/lune/ui/lyrics/LyricsEditorSheet.kt @@ -2,6 +2,7 @@ package com.demonlab.lune.ui.lyrics import android.content.ClipboardManager import android.content.Context +import android.os.Build import android.os.Vibrator import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult