Auto request battery optimizations are off

If the user reinstalls the app, and then imports their
database, they might end up with timers on but
battery optimizations on as well.
This commit is contained in:
Brandon Presley 2024-02-17 17:42:19 +13:00
parent a0dc62e761
commit 9e3f2fea78
1 changed files with 55 additions and 11 deletions

View File

@ -3,6 +3,7 @@ package com.massive
import android.Manifest import android.Manifest
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.* import android.app.*
import android.content.ActivityNotFoundException
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@ -13,10 +14,12 @@ import android.media.MediaPlayer
import android.net.Uri import android.net.Uri
import android.os.* import android.os.*
import android.util.Log import android.util.Log
import android.widget.Toast
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
class Settings(val sound: String?, val noSound: Boolean, val vibrate: Boolean, val duration: Long) class Settings(val sound: String?, val noSound: Boolean, val vibrate: Boolean, val duration: Long)
@RequiresApi(Build.VERSION_CODES.O) @RequiresApi(Build.VERSION_CODES.O)
@ -53,12 +56,15 @@ class TimerService : Service() {
super.onCreate() super.onCreate()
timerHandler = Handler(Looper.getMainLooper()) timerHandler = Handler(Looper.getMainLooper())
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
applicationContext.registerReceiver(stopReceiver, IntentFilter(STOP_BROADCAST), applicationContext.registerReceiver(
Context.RECEIVER_NOT_EXPORTED) stopReceiver, IntentFilter(STOP_BROADCAST),
applicationContext.registerReceiver(addReceiver, IntentFilter(ADD_BROADCAST), Context.RECEIVER_NOT_EXPORTED
Context.RECEIVER_NOT_EXPORTED) )
} applicationContext.registerReceiver(
else { addReceiver, IntentFilter(ADD_BROADCAST),
Context.RECEIVER_NOT_EXPORTED
)
} else {
applicationContext.registerReceiver(stopReceiver, IntentFilter(STOP_BROADCAST)) applicationContext.registerReceiver(stopReceiver, IntentFilter(STOP_BROADCAST))
applicationContext.registerReceiver(addReceiver, IntentFilter(ADD_BROADCAST)) applicationContext.registerReceiver(addReceiver, IntentFilter(ADD_BROADCAST))
} }
@ -103,6 +109,31 @@ class TimerService : Service() {
return null return null
} }
@SuppressLint("BatteryLife")
fun battery() {
val powerManager =
applicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager
val ignoring =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
powerManager.isIgnoringBatteryOptimizations(
applicationContext.packageName
)
else true
if (ignoring) return
val intent = Intent(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
intent.data = Uri.parse("package:" + applicationContext.packageName)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
try {
applicationContext.startActivity(intent)
} catch (e: ActivityNotFoundException) {
Toast.makeText(
applicationContext,
"Requests to ignore battery optimizations are disabled on your device.",
Toast.LENGTH_LONG
).show()
}
}
@SuppressLint("Range") @SuppressLint("Range")
private fun getSettings(): Settings { private fun getSettings(): Settings {
val db = DatabaseHelper(applicationContext).readableDatabase val db = DatabaseHelper(applicationContext).readableDatabase
@ -152,10 +183,21 @@ class TimerService : Service() {
val stopBroadcast = Intent(STOP_BROADCAST) val stopBroadcast = Intent(STOP_BROADCAST)
stopBroadcast.setPackage(applicationContext.packageName) stopBroadcast.setPackage(applicationContext.packageName)
val pendingStop = val pendingStop =
PendingIntent.getBroadcast(applicationContext, 0, stopBroadcast, PendingIntent.FLAG_IMMUTABLE) PendingIntent.getBroadcast(
val addBroadcast = Intent(ADD_BROADCAST).apply { setPackage(applicationContext.packageName) } applicationContext,
0,
stopBroadcast,
PendingIntent.FLAG_IMMUTABLE
)
val addBroadcast =
Intent(ADD_BROADCAST).apply { setPackage(applicationContext.packageName) }
val pendingAdd = val pendingAdd =
PendingIntent.getBroadcast(applicationContext, 0, addBroadcast, PendingIntent.FLAG_MUTABLE) PendingIntent.getBroadcast(
applicationContext,
0,
addBroadcast,
PendingIntent.FLAG_MUTABLE
)
val notificationBuilder = NotificationCompat.Builder(this, notificationChannelId) val notificationBuilder = NotificationCompat.Builder(this, notificationChannelId)
.setContentTitle(currentDescription) .setContentTitle(currentDescription)
@ -187,9 +229,11 @@ class TimerService : Service() {
private fun vibrate(settings: Settings) { private fun vibrate(settings: Settings) {
if (!settings.vibrate) return if (!settings.vibrate) return
val pattern = longArrayOf(0, settings.duration, 1000, settings.duration, 1000, settings.duration) val pattern =
longArrayOf(0, settings.duration, 1000, settings.duration, 1000, settings.duration)
vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
val vibratorManager = getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager val vibratorManager =
getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
vibratorManager.defaultVibrator vibratorManager.defaultVibrator
} else { } else {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")