Migrate music widget from livedata to flow

This commit is contained in:
MM20 2023-02-13 13:35:47 +01:00
parent 4a06158c6a
commit 5c690f7bc8
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
4 changed files with 23 additions and 19 deletions

View File

@ -102,6 +102,7 @@ dependencies {
implementation(libs.androidx.browser)
implementation(libs.androidx.lifecycle.viewmodelcompose)
implementation(libs.androidx.lifecycle.runtimecompose)
implementation(libs.jsoup)

View File

@ -36,11 +36,9 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Slider
import androidx.compose.material3.SliderDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
@ -56,8 +54,8 @@ import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.DpSize
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.ui.R
@ -72,20 +70,20 @@ fun MusicWidget() {
val viewModel: MusicWidgetVM = viewModel()
val albumArt by viewModel.albumArt.observeAsState()
val title by viewModel.title.observeAsState()
val artist by viewModel.artist.observeAsState()
val playbackState by viewModel.playbackState.observeAsState()
val position by viewModel.position.observeAsState()
val duration by viewModel.duration.observeAsState()
val albumArt by viewModel.albumArt.collectAsStateWithLifecycle(null)
val title by viewModel.title.collectAsStateWithLifecycle(null)
val artist by viewModel.artist.collectAsStateWithLifecycle(null)
val playbackState by viewModel.playbackState.collectAsStateWithLifecycle(PlaybackState.Stopped)
val position by viewModel.position.collectAsStateWithLifecycle(null)
val duration by viewModel.duration.collectAsStateWithLifecycle(null)
val context = LocalContext.current
Column(
modifier = Modifier.fillMaxWidth()
) {
val hasPermission by viewModel.hasPermission.observeAsState()
AnimatedVisibility(hasPermission == false) {
val hasPermission by viewModel.hasPermission.collectAsStateWithLifecycle(true)
AnimatedVisibility(!hasPermission) {
MissingPermissionBanner(
modifier = Modifier.padding(16.dp),
text = stringResource(R.string.missing_permission_music_widget),

View File

@ -4,6 +4,7 @@ import android.app.PendingIntent
import android.content.Context
import android.graphics.Bitmap
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.graphics.Color
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
@ -12,6 +13,8 @@ import de.mm20.launcher2.music.MusicService
import de.mm20.launcher2.music.PlaybackState
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
@ -19,14 +22,14 @@ class MusicWidgetVM: ViewModel(), KoinComponent {
private val musicService: MusicService by inject()
private val permissionsManager: PermissionsManager by inject()
val title: LiveData<String?> = musicService.title.asLiveData()
val artist: LiveData<String?> = musicService.artist.asLiveData()
val albumArt: LiveData<Bitmap?> = musicService.albumArt.asLiveData()
val playbackState: LiveData<PlaybackState> = musicService.playbackState.asLiveData()
val duration: LiveData<Long?> = musicService.duration.asLiveData()
val position: LiveData<Long?> = musicService.position.asLiveData()
val title: Flow<String?> = musicService.title
val artist: Flow<String?> = musicService.artist
val albumArt: Flow<Bitmap?> = musicService.albumArt
val playbackState: Flow<PlaybackState> = musicService.playbackState
val duration: Flow<Long?> = musicService.duration
val position: Flow<Long?> = musicService.position
val hasPermission = permissionsManager.hasPermission(PermissionGroup.Notifications).asLiveData()
val hasPermission = permissionsManager.hasPermission(PermissionGroup.Notifications)
val currentPlayerPackage
get() = musicService.lastPlayerPackage

View File

@ -55,7 +55,7 @@ dependencyResolutionManagement {
library("androidx.compose.material3", "androidx.compose.material3", "material3")
.version("1.1.0-alpha06")
version("androidx.lifecycle", "2.6.0-alpha04")
version("androidx.lifecycle", "2.6.0-beta01")
library("androidx.lifecycle.viewmodel", "androidx.lifecycle", "lifecycle-viewmodel-ktx")
.versionRef("androidx.lifecycle")
library("androidx.lifecycle.livedata", "androidx.lifecycle", "lifecycle-livedata-ktx")
@ -66,6 +66,8 @@ dependencyResolutionManagement {
.versionRef("androidx.lifecycle")
library("androidx.lifecycle.viewmodelcompose", "androidx.lifecycle", "lifecycle-viewmodel-compose")
.versionRef("androidx.lifecycle")
library("androidx.lifecycle.runtimecompose", "androidx.lifecycle", "lifecycle-runtime-compose")
.versionRef("androidx.lifecycle")
bundle(
"androidx.lifecycle",
listOf(