feat: prompt to disable battery optimization + warning on install screen

This commit is contained in:
rushiiMachine 2024-03-10 00:04:51 -08:00
parent 02076f0697
commit be422f01a2
No known key found for this signature in database
GPG key ID: DCBE5952BB3B6420
9 changed files with 163 additions and 12 deletions

View file

@ -6,11 +6,12 @@
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"

View file

@ -5,7 +5,7 @@ import com.aliucord.manager.manager.base.BasePreferenceManager
import com.aliucord.manager.ui.components.Theme
class PreferencesManager(preferences: SharedPreferences) : BasePreferenceManager(preferences) {
var theme by enumPreference("theme", Theme.SYSTEM)
var theme by enumPreference("theme", Theme.DARK)
var dynamicColor by booleanPreference("dynamic_color", true)
var devMode by booleanPreference("dev_mode", false)
var installer by enumPreference("installer", InstallerSetting.PM)

View file

@ -0,0 +1,41 @@
package com.aliucord.manager.ui.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.*
import androidx.compose.ui.graphics.Color
val MaterialTheme.customColors: CustomColors
@Composable
inline get() = LocalCustomColors.current
val LocalCustomColors = staticCompositionLocalOf<CustomColors> {
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,
)

View file

@ -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 {

View file

@ -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(

View file

@ -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,
)
}
}
}

View file

@ -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(

View file

@ -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)
}

View file

@ -85,6 +85,7 @@
<string name="installer_aborted">Cancelled Aliucord installation</string>
<string name="installer_dl_verify_fail">Failed to verify download</string>
<string name="installer_uninstall_new">Please uninstall your current version of Aliucord in order to continue!</string>
<string name="installer_minimization_warning">Since battery optimizations have not been disabled, minimizing this screen may abort the installation process!</string>
<string name="install_error_unknown">Failed to install (Unknown reason)</string>
<string name="install_error_blocked">Installation was blocked</string>