From be422f01a2644eb9fccdb8c4a18452f584343752 Mon Sep 17 00:00:00 2001
From: rushiiMachine <33725716+rushiiMachine@users.noreply.github.com>
Date: Sun, 10 Mar 2024 00:04:51 -0800
Subject: [PATCH] feat: prompt to disable battery optimization + warning on
install screen
---
app/src/main/AndroidManifest.xml | 5 +-
.../manager/manager/PreferencesManager.kt | 2 +-
.../manager/ui/components/CustomColors.kt | 41 ++++++++++++
.../aliucord/manager/ui/components/Theme.kt | 17 +++--
.../ui/screens/install/InstallScreen.kt | 7 ++-
.../install/components/MinimizationWarning.kt | 63 +++++++++++++++++++
.../installopts/InstallOptionsScreen.kt | 5 ++
.../com/aliucord/manager/util/Context.kt | 34 +++++++++-
app/src/main/res/values/strings.xml | 1 +
9 files changed, 163 insertions(+), 12 deletions(-)
create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/components/CustomColors.kt
create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/screens/install/components/MinimizationWarning.kt
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a213a2b..28aec09 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,11 +6,12 @@
+
+
-
-
+
{
+ error("No LocalCustomColors provided!")
+}
+
+@Immutable
+data class CustomColors(
+ val warning: Color,
+ val onWarning: Color,
+ val warningContainer: Color,
+ val onWarningContainer: Color,
+)
+
+private val YellowAlt1 = Color(0xFFE9C414)
+private val Shandy = Color(0xFFFFE172)
+private val DarkBrown = Color(0xFF3B2F00)
+private val DarkerBrown = Color(0xFF221B00)
+private val DarkBronze = Color(0xFF554600)
+
+val DarkCustomColors = CustomColors(
+ warning = YellowAlt1,
+ onWarning = DarkBrown,
+ warningContainer = DarkBronze,
+ onWarningContainer = Shandy,
+)
+
+val LightCustomColors = CustomColors(
+ warning = YellowAlt1,
+ onWarning = Color.White,
+ warningContainer = Shandy,
+ onWarningContainer = DarkerBrown,
+)
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/components/Theme.kt b/app/src/main/kotlin/com/aliucord/manager/ui/components/Theme.kt
index a7a3380..53d8f33 100644
--- a/app/src/main/kotlin/com/aliucord/manager/ui/components/Theme.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/components/Theme.kt
@@ -8,8 +8,7 @@ package com.aliucord.manager.ui.components
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.*
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.SideEffect
+import androidx.compose.runtime.*
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@@ -29,6 +28,10 @@ fun ManagerTheme(
isDarkTheme -> darkColorScheme()
else -> lightColorScheme()
}
+ val customColors = when (isDarkTheme) {
+ true -> DarkCustomColors
+ false -> LightCustomColors
+ }
val systemUiController = rememberSystemUiController()
@@ -42,10 +45,12 @@ fun ManagerTheme(
)
}
- MaterialTheme(
- colorScheme = colorScheme,
- content = content
- )
+ CompositionLocalProvider(LocalCustomColors provides customColors) {
+ MaterialTheme(
+ colorScheme = colorScheme,
+ content = content
+ )
+ }
}
enum class Theme {
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallScreen.kt
index 3e97b14..4b64c95 100644
--- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallScreen.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallScreen.kt
@@ -28,8 +28,7 @@ import com.aliucord.manager.installer.steps.StepGroup
import com.aliucord.manager.ui.components.Wakelock
import com.aliucord.manager.ui.components.back
import com.aliucord.manager.ui.components.dialogs.InstallerAbortDialog
-import com.aliucord.manager.ui.screens.install.components.InstallAppBar
-import com.aliucord.manager.ui.screens.install.components.StepGroupCard
+import com.aliucord.manager.ui.screens.install.components.*
import com.aliucord.manager.ui.screens.installopts.InstallOptions
import org.koin.core.parameter.parametersOf
@@ -93,6 +92,10 @@ class InstallScreen(private val data: InstallOptions) : Screen {
.height(8.dp)
.padding(bottom = 4.dp)
)
+
+ MinimizationWarning(
+ modifier = Modifier.fillMaxWidth(),
+ )
}
Column(
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/components/MinimizationWarning.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/components/MinimizationWarning.kt
new file mode 100644
index 0000000..b963d7a
--- /dev/null
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/components/MinimizationWarning.kt
@@ -0,0 +1,63 @@
+package com.aliucord.manager.ui.screens.install.components
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.*
+import androidx.compose.material3.*
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+import com.aliucord.manager.R
+import com.aliucord.manager.ui.components.customColors
+import com.aliucord.manager.util.isIgnoringBatteryOptimizations
+
+@Composable
+fun MinimizationWarning(modifier: Modifier = Modifier) {
+ val context = LocalContext.current
+ val hide = remember(context) { context.isIgnoringBatteryOptimizations() }
+
+ if (hide) return
+
+ Box(
+ contentAlignment = Alignment.Center,
+ modifier = modifier
+ .padding(
+ start = 20.dp,
+ end = 20.dp,
+ top = 20.dp,
+ bottom = 4.dp,
+ )
+ .border(
+ width = 2.dp,
+ color = MaterialTheme.customColors.warning,
+ shape = MaterialTheme.shapes.medium,
+ )
+ .clip(MaterialTheme.shapes.medium)
+ .background(MaterialTheme.customColors.warningContainer)
+ ) {
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(12.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ modifier = Modifier
+ .padding(horizontal = 20.dp, vertical = 14.dp)
+ ) {
+ Icon(
+ painter = painterResource(R.drawable.ic_warning),
+ tint = MaterialTheme.customColors.onWarningContainer,
+ contentDescription = null,
+ modifier = Modifier.size(28.dp),
+ )
+
+ Text(
+ text = stringResource(R.string.installer_minimization_warning),
+ style = MaterialTheme.typography.labelMedium,
+ )
+ }
+ }
+}
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/installopts/InstallOptionsScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/installopts/InstallOptionsScreen.kt
index 3155155..e569616 100644
--- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/installopts/InstallOptionsScreen.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/installopts/InstallOptionsScreen.kt
@@ -26,6 +26,8 @@ import com.aliucord.manager.ui.screens.installopts.components.PackageNameState
import com.aliucord.manager.ui.screens.installopts.components.options.SwitchInstallOption
import com.aliucord.manager.ui.screens.installopts.components.options.TextInstallOption
import com.aliucord.manager.ui.util.*
+import com.aliucord.manager.util.isIgnoringBatteryOptimizations
+import com.aliucord.manager.util.requestNoBatteryOptimizations
class InstallOptionsScreen(
private val supportedVersion: DiscordVersion = DiscordVersion.None,
@@ -40,6 +42,9 @@ class InstallOptionsScreen(
LaunchedEffect(Unit) {
InstallNotifications.requestPermissions(context)
+
+ if (!context.isIgnoringBatteryOptimizations())
+ context.requestNoBatteryOptimizations()
}
Scaffold(
diff --git a/app/src/main/kotlin/com/aliucord/manager/util/Context.kt b/app/src/main/kotlin/com/aliucord/manager/util/Context.kt
index 1e54fe7..7e7f893 100644
--- a/app/src/main/kotlin/com/aliucord/manager/util/Context.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/util/Context.kt
@@ -1,8 +1,11 @@
package com.aliucord.manager.util
+import android.annotation.SuppressLint
import android.app.Activity
import android.content.*
-import android.os.Environment
+import android.net.Uri
+import android.os.*
+import android.provider.Settings
import android.util.Log
import android.widget.Toast
import androidx.annotation.StringRes
@@ -54,3 +57,32 @@ fun Context.findActivity(): Activity? {
}
return null
}
+
+fun Context.isIgnoringBatteryOptimizations(): Boolean {
+ val power = applicationContext.getSystemService(PowerManager::class.java)
+ val name = applicationContext.packageName
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ return power.isIgnoringBatteryOptimizations(name)
+ }
+ return true
+}
+
+/**
+ * Launch a system dialog to enable unrestricted battery usage.
+ */
+@SuppressLint("BatteryLife")
+fun Context.requestNoBatteryOptimizations() {
+ val intent = Intent(
+ /* action = */ Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
+ /* uri = */ Uri.fromParts("package", this.packageName, null)
+ )
+
+ with(intent) {
+ addCategory(Intent.CATEGORY_DEFAULT)
+ addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
+ addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
+ }
+
+ startActivity(intent)
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c472573..18df6e1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -85,6 +85,7 @@
Cancelled Aliucord installation
Failed to verify download
Please uninstall your current version of Aliucord in order to continue!
+ Since battery optimizations have not been disabled, minimizing this screen may abort the installation process!
Failed to install (Unknown reason)
Installation was blocked