Add support for Android 14-15

This commit is contained in:
Valeri Gokadze 2024-12-04 18:48:43 +04:00
parent 6752ae2afa
commit 54393ca888
17 changed files with 81 additions and 39 deletions

View file

@ -69,11 +69,11 @@ android {
warning 'ImpliedQuantity', 'Instantiatable', 'MissingQuantity', 'MissingTranslation', 'StringFormatInvalid' warning 'ImpliedQuantity', 'Instantiatable', 'MissingQuantity', 'MissingTranslation', 'StringFormatInvalid'
} }
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_17 sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_21
} }
kotlinOptions { kotlinOptions {
jvmTarget = "17" jvmTarget = "21"
} }
dependenciesInfo { dependenciesInfo {
includeInApk = false includeInApk = false

View file

@ -20,6 +20,11 @@
# debugging stack traces. # debugging stack traces.
-keepattributes SourceFile,LineNumberTable -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 # If you keep the line number information, uncomment this to
# hide the original source file name. # hide the original source file name.
#-renamesourcefileattribute SourceFile #-renamesourcefileattribute SourceFile

View file

@ -252,7 +252,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this) PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this)
} }
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
when (key) { when (key) {
SWIPE_DOWN_DISMISS -> { SWIPE_DOWN_DISMISS -> {
bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss

View file

@ -68,6 +68,7 @@ class AppShortcutLauncherActivity : Activity() {
INTENT_EXTRA_PLAYLIST to playlist, INTENT_EXTRA_PLAYLIST to playlist,
INTENT_EXTRA_SHUFFLE_MODE to shuffleMode INTENT_EXTRA_SHUFFLE_MODE to shuffleMode
) )
intent.setPackage(this.packageName)
intent.putExtras(bundle) intent.putExtras(bundle)

View file

@ -131,6 +131,29 @@ class SleepTimerDialog : DialogFragment() {
SystemClock.elapsedRealtime() + minutes * 60 * 1000 SystemClock.elapsedRealtime() + minutes * 60 * 1000
PreferenceUtil.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt() PreferenceUtil.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt()
val am = requireContext().getSystemService<AlarmManager>() val am = requireContext().getSystemService<AlarmManager>()
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) { if (VersionUtils.hasS() && am?.canScheduleExactAlarms() != true) {
Toast.makeText( Toast.makeText(

View file

@ -374,7 +374,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme
e1: MotionEvent?, e1: MotionEvent?,
e2: MotionEvent, e2: MotionEvent,
distanceX: Float, distanceX: Float,
distanceY: Float distanceY: Float,
): Boolean { ): Boolean {
return when { return when {
abs(distanceX) > abs(distanceY) -> { abs(distanceX) > abs(distanceY) -> {

View file

@ -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 (key == SHOW_LYRICS) {
if (sharedPreferences?.getBoolean(key, false) == true) { if (sharedPreferences.getBoolean(key, false) == true) {
progressViewUpdateHelper?.start() progressViewUpdateHelper?.start()
binding.root.isVisible = true binding.root.isVisible = true
updateLyrics() updateLyrics()

View file

@ -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) { if (key == SNOWFALL) {
startOrStopSnow(PreferenceUtil.isSnowFalling) startOrStopSnow(PreferenceUtil.isSnowFalling)
} }

View file

@ -31,7 +31,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil
class NotificationSettingsFragment : AbsSettingsFragment(), class NotificationSettingsFragment : AbsSettingsFragment(),
SharedPreferences.OnSharedPreferenceChangeListener { SharedPreferences.OnSharedPreferenceChangeListener {
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
if (key == CLASSIC_NOTIFICATION) { if (key == CLASSIC_NOTIFICATION) {
if (VERSION.SDK_INT >= VERSION_CODES.O) { if (VERSION.SDK_INT >= VERSION_CODES.O) {
findPreference<Preference>(COLORED_NOTIFICATION)?.isEnabled = findPreference<Preference>(COLORED_NOTIFICATION)?.isEnabled =

View file

@ -72,7 +72,7 @@ class NowPlayingSettingsFragment : AbsSettingsFragment(),
PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this) PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this)
} }
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
when (key) { when (key) {
NOW_PLAYING_SCREEN_ID -> updateNowPlayingScreenSummary() NOW_PLAYING_SCREEN_ID -> updateNowPlayingScreenSummary()
ALBUM_COVER_STYLE -> updateAlbumCoverStyleSummary() ALBUM_COVER_STYLE -> updateAlbumCoverStyleSummary()

View file

@ -39,11 +39,14 @@ import java.io.File
object RetroGlideExtension { object RetroGlideExtension {
private const val DEFAULT_ARTIST_IMAGE = private val DEFAULT_ARTIST_IMAGE
R.drawable.default_artist_art get() = R.drawable.default_artist_art
private const val DEFAULT_SONG_IMAGE: Int = R.drawable.default_audio_art private val DEFAULT_SONG_IMAGE: Int
private const val DEFAULT_ALBUM_IMAGE = R.drawable.default_album_art get() = R.drawable.default_audio_art
private const val DEFAULT_ERROR_IMAGE_BANNER = R.drawable.material_design_default 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_ARTIST = DiskCacheStrategy.RESOURCE
private val DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.NONE private val DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.NONE

View file

@ -20,7 +20,8 @@ import code.name.monkey.retromusic.R
object HorizontalAdapterHelper { 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_FIRST = 1
private const val TYPE_MIDDLE = 2 private const val TYPE_MIDDLE = 2

View file

@ -48,7 +48,8 @@ import org.koin.core.component.get
import java.io.File import java.io.File
object SongMenuHelper : KoinComponent { 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 { fun handleMenuClick(activity: FragmentActivity, song: Song, menuItemId: Int): Boolean {
val libraryViewModel = activity.getViewModel() as LibraryViewModel val libraryViewModel = activity.getViewModel() as LibraryViewModel

View file

@ -9,6 +9,7 @@ import android.media.AudioManager
import android.media.MediaPlayer import android.media.MediaPlayer
import android.media.PlaybackParams import android.media.PlaybackParams
import androidx.annotation.CallSuper import androidx.annotation.CallSuper
import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.media.AudioAttributesCompat import androidx.media.AudioAttributesCompat
@ -157,9 +158,11 @@ abstract class LocalPlayback(val context: Context) : Playback, MediaPlayer.OnErr
private fun registerBecomingNoisyReceiver() { private fun registerBecomingNoisyReceiver() {
if (!becomingNoisyReceiverRegistered) { if (!becomingNoisyReceiverRegistered) {
context.registerReceiver( ContextCompat.registerReceiver(
context,
becomingNoisyReceiver, becomingNoisyReceiver,
becomingNoisyReceiverIntentFilter becomingNoisyReceiverIntentFilter,
ContextCompat.RECEIVER_EXPORTED
) )
becomingNoisyReceiverRegistered = true becomingNoisyReceiverRegistered = true
} }

View file

@ -633,7 +633,9 @@ class MusicService : MediaBrowserServiceCompat(),
} }
} }
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(
sharedPreferences: SharedPreferences, key: String?,
) {
when (key) { when (key) {
PLAYBACK_SPEED, PLAYBACK_PITCH -> { PLAYBACK_SPEED, PLAYBACK_PITCH -> {
updateMediaSessionPlaybackState() updateMediaSessionPlaybackState()
@ -1276,7 +1278,7 @@ class MusicService : MediaBrowserServiceCompat(),
private fun registerHeadsetEvents() { private fun registerHeadsetEvents() {
if (!headsetReceiverRegistered && isHeadsetPlugged) { if (!headsetReceiverRegistered && isHeadsetPlugged) {
registerReceiver(headsetReceiver, headsetReceiverIntentFilter) ContextCompat.registerReceiver(this, headsetReceiver, headsetReceiverIntentFilter, ContextCompat.RECEIVER_EXPORTED)
headsetReceiverRegistered = true headsetReceiverRegistered = true
} }
} }

View file

@ -1,12 +1,12 @@
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
android { android {
compileSdk 35 compileSdk 34
namespace "code.name.monkey.appthemehelper" namespace "code.name.monkey.appthemehelper"
defaultConfig { defaultConfig {
minSdk 21 minSdk 21
targetSdk 35 targetSdk 34
} }
buildTypes { buildTypes {
release { release {
@ -18,8 +18,11 @@ android {
abortOnError false abortOnError false
} }
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_17 sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_21
}
kotlinOptions {
jvmTarget = "21"
} }
} }

View file

@ -5,7 +5,7 @@ jetradarmobile_androidSnowfall_version = "1.2.1"
tankery_circularSeekBar_version = "1.4.2" tankery_circularSeekBar_version = "1.4.2"
retrofit_version = "2.9.0" retrofit_version = "2.9.0"
afollestad_dialog_version = "3.3.0" afollestad_dialog_version = "3.3.0"
coreSplashscreen = "1.0.0" coreSplashscreen = "1.0.1"
customactivityoncrash = "2.4.0" customactivityoncrash = "2.4.0"
fadingedgelayout = "1.0.0" fadingedgelayout = "1.0.0"
google_featureDelivery_version = "2.1.0" google_featureDelivery_version = "2.1.0"
@ -15,30 +15,30 @@ chrisbanes_insetter_version = "0.6.1"
jaudiotagger = "2.3.15" jaudiotagger = "2.3.15"
yslibrary_keyboardvisibilityevent_version = "3.0.0-RC3" yslibrary_keyboardvisibilityevent_version = "3.0.0-RC3"
koinAndroid = "3.4.0" koinAndroid = "3.4.0"
kotlinGradlePlugin = "1.8.10" kotlinGradlePlugin = "1.9.22"
kotlinxCoroutinesAndroid = "1.6.4" kotlinxCoroutinesAndroid = "1.7.3"
android_tab_library_version = "2.0.3" android_tab_library_version = "2.2.0"
fast_scroll_libraryVersion = "1.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" okhttp3_loggingInterceptor_version = "5.0.0-alpha.9"
afollestad_materialCab_version = "2.0.1" afollestad_materialCab_version = "2.0.1"
materialIntro = "2.0.0" materialIntro = "2.0.0"
mediarouter = "1.3.1" mediarouter = "1.6.0"
nanohttpd = "2.3.1" nanohttpd = "2.3.1"
navigation_version = "2.5.3" navigation_version = "2.7.6"
mdc_version = "1.9.0-beta01" mdc_version = "1.9.0"
glide_version = "4.15.1" glide_version = "4.15.1"
orgEclipseEgitGithubCore = "2.1.5" orgEclipseEgitGithubCore = "2.1.5"
playServicesCastFramework = "21.3.0" playServicesCastFramework = "21.3.0"
preference_version = "1.2.0" preference_version = "1.2.1"
appcompat_version = "1.6.1" appcompat_version = "1.6.1"
google_play_review_version = "2.0.1" google_play_review_version = "2.0.1"
room_version = "2.5.1" room_version = "2.6.1"
core_version = "1.10.0-rc01" core_version = "1.12.0"
#plugins #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" ben_manes_versoin = "0.46.0"
slidableactivity = "2.1.0" slidableactivity = "2.1.0"
@ -111,9 +111,9 @@ nanohttpd = { group = "org.nanohttpd", name = "nanohttpd", version.ref = "nanoht
#androidx #androidx
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat_version" } 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-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-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-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core_version" }
androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "coreSplashscreen" } androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "coreSplashscreen" }