From 7b39c1dd5ad74bb43e94cf79006bbd7287ff0b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Thu, 18 Dec 2025 19:26:08 +0800 Subject: [PATCH] Add battery optimization badge to Service menu item Show a theme-colored badge on the Service settings when battery optimization is not ignored. Also shorten button text to "Ignore". --- .../compose/screen/settings/SettingsScreen.kt | 39 ++++++++++++++----- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/SettingsScreen.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/SettingsScreen.kt index 36b18ff..22e8671 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/SettingsScreen.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/settings/SettingsScreen.kt @@ -1,5 +1,7 @@ package io.nekohasekai.sfa.compose.screen.settings +import android.os.Build +import android.os.PowerManager import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -31,8 +33,12 @@ import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color @@ -53,6 +59,15 @@ fun SettingsScreen(navController: NavController) { val context = LocalContext.current val scope = rememberCoroutineScope() val hasUpdate by UpdateState.hasUpdate + var isBatteryOptimizationIgnored by remember { mutableStateOf(true) } + + LaunchedEffect(Unit) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val pm = context.getSystemService(PowerManager::class.java) + isBatteryOptimizationIgnored = + pm?.isIgnoringBatteryOptimizations(context.packageName) == true + } + } Column( modifier = @@ -140,6 +155,11 @@ fun SettingsScreen(navController: NavController) { tint = MaterialTheme.colorScheme.primary, ) }, + trailingContent = { + if (!isBatteryOptimizationIgnored) { + Badge(containerColor = MaterialTheme.colorScheme.primary) + } + }, modifier = Modifier.clickable { navController.navigate("settings/service") }, colors = ListItemDefaults.colors( @@ -299,17 +319,16 @@ fun SettingsScreen(navController: NavController) { } } - // Debug - Spacer(modifier = Modifier.height(16.dp)) - - Text( - text = stringResource(R.string.title_debug), - style = MaterialTheme.typography.labelLarge, - color = MaterialTheme.colorScheme.primary, - modifier = Modifier.padding(horizontal = 32.dp, vertical = 8.dp), - ) - if (BuildConfig.DEBUG) { + // Debug + Spacer(modifier = Modifier.height(16.dp)) + + Text( + text = stringResource(R.string.title_debug), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.primary, + modifier = Modifier.padding(horizontal = 32.dp, vertical = 8.dp), + ) Card( modifier = Modifier diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 59d1123..1da920a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -143,7 +143,7 @@ Background permission Apply for the necessary permissions in order for the VPN to function properly.\n\nIf you are using a device made by a Chinese company, the card may not disappear after the permission is granted. Read More - Ignore Battery Optimizations + Ignore Import remote profile Are you sure to import remote profile %1$s? You will connect to %2$s to download the configuration. Profile Override