Add clock widget alignment preference

This commit is contained in:
MM20 2023-10-13 12:46:33 +02:00
parent c44a601ae2
commit f57cb71b9b
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
7 changed files with 109 additions and 1 deletions

View File

@ -1,6 +1,7 @@
package de.mm20.launcher2.ui.launcher.widgets.clock package de.mm20.launcher2.ui.launcher.widgets.clock
import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
@ -19,6 +20,9 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Alarm import androidx.compose.material.icons.rounded.Alarm
import androidx.compose.material.icons.rounded.AlignVerticalBottom
import androidx.compose.material.icons.rounded.AlignVerticalCenter
import androidx.compose.material.icons.rounded.AlignVerticalTop
import androidx.compose.material.icons.rounded.AutoAwesome import androidx.compose.material.icons.rounded.AutoAwesome
import androidx.compose.material.icons.rounded.BatteryFull import androidx.compose.material.icons.rounded.BatteryFull
import androidx.compose.material.icons.rounded.DarkMode import androidx.compose.material.icons.rounded.DarkMode
@ -30,6 +34,8 @@ import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.Today import androidx.compose.material.icons.rounded.Today
import androidx.compose.material.icons.rounded.Tune import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material.icons.rounded.VerticalSplit import androidx.compose.material.icons.rounded.VerticalSplit
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
@ -58,12 +64,15 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.preferences.Settings
import de.mm20.launcher2.preferences.Settings.ClockWidgetSettings.ClockStyle import de.mm20.launcher2.preferences.Settings.ClockWidgetSettings.ClockStyle
import de.mm20.launcher2.preferences.Settings.ClockWidgetSettings.ClockWidgetAlignment
import de.mm20.launcher2.preferences.Settings.ClockWidgetSettings.ClockWidgetColors import de.mm20.launcher2.preferences.Settings.ClockWidgetSettings.ClockWidgetColors
import de.mm20.launcher2.preferences.Settings.ClockWidgetSettings.ClockWidgetLayout import de.mm20.launcher2.preferences.Settings.ClockWidgetSettings.ClockWidgetLayout
import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.base.LocalTime import de.mm20.launcher2.ui.base.LocalTime
import de.mm20.launcher2.ui.component.BottomSheetDialog import de.mm20.launcher2.ui.component.BottomSheetDialog
import de.mm20.launcher2.ui.component.preferences.Preference
import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.component.preferences.SwitchPreference
import de.mm20.launcher2.ui.launcher.widgets.clock.clocks.AnalogClock 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.BinaryClock
@ -84,6 +93,7 @@ fun ClockWidget(
val layout by viewModel.layout.collectAsState() val layout by viewModel.layout.collectAsState()
val clockStyle by viewModel.clockStyle.collectAsState() val clockStyle by viewModel.clockStyle.collectAsState()
val color by viewModel.color.collectAsState() val color by viewModel.color.collectAsState()
val alignment by viewModel.alignment.collectAsState()
val time = LocalTime.current val time = LocalTime.current
val contentColor = val contentColor =
@ -146,7 +156,11 @@ fun ClockWidget(
} else { } else {
Box( Box(
modifier = modifier, modifier = modifier,
contentAlignment = Alignment.BottomCenter contentAlignment = when (alignment) {
ClockWidgetAlignment.Center -> Alignment.Center
ClockWidgetAlignment.Top -> Alignment.TopCenter
else -> Alignment.BottomCenter
}
) { ) {
CompositionLocalProvider( CompositionLocalProvider(
@ -277,6 +291,7 @@ fun ConfigureClockWidgetSheet(
val color by viewModel.color.collectAsState() val color by viewModel.color.collectAsState()
val style by viewModel.clockStyle.collectAsState() val style by viewModel.clockStyle.collectAsState()
val fillHeight by viewModel.fillHeight.collectAsState() val fillHeight by viewModel.fillHeight.collectAsState()
val alignment by viewModel.alignment.collectAsState()
val date by viewModel.datePart.collectAsState() val date by viewModel.datePart.collectAsState()
val favorites by viewModel.favoritesPart.collectAsState() val favorites by viewModel.favoritesPart.collectAsState()
@ -404,6 +419,66 @@ fun ConfigureClockWidgetSheet(
viewModel.setFillHeight(it) viewModel.setFillHeight(it)
} }
) )
AnimatedVisibility(fillHeight == true) {
var showDropdown by remember { mutableStateOf(false) }
Preference(
title = "Alignment",
summary = when (alignment) {
ClockWidgetAlignment.Top -> stringResource(R.string.preference_clock_widget_alignment_top)
ClockWidgetAlignment.Center -> stringResource(R.string.preference_clock_widget_alignment_center)
else -> stringResource(R.string.preference_clock_widget_alignment_bottom)
},
icon = when (alignment) {
ClockWidgetAlignment.Top -> Icons.Rounded.AlignVerticalTop
ClockWidgetAlignment.Center -> Icons.Rounded.AlignVerticalCenter
else -> Icons.Rounded.AlignVerticalBottom
},
onClick = {
showDropdown = true
}
)
DropdownMenu(
expanded = showDropdown,
onDismissRequest = { showDropdown = false }) {
DropdownMenuItem(
leadingIcon = {
Icon(
Icons.Rounded.AlignVerticalTop,
null
)
},
text = { Text(stringResource(R.string.preference_clock_widget_alignment_top)) },
onClick = {
viewModel.setAlignment(ClockWidgetAlignment.Top)
showDropdown = false
}
)
DropdownMenuItem(
leadingIcon = {
Icon(
Icons.Rounded.AlignVerticalCenter,
null
)
},
text = { Text(stringResource(R.string.preference_clock_widget_alignment_center)) },
onClick = {
viewModel.setAlignment(ClockWidgetAlignment.Center)
showDropdown = false
})
DropdownMenuItem(
leadingIcon = {
Icon(
Icons.Rounded.AlignVerticalBottom,
null
)
},
text = { Text(stringResource(R.string.preference_clock_widget_alignment_bottom)) },
onClick = {
viewModel.setAlignment(ClockWidgetAlignment.Bottom)
showDropdown = false
})
}
}
} }
} }
OutlinedCard( OutlinedCard(

View File

@ -62,6 +62,9 @@ class ClockWidgetVM : ViewModel(), KoinComponent {
val color = dataStore.data.map { it.clockWidget.color } val color = dataStore.data.map { it.clockWidget.color }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val alignment = dataStore.data.map { it.clockWidget.alignment }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
fun updateTime(time: Long) { fun updateTime(time: Long) {
partProviders.value.forEach { it.setTime(time) } partProviders.value.forEach { it.setTime(time) }
} }

View File

@ -140,4 +140,19 @@ class ClockWidgetSettingsScreenVM : ViewModel(), KoinComponent {
} }
} }
} }
val alignment = dataStore.data.map { it.clockWidget.alignment }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
fun setAlignment(alignment: ClockWidgetSettings.ClockWidgetAlignment) {
viewModelScope.launch {
dataStore.updateData {
it.toBuilder()
.setClockWidget(
it.clockWidget.toBuilder()
.setAlignment(alignment)
).build()
}
}
}
} }

