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.browser)
implementation(libs.androidx.lifecycle.viewmodelcompose) implementation(libs.androidx.lifecycle.viewmodelcompose)
implementation(libs.androidx.lifecycle.runtimecompose)
implementation(libs.jsoup) implementation(libs.jsoup)

View File

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

View File

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

View File

@ -55,7 +55,7 @@ dependencyResolutionManagement {
library("androidx.compose.material3", "androidx.compose.material3", "material3") library("androidx.compose.material3", "androidx.compose.material3", "material3")
.version("1.1.0-alpha06") .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") library("androidx.lifecycle.viewmodel", "androidx.lifecycle", "lifecycle-viewmodel-ktx")
.versionRef("androidx.lifecycle") .versionRef("androidx.lifecycle")
library("androidx.lifecycle.livedata", "androidx.lifecycle", "lifecycle-livedata-ktx") library("androidx.lifecycle.livedata", "androidx.lifecycle", "lifecycle-livedata-ktx")
@ -66,6 +66,8 @@ dependencyResolutionManagement {
.versionRef("androidx.lifecycle") .versionRef("androidx.lifecycle")
library("androidx.lifecycle.viewmodelcompose", "androidx.lifecycle", "lifecycle-viewmodel-compose") library("androidx.lifecycle.viewmodelcompose", "androidx.lifecycle", "lifecycle-viewmodel-compose")
.versionRef("androidx.lifecycle") .versionRef("androidx.lifecycle")
library("androidx.lifecycle.runtimecompose", "androidx.lifecycle", "lifecycle-runtime-compose")
.versionRef("androidx.lifecycle")
bundle( bundle(
"androidx.lifecycle", "androidx.lifecycle",
listOf( listOf(