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