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 c345599d..ba3e1715 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 @@ -58,6 +58,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import de.mm20.launcher2.music.PlaybackState +import de.mm20.launcher2.music.SupportedActions import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.MissingPermissionBanner import de.mm20.launcher2.ui.ktx.conditional @@ -77,6 +78,8 @@ fun MusicWidget() { val position by viewModel.position.collectAsStateWithLifecycle(null) val duration by viewModel.duration.collectAsStateWithLifecycle(null) + val supportedActions by viewModel.supportedActions.collectAsStateWithLifecycle(SupportedActions()) + val context = LocalContext.current Column( @@ -142,13 +145,13 @@ fun MusicWidget() { var seekPosition by remember { mutableStateOf(null) } if (pos != null && dur != null && dur > 0) { - if (playbackState != PlaybackState.Stopped) { + if (playbackState != PlaybackState.Stopped || supportedActions.seekTo) { Slider( modifier = Modifier .fillMaxWidth() .padding(horizontal = 8.dp) .requiredHeightIn(max = 20.dp), - value = (if (isDragged) seekPosition else pos?.toFloat()) ?: 0f , + value = (if (isDragged) seekPosition else pos?.toFloat()) ?: 0f, valueRange = 0f..dur.toFloat(), interactionSource = interactionSource, onValueChange = { @@ -276,14 +279,16 @@ fun MusicWidget() { verticalAlignment = Alignment.CenterVertically, ) { - IconButton( - onClick = { - viewModel.skipPrevious() - }) { - Icon( - imageVector = Icons.Rounded.SkipPrevious, - null - ) + if (supportedActions.skipToPrevious) { + IconButton( + onClick = { + viewModel.skipPrevious() + }) { + Icon( + imageVector = Icons.Rounded.SkipPrevious, + null + ) + } } val playPauseIcon = AnimatedImageVector.animatedVectorResource(R.drawable.anim_ic_play_pause) @@ -301,13 +306,15 @@ fun MusicWidget() { contentDescription = null ) } - IconButton(onClick = { - viewModel.skipNext() - }) { - Icon( - imageVector = Icons.Rounded.SkipNext, - null - ) + if (supportedActions.skipToNext) { + IconButton(onClick = { + viewModel.skipNext() + }) { + Icon( + imageVector = Icons.Rounded.SkipNext, + null + ) + } } } } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/music/MusicWidgetVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/music/MusicWidgetVM.kt index 098a6b53..ee333f2a 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/music/MusicWidgetVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/music/MusicWidgetVM.kt @@ -3,6 +3,7 @@ package de.mm20.launcher2.ui.launcher.widgets.music import android.app.PendingIntent import android.content.Context import android.graphics.Bitmap +import android.media.session.PlaybackState.CustomAction import androidx.appcompat.app.AppCompatActivity import androidx.compose.ui.graphics.Color import androidx.lifecycle.LiveData @@ -11,6 +12,7 @@ import androidx.lifecycle.asLiveData import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.music.MusicService import de.mm20.launcher2.music.PlaybackState +import de.mm20.launcher2.music.SupportedActions import de.mm20.launcher2.permissions.PermissionGroup import de.mm20.launcher2.permissions.PermissionsManager import kotlinx.coroutines.flow.Flow @@ -29,6 +31,8 @@ class MusicWidgetVM: ViewModel(), KoinComponent { val duration: Flow = musicService.duration val position: Flow = musicService.position + val supportedActions: Flow = musicService.supportedActions + val hasPermission = permissionsManager.hasPermission(PermissionGroup.Notifications) val currentPlayerPackage