mirror of
https://github.com/cmclark00/RetroMusicPlayer.git
synced 2025-05-17 23:55:21 +01:00
Merge pull request #1671 from tomaThomas/sleep-timer-android-14
Fix sleep timer crash on Android 14+
This commit is contained in:
commit
24e6f23c1d
6 changed files with 59 additions and 12 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue