Load prefs synchronously in ui

This commit is contained in:
Suphon Thanakornpakapong
2022-05-10 19:15:45 +07:00
parent 99cb8f54a6
commit 3cd0836fa3
6 changed files with 84 additions and 102 deletions
@@ -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<String>
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)
}
},
)
}
}
}
@@ -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 <P, T> getAdapter(
@Composable
fun <T> Preference<T, *>.getAdapter(): PreferenceAdapter<T> {
val state = get().collectAsState(initial = firstBlocking())
return createStateAdapter(state = state, set = this::set)
return createStateAdapter(state = asState(), set = this::set)
}
@Composable
@@ -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 <C, S> Preference<C, S>.asState() = get().collectAsState(initial = firstBlocking())
@@ -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(),
@@ -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<String>
}
@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<String>
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))
}
}
}
@@ -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
}