Music widget: add preference to make progress bar non-interactive

This commit is contained in:
MM20 2025-07-04 17:49:23 +02:00
parent 720d2ab52a
commit ca4979abaf
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
5 changed files with 53 additions and 20 deletions

View File

@ -119,7 +119,7 @@ fun ConfigureWidgetSheet(
is AppWidget -> ConfigureAppWidget(widget, onWidgetUpdated) is AppWidget -> ConfigureAppWidget(widget, onWidgetUpdated)
is CalendarWidget -> ConfigureCalendarWidget(widget, onWidgetUpdated) is CalendarWidget -> ConfigureCalendarWidget(widget, onWidgetUpdated)
is FavoritesWidget -> ConfigureFavoritesWidget(widget, onWidgetUpdated) is FavoritesWidget -> ConfigureFavoritesWidget(widget, onWidgetUpdated)
is MusicWidget -> ConfigureMusicWidget() is MusicWidget -> ConfigureMusicWidget(widget, onWidgetUpdated)
is NotesWidget -> ConfigureNotesWidget(widget, onWidgetUpdated) is NotesWidget -> ConfigureNotesWidget(widget, onWidgetUpdated)
} }
} }
@ -232,10 +232,27 @@ fun ColumnScope.ConfigureFavoritesWidget(
@Composable @Composable
fun ColumnScope.ConfigureMusicWidget( fun ColumnScope.ConfigureMusicWidget(
widget: MusicWidget,
onWidgetUpdated: (MusicWidget) -> Unit,
) { ) {
val context = LocalContext.current 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( TextButton(
modifier = Modifier modifier = Modifier
.align(Alignment.CenterHorizontally), .align(Alignment.CenterHorizontally),

View File

@ -168,7 +168,7 @@ fun MusicWidget(widget: MusicWidget) {
var seekPosition by remember { mutableStateOf<Float?>(null) } var seekPosition by remember { mutableStateOf<Float?>(null) }
if (pos != null && dur != null && dur > 0) { if (pos != null && dur != null && dur > 0) {
if (playbackState != PlaybackState.Stopped || supportedActions.seekTo) { if (playbackState != PlaybackState.Stopped && supportedActions.seekTo && widget.config.interactiveProgressBar) {
Slider( Slider(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()

View File

@ -325,6 +325,7 @@
<!-- Default title that is shown in the music widget if the app that is playing media did not publish a title --> <!-- Default title that is shown in the music widget if the app that is playing media did not publish a title -->
<string name="music_widget_default_title">%1$s is playing media</string> <string name="music_widget_default_title">%1$s is playing media</string>
<string name="music_widget_no_data">No media has been played yet</string> <string name="music_widget_no_data">No media has been played yet</string>
<string name="music_widget_interactive_progress_bar">Interactive progress bar</string>
<string name="weather_condition_sleetshowers">Sleet showers</string> <string name="weather_condition_sleetshowers">Sleet showers</string>
<string name="weather_condition_heavysleet">Heavy sleet</string> <string name="weather_condition_heavysleet">Heavy sleet</string>
<string name="weather_condition_lightrainshowersandthunder">Light rain showers and thunder</string> <string name="weather_condition_lightrainshowersandthunder">Light rain showers and thunder</string>

View File

@ -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"
}
}

View File

@ -32,7 +32,11 @@ sealed class Widget {
?: WeatherWidgetConfig() ?: WeatherWidgetConfig()
WeatherWidget(entity.id, config) WeatherWidget(entity.id, config)
} }
MusicWidget.Type -> MusicWidget(entity.id) MusicWidget.Type -> MusicWidget(
entity.id,
Json.decodeFromStringOrNull(entity.config?.takeIf { it.isNotBlank() })
?: MusicWidgetConfig(),
)
CalendarWidget.Type -> { CalendarWidget.Type -> {
val config: CalendarWidgetConfig = val config: CalendarWidgetConfig =
Json.decodeFromStringOrNull(entity.config?.takeIf { it.isNotBlank() }) 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) { enum class WidgetType(val value: String) {
INTERNAL("internal"), INTERNAL("internal"),