diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 42cdbc5..e744444 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -88,6 +88,8 @@ dependencies { implementation(libs.android.media) implementation(libs.bundles.media3) + implementation(libs.datastore) + implementation(libs.room) kapt(libs.room.compiler) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/MainActivity.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/MainActivity.kt index 2c9a5fe..e9f5c6e 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/MainActivity.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/MainActivity.kt @@ -1,6 +1,7 @@ package it.vfsfitvnm.vimusic import android.content.ComponentName +import android.content.Context import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent @@ -20,15 +21,13 @@ import androidx.compose.material.ripple.LocalRippleTheme import androidx.compose.material.ripple.RippleAlpha import androidx.compose.material.ripple.RippleTheme import androidx.compose.material.ripple.rememberRipple -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.SideEffect -import androidx.compose.runtime.remember +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.text.ExperimentalTextApi +import androidx.datastore.preferences.preferencesDataStore import androidx.media3.session.MediaController import androidx.media3.session.SessionToken import com.google.accompanist.systemuicontroller.rememberSystemUiController @@ -41,13 +40,13 @@ import it.vfsfitvnm.vimusic.ui.components.BottomSheetMenu import it.vfsfitvnm.vimusic.ui.components.LocalMenuState import it.vfsfitvnm.vimusic.ui.components.rememberMenuState import it.vfsfitvnm.vimusic.ui.screens.HomeScreen -import it.vfsfitvnm.vimusic.ui.screens.SettingsScreen import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette import it.vfsfitvnm.vimusic.ui.styling.LocalTypography import it.vfsfitvnm.vimusic.ui.styling.rememberColorPalette import it.vfsfitvnm.vimusic.ui.styling.rememberTypography import it.vfsfitvnm.vimusic.utils.* +private val Context.dataStore by preferencesDataStore(name = "preferences") @ExperimentalAnimationApi @ExperimentalFoundationApi @@ -64,7 +63,7 @@ class MainActivity : ComponentActivity() { val intentVideoId = intent?.data?.getQueryParameter("v") setContent { - val preferences = rememberPreferences() + val preferences by rememberPreferences(dataStore) val systemUiController = rememberSystemUiController() val isDarkTheme = when (preferences.colorPaletteMode) { @@ -121,10 +120,9 @@ class MainActivity : ComponentActivity() { LocalColorPalette provides colorPalette, LocalShimmerTheme provides shimmerTheme, LocalTypography provides rememberTypography(colorPalette.text), - LocalYoutubePlayer provides rememberYoutubePlayer( - mediaControllerFuture, - preferences.repeatMode - ), + LocalYoutubePlayer provides rememberYoutubePlayer(mediaControllerFuture) { + it.repeatMode = preferences.repeatMode + }, LocalMenuState provides rememberMenuState(), LocalHapticFeedback provides rememberHapticFeedback() ) { @@ -133,7 +131,6 @@ class MainActivity : ComponentActivity() { .fillMaxSize() .background(LocalColorPalette.current.background) ) { -// SettingsScreen() HomeScreen(intentVideoId = intentVideoId) BottomSheetMenu( @@ -151,3 +148,4 @@ class MainActivity : ComponentActivity() { super.onDestroy() } } + diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/HomeScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/HomeScreen.kt index ff86b1e..9e3ac43 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/HomeScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/HomeScreen.kt @@ -270,6 +270,8 @@ fun HomeScreen(intentVideoId: String?) { } } + if (!preferences.isReady) return@LazyColumn + item { Row( verticalAlignment = Alignment.CenterVertically, @@ -302,9 +304,7 @@ fun HomeScreen(intentVideoId: String?) { modifier = Modifier .clickable { val values = SongCollection.values() - - preferences.homePageSongCollection = - values[(preferences.homePageSongCollection.ordinal + 1) % values.size] + preferences.onHomePageSongCollectionChange(values[(preferences.homePageSongCollection.ordinal + 1) % values.size]) } .padding(horizontal = 8.dp, vertical = 8.dp) .size(16.dp) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistScreen.kt index bd3e377..54bb2fc 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistScreen.kt @@ -51,7 +51,6 @@ fun LocalPlaylistScreen( Database.playlistWithSongs(playlistId).map { it ?: PlaylistWithSongs.NotFound } }.collectAsState(initial = PlaylistWithSongs.Empty, context = Dispatchers.IO) - val lazyListState = rememberLazyListState() val albumRoute = rememberAlbumRoute() diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt index 56f0d03..93a6cfe 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt @@ -183,9 +183,7 @@ fun SearchResultScreen( selectedTextStyle = typography.xs.medium.color(colorPalette.onPrimaryContainer), unselectedTextStyle = typography.xs.medium, shape = RoundedCornerShape(36.dp), - onValueChanged = { filter -> - preferences.searchFilter = filter - }, + onValueChanged = preferences.onSearchFilterChange, modifier = Modifier .padding(vertical = 8.dp) .padding(horizontal = 16.dp) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SettingsScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SettingsScreen.kt index 4b67dc3..d8e8794 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SettingsScreen.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SettingsScreen.kt @@ -112,17 +112,13 @@ fun SettingsScreen() { EnumValueSelectorEntry( title = "Theme mode", selectedValue = preferences.colorPaletteMode, - onValueSelected = { - preferences.colorPaletteMode = it - } + onValueSelected = preferences.onColorPaletteModeChange ) EnumValueSelectorEntry( title = "Thumbnail roundness", selectedValue = preferences.thumbnailRoundness, - onValueSelected = { - preferences.thumbnailRoundness = it - } + onValueSelected = preferences.onThumbnailRoundnessChange ) } } diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt index 789f03f..94529d8 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt @@ -449,7 +449,8 @@ fun PlayerView( .clickable { player.mediaController.repeatMode = (player.mediaController.repeatMode + 2) % 3 - preferences.repeatMode = player.mediaController.repeatMode + + preferences.onRepeatModeChange(player.mediaController.repeatMode) } .padding(horizontal = 16.dp) .size(28.dp) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubePlayer.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubePlayer.kt index efbdf14..237a789 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubePlayer.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubePlayer.kt @@ -110,12 +110,10 @@ val LocalYoutubePlayer = compositionLocalOf { null } @Composable fun rememberYoutubePlayer( mediaControllerFuture: ListenableFuture, - repeatMode: Int + block: (MediaController) -> Unit, ): YoutubePlayer? { val mediaController by produceState(initialValue = null) { - value = mediaControllerFuture.await().also { - it.repeatMode = repeatMode - } + value = mediaControllerFuture.await().also(block) } val playerState = remember(mediaController) { diff --git a/settings.gradle.kts b/settings.gradle.kts index 8f79dd4..c1e2f63 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -32,6 +32,8 @@ dependencyResolutionManagement { alias("accompanist-systemuicontroller").to("com.google.accompanist", "accompanist-systemuicontroller").versionRef("accompanist") alias("accompanist-flowlayout").to("com.google.accompanist", "accompanist-flowlayout").versionRef("accompanist") + alias("datastore").to("androidx.datastore", "datastore-preferences").version("1.0.0") + version("room", "2.5.0-alpha01") alias("room").to("androidx.room", "room-ktx").versionRef("room") alias("room-compiler").to("androidx.room", "room-compiler").versionRef("room")