From 795c9b29324ca4633ad5075e65d02d5dbd6a04f2 Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Wed, 24 Apr 2024 18:09:46 +0200 Subject: [PATCH 01/14] Migrated to M3 Signed-off-by: Arnau Mora --- .../ui/intro/BatteryOptimizationsPage.kt | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt index 4041454fa..64bc15666 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt @@ -25,16 +25,17 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.Card -import androidx.compose.material.Checkbox -import androidx.compose.material.MaterialTheme -import androidx.compose.material.OutlinedButton -import androidx.compose.material.Switch -import androidx.compose.material.Text +import androidx.compose.material3.Card +import androidx.compose.material3.Checkbox +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Switch +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler @@ -42,7 +43,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.content.getSystemService -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewModelScope @@ -62,10 +62,10 @@ import dagger.hilt.InstallIn import dagger.hilt.android.EntryPointAccessors import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.components.SingletonComponent -import kotlinx.coroutines.launch -import org.apache.commons.text.WordUtils import java.util.Locale import javax.inject.Inject +import kotlinx.coroutines.launch +import org.apache.commons.text.WordUtils class BatteryOptimizationsPage: IntroPage { @@ -270,7 +270,7 @@ private fun BatteryOptimizationsContent( ) { Text( text = stringResource(R.string.intro_battery_title), - style = MaterialTheme.typography.h6, + style = MaterialTheme.typography.labelLarge, modifier = Modifier.weight(1f) ) Switch( @@ -289,7 +289,7 @@ private fun BatteryOptimizationsContent( R.string.intro_battery_text, stringResource(R.string.app_name) ), - style = MaterialTheme.typography.body1, + style = MaterialTheme.typography.bodyLarge, modifier = Modifier.padding(top = 12.dp) ) AnimatedVisibility(visible = !isExempted) { @@ -303,7 +303,7 @@ private fun BatteryOptimizationsContent( ) Text( text = stringResource(R.string.intro_battery_dont_show), - style = MaterialTheme.typography.body2, + style = MaterialTheme.typography.bodyMedium, modifier = Modifier .clickable { onChangeDontShowBattery(!dontShowBattery) } ) @@ -326,12 +326,12 @@ private fun BatteryOptimizationsContent( R.string.intro_autostart_title, WordUtils.capitalize(Build.MANUFACTURER) ), - style = MaterialTheme.typography.h6, + style = MaterialTheme.typography.labelLarge, modifier = Modifier.fillMaxWidth() ) Text( text = stringResource(R.string.intro_autostart_text), - style = MaterialTheme.typography.body1, + style = MaterialTheme.typography.bodyLarge, modifier = Modifier.padding(top = 12.dp) ) OutlinedButton( @@ -360,7 +360,7 @@ private fun BatteryOptimizationsContent( ) Text( text = stringResource(R.string.intro_autostart_dont_show), - style = MaterialTheme.typography.body2, + style = MaterialTheme.typography.bodyMedium, modifier = Modifier .clickable { onChangeDontShowAutostart(!dontShowAutostart) } ) @@ -373,7 +373,7 @@ private fun BatteryOptimizationsContent( R.string.intro_leave_unchecked, stringResource(R.string.app_settings_reset_hints) ), - style = MaterialTheme.typography.body2, + style = MaterialTheme.typography.bodyMedium, modifier = Modifier .padding(top = 8.dp) .padding(horizontal = 16.dp) From 3e8a7580b048bce05dca36f39161a67c0fba951b Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Wed, 24 Apr 2024 18:09:59 +0200 Subject: [PATCH 02/14] Arch update for best practises Signed-off-by: Arnau Mora --- .../ui/intro/BatteryOptimizationsPage.kt | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt index 64bc15666..227d99d03 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt @@ -105,8 +105,8 @@ class BatteryOptimizationsPage: IntroPage { } val hintBatteryOptimizations by model.hintBatteryOptimizations.collectAsStateWithLifecycle(false) - val shouldBeExempted by model.shouldBeExempted.observeAsState(false) - val isExempted by model.isExempted.observeAsState(false) + val shouldBeExempted = model.shouldBeExempted + val isExempted = model.isExempted LaunchedEffect(shouldBeExempted, isExempted) { if (shouldBeExempted && !isExempted) ignoreBatteryOptimizationsResultLauncher.launch(BuildConfig.APPLICATION_ID) @@ -115,16 +115,12 @@ class BatteryOptimizationsPage: IntroPage { val hintAutostartPermission by model.hintAutostartPermission.collectAsStateWithLifecycle(false) BatteryOptimizationsContent( dontShowBattery = hintBatteryOptimizations == false, - onChangeDontShowBattery = { - model.settings.putBoolean(HINT_BATTERY_OPTIMIZATIONS, !it) - }, + onChangeDontShowBattery = model::updateHintBatteryOptimizations, isExempted = isExempted, shouldBeExempted = shouldBeExempted, - onChangeShouldBeExempted = model.shouldBeExempted::postValue, + onChangeShouldBeExempted = model::updateShouldBeExempted, dontShowAutostart = hintAutostartPermission == false, - onChangeDontShowAutostart = { - model.settings.putBoolean(HINT_AUTOSTART_PERMISSION, !it) - }, + onChangeDontShowAutostart = model::updateHintAutostartPermission, manufacturerWarning = Model.manufacturerWarning ) } @@ -133,7 +129,7 @@ class BatteryOptimizationsPage: IntroPage { @HiltViewModel class Model @Inject constructor( val context: Application, - val settings: SettingsManager + private val settings: SettingsManager ): ViewModel() { companion object { @@ -178,8 +174,11 @@ class BatteryOptimizationsPage: IntroPage { context.getSystemService()!!.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID) } - val shouldBeExempted = MutableLiveData() - val isExempted = MutableLiveData() + var shouldBeExempted by mutableStateOf(true) + private set + var isExempted by mutableStateOf(false) + private set + val hintBatteryOptimizations = settings.getBooleanFlow(HINT_BATTERY_OPTIMIZATIONS) val hintAutostartPermission = settings.getBooleanFlow(HINT_AUTOSTART_PERMISSION) @@ -194,14 +193,26 @@ class BatteryOptimizationsPage: IntroPage { fun checkBatteryOptimizations() { val exempted = isExempted(context) - isExempted.value = exempted - shouldBeExempted.value = exempted + isExempted = exempted + shouldBeExempted = exempted // if DAVx5 is whitelisted, always show a reminder as soon as it's not whitelisted anymore if (exempted) settings.remove(HINT_BATTERY_OPTIMIZATIONS) } + fun updateShouldBeExempted(value: Boolean) { + shouldBeExempted = value + } + + fun updateHintBatteryOptimizations(value: Boolean) { + settings.putBoolean(HINT_BATTERY_OPTIMIZATIONS, value) + } + + fun updateHintAutostartPermission(value: Boolean) { + settings.putBoolean(HINT_AUTOSTART_PERMISSION, value) + } + } From a1a60ce8740a08d8c2169547c2c4c0bfb101e7f0 Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Wed, 24 Apr 2024 18:18:00 +0200 Subject: [PATCH 03/14] Moved composable to individual file Signed-off-by: Arnau Mora --- .../ui/intro/BatteryOptimizationsPage.kt | 192 +----------------- .../intro/BatteryOptimizationsPageContent.kt | 191 +++++++++++++++++ 2 files changed, 192 insertions(+), 191 deletions(-) create mode 100644 app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt index 227d99d03..ef5f945cc 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt @@ -14,45 +14,18 @@ import android.os.Build import android.os.PowerManager import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContract -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Card -import androidx.compose.material3.Checkbox -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.Switch -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.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import androidx.core.content.getSystemService import androidx.lifecycle.ViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import at.bitfire.davdroid.BuildConfig -import at.bitfire.davdroid.Constants -import at.bitfire.davdroid.Constants.withStatParams -import at.bitfire.davdroid.R import at.bitfire.davdroid.settings.SettingsManager -import at.bitfire.davdroid.ui.M2Theme import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPage.Model.Companion.HINT_AUTOSTART_PERMISSION import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPage.Model.Companion.HINT_BATTERY_OPTIMIZATIONS import at.bitfire.davdroid.util.PermissionUtils @@ -65,7 +38,6 @@ import dagger.hilt.components.SingletonComponent import java.util.Locale import javax.inject.Inject import kotlinx.coroutines.launch -import org.apache.commons.text.WordUtils class BatteryOptimizationsPage: IntroPage { @@ -113,7 +85,7 @@ class BatteryOptimizationsPage: IntroPage { } val hintAutostartPermission by model.hintAutostartPermission.collectAsStateWithLifecycle(false) - BatteryOptimizationsContent( + BatteryOptimizationsPageContent( dontShowBattery = hintBatteryOptimizations == false, onChangeDontShowBattery = model::updateHintBatteryOptimizations, isExempted = isExempted, @@ -231,165 +203,3 @@ class BatteryOptimizationsPage: IntroPage { } } - -@Preview(showBackground = true, showSystemUi = true) -@Composable -private fun BatteryOptimizationsContent_Preview() { - M2Theme { - BatteryOptimizationsContent( - dontShowBattery = true, - onChangeDontShowBattery = {}, - isExempted = false, - shouldBeExempted = true, - onChangeShouldBeExempted = {}, - dontShowAutostart = false, - onChangeDontShowAutostart = {}, - manufacturerWarning = true - ) - } -} - -@Composable -private fun BatteryOptimizationsContent( - dontShowBattery: Boolean, - onChangeDontShowBattery: (Boolean) -> Unit, - isExempted: Boolean, - shouldBeExempted: Boolean, - onChangeShouldBeExempted: (Boolean) -> Unit, - dontShowAutostart: Boolean, - onChangeDontShowAutostart: (Boolean) -> Unit, - manufacturerWarning: Boolean -) { - val uriHandler = LocalUriHandler.current - - Column( - modifier = Modifier - .fillMaxSize() - .verticalScroll(rememberScrollState()) - ) { - Card( - modifier = Modifier.padding(8.dp) - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - ) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically - ) { - Text( - text = stringResource(R.string.intro_battery_title), - style = MaterialTheme.typography.labelLarge, - modifier = Modifier.weight(1f) - ) - Switch( - checked = shouldBeExempted, - onCheckedChange = { - // Only accept click events if not whitelisted - if (!isExempted) { - onChangeShouldBeExempted(it) - } - }, - enabled = !dontShowBattery - ) - } - Text( - text = stringResource( - R.string.intro_battery_text, - stringResource(R.string.app_name) - ), - style = MaterialTheme.typography.bodyLarge, - modifier = Modifier.padding(top = 12.dp) - ) - AnimatedVisibility(visible = !isExempted) { - Row( - verticalAlignment = Alignment.CenterVertically - ) { - Checkbox( - checked = dontShowBattery, - onCheckedChange = onChangeDontShowBattery, - enabled = !isExempted - ) - Text( - text = stringResource(R.string.intro_battery_dont_show), - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier - .clickable { onChangeDontShowBattery(!dontShowBattery) } - ) - } - } - } - } - if (manufacturerWarning) { - Card( - modifier = Modifier - .padding(8.dp) - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - ) { - Text( - text = stringResource( - R.string.intro_autostart_title, - WordUtils.capitalize(Build.MANUFACTURER) - ), - style = MaterialTheme.typography.labelLarge, - modifier = Modifier.fillMaxWidth() - ) - Text( - text = stringResource(R.string.intro_autostart_text), - style = MaterialTheme.typography.bodyLarge, - modifier = Modifier.padding(top = 12.dp) - ) - OutlinedButton( - onClick = { - uriHandler.openUri( - Constants.HOMEPAGE_URL.buildUpon() - .appendPath(Constants.HOMEPAGE_PATH_FAQ) - .appendPath(Constants.HOMEPAGE_PATH_FAQ_SYNC_NOT_RUN) - .appendQueryParameter( - "manufacturer", - Build.MANUFACTURER.lowercase(Locale.ROOT) - ) - .withStatParams("BatteryOptimizationsPage") - .build().toString() - ) - } - ) { - Text(stringResource(R.string.intro_more_info)) - } - Row( - verticalAlignment = Alignment.CenterVertically - ) { - Checkbox( - checked = dontShowAutostart, - onCheckedChange = onChangeDontShowAutostart - ) - Text( - text = stringResource(R.string.intro_autostart_dont_show), - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier - .clickable { onChangeDontShowAutostart(!dontShowAutostart) } - ) - } - } - } - } - Text( - text = stringResource( - R.string.intro_leave_unchecked, - stringResource(R.string.app_settings_reset_hints) - ), - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier - .padding(top = 8.dp) - .padding(horizontal = 16.dp) - ) - Spacer(modifier = Modifier.height(90.dp)) - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt new file mode 100644 index 000000000..f403c825e --- /dev/null +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt @@ -0,0 +1,191 @@ +package at.bitfire.davdroid.ui.intro + +import android.os.Build +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Card +import androidx.compose.material3.Checkbox +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import at.bitfire.davdroid.Constants +import at.bitfire.davdroid.Constants.withStatParams +import at.bitfire.davdroid.R +import at.bitfire.davdroid.ui.AppTheme +import java.util.Locale +import org.apache.commons.text.WordUtils + +@Composable +fun BatteryOptimizationsPageContent( + dontShowBattery: Boolean, + onChangeDontShowBattery: (Boolean) -> Unit = {}, + isExempted: Boolean, + shouldBeExempted: Boolean, + onChangeShouldBeExempted: (Boolean) -> Unit = {}, + dontShowAutostart: Boolean, + onChangeDontShowAutostart: (Boolean) -> Unit = {}, + manufacturerWarning: Boolean +) { + val uriHandler = LocalUriHandler.current + + Column( + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + ) { + Card( + modifier = Modifier.padding(8.dp) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource(R.string.intro_battery_title), + style = MaterialTheme.typography.labelLarge, + modifier = Modifier.weight(1f) + ) + Switch( + checked = shouldBeExempted, + onCheckedChange = { + // Only accept click events if not whitelisted + if (!isExempted) { + onChangeShouldBeExempted(it) + } + }, + enabled = !dontShowBattery + ) + } + Text( + text = stringResource( + R.string.intro_battery_text, + stringResource(R.string.app_name) + ), + style = MaterialTheme.typography.bodyLarge, + modifier = Modifier.padding(top = 12.dp) + ) + AnimatedVisibility(visible = !isExempted) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Checkbox( + checked = dontShowBattery, + onCheckedChange = onChangeDontShowBattery, + enabled = !isExempted + ) + Text( + text = stringResource(R.string.intro_battery_dont_show), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier + .clickable { onChangeDontShowBattery(!dontShowBattery) } + ) + } + } + } + } + if (manufacturerWarning) { + Card( + modifier = Modifier + .padding(8.dp) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) { + Text( + text = stringResource( + R.string.intro_autostart_title, + WordUtils.capitalize(Build.MANUFACTURER) + ), + style = MaterialTheme.typography.labelLarge, + modifier = Modifier.fillMaxWidth() + ) + Text( + text = stringResource(R.string.intro_autostart_text), + style = MaterialTheme.typography.bodyLarge, + modifier = Modifier.padding(top = 12.dp) + ) + OutlinedButton( + onClick = { + uriHandler.openUri( + Constants.HOMEPAGE_URL.buildUpon() + .appendPath(Constants.HOMEPAGE_PATH_FAQ) + .appendPath(Constants.HOMEPAGE_PATH_FAQ_SYNC_NOT_RUN) + .appendQueryParameter( + "manufacturer", + Build.MANUFACTURER.lowercase(Locale.ROOT) + ) + .withStatParams("BatteryOptimizationsPage") + .build().toString() + ) + } + ) { + Text(stringResource(R.string.intro_more_info)) + } + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Checkbox( + checked = dontShowAutostart, + onCheckedChange = onChangeDontShowAutostart + ) + Text( + text = stringResource(R.string.intro_autostart_dont_show), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier + .clickable { onChangeDontShowAutostart(!dontShowAutostart) } + ) + } + } + } + } + Text( + text = stringResource( + R.string.intro_leave_unchecked, + stringResource(R.string.app_settings_reset_hints) + ), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier + .padding(top = 8.dp) + .padding(horizontal = 16.dp) + ) + Spacer(modifier = Modifier.height(90.dp)) + } +} + +@Preview(showBackground = true, showSystemUi = true) +@Composable +private fun BatteryOptimizationsContent_Preview() { + AppTheme { + BatteryOptimizationsPageContent( + dontShowBattery = true, + isExempted = false, + shouldBeExempted = true, + dontShowAutostart = false, + manufacturerWarning = true + ) + } +} From 9bcf57aa0530b12f9ef4689c3fefd43861d583f0 Mon Sep 17 00:00:00 2001 From: Arnau Mora Gras Date: Sun, 28 Apr 2024 10:08:27 +0200 Subject: [PATCH 04/14] Renamed function Signed-off-by: Arnau Mora --- .../at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt index ef5f945cc..744b316b8 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt @@ -65,11 +65,11 @@ class BatteryOptimizationsPage: IntroPage { @Composable override fun ComposePage() { - IntroPage_FromModel() + BatteryOptimizationsPageContent() } @Composable - private fun IntroPage_FromModel( + private fun BatteryOptimizationsPageContent( model: Model = viewModel() ) { val ignoreBatteryOptimizationsResultLauncher = rememberLauncherForActivityResult(IgnoreBatteryOptimizationsContract) { From be28d35ae50cf458cd942da749665097c8651243 Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Tue, 30 Apr 2024 15:43:05 +0200 Subject: [PATCH 05/14] Moved ViewModel Signed-off-by: Arnau Mora Gras --- .../ui/intro/BatteryOptimizationsPage.kt | 119 ------------------ .../ui/intro/BatteryOptimizationsPageModel.kt | 110 ++++++++++++++++ 2 files changed, 110 insertions(+), 119 deletions(-) create mode 100644 app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt index dd50196f6..6c5ba0aea 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt @@ -68,125 +68,6 @@ class BatteryOptimizationsPage: IntroPage { BatteryOptimizationsPageContent() } - @Composable - private fun BatteryOptimizationsPageContent( - model: Model = viewModel() - ) { - val ignoreBatteryOptimizationsResultLauncher = rememberLauncherForActivityResult(IgnoreBatteryOptimizationsContract) { - model.checkBatteryOptimizations() - } - - val hintBatteryOptimizations by model.hintBatteryOptimizations.collectAsStateWithLifecycle(false) - val shouldBeExempted = model.shouldBeExempted - val isExempted = model.isExempted - LaunchedEffect(shouldBeExempted, isExempted) { - if (shouldBeExempted && !isExempted) - ignoreBatteryOptimizationsResultLauncher.launch(BuildConfig.APPLICATION_ID) - } - - val hintAutostartPermission by model.hintAutostartPermission.collectAsStateWithLifecycle(false) - BatteryOptimizationsPageContent( - dontShowBattery = hintBatteryOptimizations == false, - onChangeDontShowBattery = model::updateHintBatteryOptimizations, - isExempted = isExempted, - shouldBeExempted = shouldBeExempted, - onChangeShouldBeExempted = model::updateShouldBeExempted, - dontShowAutostart = hintAutostartPermission == false, - onChangeDontShowAutostart = model::updateHintAutostartPermission, - manufacturerWarning = Model.manufacturerWarning - ) - } - - - @HiltViewModel - class Model @Inject constructor( - val context: Application, - private val settings: SettingsManager - ): ViewModel() { - - companion object { - - /** - * Whether the request for whitelisting from battery optimizations shall be shown. - * If this setting is true or null/not set, the notice shall be shown. Only if this - * setting is false, the notice shall not be shown. - */ - const val HINT_BATTERY_OPTIMIZATIONS = "hint_BatteryOptimizations" - - /** - * Whether the autostart permission notice shall be shown. If this setting is true - * or null/not set, the notice shall be shown. Only if this setting is false, the notice - * shall not be shown. - * - * Type: Boolean - */ - const val HINT_AUTOSTART_PERMISSION = "hint_AutostartPermissions" - - /** - * List of manufacturers which are known to restrict background processes or otherwise - * block synchronization. - * - * See https://www.davx5.com/faq/synchronization-is-not-run-as-expected for why this is evil. - * See https://github.com/jaredrummler/AndroidDeviceNames/blob/master/json/ for manufacturer values. - */ - private val evilManufacturers = arrayOf("asus", "huawei", "lenovo", "letv", "meizu", "nokia", - "oneplus", "oppo", "samsung", "sony", "vivo", "wiko", "xiaomi", "zte") - - /** - * Whether the device has been produced by an evil manufacturer. - * - * Always true for debug builds (to test the UI). - * - * @see evilManufacturers - */ - val manufacturerWarning = - (evilManufacturers.contains(Build.MANUFACTURER.lowercase(Locale.ROOT)) || BuildConfig.DEBUG) - - fun isExempted(context: Context) = - context.getSystemService()!!.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID) - } - - var shouldBeExempted by mutableStateOf(true) - private set - var isExempted by mutableStateOf(false) - private set - - val hintBatteryOptimizations = settings.getBooleanFlow(HINT_BATTERY_OPTIMIZATIONS) - - val hintAutostartPermission = settings.getBooleanFlow(HINT_AUTOSTART_PERMISSION) - - init { - viewModelScope.launch { - broadcastReceiverFlow(context, IntentFilter(PermissionUtils.ACTION_POWER_SAVE_WHITELIST_CHANGED), immediate = true).collect { - checkBatteryOptimizations() - } - } - } - - fun checkBatteryOptimizations() { - val exempted = isExempted(context) - isExempted = exempted - shouldBeExempted = exempted - - // if DAVx5 is whitelisted, always show a reminder as soon as it's not whitelisted anymore - if (exempted) - settings.remove(HINT_BATTERY_OPTIMIZATIONS) - } - - fun updateShouldBeExempted(value: Boolean) { - shouldBeExempted = value - } - - fun updateHintBatteryOptimizations(value: Boolean) { - settings.putBoolean(HINT_BATTERY_OPTIMIZATIONS, value) - } - - fun updateHintAutostartPermission(value: Boolean) { - settings.putBoolean(HINT_AUTOSTART_PERMISSION, value) - } - - } - @SuppressLint("BatteryLife") object IgnoreBatteryOptimizationsContract: ActivityResultContract() { diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt new file mode 100644 index 000000000..98f6152b8 --- /dev/null +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt @@ -0,0 +1,110 @@ +package at.bitfire.davdroid.ui.intro + +import android.app.Application +import android.content.Context +import android.content.IntentFilter +import android.os.Build +import android.os.PowerManager +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.core.content.getSystemService +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import at.bitfire.davdroid.BuildConfig +import at.bitfire.davdroid.settings.SettingsManager +import at.bitfire.davdroid.util.PermissionUtils +import at.bitfire.davdroid.util.broadcastReceiverFlow +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import java.util.Locale +import javax.inject.Inject + +@HiltViewModel +class BatteryOptimizationsPageModel @Inject constructor( + val context: Application, + private val settings: SettingsManager +): ViewModel() { + + companion object { + + /** + * Whether the request for whitelisting from battery optimizations shall be shown. + * If this setting is true or null/not set, the notice shall be shown. Only if this + * setting is false, the notice shall not be shown. + */ + const val HINT_BATTERY_OPTIMIZATIONS = "hint_BatteryOptimizations" + + /** + * Whether the autostart permission notice shall be shown. If this setting is true + * or null/not set, the notice shall be shown. Only if this setting is false, the notice + * shall not be shown. + * + * Type: Boolean + */ + const val HINT_AUTOSTART_PERMISSION = "hint_AutostartPermissions" + + /** + * List of manufacturers which are known to restrict background processes or otherwise + * block synchronization. + * + * See https://www.davx5.com/faq/synchronization-is-not-run-as-expected for why this is evil. + * See https://github.com/jaredrummler/AndroidDeviceNames/blob/master/json/ for manufacturer values. + */ + private val evilManufacturers = arrayOf("asus", "huawei", "lenovo", "letv", "meizu", "nokia", + "oneplus", "oppo", "samsung", "sony", "vivo", "wiko", "xiaomi", "zte") + + /** + * Whether the device has been produced by an evil manufacturer. + * + * Always true for debug builds (to test the UI). + * + * @see evilManufacturers + */ + val manufacturerWarning = + (evilManufacturers.contains(Build.MANUFACTURER.lowercase(Locale.ROOT)) || BuildConfig.DEBUG) + + fun isExempted(context: Context) = + context.getSystemService()!!.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID) + } + + var shouldBeExempted by mutableStateOf(true) + private set + var isExempted by mutableStateOf(false) + private set + + val hintBatteryOptimizations = settings.getBooleanFlow(HINT_BATTERY_OPTIMIZATIONS) + + val hintAutostartPermission = settings.getBooleanFlow(HINT_AUTOSTART_PERMISSION) + + init { + viewModelScope.launch { + broadcastReceiverFlow(context, IntentFilter(PermissionUtils.ACTION_POWER_SAVE_WHITELIST_CHANGED), immediate = true).collect { + checkBatteryOptimizations() + } + } + } + + fun checkBatteryOptimizations() { + val exempted = isExempted(context) + isExempted = exempted + shouldBeExempted = exempted + + // if DAVx5 is whitelisted, always show a reminder as soon as it's not whitelisted anymore + if (exempted) + settings.remove(HINT_BATTERY_OPTIMIZATIONS) + } + + fun updateShouldBeExempted(value: Boolean) { + shouldBeExempted = value + } + + fun updateHintBatteryOptimizations(value: Boolean) { + settings.putBoolean(HINT_BATTERY_OPTIMIZATIONS, value) + } + + fun updateHintAutostartPermission(value: Boolean) { + settings.putBoolean(HINT_AUTOSTART_PERMISSION, value) + } + +} From 64959f37c522b8c2d2b993879b3d09d275caa898 Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Tue, 30 Apr 2024 15:43:15 +0200 Subject: [PATCH 06/14] Moved ViewModel Signed-off-by: Arnau Mora Gras --- .../at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt index 6c5ba0aea..90237f8dd 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt @@ -55,8 +55,8 @@ class BatteryOptimizationsPage: IntroPage { // 2a. evil manufacturer AND // 2b. "don't show anymore" has not been clicked return if ( - (!Model.isExempted(application) && settingsManager.getBooleanOrNull(HINT_BATTERY_OPTIMIZATIONS) != false) || - (Model.manufacturerWarning && settingsManager.getBooleanOrNull(HINT_AUTOSTART_PERMISSION) != false) + (!BatteryOptimizationsPageModel.isExempted(application) && settingsManager.getBooleanOrNull(HINT_BATTERY_OPTIMIZATIONS) != false) || + (BatteryOptimizationsPageModel.manufacturerWarning && settingsManager.getBooleanOrNull(HINT_AUTOSTART_PERMISSION) != false) ) IntroPage.ShowPolicy.SHOW_ALWAYS else From 3b6be539b0af7930c41f57ff9f6a785a4d899794 Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Tue, 30 Apr 2024 15:43:27 +0200 Subject: [PATCH 07/14] Moved ViewModel-based Composable Signed-off-by: Arnau Mora Gras --- .../ui/intro/BatteryOptimizationsPage.kt | 24 +----------- .../intro/BatteryOptimizationsPageContent.kt | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt index 90237f8dd..795e8b674 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt @@ -8,36 +8,16 @@ import android.annotation.SuppressLint import android.app.Application import android.content.Context import android.content.Intent -import android.content.IntentFilter import android.net.Uri -import android.os.Build -import android.os.PowerManager -import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContract import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue -import androidx.core.content.getSystemService -import androidx.lifecycle.ViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.lifecycle.viewModelScope -import androidx.lifecycle.viewmodel.compose.viewModel -import at.bitfire.davdroid.BuildConfig import at.bitfire.davdroid.settings.SettingsManager -import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPage.Model.Companion.HINT_AUTOSTART_PERMISSION -import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPage.Model.Companion.HINT_BATTERY_OPTIMIZATIONS -import at.bitfire.davdroid.util.PermissionUtils -import at.bitfire.davdroid.util.broadcastReceiverFlow +import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPageModel.Companion.HINT_AUTOSTART_PERMISSION +import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPageModel.Companion.HINT_BATTERY_OPTIMIZATIONS import dagger.hilt.EntryPoint import dagger.hilt.InstallIn import dagger.hilt.android.EntryPointAccessors -import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.components.SingletonComponent -import java.util.Locale -import javax.inject.Inject -import kotlinx.coroutines.launch class BatteryOptimizationsPage: IntroPage { diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt index f403c825e..21342fca8 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt @@ -1,6 +1,7 @@ package at.bitfire.davdroid.ui.intro import android.os.Build +import androidx.activity.compose.rememberLauncherForActivityResult import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -19,12 +20,17 @@ import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.viewmodel.compose.viewModel +import at.bitfire.davdroid.BuildConfig import at.bitfire.davdroid.Constants import at.bitfire.davdroid.Constants.withStatParams import at.bitfire.davdroid.R @@ -32,6 +38,37 @@ import at.bitfire.davdroid.ui.AppTheme import java.util.Locale import org.apache.commons.text.WordUtils +@Composable +fun BatteryOptimizationsPageContent( + model: BatteryOptimizationsPageModel = viewModel() +) { + val ignoreBatteryOptimizationsResultLauncher = rememberLauncherForActivityResult( + BatteryOptimizationsPage.IgnoreBatteryOptimizationsContract + ) { + model.checkBatteryOptimizations() + } + + val hintBatteryOptimizations by model.hintBatteryOptimizations.collectAsStateWithLifecycle(false) + val shouldBeExempted = model.shouldBeExempted + val isExempted = model.isExempted + LaunchedEffect(shouldBeExempted, isExempted) { + if (shouldBeExempted && !isExempted) + ignoreBatteryOptimizationsResultLauncher.launch(BuildConfig.APPLICATION_ID) + } + + val hintAutostartPermission by model.hintAutostartPermission.collectAsStateWithLifecycle(false) + BatteryOptimizationsPageContent( + dontShowBattery = hintBatteryOptimizations == false, + onChangeDontShowBattery = model::updateHintBatteryOptimizations, + isExempted = isExempted, + shouldBeExempted = shouldBeExempted, + onChangeShouldBeExempted = model::updateShouldBeExempted, + dontShowAutostart = hintAutostartPermission == false, + onChangeDontShowAutostart = model::updateHintAutostartPermission, + manufacturerWarning = BatteryOptimizationsPageModel.manufacturerWarning + ) +} + @Composable fun BatteryOptimizationsPageContent( dontShowBattery: Boolean, From 257f89974a0d28417a135202bbfa54d1ed14dfa0 Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Tue, 30 Apr 2024 15:45:27 +0200 Subject: [PATCH 08/14] Created `UiState` Signed-off-by: Arnau Mora Gras --- .../ui/intro/BatteryOptimizationsPageContent.kt | 11 +++++------ .../ui/intro/BatteryOptimizationsPageModel.kt | 14 ++++++++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt index 21342fca8..730c2d914 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt @@ -49,10 +49,9 @@ fun BatteryOptimizationsPageContent( } val hintBatteryOptimizations by model.hintBatteryOptimizations.collectAsStateWithLifecycle(false) - val shouldBeExempted = model.shouldBeExempted - val isExempted = model.isExempted - LaunchedEffect(shouldBeExempted, isExempted) { - if (shouldBeExempted && !isExempted) + val uiState = model.uiState + LaunchedEffect(uiState) { + if (uiState.shouldBeExempted && !uiState.isExempted) ignoreBatteryOptimizationsResultLauncher.launch(BuildConfig.APPLICATION_ID) } @@ -60,8 +59,8 @@ fun BatteryOptimizationsPageContent( BatteryOptimizationsPageContent( dontShowBattery = hintBatteryOptimizations == false, onChangeDontShowBattery = model::updateHintBatteryOptimizations, - isExempted = isExempted, - shouldBeExempted = shouldBeExempted, + isExempted = uiState.isExempted, + shouldBeExempted = uiState.shouldBeExempted, onChangeShouldBeExempted = model::updateShouldBeExempted, dontShowAutostart = hintAutostartPermission == false, onChangeDontShowAutostart = model::updateHintAutostartPermission, diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt index 98f6152b8..bb81d8c15 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt @@ -68,9 +68,12 @@ class BatteryOptimizationsPageModel @Inject constructor( context.getSystemService()!!.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID) } - var shouldBeExempted by mutableStateOf(true) - private set - var isExempted by mutableStateOf(false) + data class UiState( + val shouldBeExempted: Boolean = true, + val isExempted: Boolean = false + ) + + var uiState by mutableStateOf(UiState()) private set val hintBatteryOptimizations = settings.getBooleanFlow(HINT_BATTERY_OPTIMIZATIONS) @@ -87,8 +90,7 @@ class BatteryOptimizationsPageModel @Inject constructor( fun checkBatteryOptimizations() { val exempted = isExempted(context) - isExempted = exempted - shouldBeExempted = exempted + uiState = uiState.copy(shouldBeExempted = exempted, isExempted = exempted) // if DAVx5 is whitelisted, always show a reminder as soon as it's not whitelisted anymore if (exempted) @@ -96,7 +98,7 @@ class BatteryOptimizationsPageModel @Inject constructor( } fun updateShouldBeExempted(value: Boolean) { - shouldBeExempted = value + uiState = uiState.copy(shouldBeExempted = value) } fun updateHintBatteryOptimizations(value: Boolean) { From 2b58ae49a007a689bd4e2d55e236cdf417aadc4b Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Tue, 30 Apr 2024 15:48:15 +0200 Subject: [PATCH 09/14] Fixed model name Signed-off-by: Arnau Mora Gras --- .../kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt index cbcf5971d..7071f3e37 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt @@ -72,6 +72,7 @@ import at.bitfire.davdroid.ui.composable.Setting import at.bitfire.davdroid.ui.composable.SettingsHeader import at.bitfire.davdroid.ui.composable.SwitchSetting import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPage +import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPageModel import at.bitfire.davdroid.ui.intro.OpenSourcePage import at.bitfire.davdroid.util.PermissionUtils import at.bitfire.davdroid.util.TaskUtils @@ -539,8 +540,8 @@ class AppSettingsActivity: AppCompatActivity() { } fun resetHints() { - settings.remove(BatteryOptimizationsPage.Model.HINT_BATTERY_OPTIMIZATIONS) - settings.remove(BatteryOptimizationsPage.Model.HINT_AUTOSTART_PERMISSION) + settings.remove(BatteryOptimizationsPageModel.HINT_BATTERY_OPTIMIZATIONS) + settings.remove(BatteryOptimizationsPageModel.HINT_AUTOSTART_PERMISSION) settings.remove(TasksActivity.Model.HINT_OPENTASKS_NOT_INSTALLED) settings.remove(OpenSourcePage.Model.SETTING_NEXT_DONATION_POPUP) } From 89adf8801c088cd77910d2eb102f23d1c2dd7886 Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Tue, 30 Apr 2024 15:55:42 +0200 Subject: [PATCH 10/14] Typo Signed-off-by: Arnau Mora Gras --- .../bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt index bb81d8c15..54ff0a44d 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt @@ -106,7 +106,7 @@ class BatteryOptimizationsPageModel @Inject constructor( } fun updateHintAutostartPermission(value: Boolean) { - settings.putBoolean(HINT_AUTOSTART_PERMISSION, value) + settings.putBoolean(HINT_AUTOSTART_PERMISSION, !value) } } From eb408eedfd93560dcf3efcbe0ee013562c3cf577 Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Fri, 3 May 2024 08:54:54 +0200 Subject: [PATCH 11/14] Fixed checkboxes Signed-off-by: Arnau Mora --- .../davdroid/ui/intro/BatteryOptimizationsPageContent.kt | 4 ++-- .../davdroid/ui/intro/BatteryOptimizationsPageModel.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt index 730c2d914..a0ce1270d 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt @@ -135,7 +135,7 @@ fun BatteryOptimizationsPageContent( text = stringResource(R.string.intro_battery_dont_show), style = MaterialTheme.typography.bodyMedium, modifier = Modifier - .clickable { onChangeDontShowBattery(!dontShowBattery) } + .clickable { onChangeDontShowBattery(dontShowBattery) } ) } } @@ -192,7 +192,7 @@ fun BatteryOptimizationsPageContent( text = stringResource(R.string.intro_autostart_dont_show), style = MaterialTheme.typography.bodyMedium, modifier = Modifier - .clickable { onChangeDontShowAutostart(!dontShowAutostart) } + .clickable { onChangeDontShowAutostart(dontShowAutostart) } ) } } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt index 54ff0a44d..09d5aa835 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageModel.kt @@ -16,9 +16,9 @@ import at.bitfire.davdroid.settings.SettingsManager import at.bitfire.davdroid.util.PermissionUtils import at.bitfire.davdroid.util.broadcastReceiverFlow import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.launch import java.util.Locale import javax.inject.Inject +import kotlinx.coroutines.launch @HiltViewModel class BatteryOptimizationsPageModel @Inject constructor( @@ -106,7 +106,7 @@ class BatteryOptimizationsPageModel @Inject constructor( } fun updateHintAutostartPermission(value: Boolean) { - settings.putBoolean(HINT_AUTOSTART_PERMISSION, !value) + settings.putBoolean(HINT_AUTOSTART_PERMISSION, value) } } From 19a077d95258c0ffb87c68e57d43243ef5749095 Mon Sep 17 00:00:00 2001 From: Sunik Kupfer Date: Mon, 6 May 2024 09:57:17 +0200 Subject: [PATCH 12/14] Make checkboxes clickable too --- .../davdroid/ui/intro/BatteryOptimizationsPageContent.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt index a0ce1270d..e4b41ec5e 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPageContent.kt @@ -128,7 +128,7 @@ fun BatteryOptimizationsPageContent( ) { Checkbox( checked = dontShowBattery, - onCheckedChange = onChangeDontShowBattery, + onCheckedChange = { onChangeDontShowBattery(dontShowBattery) }, enabled = !isExempted ) Text( @@ -186,7 +186,7 @@ fun BatteryOptimizationsPageContent( ) { Checkbox( checked = dontShowAutostart, - onCheckedChange = onChangeDontShowAutostart + onCheckedChange = { onChangeDontShowAutostart(dontShowAutostart) } ) Text( text = stringResource(R.string.intro_autostart_dont_show), From 45e368985dd37450f0ebb3d00ad77748faf686ba Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Wed, 8 May 2024 16:06:40 +0200 Subject: [PATCH 13/14] Optimized imports Signed-off-by: Arnau Mora Gras --- .../davdroid/ui/intro/BatteryOptimizationsPage.kt | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt index ec723ed24..1ec486452 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsPage.kt @@ -12,22 +12,9 @@ import android.net.Uri import androidx.activity.result.contract.ActivityResultContract import androidx.compose.runtime.Composable import at.bitfire.davdroid.settings.SettingsManager -import at.bitfire.davdroid.ui.M2Theme -import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPage.Model.Companion.HINT_AUTOSTART_PERMISSION -import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPage.Model.Companion.HINT_BATTERY_OPTIMIZATIONS -import at.bitfire.davdroid.util.PermissionUtils -import at.bitfire.davdroid.util.broadcastReceiverFlow -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.launch -import org.apache.commons.text.WordUtils -import java.util.Locale import javax.inject.Inject import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPageModel.Companion.HINT_AUTOSTART_PERMISSION import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPageModel.Companion.HINT_BATTERY_OPTIMIZATIONS -import dagger.hilt.EntryPoint -import dagger.hilt.InstallIn -import dagger.hilt.android.EntryPointAccessors -import dagger.hilt.components.SingletonComponent class BatteryOptimizationsPage @Inject constructor( private val application: Application, From 946a3842184e438c731e275b918ac31e3f9865df Mon Sep 17 00:00:00 2001 From: Sunik Kupfer Date: Mon, 13 May 2024 10:04:52 +0200 Subject: [PATCH 14/14] Optimize imports --- .../main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt index 14f435f7f..1fdf54ffc 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/AppSettingsActivity.kt @@ -71,7 +71,6 @@ import at.bitfire.davdroid.ui.composable.MultipleChoiceInputDialog import at.bitfire.davdroid.ui.composable.Setting import at.bitfire.davdroid.ui.composable.SettingsHeader import at.bitfire.davdroid.ui.composable.SwitchSetting -import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPage import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPageModel import at.bitfire.davdroid.ui.intro.OpenSourcePage import at.bitfire.davdroid.util.PermissionUtils