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,
+ )
}
}
}