Music widget: hide unsupported skip actions

This commit is contained in:
MM20 2023-02-13 16:11:39 +01:00
parent 2a25db9433
commit c8d6da41dd
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
2 changed files with 28 additions and 17 deletions

View File

@ -58,6 +58,7 @@ 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.music.PlaybackState import de.mm20.launcher2.music.PlaybackState
import de.mm20.launcher2.music.SupportedActions
import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.MissingPermissionBanner import de.mm20.launcher2.ui.component.MissingPermissionBanner
import de.mm20.launcher2.ui.ktx.conditional import de.mm20.launcher2.ui.ktx.conditional
@ -77,6 +78,8 @@ fun MusicWidget() {
val position by viewModel.position.collectAsStateWithLifecycle(null) val position by viewModel.position.collectAsStateWithLifecycle(null)
val duration by viewModel.duration.collectAsStateWithLifecycle(null) val duration by viewModel.duration.collectAsStateWithLifecycle(null)
val supportedActions by viewModel.supportedActions.collectAsStateWithLifecycle(SupportedActions())
val context = LocalContext.current val context = LocalContext.current
Column( Column(
@ -142,13 +145,13 @@ fun 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) { if (playbackState != PlaybackState.Stopped || supportedActions.seekTo) {
Slider( Slider(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 8.dp) .padding(horizontal = 8.dp)
.requiredHeightIn(max = 20.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(), valueRange = 0f..dur.toFloat(),
interactionSource = interactionSource, interactionSource = interactionSource,
onValueChange = { onValueChange = {
@ -276,14 +279,16 @@ fun MusicWidget() {
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
IconButton( if (supportedActions.skipToPrevious) {
onClick = { IconButton(
viewModel.skipPrevious() onClick = {
}) { viewModel.skipPrevious()
Icon( }) {
imageVector = Icons.Rounded.SkipPrevious, Icon(
null imageVector = Icons.Rounded.SkipPrevious,
) null
)
}
} }
val playPauseIcon = val playPauseIcon =
AnimatedImageVector.animatedVectorResource(R.drawable.anim_ic_play_pause) AnimatedImageVector.animatedVectorResource(R.drawable.anim_ic_play_pause)
@ -301,13 +306,15 @@ fun MusicWidget() {
contentDescription = null contentDescription = null
) )
} }
IconButton(onClick = { if (supportedActions.skipToNext) {
viewModel.skipNext() IconButton(onClick = {
}) { viewModel.skipNext()
Icon( }) {
imageVector = Icons.Rounded.SkipNext, Icon(
null imageVector = Icons.Rounded.SkipNext,
) null
)
}
} }
} }
} }

View File

@ -3,6 +3,7 @@ package de.mm20.launcher2.ui.launcher.widgets.music
import android.app.PendingIntent import android.app.PendingIntent
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.media.session.PlaybackState.CustomAction
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
@ -11,6 +12,7 @@ import androidx.lifecycle.asLiveData
import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.crashreporter.CrashReporter
import de.mm20.launcher2.music.MusicService import de.mm20.launcher2.music.MusicService
import de.mm20.launcher2.music.PlaybackState import de.mm20.launcher2.music.PlaybackState
import de.mm20.launcher2.music.SupportedActions
import de.mm20.launcher2.permissions.PermissionGroup import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.permissions.PermissionsManager
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@ -29,6 +31,8 @@ class MusicWidgetVM: ViewModel(), KoinComponent {
val duration: Flow<Long?> = musicService.duration val duration: Flow<Long?> = musicService.duration
val position: Flow<Long?> = musicService.position val position: Flow<Long?> = musicService.position
val supportedActions: Flow<SupportedActions> = musicService.supportedActions
val hasPermission = permissionsManager.hasPermission(PermissionGroup.Notifications) val hasPermission = permissionsManager.hasPermission(PermissionGroup.Notifications)
val currentPlayerPackage val currentPlayerPackage