diff --git a/app/build.gradle b/app/build.gradle index 596db7f..2928aed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { - jvmTarget = '1.8' + jvmTarget = '11' useIR = true } buildFeatures { diff --git a/app/src/main/java/com/owenlejeune/tvtime/preferences/AppPreferences.kt b/app/src/main/java/com/owenlejeune/tvtime/preferences/AppPreferences.kt index b15dd81..f8e2a16 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/preferences/AppPreferences.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/preferences/AppPreferences.kt @@ -65,9 +65,9 @@ class AppPreferences(context: Context) { get() = preferences.getBoolean(USE_SYSTEM_COLORS, useSystemColorsDefault) set(value) { preferences.put(USE_SYSTEM_COLORS, value) } - val chromeMultiplyerDefault: Double = MonetCompat.chromaMultiplier.toFloat().toDouble() + val chromaMultiplierDefault: Double = MonetCompat.chromaMultiplier.toFloat().toDouble() var chromaMultiplier: Double - get() = preferences.getFloat(CHROMA_MULTIPLIER, chromeMultiplyerDefault.toFloat()).toDouble() + get() = preferences.getFloat(CHROMA_MULTIPLIER, chromaMultiplierDefault.toFloat()).toDouble() set(value) { preferences.put(CHROMA_MULTIPLIER, value) } val selectedColorDefault: Int = Int.MAX_VALUE diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/components/PreferenceWidgets.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/PreferenceWidgets.kt index bcc9a73..20d30cf 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/components/PreferenceWidgets.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/PreferenceWidgets.kt @@ -29,7 +29,7 @@ fun PreferenceHeading( @Composable fun SwitchPreference( titleText: String, - checkState: Boolean, + checkState: State, modifier: Modifier = Modifier, subtitleText: String = "", onCheckedChange: (Boolean) -> Unit = {}, @@ -59,6 +59,52 @@ fun SwitchPreference( Spacer(modifier = Modifier.width(32.dp)) + CustomSwitch( + modifier = Modifier + .align(Alignment.CenterVertically), + checked = checkState.value, + onCheckedChange = onCheckedChange, + width = 30.dp, + height = 15.dp, + colors = CustomSwitchColors.standardColors(), + enabled = enabled + ) + } +} + +@Composable +fun SwitchPreference( + titleText: String, + checkState: Boolean, + modifier: Modifier = Modifier, + subtitleText: String = "", + onCheckedChange: (Boolean) -> Unit = {}, + titleTextColor: Color = MaterialTheme.colorScheme.onBackground, + subtitleTextColor: Color = MaterialTheme.colorScheme.onSurfaceVariant, + disabledTextColor: Color = MaterialTheme.colorScheme.outline, + enabled: Boolean = true +) { + Row( + modifier = modifier + .fillMaxWidth() + .wrapContentHeight() + .padding(all = 8.dp) + ) { + Column( + modifier = Modifier + .align(Alignment.CenterVertically) + .weight(1f) + ) { + val titleColor = if (enabled) titleTextColor else disabledTextColor + val subtitleColor = if (enabled) subtitleTextColor else disabledTextColor + Text(text = titleText, style = MaterialTheme.typography.titleLarge, color = titleColor, fontSize = 20.sp) + if (subtitleText.isNotEmpty()) { + Text(text = subtitleText, style = MaterialTheme.typography.bodyMedium, color = subtitleColor) + } + } + + Spacer(modifier = Modifier.width(32.dp)) + CustomSwitch( modifier = Modifier .align(Alignment.CenterVertically), @@ -76,8 +122,8 @@ fun SwitchPreference( fun SliderPreference( modifier: Modifier = Modifier, titleText: String, - value: Float, - onValueChangeFinished: (Float) -> Unit , + value: State, + onValueChangeFinished: (Double) -> Unit , titleTextColor: Color = MaterialTheme.colorScheme.onBackground, disabledTextColor: Color = MaterialTheme.colorScheme.outline, enabled: Boolean = true @@ -90,14 +136,14 @@ fun SliderPreference( val titleColor = if (enabled) titleTextColor else disabledTextColor Text(text = titleText, style = MaterialTheme.typography.titleLarge, color = titleColor, fontSize = 20.sp) - var sliderValue by remember { mutableStateOf(value) } + var sliderValue by remember { mutableStateOf(value.value) } Slider( modifier = Modifier .fillMaxWidth() .padding(start = 8.dp), - value = sliderValue, - onValueChange = { sliderValue = it }, + value = sliderValue.toFloat(), + onValueChange = { sliderValue = it.toDouble() }, enabled = enabled, valueRange = 0f..100f, onValueChangeFinished = { diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MediaTabNavItem.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MediaTabNavItem.kt index 21b4d79..2dcb677 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MediaTabNavItem.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/MediaTabNavItem.kt @@ -6,7 +6,7 @@ import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.api.tmdb.api.v3.HomePageService import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePageResponse import com.owenlejeune.tvtime.utils.types.MediaViewType -import com.owenlejeune.tvtime.api.tmdb.viewmodel.MediaTabViewModel +import com.owenlejeune.tvtime.ui.viewmodel.MediaTabViewModel import com.owenlejeune.tvtime.ui.screens.tabs.MediaTabContent import com.owenlejeune.tvtime.utils.ResourceUtils import com.owenlejeune.tvtime.utils.types.TabNavItem diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/AccountScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/AccountScreen.kt index ca0af59..a2e27a9 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/AccountScreen.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/AccountScreen.kt @@ -30,7 +30,7 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.api.tmdb.api.v3.model.* import com.owenlejeune.tvtime.api.tmdb.api.v4.model.AccountList -import com.owenlejeune.tvtime.api.tmdb.viewmodel.RecommendedMediaViewModel +import com.owenlejeune.tvtime.ui.viewmodel.RecommendedMediaViewModel import com.owenlejeune.tvtime.extensions.unlessEmpty import com.owenlejeune.tvtime.ui.components.AccountIcon import com.owenlejeune.tvtime.ui.components.PagingPosterGrid diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt index 54e44b9..38f98af 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SettingsScreen.kt @@ -26,6 +26,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.viewinterop.AndroidView +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager @@ -38,6 +39,7 @@ import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.preferences.AppPreferences import com.owenlejeune.tvtime.ui.components.* import com.owenlejeune.tvtime.ui.navigation.AppNavItem +import com.owenlejeune.tvtime.ui.viewmodel.SettingsViewModel import com.owenlejeune.tvtime.ui.views.HomeTabRecyclerAdapter import com.owenlejeune.tvtime.ui.views.ItemMoveCallback import com.owenlejeune.tvtime.utils.ResourceUtils @@ -66,7 +68,11 @@ fun SettingsScreen( val appBarTitle = remember { mutableStateOf("") } val defaultRestoreAction = ::resetAllPreferences - val restoreAction = remember { mutableStateOf<(AppPreferences) -> Unit>(defaultRestoreAction) } + val restoreAction = remember { mutableStateOf(defaultRestoreAction) } + + val settingsViewModel = viewModel() + + val activity = LocalContext.current as AppCompatActivity Scaffold( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), @@ -89,9 +95,11 @@ fun SettingsScreen( } }, actions = { - IconButton(onClick = { - restoreAction.value(preferences) - }) { + IconButton( + onClick = { + restoreAction.value(preferences, settingsViewModel, activity) + } + ) { Icon( imageVector = Icons.Filled.SettingsBackupRestore, contentDescription = stringResource(R.string.preferences_restore_content_description) @@ -109,11 +117,10 @@ fun SettingsScreen( .padding(all = 24.dp), verticalArrangement = Arrangement.spacedBy(18.dp) ) { - val activity = LocalContext.current as AppCompatActivity SettingsPage.getByRoute(route).apply { appBarTitle.value = name restoreAction.value = resetPreferencesHandler - settingsPageRenderer(appNavController, activity, preferences) + settingsPageRenderer(appNavController, activity) } } } else { @@ -216,28 +223,24 @@ private fun TopLevelSettingsCard( } @Composable -private fun SearchPreferences( - preferences: AppPreferences = get(AppPreferences::class.java) -) { - val persistentSearch = remember { mutableStateOf(preferences.showSearchBar) } +private fun SearchPreferences() { + val settingsViewModel = viewModel() + SwitchPreference( titleText = stringResource(R.string.preferences_persistent_search_title), subtitleText = stringResource(R.string.preferences_persistent_search_subtitle), - checkState = persistentSearch.value, - onCheckedChange = { isChecked -> - persistentSearch.value = isChecked - preferences.showSearchBar = isChecked + checkState = settingsViewModel.showSearchBar.collectAsState(), + onCheckedChange = { + settingsViewModel.toggleShowSearchBar() } ) - val multiSearch = remember { mutableStateOf(preferences.multiSearch) } SwitchPreference( titleText = stringResource(R.string.preference_multi_search_title), subtitleText = stringResource(R.string.preference_multi_search_subtitle), - checkState = multiSearch.value, - onCheckedChange = { isChecked -> - multiSearch.value = isChecked - preferences.multiSearch = isChecked + checkState = settingsViewModel.useMultiSearch.collectAsState(), + onCheckedChange = { + settingsViewModel.toggleMultiSearch() } ) } @@ -245,9 +248,10 @@ private fun SearchPreferences( @Composable private fun DesignPreferences( appNavController: NavController, - activity: AppCompatActivity, - preferences: AppPreferences = get(AppPreferences::class.java) + activity: AppCompatActivity ) { + val settingsViewModel = viewModel() + TopLevelSettingsCard( title = stringResource(id = R.string.preference_heading_dark_mode), subtitle = stringResource(R.string.preference_subtitle_dark_mode), @@ -256,53 +260,48 @@ private fun DesignPreferences( appNavController = appNavController ) - val useWallpaperColors = remember { mutableStateOf(preferences.useWallpaperColors) } SwitchPreference( titleText = stringResource(R.string.preferences_use_wallpaper_colors_title), subtitleText = stringResource(R.string.preferences_use_wallpaper_colors_subtitle), - checkState = useWallpaperColors.value, - onCheckedChange = { isChecked -> - useWallpaperColors.value = isChecked - preferences.useWallpaperColors = isChecked + checkState = settingsViewModel.useWallpaperColors.collectAsState(), + onCheckedChange = { + settingsViewModel.toggleUseWallpaperColors() activity.recreate() } ) val isSystemColorsSupported = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S if (isSystemColorsSupported) { - val useSystemColors = remember { mutableStateOf(preferences.useSystemColors) } SwitchPreference( titleText = stringResource(id = R.string.preference_system_colors_heading), subtitleText = stringResource(R.string.preference_system_colors_subtitle), - checkState = useSystemColors.value, + checkState = settingsViewModel.useSystemColors.collectAsState(), onCheckedChange = { isChecked -> - useSystemColors.value = isChecked - preferences.useSystemColors = isChecked + settingsViewModel.toggleUseSystemColors() MonetCompat.useSystemColorsOnAndroid12 = isChecked MonetCompat.getInstance().updateMonetColors() }, - enabled = useWallpaperColors.value + enabled = settingsViewModel.useSystemColors.collectAsState().value ) } SliderPreference( titleText = stringResource(id = R.string.preference_chroma_factor_heading), - value = preferences.chromaMultiplier.toFloat() * 50f, + value = settingsViewModel.chromaMultiplier.collectAsState(), onValueChangeFinished = { value -> - with((value / 50f).toDouble()) { - preferences.chromaMultiplier = this + with((value / 50f)) { + settingsViewModel.setChromaMultiplier(value) MonetCompat.chromaMultiplier = this } MonetCompat.getInstance().updateMonetColors() }, - enabled = (if (isSystemColorsSupported) !preferences.useSystemColors else true).and( - useWallpaperColors.value - ) + enabled = (if (isSystemColorsSupported) !settingsViewModel.useSystemColors.collectAsState().value else true) + .and(settingsViewModel.useWallpaperColors.collectAsState().value) ) val showWallpaperPicker = remember { mutableStateOf(false) } val wallpaperPickerModifier = - if (isSystemColorsSupported && preferences.useSystemColors && useWallpaperColors.value) { + if (isSystemColorsSupported && settingsViewModel.useSystemColors.collectAsState().value && settingsViewModel.useWallpaperColors.collectAsState().value) { Modifier } else { Modifier.clickable { showWallpaperPicker.value = true } @@ -311,7 +310,7 @@ private fun DesignPreferences( text = stringResource(id = R.string.preference_wallpaper_color_heading), style = MaterialTheme.typography.titleLarge, fontSize = 20.sp, - color = if (isSystemColorsSupported && preferences.useSystemColors) { + color = if (isSystemColorsSupported && settingsViewModel.useSystemColors.collectAsState().value) {//preferences.useSystemColors) { MaterialTheme.colorScheme.outline } else { MaterialTheme.colorScheme.onBackground @@ -326,15 +325,13 @@ private fun DesignPreferences( @Composable private fun DarkModePreferences( - activity: AppCompatActivity, - preferences: AppPreferences = get(AppPreferences::class.java) + activity: AppCompatActivity ) { - val selectedValue = remember { mutableStateOf(preferences.darkTheme) } + val settingsViewModel = viewModel() - val isSelected: (Int) -> Boolean = { selectedValue.value == it } + val isSelected: (Int) -> Boolean = { settingsViewModel.darkTheme.value == it } val onChangeState: (Int) -> Unit = { - selectedValue.value = it - preferences.darkTheme = it + settingsViewModel.setDarkMode(it) activity.recreate() } @@ -368,30 +365,26 @@ private fun DarkModePreferences( } @Composable -private fun HomeScreenPreferences( - preferences: AppPreferences = get(AppPreferences::class.java) -) { +private fun HomeScreenPreferences() { + val settingsViewModel = viewModel() + PreferenceHeading(text = stringResource(R.string.preference_look_and_feel_heading)) - val showTabLabels = remember { mutableStateOf(preferences.showBottomTabLabels) } SwitchPreference( titleText = stringResource(R.string.preference_show_text_labels_title), subtitleText = stringResource(R.string.preference_show_text_labels_subtitle), - checkState = showTabLabels.value, - onCheckedChange = { isChecked -> - showTabLabels.value = isChecked - preferences.showBottomTabLabels = isChecked + checkState = settingsViewModel.showBottomTabLabels.collectAsState(), + onCheckedChange = { + settingsViewModel.toggleShowBottomTabLabels() } ) - val showPosterTitles = remember { mutableStateOf(preferences.showPosterTitles) } SwitchPreference( titleText = stringResource(R.string.preference_show_poster_titles_title), subtitleText = stringResource(R.string.preference_show_poster_titles_subtitle), - checkState = showPosterTitles.value, - onCheckedChange = { isChecked -> - showPosterTitles.value = isChecked - preferences.showPosterTitles = isChecked + checkState = settingsViewModel.showPosterTitles.collectAsState(), + onCheckedChange = { + settingsViewModel.toggleShowPosterTitles() } ) @@ -423,32 +416,28 @@ private fun HomeScreenPreferences( } @Composable -private fun DevPreferences( - preferences: AppPreferences = get(AppPreferences::class.java) -) { +private fun DevPreferences() { if (BuildConfig.DEBUG) { + val settingsViewModel = viewModel() + val context = LocalContext.current val coroutineScope = rememberCoroutineScope() - val showBackdropGallery = remember { mutableStateOf(preferences.showBackdropGallery) } SwitchPreference( titleText = "Show backdrop gallery", subtitleText = "Show galleries for movies/tv backdrops", - checkState = showBackdropGallery.value, - onCheckedChange = { isChecked -> - showBackdropGallery.value = isChecked - preferences.showBackdropGallery = isChecked + checkState = settingsViewModel.showBackdropGallery.collectAsState(), + onCheckedChange = { + settingsViewModel.toggleShowBackdropGallery() } ) - val firstLaunchTesting = remember { mutableStateOf(preferences.firstLaunchTesting) } SwitchPreference( titleText = "Always show onboarding flow", subtitleText = "Show onboarding flow on each launch", - checkState = firstLaunchTesting.value, - onCheckedChange = { isChecked -> - firstLaunchTesting.value = isChecked - preferences.firstLaunchTesting = isChecked + checkState = settingsViewModel.firstLaunchTesting.collectAsState(), + onCheckedChange = { + settingsViewModel.toggleFirstLaunchTesting() } ) Text( @@ -506,11 +495,12 @@ private fun DevPreferences( @Composable private fun WallpaperPicker( - showPopup: MutableState, - preference: AppPreferences = get(AppPreferences::class.java) + showPopup: MutableState ) { val context = LocalContext.current + val settingsViewModel = viewModel() + val wallpaperColors = remember { mutableStateOf>(emptyList()) } val selectedWallpaperColor = remember { mutableStateOf(0) } LaunchedEffect(true) { @@ -546,7 +536,7 @@ private fun WallpaperPicker( showIcon = it == selectedWallpaperColor.value, onClick = { if (it != selectedWallpaperColor.value) { - preference.selectedColor = it + settingsViewModel.setSelectedColor(it) MonetCompat .getInstance() .updateMonetColors() @@ -562,8 +552,8 @@ private fun WallpaperPicker( icon = Icons.Filled.RestartAlt, contentDescription = null, onClick = { - if (preference.selectedColor != Int.MAX_VALUE) { - preference.selectedColor = Int.MAX_VALUE + if (settingsViewModel.selectedColor.value != Int.MAX_VALUE) { + settingsViewModel.setSelectedColor(Int.MAX_VALUE) MonetCompat.getInstance().updateMonetColors() } else { Toast.makeText(context, context.getString(R.string.preference_wallpaper_color_default_selected), Toast.LENGTH_SHORT).show() @@ -583,50 +573,99 @@ private fun WallpaperPicker( } } -private fun resetAllPreferences(preferences: AppPreferences) { - resetSearchPreferences(preferences = preferences) - resetDesignPreferences(preferences = preferences) - resetHomeScreenPreferences(preferences = preferences) - resetDevModePreference(preferences = preferences) +private fun resetAllPreferences( + preferences: AppPreferences, + settingsViewModel: SettingsViewModel, + activity: AppCompatActivity +) { + resetSearchPreferences(preferences = preferences, settingsViewModel = settingsViewModel, activity = activity, skipRecreate = true) + resetDesignPreferences(preferences = preferences, settingsViewModel = settingsViewModel, activity = activity, skipRecreate = true) + resetHomeScreenPreferences(preferences = preferences, settingsViewModel = settingsViewModel, activity = activity, skipRecreate = true) + resetDevModePreference(preferences = preferences, settingsViewModel = settingsViewModel, activity = activity, skipRecreate = true) + activity.recreate() + Toast.makeText(activity, "All settings reset successfully", Toast.LENGTH_SHORT).show() } -private fun resetSearchPreferences(preferences: AppPreferences) { - preferences.showSearchBar = preferences.showSearchBarDefault - preferences.multiSearch = preferences.multiSearchDefault +private fun resetSearchPreferences( + preferences: AppPreferences, + settingsViewModel: SettingsViewModel, + activity: AppCompatActivity, + skipRecreate: Boolean = false +) { + settingsViewModel.setShowSearchBar(preferences.showSearchBarDefault) + settingsViewModel.setMultiSearch(preferences.multiSearchDefault) + if (!skipRecreate) { + activity.recreate() + } } -private fun resetDesignPreferences(preferences: AppPreferences) { - preferences.useWallpaperColors = preferences.useWallpaperColorsDefault - preferences.useSystemColors = preferences.useSystemColorsDefault - preferences.chromaMultiplier = preferences.chromeMultiplyerDefault - preferences.selectedColor = preferences.selectedColorDefault - resetDarkModePreferences(preferences = preferences) +private fun resetDesignPreferences( + preferences: AppPreferences, + settingsViewModel: SettingsViewModel, + activity: AppCompatActivity, + skipRecreate: Boolean = false +) { + settingsViewModel.setUseSystemColors(preferences.useSystemColorsDefault) + settingsViewModel.setUseWallpaperColors(preferences.useWallpaperColorsDefault) + settingsViewModel.setChromaMultiplier(preferences.chromaMultiplierDefault) + settingsViewModel.setSelectedColor(preferences.selectedColorDefault) + resetDarkModePreferences(preferences = preferences, settingsViewModel = settingsViewModel, activity = activity, skipRecreate = true) + if (!skipRecreate) { + activity.recreate() + } } -private fun resetDarkModePreferences(preferences: AppPreferences) { - preferences.darkTheme = preferences.darkThemeDefault +private fun resetDarkModePreferences( + preferences: AppPreferences, + settingsViewModel: SettingsViewModel, + activity: AppCompatActivity, + skipRecreate: Boolean = false +) { + settingsViewModel.setDarkMode(preferences.darkThemeDefault) + if (!skipRecreate) { + activity.recreate() + } } -private fun resetDevModePreference(preferences: AppPreferences) { - preferences.firstLaunchTesting = preferences.firstLaunchTestingDefault - preferences.showBackdropGallery = preferences.showBackdropGalleryDefault +private fun resetDevModePreference( + preferences: AppPreferences, + settingsViewModel: SettingsViewModel, + activity: AppCompatActivity, + skipRecreate: Boolean = false +) { + settingsViewModel.setFirstLaunchTesting(preferences.firstLaunchTestingDefault) + settingsViewModel.setShowBackdropGallery(preferences.showBackdropGalleryDefault) + if (!skipRecreate) { + activity.recreate() + } } -private fun resetHomeScreenPreferences(preferences: AppPreferences) { +private fun resetHomeScreenPreferences( + preferences: AppPreferences, + settingsViewModel: SettingsViewModel, + activity: AppCompatActivity, + skipRecreate: Boolean = false +) { + settingsViewModel.setShowBottomTabLabels(preferences.showBottomTabLabelsDefault) + settingsViewModel.setShowPosterTitles(preferences.showPosterTitlesDefault) preferences.moviesTabPosition = preferences.moviesTabPositionDefault preferences.tvTabPosition = preferences.tvTabPositionDefault preferences.peopleTabPosition = preferences.peopleTabPositionDefault preferences.accountTabPosition = preferences.accountTabPositionDefault preferences.showBottomTabLabels = preferences.showBottomTabLabelsDefault + if (!skipRecreate) { + activity.recreate() + } } -private typealias SettingsPageRenderer = @Composable (NavController, AppCompatActivity, AppPreferences) -> Unit +private typealias SettingsResetHandler = (AppPreferences, SettingsViewModel, AppCompatActivity) -> Unit +private typealias SettingsPageRenderer = @Composable (NavController, AppCompatActivity) -> Unit private sealed class SettingsPage( stringRes: Int, val route: String, val settingsPageRenderer: SettingsPageRenderer, - val resetPreferencesHandler: (AppPreferences) -> Unit + val resetPreferencesHandler: SettingsResetHandler ): KoinComponent { private val resources: ResourceUtils by inject() @@ -654,31 +693,31 @@ private sealed class SettingsPage( object SearchSettings: SettingsPage( R.string.preference_heading_search, "search", - @Composable { _, _, p -> SearchPreferences(p) }, + @Composable { _, _ -> SearchPreferences() }, ::resetSearchPreferences ) object DesignSettings: SettingsPage( R.string.preference_heading_design, "design", - @Composable { n, a, p -> DesignPreferences(n, a, p) }, + @Composable { n, a -> DesignPreferences(n, a) }, ::resetDesignPreferences ) object HomeScreenSettings: SettingsPage( R.string.preference_heading_home_screen, "home", - @Composable { _, _, p -> HomeScreenPreferences(p) }, + @Composable { _, _ -> HomeScreenPreferences() }, ::resetHomeScreenPreferences ) object DeveloperSettings: SettingsPage( R.string.preferences_debug_title, "dev", - @Composable { _, _, p -> DevPreferences(p) }, + @Composable { _, _ -> DevPreferences() }, ::resetDevModePreference ) object DarkModeSettings: SettingsPage( R.string.preference_heading_dark_mode, "darkmode", - @Composable { _, a, p -> DarkModePreferences(a, p) }, + @Composable { _, a -> DarkModePreferences(a) }, ::resetDarkModePreferences ) } diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/MediaTab.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/MediaTab.kt index 57471d5..66a5925 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/MediaTab.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/MediaTab.kt @@ -18,7 +18,7 @@ import com.owenlejeune.tvtime.ui.components.SearchView import com.owenlejeune.tvtime.ui.navigation.AppNavItem import com.owenlejeune.tvtime.ui.navigation.MediaTabNavItem import com.owenlejeune.tvtime.ui.components.Tabs -import com.owenlejeune.tvtime.api.tmdb.viewmodel.MediaTabViewModel +import com.owenlejeune.tvtime.ui.viewmodel.MediaTabViewModel import com.owenlejeune.tvtime.utils.types.MediaViewType @OptIn(ExperimentalPagerApi::class) diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/PeopleTab.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/PeopleTab.kt index 444c1a8..d6650ec 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/PeopleTab.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/tabs/PeopleTab.kt @@ -11,7 +11,7 @@ import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.ui.components.PagingPeoplePosterGrid import com.owenlejeune.tvtime.ui.components.SearchView import com.owenlejeune.tvtime.ui.navigation.AppNavItem -import com.owenlejeune.tvtime.api.tmdb.viewmodel.PeopleTabViewModel +import com.owenlejeune.tvtime.ui.viewmodel.PeopleTabViewModel import com.owenlejeune.tvtime.utils.types.MediaViewType @Composable diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/MediaTabViewModel.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/MediaTabViewModel.kt similarity index 97% rename from app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/MediaTabViewModel.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/MediaTabViewModel.kt index b067783..8e74025 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/MediaTabViewModel.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/MediaTabViewModel.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api.tmdb.viewmodel +package com.owenlejeune.tvtime.ui.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/PeopleTabViewModel.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/PeopleTabViewModel.kt similarity index 92% rename from app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/PeopleTabViewModel.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/PeopleTabViewModel.kt index 14b0422..01e6bf8 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/PeopleTabViewModel.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/PeopleTabViewModel.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api.tmdb.viewmodel +package com.owenlejeune.tvtime.ui.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/RecommendedMediaViewModel.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/RecommendedMediaViewModel.kt similarity index 94% rename from app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/RecommendedMediaViewModel.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/RecommendedMediaViewModel.kt index 5e11161..e73adf0 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/RecommendedMediaViewModel.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/RecommendedMediaViewModel.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api.tmdb.viewmodel +package com.owenlejeune.tvtime.ui.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SettingsViewModel.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SettingsViewModel.kt new file mode 100644 index 0000000..d0bb34c --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/SettingsViewModel.kt @@ -0,0 +1,142 @@ +package com.owenlejeune.tvtime.ui.viewmodel + +import androidx.lifecycle.ViewModel +import com.owenlejeune.tvtime.preferences.AppPreferences +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +class SettingsViewModel: ViewModel(), KoinComponent { + + private val preferences: AppPreferences by inject() + + private val _showSearchBar = MutableStateFlow(preferences.showSearchBar) + val showSearchBar = _showSearchBar.asStateFlow() + + private val _useMultiSearch = MutableStateFlow(preferences.multiSearch) + val useMultiSearch = _useMultiSearch.asStateFlow() + + private val _useWallpaperColor = MutableStateFlow(preferences.useWallpaperColors) + val useWallpaperColors = _useWallpaperColor.asStateFlow() + + private val _darkTheme = MutableStateFlow(preferences.darkTheme) + val darkTheme = _darkTheme.asStateFlow() + + private val _useSystemColors = MutableStateFlow(preferences.useSystemColors) + val useSystemColors = _useSystemColors.asStateFlow() + + private val _chromaMultiplier = MutableStateFlow(preferences.chromaMultiplier) + val chromaMultiplier = _chromaMultiplier.asStateFlow() + + private val _selectedColor = MutableStateFlow(preferences.selectedColor) + val selectedColor = _selectedColor.asStateFlow() + + private val _showBottomTabLabels = MutableStateFlow(preferences.showBottomTabLabels) + val showBottomTabLabels = _showBottomTabLabels.asStateFlow() + + private val _showPosterTitles = MutableStateFlow(preferences.showPosterTitles) + val showPosterTitles = _showPosterTitles.asStateFlow() + + private val _firstLaunchTesting = MutableStateFlow(preferences.firstLaunchTesting) + val firstLaunchTesting = _firstLaunchTesting.asStateFlow() + + private val _showBackdropGallery = MutableStateFlow(preferences.showBackdropGallery) + val showBackdropGallery = _showBackdropGallery.asStateFlow() + + fun toggleShowSearchBar() { + _showSearchBar.value = _showSearchBar.value.not() + preferences.showSearchBar = _showSearchBar.value + } + + fun setShowSearchBar(value: Boolean) { + _showSearchBar.value = value + preferences.showSearchBar = value + } + + fun toggleMultiSearch() { + _useMultiSearch.value = _useMultiSearch.value.not() + preferences.multiSearch = _useMultiSearch.value + } + + fun setMultiSearch(value: Boolean) { + _useMultiSearch.value = value + preferences.multiSearch = value + } + + fun toggleUseWallpaperColors() { + _useWallpaperColor.value = _useWallpaperColor.value.not() + preferences.useWallpaperColors = _useWallpaperColor.value + } + + fun setUseWallpaperColors(value: Boolean) { + _useWallpaperColor.value = value + preferences.useWallpaperColors = value + } + + fun setDarkMode(darkMode: Int) { + _darkTheme.value = darkMode + preferences.darkTheme = _darkTheme.value + } + + fun toggleUseSystemColors() { + _useSystemColors.value = _useSystemColors.value.not() + preferences.useSystemColors = _useSystemColors.value + } + + fun setUseSystemColors(value: Boolean) { + _useSystemColors.value = value + preferences.useSystemColors = value + } + + fun setChromaMultiplier(multiplier: Double) { + _chromaMultiplier.value = multiplier + preferences.chromaMultiplier = _chromaMultiplier.value + } + + fun setSelectedColor(selectedColor: Int) { + _selectedColor.value = selectedColor + preferences.selectedColor = _selectedColor.value + } + + fun toggleShowBottomTabLabels() { + _showBottomTabLabels.value = _showBottomTabLabels.value.not() + preferences.showBottomTabLabels = _showBottomTabLabels.value + } + + fun setShowBottomTabLabels(value: Boolean) { + _showBottomTabLabels.value = value + preferences.showBottomTabLabels = value + } + + fun toggleShowPosterTitles() { + _showPosterTitles.value = _showPosterTitles.value.not() + preferences.showPosterTitles = _showPosterTitles.value + } + + fun setShowPosterTitles(value: Boolean) { + _showPosterTitles.value = value + preferences.showPosterTitles = value + } + + fun toggleFirstLaunchTesting() { + _firstLaunchTesting.value = _firstLaunchTesting.value.not() + preferences.firstLaunchTesting = _firstLaunchTesting.value + } + + fun setFirstLaunchTesting(value: Boolean) { + _firstLaunchTesting.value = value + preferences.firstLaunchTesting = value + } + + fun toggleShowBackdropGallery() { + _showBackdropGallery.value = _showBackdropGallery.value.not() + preferences.showBackdropGallery = _showBackdropGallery.value + } + + fun setShowBackdropGallery(value: Boolean) { + _showBackdropGallery.value = value + preferences.showBackdropGallery = value + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/ViewModelConstants.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/ViewModelConstants.kt similarity index 55% rename from app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/ViewModelConstants.kt rename to app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/ViewModelConstants.kt index 18e490a..812eed7 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/viewmodel/ViewModelConstants.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/viewmodel/ViewModelConstants.kt @@ -1,4 +1,4 @@ -package com.owenlejeune.tvtime.api.tmdb.viewmodel +package com.owenlejeune.tvtime.ui.viewmodel object ViewModelConstants {