diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 27c3deb..c41b87c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
+
diff --git a/app/src/main/java/app/revanced/manager/compose/ui/screen/SettingsScreen.kt b/app/src/main/java/app/revanced/manager/compose/ui/screen/SettingsScreen.kt
index 7452b65..232b266 100644
--- a/app/src/main/java/app/revanced/manager/compose/ui/screen/SettingsScreen.kt
+++ b/app/src/main/java/app/revanced/manager/compose/ui/screen/SettingsScreen.kt
@@ -1,19 +1,39 @@
package app.revanced.manager.compose.ui.screen
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.PowerManager
+import android.provider.Settings
+import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.ExperimentalAnimationApi
+import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.BatteryAlert
import androidx.compose.material.icons.outlined.*
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+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.stringResource
import androidx.compose.ui.unit.dp
import app.revanced.manager.compose.R
@@ -24,6 +44,7 @@ import app.revanced.manager.compose.ui.viewmodel.SettingsViewModel
import dev.olshevski.navigation.reimagined.*
import org.koin.androidx.compose.getViewModel
+@SuppressLint("BatteryLife")
@OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class)
@Composable
@Stable
@@ -33,6 +54,11 @@ fun SettingsScreen(
) {
val navController =
rememberNavController(startDestination = SettingsDestination.Settings)
+
+ val context = LocalContext.current
+ val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
+ var showBatteryButton by remember { mutableStateOf(!pm.isIgnoringBatteryOptimizations(context.packageName)) }
+
val settingsSections = listOf(
Triple(
R.string.general,
@@ -62,7 +88,6 @@ fun SettingsScreen(
)
NavBackHandler(navController)
-
AnimatedNavHost(
controller = navController
) { destination ->
@@ -90,8 +115,6 @@ fun SettingsScreen(
)
is SettingsDestination.Settings -> {
-
-
Scaffold(
topBar = {
AppTopBar(
@@ -107,6 +130,32 @@ fun SettingsScreen(
.verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
+ AnimatedVisibility(visible = showBatteryButton) {
+ Card(
+ onClick = {
+ context.startActivity(Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply {
+ data = Uri.parse("package:${context.packageName}")
+ })
+ showBatteryButton = !pm.isIgnoringBatteryOptimizations(context.packageName)
+ },
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(16.dp)
+ .clip(RoundedCornerShape(24.dp))
+ .background(MaterialTheme.colorScheme.tertiaryContainer),
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(16.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(16.dp)
+ ) {
+ Icon(imageVector = Icons.Default.BatteryAlert, contentDescription = null, tint = MaterialTheme.colorScheme.onTertiaryContainer, modifier = Modifier.size(24.dp))
+ Text(text = stringResource(R.string.battery_optimization_notification), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onTertiaryContainer)
+ }
+ }
+ }
settingsSections.forEach { (titleDescIcon, destination) ->
ListItem(
modifier = Modifier.clickable { navController.navigate(destination) },
@@ -120,4 +169,4 @@ fun SettingsScreen(
}
}
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/app/revanced/manager/compose/ui/screen/settings/UpdatesSettingsScreen.kt b/app/src/main/java/app/revanced/manager/compose/ui/screen/settings/UpdatesSettingsScreen.kt
index 34be100..3227a13 100644
--- a/app/src/main/java/app/revanced/manager/compose/ui/screen/settings/UpdatesSettingsScreen.kt
+++ b/app/src/main/java/app/revanced/manager/compose/ui/screen/settings/UpdatesSettingsScreen.kt
@@ -76,7 +76,7 @@ fun UpdateNotification() {
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
- .clip(RoundedCornerShape(16.dp))
+ .clip(RoundedCornerShape(24.dp))
.background(MaterialTheme.colorScheme.secondaryContainer)
) {
Row(
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 437a530..1e5359a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -91,4 +91,5 @@
Dialog on app launch + badges
Changelog
Check out the latest changes in this update
+ Battery optimization must be turned off in order for ReVanced Manager to work correctly in the background. Tap here to turn off.
\ No newline at end of file