From 67b29d759069accb7afdfe85cf49151b9ae8abc2 Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Wed, 24 Jul 2024 18:39:12 +0200 Subject: [PATCH] Add preference to disable battery optimization --- app/src/main/AndroidManifest.xml | 1 + .../app/more/preferences/PreferencesScreen.kt | 47 ++++++++++++++++++- app/src/main/res/values-fr/strings.xml | 3 ++ app/src/main/res/values/strings.xml | 3 ++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fcd27393..f58dc125 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ + () + val coroutineScope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } + val state by screenModel.state.collectAsStateWithLifecycle() Scaffold( @@ -55,7 +70,8 @@ class PreferencesScreen : AndroidScreen() { } } ) - } + }, + snackbarHost = { SnackbarHost(snackbarHostState) } ) { paddingValues -> Box( modifier = Modifier.padding(paddingValues) @@ -64,6 +80,7 @@ class PreferencesScreen : AndroidScreen() { is PreferencesScreenState.Loading -> { CenteredProgressIndicator() } + else -> { val loadedState = (state as PreferencesScreenState.Loaded) @@ -99,6 +116,34 @@ class PreferencesScreen : AndroidScreen() { onValueChange = { SyncWorker.startPeriodically(context, it) } ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + BasePreference( + title = stringResource(R.string.disable_battery_optimization), + subtitle = stringResource(R.string.disable_battery_optimization_subtitle), + onClick = { + val powerManager = + context.getSystemService("power") as PowerManager + val packageName = context.packageName + + if (!powerManager.isIgnoringBatteryOptimizations(packageName)) { + @SuppressLint("BatteryLife") + val intent = Intent().apply { + action = + Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS + data = Uri.parse("package:$packageName") + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + context.startActivity(intent) + } else { + coroutineScope.launch { + snackbarHostState.showSnackbar(context.getString(R.string.battery_optimization_already_disabled)) + } + } + } + ) + } + PreferenceHeader(text = stringResource(id = R.string.timeline)) ListPreferenceWidget( diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f32635f7..9d32d3c7 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -185,4 +185,7 @@ Large Taille des items Une synchronisation en arrière-plan est déjà en cours + Désactiver l\'optimisation de la batterie + Peut aider à éviter que le système n\'empêche la synchronisation d\'arrière-plan + L\'optimisation de la batterie est déjà optimisée pour cette appli \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 395f4513..148bba00 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -194,4 +194,7 @@ Large Item size A background synchronization is already running + Disable battery optimization + Can help with background synchronization not being killed by the system + Battery optimization already disabled for this app \ No newline at end of file