diff --git a/lawnchair/src/app/lawnchair/override/CustomizeDialog.kt b/lawnchair/src/app/lawnchair/override/CustomizeDialog.kt index b16cdc4f8d..d1bb2968ca 100644 --- a/lawnchair/src/app/lawnchair/override/CustomizeDialog.kt +++ b/lawnchair/src/app/lawnchair/override/CustomizeDialog.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import app.lawnchair.launcher import app.lawnchair.preferences.preferenceManager +import app.lawnchair.preferences2.asState import app.lawnchair.preferences2.preferenceManager2 import app.lawnchair.ui.preferences.PreferenceActivity import app.lawnchair.ui.preferences.Routes @@ -27,13 +28,11 @@ import app.lawnchair.ui.preferences.components.ClickableIcon import app.lawnchair.ui.preferences.components.PreferenceGroup import app.lawnchair.ui.preferences.components.SwitchPreference import app.lawnchair.ui.util.addIfNotNull -import app.lawnchair.util.ifNotNull import app.lawnchair.util.navigationBarsOrDisplayCutoutPadding import com.android.launcher3.LauncherAppState import com.android.launcher3.R import com.android.launcher3.util.ComponentKey import com.google.accompanist.drawablepainter.rememberDrawablePainter -import com.patrykmichalik.preferencemanager.state import kotlinx.coroutines.launch @ExperimentalMaterialApi @@ -107,9 +106,9 @@ fun CustomizeAppDialog( val prefs = preferenceManager() val preferenceManager2 = preferenceManager2() val coroutineScope = rememberCoroutineScope() - val enableIconSelection by preferenceManager2.enableIconSelection.state() - val showComponentNames by preferenceManager2.showComponentNames.state() - val hiddenApps by preferenceManager2.hiddenApps.state() + val enableIconSelection by preferenceManager2.enableIconSelection.asState() + val showComponentNames by preferenceManager2.showComponentNames.asState() + val hiddenApps by preferenceManager2.hiddenApps.asState() val context = LocalContext.current var title by remember { mutableStateOf("") } @@ -131,7 +130,6 @@ fun CustomizeAppDialog( if (newTitle != previousTitle) { prefs.customAppName[componentKey] = newTitle val las = LauncherAppState.getInstance(context) - val idp = las.invariantDeviceProfile las.iconCache.updateIconsForPkg( componentKey.componentName.packageName, componentKey.user, @@ -147,26 +145,22 @@ fun CustomizeAppDialog( defaultTitle = defaultTitle, launchSelectIcon = if (enableIconSelection == true) openIconPicker else null, ) { - ifNotNull(showComponentNames, hiddenApps) { - val collectedShowComponentNames = it[0] as Boolean - val collectedHiddenApps = it[1] as Set - PreferenceGroup( - description = componentKey.componentName.flattenToString(), - showDescription = collectedShowComponentNames, - ) { - val stringKey = componentKey.toString() - SwitchPreference( - checked = collectedHiddenApps.contains(stringKey), - label = stringResource(id = R.string.hide_from_drawer), - onCheckedChange = { newValue -> - val newSet = collectedHiddenApps.toMutableSet() - if (newValue) newSet.add(stringKey) else newSet.remove(stringKey) - coroutineScope.launch { - preferenceManager2.hiddenApps.set(value = newSet) - } - }, - ) - } + PreferenceGroup( + description = componentKey.componentName.flattenToString(), + showDescription = showComponentNames, + ) { + val stringKey = componentKey.toString() + SwitchPreference( + checked = hiddenApps.contains(stringKey), + label = stringResource(id = R.string.hide_from_drawer), + onCheckedChange = { newValue -> + val newSet = hiddenApps.toMutableSet() + if (newValue) newSet.add(stringKey) else newSet.remove(stringKey) + coroutineScope.launch { + preferenceManager2.hiddenApps.set(value = newSet) + } + }, + ) } } } diff --git a/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt b/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt index bed295da31..77f2d9f110 100644 --- a/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt +++ b/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt @@ -19,11 +19,10 @@ package app.lawnchair.preferences import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext import app.lawnchair.preferences2.IdpPreference +import app.lawnchair.preferences2.asState import app.lawnchair.preferences2.firstBlocking import com.android.launcher3.InvariantDeviceProfile import com.patrykmichalik.preferencemanager.Preference -import com.patrykmichalik.preferencemanager.firstBlocking -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlin.reflect.KProperty @@ -111,8 +110,7 @@ private fun getAdapter( @Composable fun Preference.getAdapter(): PreferenceAdapter { - val state = get().collectAsState(initial = firstBlocking()) - return createStateAdapter(state = state, set = this::set) + return createStateAdapter(state = asState(), set = this::set) } @Composable diff --git a/lawnchair/src/app/lawnchair/preferences2/PreferenceUtils.kt b/lawnchair/src/app/lawnchair/preferences2/PreferenceUtils.kt new file mode 100644 index 0000000000..6520849ff6 --- /dev/null +++ b/lawnchair/src/app/lawnchair/preferences2/PreferenceUtils.kt @@ -0,0 +1,9 @@ +package app.lawnchair.preferences2 + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import com.patrykmichalik.preferencemanager.Preference +import com.patrykmichalik.preferencemanager.firstBlocking + +@Composable +fun Preference.asState() = get().collectAsState(initial = firstBlocking()) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt index f60565fa5c..72f464fde0 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt @@ -26,6 +26,7 @@ import androidx.compose.ui.res.stringResource import androidx.navigation.NavGraphBuilder import app.lawnchair.preferences.getAdapter import app.lawnchair.preferences.preferenceManager +import app.lawnchair.preferences2.asState import app.lawnchair.preferences2.preferenceManager2 import app.lawnchair.ui.preferences.components.* import app.lawnchair.util.Constants.LAWNICONS_PACKAGE_NAME @@ -72,7 +73,7 @@ fun GeneralPreferences() { description = if (!themedIconsAvailable) stringResource(id = R.string.lawnicons_not_installed_description) else null, ) IconShapePreference() - val enableFontSelection = prefs2.enableFontSelection.getAdapter().state.value + val enableFontSelection = prefs2.enableFontSelection.asState().value if (enableFontSelection) { FontPreference( adapter = prefs.workspaceFont.getAdapter(), diff --git a/lawnchair/src/app/lawnchair/ui/preferences/HiddenAppsPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/HiddenAppsPreferences.kt index 442a514566..2e4b02533f 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/HiddenAppsPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/HiddenAppsPreferences.kt @@ -25,20 +25,17 @@ import androidx.compose.material.Checkbox import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.NavGraphBuilder -import app.lawnchair.preferences2.PreferenceCollectorScope +import app.lawnchair.preferences.getAdapter import app.lawnchair.preferences2.preferenceManager2 import app.lawnchair.ui.preferences.components.* import app.lawnchair.util.App import app.lawnchair.util.appComparator import app.lawnchair.util.appsList -import app.lawnchair.util.ifNotNull import com.android.launcher3.R -import com.patrykmichalik.preferencemanager.state import java.util.Comparator.comparing @ExperimentalAnimationApi @@ -46,76 +43,59 @@ fun NavGraphBuilder.hiddenAppsGraph(route: String) { preferenceGraph(route, { HiddenAppsPreferences() }) } -interface HiddenAppsPreferenceCollectorScope : PreferenceCollectorScope { - val hiddenApps: Set -} - -@Composable -fun HiddenAppsPreferenceCollector(content: @Composable HiddenAppsPreferenceCollectorScope.() -> Unit) { - val preferenceManager = preferenceManager2() - val hiddenApps by preferenceManager.hiddenApps.state() - ifNotNull(hiddenApps) { - object : HiddenAppsPreferenceCollectorScope { - override val hiddenApps = it[0] as Set - override val coroutineScope = rememberCoroutineScope() - override val preferenceManager = preferenceManager - }.content() - } -} - @ExperimentalAnimationApi @Composable fun HiddenAppsPreferences() { - HiddenAppsPreferenceCollector { - val pageTitle = - if (hiddenApps.isEmpty()) stringResource(id = R.string.hidden_apps_label) - else stringResource(id = R.string.hidden_apps_label_with_count, hiddenApps.size) - val optionalApps by appsList(comparator = hiddenAppsComparator(hiddenApps)) - val state = rememberLazyListState() - PreferenceScaffold( - label = pageTitle, - floating = rememberFloatingState(state), - ) { - Crossfade(targetState = optionalApps.isPresent) { present -> - if (present) { - PreferenceLazyColumn(state = state) { - val apps = optionalApps.get() - val toggleHiddenApp = { app: App -> - val key = app.key.toString() - val newSet = apps - .filter { hiddenApps.contains(it.key.toString()) } - .map { it.key.toString() } - .toMutableSet() - val isHidden = !hiddenApps.contains(key) - if (isHidden) newSet.add(key) else newSet.remove(key) - edit { hiddenApps.set(value = newSet) } - } - preferenceGroupItems( - items = apps, - isFirstChild = true, - dividerStartIndent = 40.dp, - ) { _, app -> - AppItem( - app = app, - onClick = toggleHiddenApp, - ) { - Checkbox( - checked = hiddenApps.contains(app.key.toString()), - onCheckedChange = null, - ) - } + val adapter = preferenceManager2().hiddenApps.getAdapter() + val hiddenApps by adapter.state + val pageTitle = + if (hiddenApps.isEmpty()) stringResource(id = R.string.hidden_apps_label) + else stringResource(id = R.string.hidden_apps_label_with_count, hiddenApps.size) + val optionalApps by appsList(comparator = hiddenAppsComparator(hiddenApps)) + val state = rememberLazyListState() + PreferenceScaffold( + label = pageTitle, + floating = rememberFloatingState(state), + ) { + Crossfade(targetState = optionalApps.isPresent) { present -> + if (present) { + PreferenceLazyColumn(state = state) { + val apps = optionalApps.get() + val toggleHiddenApp = { app: App -> + val key = app.key.toString() + val newSet = apps + .filter { hiddenApps.contains(it.key.toString()) } + .map { it.key.toString() } + .toMutableSet() + val isHidden = !hiddenApps.contains(key) + if (isHidden) newSet.add(key) else newSet.remove(key) + adapter.onChange(newSet) + } + preferenceGroupItems( + items = apps, + isFirstChild = true, + dividerStartIndent = 40.dp, + ) { _, app -> + AppItem( + app = app, + onClick = toggleHiddenApp, + ) { + Checkbox( + checked = hiddenApps.contains(app.key.toString()), + onCheckedChange = null, + ) } } - } else { - PreferenceLazyColumn(enabled = false) { - preferenceGroupItems( - count = 20, - isFirstChild = true, - dividerStartIndent = 40.dp, - ) { - AppItemPlaceholder { - Spacer(Modifier.width(24.dp)) - } + } + } else { + PreferenceLazyColumn(enabled = false) { + preferenceGroupItems( + count = 20, + isFirstChild = true, + dividerStartIndent = 40.dp, + ) { + AppItemPlaceholder { + Spacer(Modifier.width(24.dp)) } } } diff --git a/lawnchair/src/app/lawnchair/ui/theme/Theme.kt b/lawnchair/src/app/lawnchair/ui/theme/Theme.kt index 7efd16db15..0c137b05c2 100644 --- a/lawnchair/src/app/lawnchair/ui/theme/Theme.kt +++ b/lawnchair/src/app/lawnchair/ui/theme/Theme.kt @@ -23,6 +23,7 @@ import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext import app.lawnchair.preferences.observeAsState import app.lawnchair.preferences.preferenceManager +import app.lawnchair.preferences2.asState import app.lawnchair.preferences2.preferenceManager2 import app.lawnchair.theme.ThemeProvider import app.lawnchair.theme.m3ColorScheme @@ -30,7 +31,6 @@ import app.lawnchair.theme.materialColors import app.lawnchair.ui.preferences.components.ThemeChoice import app.lawnchair.wallpaper.WallpaperManagerCompat import com.android.launcher3.Utilities -import com.patrykmichalik.preferencemanager.state import androidx.compose.material3.MaterialTheme as Material3Theme @Composable @@ -56,7 +56,7 @@ fun LawnchairTheme( fun getColorScheme(darkTheme: Boolean): ColorScheme { val context = LocalContext.current val preferenceManager2 = preferenceManager2() - val accentColor by preferenceManager2.accentColor.state() + val accentColor by preferenceManager2.accentColor.asState() val colorScheme = remember(accentColor) { ThemeProvider.INSTANCE.get(context).colorScheme }