From 57f294469726a3ae2be64f8cdba11af127611240 Mon Sep 17 00:00:00 2001 From: machiav3lli Date: Sun, 10 Apr 2022 14:48:32 +0200 Subject: [PATCH] Add: Ignore battery optimization's dialog (to fix crashes on A12+) --- .../looker/droidify/content/Preferences.kt | 6 +++- .../droidify/ui/activities/MainActivityX.kt | 6 ++++ .../com/looker/droidify/utility/Utils.kt | 34 ++++++++++++++++++- src/main/res/values/strings.xml | 5 +++ 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/looker/droidify/content/Preferences.kt b/src/main/kotlin/com/looker/droidify/content/Preferences.kt index e1f37c3b..1b283d38 100644 --- a/src/main/kotlin/com/looker/droidify/content/Preferences.kt +++ b/src/main/kotlin/com/looker/droidify/content/Preferences.kt @@ -37,7 +37,8 @@ object Preferences { Key.Theme, Key.DefaultTab, Key.UpdateNotify, - Key.UpdateUnstable + Key.UpdateUnstable, + Key.IgnoreIgnoreBatteryOptimization ).map { Pair(it.name, it) }.toMap() fun init(context: Context) { @@ -178,6 +179,9 @@ object Preferences { object UpdateNotify : Key("update_notify", Value.BooleanValue(true)) object UpdateUnstable : Key("update_unstable", Value.BooleanValue(false)) + + object IgnoreIgnoreBatteryOptimization : + Key("ignore_ignore_battery_optimization", Value.BooleanValue(false)) } sealed class AutoSync(override val valueString: String) : Enumeration { diff --git a/src/main/kotlin/com/looker/droidify/ui/activities/MainActivityX.kt b/src/main/kotlin/com/looker/droidify/ui/activities/MainActivityX.kt index 2bbf06eb..2b9cb2d4 100644 --- a/src/main/kotlin/com/looker/droidify/ui/activities/MainActivityX.kt +++ b/src/main/kotlin/com/looker/droidify/ui/activities/MainActivityX.kt @@ -3,6 +3,7 @@ package com.looker.droidify.ui.activities import android.content.Context import android.content.Intent import android.os.Bundle +import android.os.PowerManager import android.view.Menu import android.view.MenuItem import android.view.inputmethod.InputMethodManager @@ -31,6 +32,7 @@ import com.looker.droidify.ui.fragments.Source import com.looker.droidify.ui.viewmodels.MainActivityViewModelX import com.looker.droidify.utility.extension.android.Android import com.looker.droidify.utility.extension.text.nullIfEmpty +import com.looker.droidify.utility.showBatteryOptimizationDialog import kotlinx.coroutines.launch import kotlin.properties.Delegates @@ -52,6 +54,7 @@ class MainActivityX : AppCompatActivity() { lateinit var appBarConfiguration: AppBarConfiguration private lateinit var navController: NavController private val viewModel: MainActivityViewModelX by viewModels() + private lateinit var powerManager: PowerManager val menuSetup = MutableLiveData() val syncConnection = Connection(SyncService::class.java, onBind = { _, _ -> @@ -95,6 +98,7 @@ class MainActivityX : AppCompatActivity() { setupActionBarWithNavController(navController, appBarConfiguration) binding.bottomNavigation.selectedItemId = currentTab + powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager if (savedInstanceState == null && (intent.flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { handleIntent(intent) } @@ -117,6 +121,8 @@ class MainActivityX : AppCompatActivity() { super.onResume() if (currentTheme != Preferences[Preferences.Key.Theme].getResId(resources.configuration)) recreate() + if (!powerManager.isIgnoringBatteryOptimizations(this.packageName) && !Preferences[Preferences.Key.IgnoreIgnoreBatteryOptimization]) + showBatteryOptimizationDialog() } override fun onSupportNavigateUp(): Boolean { diff --git a/src/main/kotlin/com/looker/droidify/utility/Utils.kt b/src/main/kotlin/com/looker/droidify/utility/Utils.kt index 03107957..fbd1bda4 100644 --- a/src/main/kotlin/com/looker/droidify/utility/Utils.kt +++ b/src/main/kotlin/com/looker/droidify/utility/Utils.kt @@ -3,11 +3,19 @@ package com.looker.droidify.utility import android.app.ActivityManager import android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND import android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE +import android.content.ActivityNotFoundException import android.content.Context +import android.content.DialogInterface +import android.content.Intent import android.content.pm.PackageInfo import android.content.pm.Signature import android.content.res.Configuration import android.graphics.drawable.Drawable +import android.net.Uri +import android.os.PowerManager +import android.provider.Settings +import android.widget.Toast +import androidx.appcompat.app.AlertDialog import com.looker.droidify.BuildConfig import com.looker.droidify.PREFS_LANGUAGE_DEFAULT import com.looker.droidify.R @@ -193,4 +201,28 @@ val isBlackTheme: Boolean is Preferences.Theme.Amoled -> true is Preferences.Theme.AmoledSystem -> true else -> false - } \ No newline at end of file + } + +fun Context.showBatteryOptimizationDialog() { + AlertDialog.Builder(this) + .setTitle(R.string.ignore_battery_optimization_title) + .setMessage(R.string.ignore_battery_optimization_message) + .setPositiveButton(R.string.dialog_approve) { dialog: DialogInterface?, _: Int -> + val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) + intent.data = Uri.parse("package:" + this.packageName) + try { + startActivity(intent) + } catch (e: ActivityNotFoundException) { + Toast.makeText( + this, + R.string.ignore_battery_optimization_not_supported, + Toast.LENGTH_LONG + ).show() + Preferences[Preferences.Key.IgnoreIgnoreBatteryOptimization] = true + } + } + .setNeutralButton(R.string.dialog_refuse) { _: DialogInterface?, _: Int -> + Preferences[Preferences.Key.IgnoreIgnoreBatteryOptimization] = true + } + .show() +} \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 54484d9e..fbe796c2 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -189,4 +189,9 @@ Default Tab Pending Installing + Ignore Battery Optimization + Starting Android 12 there\'s restrictions on running foreground services causing the app to crash on downloads. To prevent this, you should turn off the battery optimization + The device doesn\'t support ignoring battery optimizations! + Don\'t need it + Let\'s do it!