Merge pull request #1671 from tomaThomas/sleep-timer-android-14

Fix sleep timer crash on Android 14+
This commit is contained in:
Hemanth Savarala 2024-10-19 23:02:17 +05:30 committed by GitHub
commit 24e6f23c1d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 59 additions and 12 deletions

View file

@ -66,7 +66,7 @@ android {
} }
lint { lint {
abortOnError true abortOnError true
warning 'ImpliedQuantity', 'Instantiatable', 'MissingQuantity', 'MissingTranslation' warning 'ImpliedQuantity', 'Instantiatable', 'MissingQuantity', 'MissingTranslation', 'StringFormatInvalid'
} }
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_17 sourceCompatibility JavaVersion.VERSION_17

View file

@ -6,7 +6,9 @@
android:name="android.permission.BLUETOOTH" android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" /> android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> <uses-permission
android:name="android.permission.SCHEDULE_EXACT_ALARM"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission <uses-permission

View file

@ -15,6 +15,7 @@
package code.name.monkey.retromusic.activities package code.name.monkey.retromusic.activities
import android.Manifest.permission.BLUETOOTH_CONNECT import android.Manifest.permission.BLUETOOTH_CONNECT
import android.app.AlarmManager
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.res.ColorStateList import android.content.res.ColorStateList
@ -24,6 +25,7 @@ import android.provider.Settings
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.getSystemService
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.text.parseAsHtml import androidx.core.text.parseAsHtml
import androidx.core.view.isVisible import androidx.core.view.isVisible
@ -67,6 +69,11 @@ class PermissionActivity : AbsMusicServiceActivity() {
BLUETOOTH_PERMISSION_REQUEST BLUETOOTH_PERMISSION_REQUEST
) )
} }
binding.alarmPermission.show()
binding.alarmPermission.setButtonClick {
val intent = Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM)
startActivity(intent)
}
} else { } else {
binding.audioPermission.setNumber("2") binding.audioPermission.setNumber("2")
} }
@ -124,6 +131,11 @@ class PermissionActivity : AbsMusicServiceActivity() {
binding.bluetoothPermission.checkImage.imageTintList = binding.bluetoothPermission.checkImage.imageTintList =
ColorStateList.valueOf(accentColor()) 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 { private fun hasAudioPermission(): Boolean {
return Settings.System.canWrite(this) return Settings.System.canWrite(this)
} }
@RequiresApi(Build.VERSION_CODES.S)
private fun hasAlarmPermission(): Boolean {
return getSystemService<AlarmManager>()?.canScheduleExactAlarms() == true
}
} }

View file

@ -19,9 +19,11 @@ import android.app.Dialog
import android.app.PendingIntent import android.app.PendingIntent
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.CountDownTimer import android.os.CountDownTimer
import android.os.SystemClock import android.os.SystemClock
import android.provider.Settings
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
@ -129,17 +131,27 @@ 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>()
am?.setExact(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
nextSleepTimerElapsedTime,
pi
)
Toast.makeText( if (VersionUtils.hasS() && am?.canScheduleExactAlarms() != true) {
requireContext(), Toast.makeText(
requireContext().resources.getString(R.string.sleep_timer_set, minutes), requireContext(),
Toast.LENGTH_SHORT requireContext().resources.getString(R.string.sleep_timer_no_permission),
).show() 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) setView(binding.root)

View file

@ -78,6 +78,19 @@
app:permissionTitleNumber="3" app:permissionTitleNumber="3"
app:permissionTitleSubTitle="@string/ringtone_summary" app:permissionTitleSubTitle="@string/ringtone_summary"
tools:visibility="visible" /> tools:visibility="visible" />
<code.name.monkey.retromusic.views.PermissionItem
android:id="@+id/alarm_permission"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="@integer/permission_layout_weight"
android:visibility="gone"
app:permissionButtonTitle="@string/grant_access"
app:permissionIcon="@drawable/ic_phonelink_ring"
app:permissionTitle="@string/permission_alarm_title"
app:permissionTitleNumber="4"
app:permissionTitleSubTitle="@string/permission_alarm_summary"
tools:visibility="visible" />
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

View file

@ -456,6 +456,8 @@
<string name="retro_music_pro">Retro Music Pro</string> <string name="retro_music_pro">Retro Music Pro</string>
<string name="ringtone_summary">The app needs permission to access your device settings in order to set music as Ringtone</string> <string name="ringtone_summary">The app needs permission to access your device settings in order to set music as Ringtone</string>
<string name="ringtone_title">Ringtone (Optional)</string> <string name="ringtone_title">Ringtone (Optional)</string>
<string name="permission_alarm_summary">The app needs permission to schedule exact alarms to set sleep timers</string>
<string name="permission_alarm_title">Alarm (Optional)</string>
<string name="saf_delete_failed">File delete failed: %s</string> <string name="saf_delete_failed">File delete failed: %s</string>
<!-- SAF --> <!-- SAF -->
<string name="saf_error_uri">Can\'t get SAF URI</string> <string name="saf_error_uri">Can\'t get SAF URI</string>
@ -563,4 +565,5 @@
<string name="you_will_be_forwarded_to_the_issue_tracker_website">You will be forwarded to the issue tracker website.</string> <string name="you_will_be_forwarded_to_the_issue_tracker_website">You will be forwarded to the issue tracker website.</string>
<string name="your_account_data_is_only_used_for_authentication">Your account data is only used for authentication.</string> <string name="your_account_data_is_only_used_for_authentication">Your account data is only used for authentication.</string>
<string name="could_not_write_tags_to_file">Could not write tags to the music file!</string> <string name="could_not_write_tags_to_file">Could not write tags to the music file!</string>
<string name="sleep_timer_no_permission">No permission to schedule alarms, please allow Retro Music.</string>
</resources> </resources>