diff --git a/app/build.gradle b/app/build.gradle index 871bb1f58..d71bbfdc3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,7 +66,7 @@ android { } lint { abortOnError true - warning 'ImpliedQuantity', 'Instantiatable', 'MissingQuantity', 'MissingTranslation' + warning 'ImpliedQuantity', 'Instantiatable', 'MissingQuantity', 'MissingTranslation', 'StringFormatInvalid' } compileOptions { sourceCompatibility JavaVersion.VERSION_17 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ebee6ad1f..a58f749b0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,9 @@ android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> - + ()?.canScheduleExactAlarms() == true + } } 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 906fb83ea..75bc9b436 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 @@ -19,9 +19,11 @@ import android.app.Dialog import android.app.PendingIntent import android.content.DialogInterface import android.content.Intent +import android.os.Build import android.os.Bundle import android.os.CountDownTimer import android.os.SystemClock +import android.provider.Settings import android.widget.CheckBox import android.widget.SeekBar import android.widget.TextView @@ -129,17 +131,27 @@ class SleepTimerDialog : DialogFragment() { SystemClock.elapsedRealtime() + minutes * 60 * 1000 PreferenceUtil.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt() val am = requireContext().getSystemService() - 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( + requireContext(), + requireContext().resources.getString(R.string.sleep_timer_no_permission), + Toast.LENGTH_SHORT + ).show() + val intent = Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) + 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() + } } } setView(binding.root) diff --git a/app/src/main/res/layout/activity_permission.xml b/app/src/main/res/layout/activity_permission.xml index d25afeb41..bfc23e3ca 100644 --- a/app/src/main/res/layout/activity_permission.xml +++ b/app/src/main/res/layout/activity_permission.xml @@ -78,6 +78,19 @@ app:permissionTitleNumber="3" app:permissionTitleSubTitle="@string/ringtone_summary" tools:visibility="visible" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e9609c7c1..a86c5899e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -456,6 +456,8 @@ Retro Music Pro The app needs permission to access your device settings in order to set music as Ringtone Ringtone (Optional) + The app needs permission to schedule exact alarms to set sleep timers + Alarm (Optional) File delete failed: %s Can\'t get SAF URI @@ -563,4 +565,5 @@ You will be forwarded to the issue tracker website. Your account data is only used for authentication. Could not write tags to the music file! + No permission to schedule alarms, please allow Retro Music.