Skip to content

Commit be422f0

Browse files
committed
feat: prompt to disable battery optimization + warning on install screen
1 parent 02076f0 commit be422f0

File tree

9 files changed

+163
-12
lines changed

9 files changed

+163
-12
lines changed

app/src/main/AndroidManifest.xml

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
<uses-permission android:name="android.permission.WAKE_LOCK" />
77
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
88
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
9+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
10+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
911
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
1012
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
1113
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
12-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
13-
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
14+
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
1415

1516
<uses-permission
1617
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"

app/src/main/kotlin/com/aliucord/manager/manager/PreferencesManager.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.aliucord.manager.manager.base.BasePreferenceManager
55
import com.aliucord.manager.ui.components.Theme
66

77
class PreferencesManager(preferences: SharedPreferences) : BasePreferenceManager(preferences) {
8-
var theme by enumPreference("theme", Theme.SYSTEM)
8+
var theme by enumPreference("theme", Theme.DARK)
99
var dynamicColor by booleanPreference("dynamic_color", true)
1010
var devMode by booleanPreference("dev_mode", false)
1111
var installer by enumPreference("installer", InstallerSetting.PM)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.aliucord.manager.ui.components
2+
3+
import androidx.compose.material3.MaterialTheme
4+
import androidx.compose.runtime.*
5+
import androidx.compose.ui.graphics.Color
6+
7+
val MaterialTheme.customColors: CustomColors
8+
@Composable
9+
inline get() = LocalCustomColors.current
10+
11+
val LocalCustomColors = staticCompositionLocalOf<CustomColors> {
12+
error("No LocalCustomColors provided!")
13+
}
14+
15+
@Immutable
16+
data class CustomColors(
17+
val warning: Color,
18+
val onWarning: Color,
19+
val warningContainer: Color,
20+
val onWarningContainer: Color,
21+
)
22+
23+
private val YellowAlt1 = Color(0xFFE9C414)
24+
private val Shandy = Color(0xFFFFE172)
25+
private val DarkBrown = Color(0xFF3B2F00)
26+
private val DarkerBrown = Color(0xFF221B00)
27+
private val DarkBronze = Color(0xFF554600)
28+
29+
val DarkCustomColors = CustomColors(
30+
warning = YellowAlt1,
31+
onWarning = DarkBrown,
32+
warningContainer = DarkBronze,
33+
onWarningContainer = Shandy,
34+
)
35+
36+
val LightCustomColors = CustomColors(
37+
warning = YellowAlt1,
38+
onWarning = Color.White,
39+
warningContainer = Shandy,
40+
onWarningContainer = DarkerBrown,
41+
)

app/src/main/kotlin/com/aliucord/manager/ui/components/Theme.kt

+11-6
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ package com.aliucord.manager.ui.components
88
import android.os.Build
99
import androidx.compose.foundation.isSystemInDarkTheme
1010
import androidx.compose.material3.*
11-
import androidx.compose.runtime.Composable
12-
import androidx.compose.runtime.SideEffect
11+
import androidx.compose.runtime.*
1312
import androidx.compose.ui.graphics.Color
1413
import androidx.compose.ui.platform.LocalContext
1514
import androidx.compose.ui.res.stringResource
@@ -29,6 +28,10 @@ fun ManagerTheme(
2928
isDarkTheme -> darkColorScheme()
3029
else -> lightColorScheme()
3130
}
31+
val customColors = when (isDarkTheme) {
32+
true -> DarkCustomColors
33+
false -> LightCustomColors
34+
}
3235

3336
val systemUiController = rememberSystemUiController()
3437

@@ -42,10 +45,12 @@ fun ManagerTheme(
4245
)
4346
}
4447

45-
MaterialTheme(
46-
colorScheme = colorScheme,
47-
content = content
48-
)
48+
CompositionLocalProvider(LocalCustomColors provides customColors) {
49+
MaterialTheme(
50+
colorScheme = colorScheme,
51+
content = content
52+
)
53+
}
4954
}
5055

5156
enum class Theme {

app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallScreen.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ import com.aliucord.manager.installer.steps.StepGroup
2828
import com.aliucord.manager.ui.components.Wakelock
2929
import com.aliucord.manager.ui.components.back
3030
import com.aliucord.manager.ui.components.dialogs.InstallerAbortDialog
31-
import com.aliucord.manager.ui.screens.install.components.InstallAppBar
32-
import com.aliucord.manager.ui.screens.install.components.StepGroupCard
31+
import com.aliucord.manager.ui.screens.install.components.*
3332
import com.aliucord.manager.ui.screens.installopts.InstallOptions
3433
import org.koin.core.parameter.parametersOf
3534

@@ -93,6 +92,10 @@ class InstallScreen(private val data: InstallOptions) : Screen {
9392
.height(8.dp)
9493
.padding(bottom = 4.dp)
9594
)
95+
96+
MinimizationWarning(
97+
modifier = Modifier.fillMaxWidth(),
98+
)
9699
}
97100

