From de4f66433357a4c704f09bac2499b1a4430d77d5 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Mon, 11 Apr 2022 22:01:48 +0200 Subject: [PATCH] Move color scheme preferences their own screen --- .../launcher2/ui/settings/SettingsActivity.kt | 4 ++ .../appearance/AppearanceSettingsScreen.kt | 27 +++++++------ .../colorscheme/ColorSchemeSettingsScreen.kt | 40 +++++++++++++++++++ .../ColorSchemeSettingsScreenVM.kt | 28 +++++++++++++ 4 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt create mode 100644 ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreenVM.kt diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt index ef1b6d92..29922899 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt @@ -27,6 +27,7 @@ import de.mm20.launcher2.ui.settings.buildinfo.BuildInfoSettingsScreen import de.mm20.launcher2.ui.settings.calendarwidget.CalendarWidgetSettingsScreen import de.mm20.launcher2.ui.settings.cards.CardsSettingsScreen import de.mm20.launcher2.ui.settings.clockwidget.ClockWidgetSettingsScreen +import de.mm20.launcher2.ui.settings.colorscheme.ColorSchemeSettingsScreen import de.mm20.launcher2.ui.settings.crashreporter.CrashReportScreen import de.mm20.launcher2.ui.settings.crashreporter.CrashReporterScreen import de.mm20.launcher2.ui.settings.debug.DebugSettingsScreen @@ -84,6 +85,9 @@ class SettingsActivity : BaseActivity() { composable("settings/appearance") { AppearanceSettingsScreen() } + composable("settings/appearance/colorscheme") { + ColorSchemeSettingsScreen() + } composable("settings/appearance/cards") { CardsSettingsScreen() } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt index 764eda39..7a6b160a 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt @@ -1,12 +1,14 @@ package de.mm20.launcher2.ui.settings.appearance import android.graphics.drawable.ColorDrawable -import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items @@ -27,10 +29,10 @@ import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.HorizontalPagerIndicator import com.google.accompanist.pager.rememberPagerState import de.mm20.launcher2.icons.LauncherIcon -import de.mm20.launcher2.ktx.dp -import de.mm20.launcher2.preferences.Settings.* import de.mm20.launcher2.preferences.Settings.AppearanceSettings.ColorScheme import de.mm20.launcher2.preferences.Settings.AppearanceSettings.Theme +import de.mm20.launcher2.preferences.Settings.IconSettings +import de.mm20.launcher2.preferences.Settings.SearchBarSettings import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.ShapedLauncherIcon import de.mm20.launcher2.ui.component.getShape @@ -64,16 +66,15 @@ fun AppearanceSettingsScreen() { } ) val colorScheme by viewModel.colorScheme.observeAsState() - ListPreference( + Preference( title = stringResource(id = R.string.preference_screen_colors), - items = listOf( - stringResource(id = R.string.preference_colors_default) to ColorScheme.Default, - stringResource(id = R.string.preference_colors_bw) to ColorScheme.BlackAndWhite, - ), - value = colorScheme, - onValueChanged = { newValue -> - if (newValue == null) return@ListPreference - viewModel.setColorScheme(newValue) + summary = when (colorScheme) { + ColorScheme.Default -> stringResource(R.string.preference_colors_default) + ColorScheme.BlackAndWhite -> stringResource(R.string.preference_colors_bw) + else -> null + }, + onClick = { + navController?.navigate("settings/appearance/colorscheme") } ) Preference( diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt new file mode 100644 index 00000000..efedf950 --- /dev/null +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt @@ -0,0 +1,40 @@ +package de.mm20.launcher2.ui.settings.colorscheme + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.RadioButtonChecked +import androidx.compose.material.icons.rounded.RadioButtonUnchecked +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.viewmodel.compose.viewModel +import de.mm20.launcher2.preferences.Settings.AppearanceSettings.ColorScheme +import de.mm20.launcher2.ui.R +import de.mm20.launcher2.ui.component.preferences.Preference +import de.mm20.launcher2.ui.component.preferences.PreferenceCategory +import de.mm20.launcher2.ui.component.preferences.PreferenceScreen + +@Composable +fun ColorSchemeSettingsScreen() { + val viewModel: ColorSchemeSettingsScreenVM = viewModel() + val context = LocalContext.current + + PreferenceScreen(title = stringResource(R.string.preference_screen_colors)) { + item { + PreferenceCategory { + val colorScheme by viewModel.colorScheme.observeAsState() + Preference( + title = stringResource(R.string.preference_colors_default), + icon = if (colorScheme == ColorScheme.Default) Icons.Rounded.RadioButtonChecked else Icons.Rounded.RadioButtonUnchecked, + onClick = { viewModel.setColorScheme(ColorScheme.Default) } + ) + Preference( + title = stringResource(R.string.preference_colors_bw), + icon = if (colorScheme == ColorScheme.BlackAndWhite) Icons.Rounded.RadioButtonChecked else Icons.Rounded.RadioButtonUnchecked, + onClick = { viewModel.setColorScheme(ColorScheme.BlackAndWhite) } + ) + } + } + } +} \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreenVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreenVM.kt new file mode 100644 index 00000000..3cbbfd89 --- /dev/null +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreenVM.kt @@ -0,0 +1,28 @@ +package de.mm20.launcher2.ui.settings.colorscheme + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.asLiveData +import androidx.lifecycle.viewModelScope +import de.mm20.launcher2.preferences.LauncherDataStore +import de.mm20.launcher2.preferences.Settings.AppearanceSettings +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +class ColorSchemeSettingsScreenVM : ViewModel(), KoinComponent { + private val dataStore: LauncherDataStore by inject() + + val colorScheme = dataStore.data.map { it.appearance.colorScheme }.asLiveData() + fun setColorScheme(colorScheme: AppearanceSettings.ColorScheme) { + viewModelScope.launch { + dataStore.updateData { + it.toBuilder() + .setAppearance( + it.appearance.toBuilder() + .setColorScheme(colorScheme) + ).build() + } + } + } +} \ No newline at end of file