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.