From 5c690f7bc8ea358eaaaa66f9f745f66a01cf5b69 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Mon, 13 Feb 2023 13:35:47 +0100 Subject: [PATCH] Migrate music widget from livedata to flow --- app/ui/build.gradle.kts | 1 + .../ui/launcher/widgets/music/MusicWidget.kt | 20 +++++++++---------- .../launcher/widgets/music/MusicWidgetVM.kt | 17 +++++++++------- settings.gradle.kts | 4 +++- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/app/ui/build.gradle.kts b/app/ui/build.gradle.kts index 52774568..973681d9 100644 --- a/app/ui/build.gradle.kts +++ b/app/ui/build.gradle.kts @@ -102,6 +102,7 @@ dependencies { implementation(libs.androidx.browser) implementation(libs.androidx.lifecycle.viewmodelcompose) + implementation(libs.androidx.lifecycle.runtimecompose) implementation(libs.jsoup) 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 486ed1b1..c345599d 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 @@ -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), 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 6378aa6d..098a6b53 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 @@ -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 = musicService.title.asLiveData() - val artist: LiveData = musicService.artist.asLiveData() - val albumArt: LiveData = musicService.albumArt.asLiveData() - val playbackState: LiveData = musicService.playbackState.asLiveData() - val duration: LiveData = musicService.duration.asLiveData() - val position: LiveData = musicService.position.asLiveData() + val title: Flow = musicService.title + val artist: Flow = musicService.artist + val albumArt: Flow = musicService.albumArt + val playbackState: Flow = musicService.playbackState + val duration: Flow = musicService.duration + val position: Flow = musicService.position - val hasPermission = permissionsManager.hasPermission(PermissionGroup.Notifications).asLiveData() + val hasPermission = permissionsManager.hasPermission(PermissionGroup.Notifications) val currentPlayerPackage get() = musicService.lastPlayerPackage diff --git a/settings.gradle.kts b/settings.gradle.kts index bd793455..fc599dfa 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -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(