From 54393ca88894634304fd65b04d8b9fe3f964bbc7 Mon Sep 17 00:00:00 2001 From: Valeri Gokadze Date: Wed, 4 Dec 2024 18:48:43 +0400 Subject: [PATCH] Add support for Android 14-15 --- app/build.gradle | 6 ++-- app/proguard-rules.pro | 5 ++++ .../base/AbsSlidingMusicPanelActivity.kt | 2 +- .../AppShortcutLauncherActivity.kt | 1 + .../retromusic/dialogs/SleepTimerDialog.kt | 23 +++++++++++++++ .../fragments/base/AbsPlayerFragment.kt | 2 +- .../fragments/player/CoverLyricsFragment.kt | 4 +-- .../fragments/player/normal/PlayerFragment.kt | 2 +- .../settings/NotificationSettingsFragment.kt | 2 +- .../settings/NowPlayingSettingsFragment.kt | 2 +- .../retromusic/glide/RetroGlideExtension.kt | 13 +++++---- .../helper/HorizontalAdapterHelper.kt | 3 +- .../retromusic/helper/menu/SongMenuHelper.kt | 3 +- .../retromusic/service/LocalPlayback.kt | 7 +++-- .../monkey/retromusic/service/MusicService.kt | 6 ++-- appthemehelper/build.gradle | 11 +++++--- gradle/libs.versions.toml | 28 +++++++++---------- 17 files changed, 81 insertions(+), 39 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d71bbfdc3..dd2f699d4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,11 +69,11 @@ android { warning 'ImpliedQuantity', 'Instantiatable', 'MissingQuantity', 'MissingTranslation', 'StringFormatInvalid' } compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } kotlinOptions { - jvmTarget = "17" + jvmTarget = "21" } dependenciesInfo { includeInApk = false diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 7aa3313de..49498d773 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -20,6 +20,11 @@ # debugging stack traces. -keepattributes SourceFile,LineNumberTable +# required after agp 8 made r8 full mode default +-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken +-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken +-keep,allowobfuscation,allowshrinking public class * implements java.lang.reflect.Type + # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt index a7ac69397..67c61ca5a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt @@ -252,7 +252,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this) } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { when (key) { SWIPE_DOWN_DISMISS -> { bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt index 502ff0e71..3c551c17b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt @@ -68,6 +68,7 @@ class AppShortcutLauncherActivity : Activity() { INTENT_EXTRA_PLAYLIST to playlist, INTENT_EXTRA_SHUFFLE_MODE to shuffleMode ) + intent.setPackage(this.packageName) intent.putExtras(bundle) diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt index 75bc9b436..a187a7f46 100755 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt @@ -131,6 +131,29 @@ class SleepTimerDialog : DialogFragment() { SystemClock.elapsedRealtime() + minutes * 60 * 1000 PreferenceUtil.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt() val am = requireContext().getSystemService() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if (am?.canScheduleExactAlarms() == false) { + Intent().also { intent -> + intent.action = Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM + context.startActivity(intent) + } + } else { + am?.setExact( + AlarmManager.ELAPSED_REALTIME_WAKEUP, + nextSleepTimerElapsedTime, + pi + ) + + Toast.makeText( + requireContext(), + requireContext().resources.getString( + R.string.sleep_timer_set, + minutes + ), + Toast.LENGTH_SHORT + ).show() + } + } if (VersionUtils.hasS() && am?.canScheduleExactAlarms() != true) { Toast.makeText( diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt index 91f8b9921..bb0950950 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt @@ -374,7 +374,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme e1: MotionEvent?, e2: MotionEvent, distanceX: Float, - distanceY: Float + distanceY: Float, ): Boolean { return when { abs(distanceX) > abs(distanceY) -> { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt index ee32e72d3..afd18c347 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt @@ -69,9 +69,9 @@ class CoverLyricsFragment : AbsMusicServiceFragment(R.layout.fragment_cover_lyri } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { if (key == SHOW_LYRICS) { - if (sharedPreferences?.getBoolean(key, false) == true) { + if (sharedPreferences.getBoolean(key, false) == true) { progressViewUpdateHelper?.start() binding.root.isVisible = true updateLyrics() diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt index 45bbac39d..7d0fef4a8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerFragment.kt @@ -152,7 +152,7 @@ class PlayerFragment : AbsPlayerFragment(R.layout.fragment_player), ) } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { if (key == SNOWFALL) { startOrStopSnow(PreferenceUtil.isSnowFalling) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NotificationSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NotificationSettingsFragment.kt index 2abffa6b0..d18f3430a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NotificationSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NotificationSettingsFragment.kt @@ -31,7 +31,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil class NotificationSettingsFragment : AbsSettingsFragment(), SharedPreferences.OnSharedPreferenceChangeListener { - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { if (key == CLASSIC_NOTIFICATION) { if (VERSION.SDK_INT >= VERSION_CODES.O) { findPreference(COLORED_NOTIFICATION)?.isEnabled = diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt index 753707659..586312974 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt @@ -72,7 +72,7 @@ class NowPlayingSettingsFragment : AbsSettingsFragment(), PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this) } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { when (key) { NOW_PLAYING_SCREEN_ID -> updateNowPlayingScreenSummary() ALBUM_COVER_STYLE -> updateAlbumCoverStyleSummary() diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt b/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt index 11439ace9..fa12ad39a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt +++ b/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt @@ -39,11 +39,14 @@ import java.io.File object RetroGlideExtension { - private const val DEFAULT_ARTIST_IMAGE = - R.drawable.default_artist_art - private const val DEFAULT_SONG_IMAGE: Int = R.drawable.default_audio_art - private const val DEFAULT_ALBUM_IMAGE = R.drawable.default_album_art - private const val DEFAULT_ERROR_IMAGE_BANNER = R.drawable.material_design_default + private val DEFAULT_ARTIST_IMAGE + get() = R.drawable.default_artist_art + private val DEFAULT_SONG_IMAGE: Int + get() = R.drawable.default_audio_art + private val DEFAULT_ALBUM_IMAGE + get() = R.drawable.default_album_art + private val DEFAULT_ERROR_IMAGE_BANNER + get() = R.drawable.material_design_default private val DEFAULT_DISK_CACHE_STRATEGY_ARTIST = DiskCacheStrategy.RESOURCE private val DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.NONE diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/HorizontalAdapterHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/HorizontalAdapterHelper.kt index f98508bf8..56b6990cf 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/HorizontalAdapterHelper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/HorizontalAdapterHelper.kt @@ -20,7 +20,8 @@ import code.name.monkey.retromusic.R object HorizontalAdapterHelper { - const val LAYOUT_RES = R.layout.item_image + val LAYOUT_RES + get() = R.layout.item_image private const val TYPE_FIRST = 1 private const val TYPE_MIDDLE = 2 diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt index 801c2b209..59b1d0eb0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt @@ -48,7 +48,8 @@ import org.koin.core.component.get import java.io.File object SongMenuHelper : KoinComponent { - const val MENU_RES = R.menu.menu_item_song + val MENU_RES + get() = R.menu.menu_item_song fun handleMenuClick(activity: FragmentActivity, song: Song, menuItemId: Int): Boolean { val libraryViewModel = activity.getViewModel() as LibraryViewModel diff --git a/app/src/main/java/code/name/monkey/retromusic/service/LocalPlayback.kt b/app/src/main/java/code/name/monkey/retromusic/service/LocalPlayback.kt index 429867051..07ab35fcb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/LocalPlayback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/LocalPlayback.kt @@ -9,6 +9,7 @@ import android.media.AudioManager import android.media.MediaPlayer import android.media.PlaybackParams import androidx.annotation.CallSuper +import androidx.core.content.ContextCompat import androidx.core.content.getSystemService import androidx.core.net.toUri import androidx.media.AudioAttributesCompat @@ -157,9 +158,11 @@ abstract class LocalPlayback(val context: Context) : Playback, MediaPlayer.OnErr private fun registerBecomingNoisyReceiver() { if (!becomingNoisyReceiverRegistered) { - context.registerReceiver( + ContextCompat.registerReceiver( + context, becomingNoisyReceiver, - becomingNoisyReceiverIntentFilter + becomingNoisyReceiverIntentFilter, + ContextCompat.RECEIVER_EXPORTED ) becomingNoisyReceiverRegistered = true } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 77cabfc87..078c8d575 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -633,7 +633,9 @@ class MusicService : MediaBrowserServiceCompat(), } } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + override fun onSharedPreferenceChanged( + sharedPreferences: SharedPreferences, key: String?, + ) { when (key) { PLAYBACK_SPEED, PLAYBACK_PITCH -> { updateMediaSessionPlaybackState() @@ -1276,7 +1278,7 @@ class MusicService : MediaBrowserServiceCompat(), private fun registerHeadsetEvents() { if (!headsetReceiverRegistered && isHeadsetPlugged) { - registerReceiver(headsetReceiver, headsetReceiverIntentFilter) + ContextCompat.registerReceiver(this, headsetReceiver, headsetReceiverIntentFilter, ContextCompat.RECEIVER_EXPORTED) headsetReceiverRegistered = true } } diff --git a/appthemehelper/build.gradle b/appthemehelper/build.gradle index 480af3bcc..999c0efb4 100644 --- a/appthemehelper/build.gradle +++ b/appthemehelper/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { - compileSdk 35 + compileSdk 34 namespace "code.name.monkey.appthemehelper" defaultConfig { minSdk 21 - targetSdk 35 + targetSdk 34 } buildTypes { release { @@ -18,8 +18,11 @@ android { abortOnError false } compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 + } + kotlinOptions { + jvmTarget = "21" } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 694e003d5..8e849818b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ jetradarmobile_androidSnowfall_version = "1.2.1" tankery_circularSeekBar_version = "1.4.2" retrofit_version = "2.9.0" afollestad_dialog_version = "3.3.0" -coreSplashscreen = "1.0.0" +coreSplashscreen = "1.0.1" customactivityoncrash = "2.4.0" fadingedgelayout = "1.0.0" google_featureDelivery_version = "2.1.0" @@ -15,30 +15,30 @@ chrisbanes_insetter_version = "0.6.1" jaudiotagger = "2.3.15" yslibrary_keyboardvisibilityevent_version = "3.0.0-RC3" koinAndroid = "3.4.0" -kotlinGradlePlugin = "1.8.10" +kotlinGradlePlugin = "1.9.22" -kotlinxCoroutinesAndroid = "1.6.4" -android_tab_library_version = "2.0.3" +kotlinxCoroutinesAndroid = "1.7.3" +android_tab_library_version = "2.2.0" fast_scroll_libraryVersion = "1.2.0" -lifecycle_version = "2.6.1" +lifecycle_version = "2.7.0" okhttp3_loggingInterceptor_version = "5.0.0-alpha.9" afollestad_materialCab_version = "2.0.1" materialIntro = "2.0.0" -mediarouter = "1.3.1" +mediarouter = "1.6.0" nanohttpd = "2.3.1" -navigation_version = "2.5.3" -mdc_version = "1.9.0-beta01" +navigation_version = "2.7.6" +mdc_version = "1.9.0" glide_version = "4.15.1" orgEclipseEgitGithubCore = "2.1.5" playServicesCastFramework = "21.3.0" -preference_version = "1.2.0" +preference_version = "1.2.1" appcompat_version = "1.6.1" google_play_review_version = "2.0.1" -room_version = "2.5.1" -core_version = "1.10.0-rc01" +room_version = "2.6.1" +core_version = "1.12.0" #plugins -devTools_ksp_version = "1.8.10-1.0.9" +devTools_ksp_version = "1.9.22-1.0.17" ben_manes_versoin = "0.46.0" slidableactivity = "2.1.0" @@ -111,9 +111,9 @@ nanohttpd = { group = "org.nanohttpd", name = "nanohttpd", version.ref = "nanoht #androidx androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat_version" } -androidx-annotation = { group = "androidx.annotation", name = "annotation", version = "1.6.0" } +androidx-annotation = { group = "androidx.annotation", name = "annotation", version = "1.7.1" } androidx-constraintLayout = { group = "androidx.constraintlayout", name = "constraintlayout", version = "2.1.4" } -androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version = "1.3.0" } +androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version = "1.3.2" } androidx-preference-ktx = { group = "androidx.preference", name = "preference-ktx", version.ref = "preference_version" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core_version" } androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "coreSplashscreen" }