From df58f7a17be3068deea3ed900e9c5ab498c8337f Mon Sep 17 00:00:00 2001 From: tomaThomas Date: Fri, 11 Oct 2024 17:38:32 +0200 Subject: [PATCH 1/2] Request alarm permissions for sleep timer --- .../activities/PermissionActivity.kt | 17 ++++++++++ .../retromusic/dialogs/SleepTimerDialog.kt | 32 +++++++++++++------ .../main/res/layout/activity_permission.xml | 13 ++++++++ app/src/main/res/values/strings.xml | 3 ++ 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt index 67850d8ed..810a58028 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt @@ -15,6 +15,7 @@ package code.name.monkey.retromusic.activities import android.Manifest.permission.BLUETOOTH_CONNECT +import android.app.AlarmManager import android.content.Intent import android.content.pm.PackageManager import android.content.res.ColorStateList @@ -24,6 +25,7 @@ import android.provider.Settings import androidx.activity.OnBackPressedCallback import androidx.annotation.RequiresApi import androidx.core.app.ActivityCompat +import androidx.core.content.getSystemService import androidx.core.net.toUri import androidx.core.text.parseAsHtml import androidx.core.view.isVisible @@ -67,6 +69,11 @@ class PermissionActivity : AbsMusicServiceActivity() { BLUETOOTH_PERMISSION_REQUEST ) } + binding.alarmPermission.show() + binding.alarmPermission.setButtonClick { + val intent = Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) + startActivity(intent) + } } else { binding.audioPermission.setNumber("2") } @@ -124,6 +131,11 @@ class PermissionActivity : AbsMusicServiceActivity() { binding.bluetoothPermission.checkImage.imageTintList = ColorStateList.valueOf(accentColor()) } + if (hasAlarmPermission()) { + binding.alarmPermission.checkImage.isVisible = true + binding.alarmPermission.checkImage.imageTintList = + ColorStateList.valueOf(accentColor()) + } } } @@ -143,4 +155,9 @@ class PermissionActivity : AbsMusicServiceActivity() { private fun hasAudioPermission(): Boolean { return Settings.System.canWrite(this) } + + @RequiresApi(Build.VERSION_CODES.S) + private fun hasAlarmPermission(): Boolean { + return getSystemService()?.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. From fd31db5686decf1cc4e7a9a9bfe018db9395ac96 Mon Sep 17 00:00:00 2001 From: tomaThomas Date: Fri, 18 Oct 2024 23:39:04 +0200 Subject: [PATCH 2/2] Fix some linter issues --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3c30219dd..3624e5743 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -65,7 +65,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" /> - +