From c6e975be4dff70a15cbdbb71d75dd154349ac2c1 Mon Sep 17 00:00:00 2001 From: SuperDragonXD <70206496+SuperDragonXD@users.noreply.github.com> Date: Fri, 9 Feb 2024 18:46:34 +0800 Subject: [PATCH] Create `MainSwitchPreference` (#4062) --- lawnchair/res/values/strings.xml | 2 +- .../controls/MainSwitchPreference.kt | 58 ++++++++++++ .../destinations/DebugMenuPreferences.kt | 82 +++++++++------- .../destinations/DockPreferences.kt | 94 +++++++++---------- 4 files changed, 147 insertions(+), 89 deletions(-) create mode 100644 lawnchair/src/app/lawnchair/ui/preferences/components/controls/MainSwitchPreference.kt diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index f29fae3198..6129810ff2 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -293,7 +293,7 @@ - Enable Dock + Show Dock Search Bar Widget Disabled Lawnchair diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/MainSwitchPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/MainSwitchPreference.kt new file mode 100644 index 0000000000..f2b97da93d --- /dev/null +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/MainSwitchPreference.kt @@ -0,0 +1,58 @@ +package app.lawnchair.ui.preferences.components.controls + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.AnimatedVisibilityScope +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.layout.padding +import androidx.compose.material.ContentAlpha +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import app.lawnchair.preferences.PreferenceAdapter +import app.lawnchair.ui.preferences.components.layout.DividerColumn + +/** + * A toggle to enable a list of preferences. + */ +@Composable +fun MainSwitchPreference( + adapter: PreferenceAdapter, + label: String, + description: String? = null, + content: @Composable AnimatedVisibilityScope.() -> Unit, +) { + val checked = adapter.state.value + + Surface( + modifier = Modifier.padding(horizontal = 16.dp), + shape = androidx.compose.material.MaterialTheme.shapes.large, + color = if (checked) MaterialTheme.colorScheme.primaryContainer else MaterialTheme.colorScheme.surfaceVariant, + ) { + SwitchPreference( + checked = checked, + onCheckedChange = adapter::onChange, + label = label, + ) + } + if (description != null) { + CompositionLocalProvider( + LocalContentColor provides MaterialTheme.colorScheme.onBackground.copy(alpha = ContentAlpha.medium), + LocalTextStyle provides MaterialTheme.typography.bodyMedium, + ) { + Text(text = description) + } + } + AnimatedVisibility( + visible = checked, + enter = fadeIn(), + exit = fadeOut(), + ) { DividerColumn(color = Color.Transparent) { content() } } +} diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/DebugMenuPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/DebugMenuPreferences.kt index 1ed4373de6..15e2c109bd 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/DebugMenuPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/DebugMenuPreferences.kt @@ -13,6 +13,7 @@ import app.lawnchair.preferences2.PreferenceManager2 import app.lawnchair.preferences2.preferenceManager2 import app.lawnchair.ui.preferences.components.FontPreference import app.lawnchair.ui.preferences.components.controls.ClickablePreference +import app.lawnchair.ui.preferences.components.controls.MainSwitchPreference import app.lawnchair.ui.preferences.components.controls.SwitchPreference import app.lawnchair.ui.preferences.components.controls.TextPreference import app.lawnchair.ui.preferences.components.layout.PreferenceGroup @@ -38,45 +39,54 @@ fun DebugMenuPreferences() { val textFlags = remember { prefs2.textFlags } val fontFlags = remember { prefs.fontFlags } val context = LocalContext.current + + val enableDebug = prefs.enableDebugMenu.getAdapter() + PreferenceLayout(label = "Debug Menu") { - PreferenceGroup { - ClickablePreference( - label = "Feature Flags", - onClick = { - Intent(context, SettingsActivity::class.java) - .putExtra(":settings:fragment", DeveloperOptionsFragment::class.java.name) - .also { context.startActivity(it) } - }, - ) - ClickablePreference( - label = "Crash Launcher", - onClick = { throw RuntimeException("User triggered crash") }, - ) - } - PreferenceGroup(heading = "Debug Flags") { - flags2.forEach { - SwitchPreference( - adapter = it.getAdapter(), - label = it.key.name, + MainSwitchPreference(adapter = enableDebug, label = "Show Debug Menu") { + PreferenceGroup { + ClickablePreference( + label = "Feature Flags", + onClick = { + Intent(context, SettingsActivity::class.java) + .putExtra( + ":settings:fragment", + DeveloperOptionsFragment::class.java.name, + ) + .also { context.startActivity(it) } + }, + ) + ClickablePreference( + label = "Crash Launcher", + onClick = { throw RuntimeException("User triggered crash") }, ) } - flags.forEach { - SwitchPreference( - adapter = it.getAdapter(), - label = it.key, - ) - } - textFlags.forEach { - TextPreference( - adapter = it.getAdapter(), - label = it.key.name, - ) - } - fontFlags.forEach { - FontPreference( - fontPref = it, - label = it.key, - ) + + PreferenceGroup(heading = "Debug Flags") { + flags2.forEach { + SwitchPreference( + adapter = it.getAdapter(), + label = it.key.name, + ) + } + flags.forEach { + SwitchPreference( + adapter = it.getAdapter(), + label = it.key, + ) + } + textFlags.forEach { + TextPreference( + adapter = it.getAdapter(), + label = it.key.name, + ) + } + fontFlags.forEach { + FontPreference( + fontPref = it, + label = it.key, + ) + } } } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/DockPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/DockPreferences.kt index be8b3b245d..0118cefb8c 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/DockPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/DockPreferences.kt @@ -18,7 +18,6 @@ package app.lawnchair.ui.preferences.destinations import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.navigation.NavGraphBuilder @@ -32,6 +31,7 @@ import app.lawnchair.qsb.providers.QsbSearchProvider import app.lawnchair.ui.preferences.components.NavigationActionPreference import app.lawnchair.ui.preferences.components.controls.ListPreference import app.lawnchair.ui.preferences.components.controls.ListPreferenceEntry +import app.lawnchair.ui.preferences.components.controls.MainSwitchPreference import app.lawnchair.ui.preferences.components.controls.SliderPreference import app.lawnchair.ui.preferences.components.controls.SwitchPreference import app.lawnchair.ui.preferences.components.layout.DividerColumn @@ -60,61 +60,51 @@ fun DockPreferences() { PreferenceLayout(label = stringResource(id = R.string.dock_label)) { val isHotseatEnabled = prefs2.isHotseatEnabled.getAdapter() val hotseatModeAdapter = prefs2.hotseatMode.getAdapter() - PreferenceGroup(heading = stringResource(id = R.string.general_label)) { - SwitchPreference( - adapter = isHotseatEnabled, - label = stringResource(id = R.string.show_hotseat_title), - ) - } - ExpandAndShrink(visible = isHotseatEnabled.state.value) { - DividerColumn(color = Color.Transparent) { - PreferenceGroup(heading = stringResource(id = R.string.search_bar_label)) { + MainSwitchPreference(adapter = isHotseatEnabled, label = stringResource(id = R.string.show_hotseat_title)) { + PreferenceGroup(heading = stringResource(id = R.string.search_bar_label)) { + HotseatModePreference( + adapter = hotseatModeAdapter, + ) + ExpandAndShrink(visible = hotseatModeAdapter.state.value == LawnchairHotseat) { DividerColumn { - HotseatModePreference( - adapter = hotseatModeAdapter, + SwitchPreference( + adapter = prefs2.themedHotseatQsb.getAdapter(), + label = stringResource(id = R.string.apply_accent_color_label), + ) + SliderPreference( + label = stringResource(id = R.string.corner_radius_label), + adapter = prefs.hotseatQsbCornerRadius.getAdapter(), + step = 0.05F, + valueRange = 0F..1F, + showAsPercentage = true, + ) + val hotseatQsbProviderAdapter by preferenceManager2().hotseatQsbProvider.getAdapter() + NavigationActionPreference( + label = stringResource(R.string.search_provider), + destination = subRoute(DockRoutes.SEARCH_PROVIDER), + subtitle = stringResource( + id = QsbSearchProvider.values() + .first { it == hotseatQsbProviderAdapter } + .name, + ), ) - ExpandAndShrink(visible = hotseatModeAdapter.state.value == LawnchairHotseat) { - DividerColumn { - SwitchPreference( - adapter = prefs2.themedHotseatQsb.getAdapter(), - label = stringResource(id = R.string.apply_accent_color_label), - ) - SliderPreference( - label = stringResource(id = R.string.corner_radius_label), - adapter = prefs.hotseatQsbCornerRadius.getAdapter(), - step = 0.05F, - valueRange = 0F..1F, - showAsPercentage = true, - ) - val hotseatQsbProviderAdapter by preferenceManager2().hotseatQsbProvider.getAdapter() - NavigationActionPreference( - label = stringResource(R.string.search_provider), - destination = subRoute(DockRoutes.SEARCH_PROVIDER), - subtitle = stringResource( - id = QsbSearchProvider.values() - .first { it == hotseatQsbProviderAdapter } - .name, - ), - ) - } - } } } - PreferenceGroup(heading = stringResource(id = R.string.grid)) { - SliderPreference( - label = stringResource(id = R.string.dock_icons), - adapter = prefs.hotseatColumns.getAdapter(), - step = 1, - valueRange = 3..10, - ) - SliderPreference( - adapter = prefs2.hotseatBottomFactor.getAdapter(), - label = stringResource(id = R.string.hotseat_bottom_space_label), - valueRange = 0.0F..1.7F, - step = 0.1F, - showAsPercentage = true, - ) - } + } + PreferenceGroup(heading = stringResource(id = R.string.grid)) { + SliderPreference( + label = stringResource(id = R.string.dock_icons), + adapter = prefs.hotseatColumns.getAdapter(), + step = 1, + valueRange = 3..10, + ) + SliderPreference( + adapter = prefs2.hotseatBottomFactor.getAdapter(), + label = stringResource(id = R.string.hotseat_bottom_space_label), + valueRange = 0.0F..1.7F, + step = 0.1F, + showAsPercentage = true, + ) } } }