diff --git a/i18n/src/main/res/values-de/strings.xml b/i18n/src/main/res/values-de/strings.xml
index 0a5eeee4..240511bb 100644
--- a/i18n/src/main/res/values-de/strings.xml
+++ b/i18n/src/main/res/values-de/strings.xml
@@ -413,6 +413,8 @@
Diese App ist freie Software.
Lizenziert unter der GNU General Public License 3.0
Diese Funktion ist in dieser Version von %1$s nicht verfügbar.
+ Uhr
+ Uhrenstil
- +%1$d laufender Termin aus vergangenen Tagen
- +%1$d laufende Termine aus vergangenen Tagen
diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml
index af85f755..81692533 100644
--- a/i18n/src/main/res/values/strings.xml
+++ b/i18n/src/main/res/values/strings.xml
@@ -451,4 +451,6 @@
This app is free software.
Licensed under the GNU General Public License 3.0
This feature is not available in this version of %1$s
+ Clock
+ Clock style
diff --git a/preferences/src/main/proto/settings.proto b/preferences/src/main/proto/settings.proto
index 09f48838..c28d63f2 100644
--- a/preferences/src/main/proto/settings.proto
+++ b/preferences/src/main/proto/settings.proto
@@ -34,6 +34,13 @@ message Settings {
bool light_nav_bar = 3;
bool dim_wallpaper = 4;
bool app_start_animation = 5;
+
+ enum ClockStyle {
+ Digital = 0;
+ Analog = 1;
+ Binary = 2;
+ }
+ ClockStyle clock_style = 8;
}
AppearanceSettings appearance = 1;
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/activity/ComposeActivity.kt b/ui/src/main/java/de/mm20/launcher2/ui/activity/ComposeActivity.kt
index d64431c5..2bf57388 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/activity/ComposeActivity.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/activity/ComposeActivity.kt
@@ -108,6 +108,9 @@ class ComposeActivity : AppCompatActivity() {
composable("settings/appearance/colors") {
SettingsColorsScreen()
}
+ composable("settings/appearance/clock") {
+ SettingsClockScreen()
+ }
composable(
"settings/license?library={libraryName}",
arguments = listOf(navArgument("libraryName") {
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/component/Clocks.kt b/ui/src/main/java/de/mm20/launcher2/ui/component/Clocks.kt
index a080300f..ec2b5b94 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/component/Clocks.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/component/Clocks.kt
@@ -101,7 +101,8 @@ fun AnalogClock(time: Long) {
.padding(bottom = 24.dp)
.size(156.dp),
shape = CircleShape,
- color = bgColor
+ color = bgColor,
+ elevation = 8.dp
) {
Box(
modifier = Modifier.fillMaxSize()
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsAppearanceScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsAppearanceScreen.kt
index 1dcd1d96..80566b53 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsAppearanceScreen.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsAppearanceScreen.kt
@@ -44,9 +44,21 @@ fun SettingsAppearanceScreen() {
}
}
)
- Preference(title = stringResource(id = R.string.preference_screen_colors), onClick = {
- navController?.navigate("settings/appearance/colors")
- })
+ Preference(
+ title = stringResource(id = R.string.preference_screen_colors),
+ onClick = {
+ navController?.navigate("settings/appearance/colors")
+ })
+ }
+ }
+ item {
+ PreferenceCategory(title = stringResource(id = R.string.preference_category_clock_widget)) {
+ Preference(
+ title = stringResource(id = R.string.preference_clock_widget_style),
+ onClick = {
+ navController?.navigate("settings/appearance/clock")
+ }
+ )
}
}
}
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsClockScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsClockScreen.kt
new file mode 100644
index 00000000..9c55fdcf
--- /dev/null
+++ b/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsClockScreen.kt
@@ -0,0 +1,97 @@
+package de.mm20.launcher2.ui.screens.settings
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.rounded.RadioButtonChecked
+import androidx.compose.material.icons.rounded.RadioButtonUnchecked
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.datastore.core.DataStore
+import de.mm20.launcher2.preferences.Settings
+import de.mm20.launcher2.preferences.Settings.AppearanceSettings.ClockStyle
+import de.mm20.launcher2.preferences.dataStore
+import de.mm20.launcher2.ui.R
+import de.mm20.launcher2.ui.component.AnalogClock
+import de.mm20.launcher2.ui.component.BinaryClock
+import de.mm20.launcher2.ui.component.DigitalClock
+import de.mm20.launcher2.ui.component.preferences.Preference
+import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
+import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.launch
+
+@Composable
+fun SettingsClockScreen() {
+ val dataStore = LocalContext.current.dataStore
+ val scope = rememberCoroutineScope()
+ val selectedClock by remember { dataStore.data.map { it.appearance.clockStyle } }.collectAsState(
+ initial = ClockStyle.Digital
+ )
+ val time = System.currentTimeMillis()
+ PreferenceScreen(title = stringResource(id = R.string.preference_clock_widget_style)) {
+ item {
+ ClockPreview(selected = selectedClock == ClockStyle.Digital, onClick = {
+ scope.launch {
+ updateClock(dataStore, ClockStyle.Digital)
+ }
+ }) {
+ DigitalClock(time)
+ }
+ }
+ item {
+ ClockPreview(selected = selectedClock == ClockStyle.Analog, onClick = {
+ scope.launch {
+ updateClock(dataStore, ClockStyle.Analog)
+ }
+ }) {
+ AnalogClock(time)
+ }
+ }
+ item {
+ ClockPreview(selected = selectedClock == ClockStyle.Binary, onClick = {
+ scope.launch {
+ updateClock(dataStore, ClockStyle.Binary)
+ }
+ }) {
+ BinaryClock(time)
+ }
+ }
+ }
+}
+
+private suspend fun updateClock(dataStore: DataStore, clockStyle: ClockStyle) {
+ dataStore.updateData {
+ it.toBuilder()
+ .setAppearance(it.appearance.toBuilder().setClockStyle(clockStyle))
+ .build()
+ }
+}
+
+@Composable
+private fun ClockPreview(
+ selected: Boolean,
+ onClick: () -> Unit,
+ clock: @Composable () -> Unit
+) {
+ PreferenceCategory {
+ Preference(
+ title = "",
+ icon = if (selected) Icons.Rounded.RadioButtonChecked else Icons.Rounded.RadioButtonUnchecked,
+ controls = {
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.Center
+ ) {
+ clock()
+ }
+ },
+ onClick = onClick
+ )
+ }
+}
\ No newline at end of file
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/widget/ClockWidget.kt b/ui/src/main/java/de/mm20/launcher2/ui/widget/ClockWidget.kt
index 47ee54e0..a84bb4da 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/widget/ClockWidget.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/widget/ClockWidget.kt
@@ -15,10 +15,15 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import com.google.accompanist.insets.LocalWindowInsets
-import de.mm20.launcher2.ui.locals.LocalWindowSize
+import de.mm20.launcher2.preferences.Settings.AppearanceSettings.ClockStyle
+import de.mm20.launcher2.preferences.dataStore
+import de.mm20.launcher2.ui.component.AnalogClock
+import de.mm20.launcher2.ui.component.BinaryClock
import de.mm20.launcher2.ui.component.DigitalClock
import de.mm20.launcher2.ui.ktx.toDp
+import de.mm20.launcher2.ui.locals.LocalWindowSize
import de.mm20.launcher2.ui.widget.parts.DatePart
+import kotlinx.coroutines.flow.map
@Composable
fun ClockWidget(
@@ -55,6 +60,10 @@ fun ClockWidget(
fun Clock(transparentBackground: Boolean) {
var time by remember { mutableStateOf(System.currentTimeMillis()) }
val context = LocalContext.current
+ val dataStore = context.dataStore
+ val clockStyle by remember { dataStore.data.map { it.appearance.clockStyle } }.collectAsState(
+ initial = ClockStyle.Digital
+ )
DisposableEffect(null) {
val receiver = object : BroadcastReceiver() {
@@ -72,7 +81,17 @@ fun Clock(transparentBackground: Boolean) {
}
}
- DigitalClock(time)
+ when (clockStyle) {
+ ClockStyle.Analog -> {
+ AnalogClock(time = time)
+ }
+ ClockStyle.Binary -> {
+ BinaryClock(time = time)
+ }
+ else -> {
+ DigitalClock(time = time)
+ }
+ }
}
@Composable