diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt index cabc10d81..e582b0aea 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt @@ -51,6 +51,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import de.mm20.launcher2.preferences.BatteryStatusVisibility import de.mm20.launcher2.preferences.ClockWidgetAlignment import de.mm20.launcher2.preferences.ClockWidgetColors import de.mm20.launcher2.preferences.ClockWidgetStyle @@ -61,6 +62,7 @@ import de.mm20.launcher2.ui.component.Banner import de.mm20.launcher2.ui.component.DismissableBottomSheet import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.SwitchPreference +import de.mm20.launcher2.ui.component.preferences.ListPreference import de.mm20.launcher2.ui.launcher.widgets.clock.clocks.AnalogClock import de.mm20.launcher2.ui.launcher.widgets.clock.clocks.BinaryClock import de.mm20.launcher2.ui.launcher.widgets.clock.clocks.CustomClock @@ -666,14 +668,19 @@ fun ConfigureClockWidgetSheet( viewModel.setAlarmPart(it) } ) - SwitchPreference( + ListPreference( title = stringResource(R.string.preference_clockwidget_battery_part), summary = stringResource(R.string.preference_clockwidget_battery_part_summary), icon = R.drawable.battery_full_24px, - value = parts?.battery == true, + value = parts?.battery, onValueChanged = { - viewModel.setBatteryPart(it) - } + if (it != null) viewModel.setBatteryPart(it) + }, + items = listOf( + stringResource(R.string.preference_clockwidget_battery_part_hide) to BatteryStatusVisibility.Hide, + stringResource(R.string.preference_clockwidget_battery_part_show) to BatteryStatusVisibility.Show, + stringResource(R.string.preference_clockwidget_battery_part_always_show) to BatteryStatusVisibility.Always + ) ) } } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidgetVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidgetVM.kt index a0a84fc9c..2573191e8 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidgetVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidgetVM.kt @@ -38,7 +38,7 @@ class ClockWidgetVM : ViewModel(), KoinComponent { val providers = mutableListOf() if (parts.date) providers += DatePartProvider() if (parts.music) providers += MusicPartProvider() - if (parts.battery) providers += BatteryPartProvider() + providers += BatteryPartProvider(parts.battery) if (parts.alarm) providers += AlarmPartProvider() providers }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList()) @@ -82,4 +82,4 @@ class ClockWidgetVM : ViewModel(), KoinComponent { flags = Intent.FLAG_ACTIVITY_NEW_TASK }) } -} \ No newline at end of file +} diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/parts/BatteryPartProvider.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/parts/BatteryPartProvider.kt index 26ebb2b84..11511b43b 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/parts/BatteryPartProvider.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/parts/BatteryPartProvider.kt @@ -23,13 +23,16 @@ import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.content.getSystemService +import de.mm20.launcher2.preferences.BatteryStatusVisibility import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.utils.formatPercent import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.flow.* -class BatteryPartProvider : PartProvider { +class BatteryPartProvider( + private val batteryStatusVisibility: BatteryStatusVisibility = BatteryStatusVisibility.Hide, +) : PartProvider { private val batteryInfo = MutableStateFlow(null) @@ -38,7 +41,11 @@ class BatteryPartProvider : PartProvider { chargingInfo.collectLatest { batteryInfo.value = it - if (it.charging) { + if (batteryStatusVisibility == BatteryStatusVisibility.Hide) { + send(0) + } else if (batteryStatusVisibility == BatteryStatusVisibility.Always) { + send(10) + } else if (it.charging) { send(10) } else if (it.level <= 15) { send(55) @@ -177,4 +184,4 @@ private data class BatteryInfo( val level: Int, val charging: Boolean, val fullIn: Long?, -) \ No newline at end of file +) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/clockwidget/ClockWidgetSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/clockwidget/ClockWidgetSettingsScreenVM.kt index 12a25b905..cf4071798 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/clockwidget/ClockWidgetSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/clockwidget/ClockWidgetSettingsScreenVM.kt @@ -2,6 +2,7 @@ package de.mm20.launcher2.ui.settings.clockwidget import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import de.mm20.launcher2.preferences.BatteryStatusVisibility import de.mm20.launcher2.preferences.ClockWidgetAlignment import de.mm20.launcher2.preferences.ClockWidgetColors import de.mm20.launcher2.preferences.ClockWidgetStyle @@ -88,7 +89,7 @@ class ClockWidgetSettingsScreenVM : ViewModel(), KoinComponent { settings.setDatePart(datePart) } - fun setBatteryPart(batteryPart: Boolean) { + fun setBatteryPart(batteryPart: BatteryStatusVisibility) { settings.setBatteryPart(batteryPart) } @@ -114,4 +115,4 @@ class ClockWidgetSettingsScreenVM : ViewModel(), KoinComponent { settings.setUseSmartspacer(false) } -} \ No newline at end of file +} diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml index a9dea20cc..1e1b82149 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -607,7 +607,10 @@ Media Show media controls when there is an active media session Battery - Show the current battery level when the battery is low or charging + Show the current battery level + Always show + Show when low or charging + Off Alarms Show alarms that will ring within the next 8 hours Backup and restore diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherDataStore.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherDataStore.kt index 9168ba0d4..8d99c719f 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherDataStore.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherDataStore.kt @@ -6,6 +6,7 @@ import de.mm20.launcher2.preferences.migrations.Migration2 import de.mm20.launcher2.preferences.migrations.Migration3 import de.mm20.launcher2.preferences.migrations.Migration4 import de.mm20.launcher2.preferences.migrations.Migration5 +import de.mm20.launcher2.preferences.migrations.Migration6 import de.mm20.launcher2.settings.BaseSettings internal class LauncherDataStore( @@ -19,6 +20,7 @@ internal class LauncherDataStore( Migration3(), Migration4(), Migration5(), + Migration6(), ), corruptionHandler = ReplaceFileCorruptionHandler { LauncherSettingsData() } ) { diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt index 141229ced..909980e4d 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt @@ -51,7 +51,11 @@ data class LauncherSettingsData internal constructor( val clockWidgetMonospaced: Boolean = false, val clockWidgetUseThemeColor: Boolean = false, val clockWidgetAlarmPart: Boolean = true, - val clockWidgetBatteryPart: Boolean = true, + @Deprecated("") + @SerialName("clockWidgetBatteryPart") + val _clockWidgetBatteryPart: Boolean = true, + @SerialName("clockWidgetBatteryPart2") + val clockWidgetBatteryPart: BatteryStatusVisibility = BatteryStatusVisibility.Show, val clockWidgetMusicPart: Boolean = true, val clockWidgetDatePart: Boolean = true, val clockWidgetFillHeight: Boolean = false, @@ -457,3 +461,10 @@ enum class MeasurementSystem { @SerialName("uk") UnitedKingdom, @SerialName("us") UnitedStates, } + +@Serializable +enum class BatteryStatusVisibility { + @SerialName("hide") Hide, + @SerialName("show") Show, + @SerialName("always") Always +} diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration6.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration6.kt new file mode 100644 index 000000000..865945ada --- /dev/null +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration6.kt @@ -0,0 +1,25 @@ +package de.mm20.launcher2.preferences.migrations + +import androidx.datastore.core.DataMigration +import de.mm20.launcher2.preferences.BatteryStatusVisibility +import de.mm20.launcher2.preferences.LauncherSettingsData + +class Migration6 : DataMigration { + override suspend fun cleanUp() { + } + + override suspend fun shouldMigrate(currentData: LauncherSettingsData): Boolean { + return currentData.schemaVersion < 6 + } + + override suspend fun migrate(currentData: LauncherSettingsData): LauncherSettingsData { + return currentData.copy( + schemaVersion = 6, + clockWidgetBatteryPart = if (currentData._clockWidgetBatteryPart) { + BatteryStatusVisibility.Show + } else { + BatteryStatusVisibility.Hide + } + ) + } +} diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/ClockWidgetSettings.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/ClockWidgetSettings.kt index 8e4cea8af..b9cd509c6 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/ClockWidgetSettings.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/ClockWidgetSettings.kt @@ -1,5 +1,6 @@ package de.mm20.launcher2.preferences.ui +import de.mm20.launcher2.preferences.BatteryStatusVisibility import de.mm20.launcher2.preferences.ClockWidgetAlignment import de.mm20.launcher2.preferences.ClockWidgetColors import de.mm20.launcher2.preferences.ClockWidgetStyle @@ -13,7 +14,7 @@ import kotlinx.coroutines.flow.map data class ClockWidgetParts( val date: Boolean, val music: Boolean = false, - val battery: Boolean = false, + val battery: BatteryStatusVisibility = BatteryStatusVisibility.Hide, val alarm: Boolean = false, ) @@ -51,7 +52,7 @@ class ClockWidgetSettings internal constructor( } } - fun setBatteryPart(batteryPart: Boolean) { + fun setBatteryPart(batteryPart: BatteryStatusVisibility) { launcherDataStore.update { it.copy(clockWidgetBatteryPart = batteryPart) } @@ -175,4 +176,4 @@ internal val ClockWidgetStyle.enumValue is ClockWidgetStyle.Segment -> ClockWidgetStyleEnum.Segment is ClockWidgetStyle.Empty -> ClockWidgetStyleEnum.Empty is ClockWidgetStyle.Custom -> ClockWidgetStyleEnum.Custom - } \ No newline at end of file + }