98101
Column(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.aliucord.manager.ui.screens.install.components
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.border
5+
import androidx.compose.foundation.layout.*
6+
import androidx.compose.material3.*
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.runtime.remember
9+
import androidx.compose.ui.Alignment
10+
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.draw.clip
12+
import androidx.compose.ui.platform.LocalContext
13+
import androidx.compose.ui.res.painterResource
14+
import androidx.compose.ui.res.stringResource
15+
import androidx.compose.ui.unit.dp
16+
import com.aliucord.manager.R
17+
import com.aliucord.manager.ui.components.customColors
18+
import com.aliucord.manager.util.isIgnoringBatteryOptimizations
19+
20+
@Composable
21+
fun MinimizationWarning(modifier: Modifier = Modifier) {
22+
val context = LocalContext.current
23+
val hide = remember(context) { context.isIgnoringBatteryOptimizations() }
24+
25+
if (hide) return
26+
27+
Box(
28+
contentAlignment = Alignment.Center,
29+
modifier = modifier
30+
.padding(
31+
start = 20.dp,
32+
end = 20.dp,
33+
top = 20.dp,
34+
bottom = 4.dp,
35+
)
36+
.border(
37+
width = 2.dp,
38+
color = MaterialTheme.customColors.warning,
39+
shape = MaterialTheme.shapes.medium,
40+
)
41+
.clip(MaterialTheme.shapes.medium)
42+
.background(MaterialTheme.customColors.warningContainer)
43+
) {
44+
Row(
45+
horizontalArrangement = Arrangement.spacedBy(12.dp),
46+
verticalAlignment = Alignment.CenterVertically,
47+
modifier = Modifier
48+
.padding(horizontal = 20.dp, vertical = 14.dp)
49+
) {
50+
Icon(
51+
painter = painterResource(R.drawable.ic_warning),
52+
tint = MaterialTheme.customColors.onWarningContainer,
53+
contentDescription = null,
54+
modifier = Modifier.size(28.dp),
55+
)
56+
57+
Text(
58+
text = stringResource(R.string.installer_minimization_warning),
59+
style = MaterialTheme.typography.labelMedium,
60+
)
61+
}
62+
}
63+
}

app/src/main/kotlin/com/aliucord/manager/ui/screens/installopts/InstallOptionsScreen.kt

+5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import com.aliucord.manager.ui.screens.installopts.components.PackageNameState
2626
import com.aliucord.manager.ui.screens.installopts.components.options.SwitchInstallOption
2727
import com.aliucord.manager.ui.screens.installopts.components.options.TextInstallOption
2828
import com.aliucord.manager.ui.util.*
29+
import com.aliucord.manager.util.isIgnoringBatteryOptimizations
30+
import com.aliucord.manager.util.requestNoBatteryOptimizations
2931

3032
class InstallOptionsScreen(
3133
private val supportedVersion: DiscordVersion = DiscordVersion.None,
@@ -40,6 +42,9 @@ class InstallOptionsScreen(
4042

4143
LaunchedEffect(Unit) {
4244
InstallNotifications.requestPermissions(context)
45+
46+
if (!context.isIgnoringBatteryOptimizations())
47+
context.requestNoBatteryOptimizations()
4348
}
4449

4550
Scaffold(

app/src/main/kotlin/com/aliucord/manager/util/Context.kt

+33-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.aliucord.manager.util
22

3+
import android.annotation.SuppressLint
34
import android.app.Activity
45
import android.content.*
5-
import android.os.Environment
6+
import android.net.Uri
7+
import android.os.*
8+
import android.provider.Settings
69
import android.util.Log
710
import android.widget.Toast
811
import androidx.annotation.StringRes
@@ -54,3 +57,32 @@ fun Context.findActivity(): Activity? {
5457
}
5558
return null
5659
}
60+
61+
fun Context.isIgnoringBatteryOptimizations(): Boolean {
62+
val power = applicationContext.getSystemService(PowerManager::class.java)
63+
val name = applicationContext.packageName
64+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
65+
return power.isIgnoringBatteryOptimizations(name)
66+
}
67+
return true
68+
}
69+
70+
/**
71+
* Launch a system dialog to enable unrestricted battery usage.
72+
*/
73+
@SuppressLint("BatteryLife")
74+
fun Context.requestNoBatteryOptimizations() {
75+
val intent = Intent(
76+
/* action = */ Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
77+
/* uri = */ Uri.fromParts("package", this.packageName, null)
78+
)
79+
80+
with(intent) {
81+
addCategory(Intent.CATEGORY_DEFAULT)
82+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
83+
addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
84+
addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
85+
}
86+
87+
startActivity(intent)
88+
}

app/src/main/res/values/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
<string name="installer_aborted">Cancelled Aliucord installation</string>
8686
<string name="installer_dl_verify_fail">Failed to verify download</string>
8787
<string name="installer_uninstall_new">Please uninstall your current version of Aliucord in order to continue!</string>
88+
<string name="installer_minimization_warning">Since battery optimizations have not been disabled, minimizing this screen may abort the installation process!</string>
8889

8990
<string name="install_error_unknown">Failed to install (Unknown reason)</string>
9091
<string name="install_error_blocked">Installation was blocked</string>

0 commit comments

Comments
 (0)