View File

@ -585,6 +585,10 @@
<string name="preference_clock_widget_color">Color</string> <string name="preference_clock_widget_color">Color</string>
<string name="preference_clock_widget_style">Style</string> <string name="preference_clock_widget_style">Style</string>
<string name="preference_clock_widget_style_summary">Select a clock</string> <string name="preference_clock_widget_style_summary">Select a clock</string>
<string name="preference_clock_widget_alignment">Alignment</string>
<string name="preference_clock_widget_alignment_top">Top</string>
<string name="preference_clock_widget_alignment_center">Center</string>
<string name="preference_clock_widget_alignment_bottom">Bottom</string>
<string name="preference_clockwidget_date_part">Date</string> <string name="preference_clockwidget_date_part">Date</string>
<string name="preference_clockwidget_date_part_summary">Show the current date</string> <string name="preference_clockwidget_date_part_summary">Show the current date</string>
<string name="preference_clockwidget_favorites_part">Favorites</string> <string name="preference_clockwidget_favorites_part">Favorites</string>

View File

@ -49,6 +49,7 @@ fun createFactorySettings(context: Context): Settings {
.setDatePart(true) .setDatePart(true)
.setFavoritesPart(false) .setFavoritesPart(false)
.setFillHeight(true) .setFillHeight(true)
.setAlignment(Settings.ClockWidgetSettings.ClockWidgetAlignment.Bottom)
.build() .build()
) )
.setFavorites( .setFavorites(

View File

@ -8,5 +8,8 @@ class Migration_17_18 : VersionedMigration(17, 18) {
.setAppearance(builder.appearance.toBuilder() .setAppearance(builder.appearance.toBuilder()
.setBlurWallpaperRadius(32) .setBlurWallpaperRadius(32)
) )
.setClockWidget(builder.clockWidget.toBuilder()
.setAlignment(Settings.ClockWidgetSettings.ClockWidgetAlignment.Bottom)
)
} }
} }

View File

@ -144,6 +144,13 @@ message Settings {
Dark = 2; Dark = 2;
} }
ClockWidgetColors color = 9; ClockWidgetColors color = 9;
enum ClockWidgetAlignment {
Bottom = 0;
Center = 1;
Top = 2;
}
ClockWidgetAlignment alignment = 10;
} }
ClockWidgetSettings clock_widget = 7; ClockWidgetSettings clock_widget = 7;