Load prefs synchronously in ui
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user