From ca4979abaf686273b69ba7fa4cd392111b79d4fd Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Fri, 4 Jul 2025 17:49:23 +0200 Subject: [PATCH] Music widget: add preference to make progress bar non-interactive --- .../launcher/sheets/ConfigureWidgetSheet.kt | 19 ++++++++++++- .../ui/launcher/widgets/music/MusicWidget.kt | 2 +- core/i18n/src/main/res/values/strings.xml | 1 + .../de/mm20/launcher2/widgets/MusicWidget.kt | 28 +++++++++++++++++++ .../java/de/mm20/launcher2/widgets/Widget.kt | 23 ++++----------- 5 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 data/widgets/src/main/java/de/mm20/launcher2/widgets/MusicWidget.kt diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/ConfigureWidgetSheet.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/ConfigureWidgetSheet.kt index b4a2d19e..9892ceb2 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/ConfigureWidgetSheet.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/ConfigureWidgetSheet.kt @@ -119,7 +119,7 @@ fun ConfigureWidgetSheet( is AppWidget -> ConfigureAppWidget(widget, onWidgetUpdated) is CalendarWidget -> ConfigureCalendarWidget(widget, onWidgetUpdated) is FavoritesWidget -> ConfigureFavoritesWidget(widget, onWidgetUpdated) - is MusicWidget -> ConfigureMusicWidget() + is MusicWidget -> ConfigureMusicWidget(widget, onWidgetUpdated) is NotesWidget -> ConfigureNotesWidget(widget, onWidgetUpdated) } } @@ -232,10 +232,27 @@ fun ColumnScope.ConfigureFavoritesWidget( @Composable fun ColumnScope.ConfigureMusicWidget( + widget: MusicWidget, + onWidgetUpdated: (MusicWidget) -> Unit, ) { val context = LocalContext.current + OutlinedCard { + Column( + modifier = Modifier.fillMaxWidth() + ) { + SwitchPreference( + title = stringResource(R.string.music_widget_interactive_progress_bar), + iconPadding = false, + value = widget.config.interactiveProgressBar, + onValueChanged = { + onWidgetUpdated(widget.copy(config = widget.config.copy(interactiveProgressBar = it))) + } + ) + } + } + TextButton( modifier = Modifier .align(Alignment.CenterHorizontally), diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/music/MusicWidget.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/music/MusicWidget.kt index dd545b85..868807f7 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/music/MusicWidget.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/music/MusicWidget.kt @@ -168,7 +168,7 @@ fun MusicWidget(widget: MusicWidget) { var seekPosition by remember { mutableStateOf(null) } if (pos != null && dur != null && dur > 0) { - if (playbackState != PlaybackState.Stopped || supportedActions.seekTo) { + if (playbackState != PlaybackState.Stopped && supportedActions.seekTo && widget.config.interactiveProgressBar) { Slider( modifier = Modifier .fillMaxWidth() diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml index aa5667b9..4077b8c7 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -325,6 +325,7 @@ %1$s is playing media No media has been played yet + Interactive progress bar Sleet showers Heavy sleet Light rain showers and thunder diff --git a/data/widgets/src/main/java/de/mm20/launcher2/widgets/MusicWidget.kt b/data/widgets/src/main/java/de/mm20/launcher2/widgets/MusicWidget.kt new file mode 100644 index 00000000..fb3515c8 --- /dev/null +++ b/data/widgets/src/main/java/de/mm20/launcher2/widgets/MusicWidget.kt @@ -0,0 +1,28 @@ +package de.mm20.launcher2.widgets + +import de.mm20.launcher2.database.entities.PartialWidgetEntity +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import java.util.UUID + +@Serializable +data class MusicWidgetConfig( + val interactiveProgressBar: Boolean = false +) + +data class MusicWidget( + override val id: UUID, + val config: MusicWidgetConfig = MusicWidgetConfig(), +) : Widget() { + override fun toDatabaseEntity(): PartialWidgetEntity { + return PartialWidgetEntity( + id = id, + type = Type, + config = Json.encodeToString(config), + ) + } + + companion object { + const val Type = "music" + } +} \ No newline at end of file diff --git a/data/widgets/src/main/java/de/mm20/launcher2/widgets/Widget.kt b/data/widgets/src/main/java/de/mm20/launcher2/widgets/Widget.kt index 246bcb9e..3ac3bc6c 100644 --- a/data/widgets/src/main/java/de/mm20/launcher2/widgets/Widget.kt +++ b/data/widgets/src/main/java/de/mm20/launcher2/widgets/Widget.kt @@ -32,7 +32,11 @@ sealed class Widget { ?: WeatherWidgetConfig() WeatherWidget(entity.id, config) } - MusicWidget.Type -> MusicWidget(entity.id) + MusicWidget.Type -> MusicWidget( + entity.id, + Json.decodeFromStringOrNull(entity.config?.takeIf { it.isNotBlank() }) + ?: MusicWidgetConfig(), + ) CalendarWidget.Type -> { val config: CalendarWidgetConfig = Json.decodeFromStringOrNull(entity.config?.takeIf { it.isNotBlank() }) @@ -68,23 +72,6 @@ sealed class Widget { } -data class MusicWidget( - override val id: UUID, -) : Widget() { - override fun toDatabaseEntity(): PartialWidgetEntity { - return PartialWidgetEntity( - id = id, - type = Type, - config = null - ) - } - - companion object { - const val Type = "music" - } -} - - enum class WidgetType(val value: String) { INTERNAL("internal"),