From 4ed6d80a6339f2b0a6dac594ca6436d75450b8a7 Mon Sep 17 00:00:00 2001 From: SuperDragonXD <70206496+SuperDragonXD@users.noreply.github.com> Date: Sun, 18 Aug 2024 20:01:30 +0800 Subject: [PATCH] Minor prefs UX improvements This commit does the following: * Remove spacer when announcement is inactive * Improve drag/drop animation for recents quick action preferences * Improve permission request UI for SearchSuggestionPreference * Shorten wording of maximum entry count (fix #4547, fix #4548) --- lawnchair/res/values/strings.xml | 16 ++++----- .../components/AnnouncementPreference.kt | 2 +- .../components/QuickActionsPreferences.kt | 34 +++++++++++------- .../components/SearchSuggestionPreference.kt | 35 ++++++++++--------- .../destinations/SearchPreferences.kt | 1 + 5 files changed, 50 insertions(+), 38 deletions(-) diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index 5ff4ba571c..e72bef10b6 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -690,21 +690,21 @@ Via %1$s - Maximum number of apps in search results - Maximum number of people in search results - Maximum number of files in search results - Maximum number of settings entries in search results - Maximum number of history entries in search results - Maximum number of suggestions in search results + Maximum number of apps + Maximum number of people + Maximum number of files + Maximum number of settings + Maximum items for search history + Maximum number of suggestions Maximum web suggestion delay To search for contacts, grant contacts and phone permissions to Lawnchair To search your files, grant storage permissions to Lawnchair Grant permissions - Lawnchair (compose) Web suggestion provider Show web suggestion provider icon in search bar - Match dock search bar style + Match dock search bar actions + Clicking the dock search bar will now open the app drawer search UI diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt index f093160546..8c05f177a1 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt @@ -72,7 +72,7 @@ fun AnnouncementPreference( announcements.forEachIndexed { index, announcement -> var show by rememberSaveable { mutableStateOf(true) } AnnouncementItem(show, announcement) { show = false } - if (index != announcements.lastIndex && show && (!announcement.test || BuildConfig.DEBUG)) { + if (index != announcements.lastIndex && show && announcement.active && (!announcement.test || BuildConfig.DEBUG)) { Spacer(modifier = Modifier.height(16.dp)) } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/QuickActionsPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/QuickActionsPreferences.kt index 3be4eaac38..38987d02fa 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/QuickActionsPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/QuickActionsPreferences.kt @@ -2,6 +2,7 @@ package app.lawnchair.ui.preferences.components import android.view.HapticFeedbackConstants import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Column @@ -22,10 +23,11 @@ import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.ripple import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.key -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalView @@ -82,8 +84,12 @@ fun QuickActionsPreferences( ) { var orderedItems = sortListByIdOrder(items, order) - val isAnyDragging = remember { mutableStateOf(false) } - val lastItemIdIndex = remember { mutableIntStateOf(4) } + var isAnyDragging by remember { mutableStateOf(false) } + + val elevation by animateDpAsState( + targetValue = if (!isAnyDragging) 1.dp else 0.dp, + label = "card background animation", + ) val view = LocalView.current @@ -94,7 +100,7 @@ fun QuickActionsPreferences( Surface( modifier = Modifier.padding(horizontal = 16.dp), shape = MaterialTheme.shapes.large, - tonalElevation = if (!isAnyDragging.value) 1.dp else 0.dp, + tonalElevation = elevation, ) { ReorderableColumn( modifier = Modifier, @@ -102,16 +108,15 @@ fun QuickActionsPreferences( onSettle = { fromIndex, toIndex -> orderedItems = orderedItems.toMutableList().apply { add(toIndex, removeAt(fromIndex)) - }.toList().also { items -> + }.toList().also { newItems -> onOrderChange( - items.map { it.id }.joinToString(separator = ","), + newItems.map { it.id }.joinToString(separator = ","), ) - isAnyDragging.value = false - lastItemIdIndex.intValue = items.last().id + isAnyDragging = false } }, onMove = { - isAnyDragging.value = true + isAnyDragging = true if (Utilities.ATLEAST_U) { view.performHapticFeedback(HapticFeedbackConstants.SEGMENT_FREQUENT_TICK) } @@ -185,13 +190,14 @@ fun QuickActionsPreferences( DragHandle( interactionSource = interactionSource, scope = scope, + onDragStop = { + isAnyDragging = false + }, ) }, ) - AnimatedVisibility(visible = !isAnyDragging.value) { - if (index != lastItemIdIndex.intValue) { - HorizontalDivider() - } + AnimatedVisibility(!isAnyDragging && index != orderedItems.lastIndex) { + HorizontalDivider() } } } @@ -256,6 +262,7 @@ fun DraggableSwitchPreference( private fun DragHandle( scope: ReorderableScope, interactionSource: MutableInteractionSource, + onDragStop: () -> Unit, modifier: Modifier = Modifier, ) { val view = LocalView.current @@ -271,6 +278,7 @@ private fun DragHandle( if (Utilities.ATLEAST_R) { view.performHapticFeedback(HapticFeedbackConstants.GESTURE_END) } + onDragStop() }, ) }, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/SearchSuggestionPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/SearchSuggestionPreference.kt index 0aa90f01c3..f3376fccc3 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/SearchSuggestionPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/SearchSuggestionPreference.kt @@ -3,6 +3,7 @@ package app.lawnchair.ui.preferences.components import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth @@ -84,14 +85,14 @@ fun SearchSuggestionPreference( content: @Composable (() -> Unit)? = null, ) { val bottomSheetHandler = bottomSheetHandler - val preventSwitchChange = false SearchSuggestionsSwitchPreference( label = label, description = description, checked = adapter.state.value, + onCheckedChange = adapter::onChange, enabled = isGranted, - preventSwitchChange = preventSwitchChange, + preventSwitchChange = !isGranted, onClick = { bottomSheetHandler.show { BottomSheetContent( @@ -100,14 +101,13 @@ fun SearchSuggestionPreference( adapterValue = adapter.state.value, adapterOnChange = adapter::onChange, label = label, - description = description, maxCountLabel = maxCountLabel, maxCountAdapter = maxCountAdapter, maxCountRange = maxCountRange, content = content, onRequestPermission = onRequestPermission, permissionRationale = permissionRationale, - preventSwitchChange = preventSwitchChange, + preventSwitchChange = !isGranted, ) } }, @@ -119,16 +119,14 @@ private fun BottomSheetContent( adapterValue: Boolean, adapterOnChange: (Boolean) -> Unit, label: String, - description: String?, maxCountLabel: String, maxCountAdapter: PreferenceAdapter, maxCountRange: ClosedRange, isPermissionGranted: Boolean, onHide: () -> Unit, onRequestPermission: (() -> Unit)?, - // TODO optimize permission requesting code permissionRationale: String?, - preventSwitchChange: Boolean = false, + preventSwitchChange: Boolean, content: @Composable (() -> Unit)?, ) { ModalBottomSheetContent( @@ -147,7 +145,6 @@ private fun BottomSheetContent( } }, label = label, - description = description, enabled = if (preventSwitchChange) false else isPermissionGranted, ) { Column(modifier = Modifier.padding(horizontal = 16.dp)) { @@ -174,13 +171,17 @@ private fun BottomSheetContent( Text( text = permissionRationale, ) - Button( - onClick = { - onHide() - onRequestPermission() - }, - ) { - Text(text = stringResource(id = R.string.grant_requested_permissions)) + Spacer(Modifier.height(8.dp)) + Row { + Spacer(Modifier.weight(1f)) + Button( + onClick = { + onHide() + onRequestPermission() + }, + ) { + Text(text = stringResource(id = R.string.grant_requested_permissions)) + } } } } @@ -194,6 +195,7 @@ private fun BottomSheetContent( private fun SearchSuggestionsSwitchPreference( label: String, checked: Boolean, + onCheckedChange: (Boolean) -> Unit, preventSwitchChange: Boolean, onClick: () -> Unit, enabled: Boolean, @@ -222,7 +224,7 @@ private fun SearchSuggestionsSwitchPreference( .padding(all = 16.dp) .height(24.dp), checked = checked, - onCheckedChange = { onClick() }, + onCheckedChange = { onCheckedChange(it) }, enabled = if (preventSwitchChange) false else enabled, ) }, @@ -238,6 +240,7 @@ private fun SearchSuggestionsSwitchPreferencePreview() { label = "example", checked = true, onClick = { /*TODO*/ }, + onCheckedChange = {}, preventSwitchChange = false, enabled = true, ) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/SearchPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/SearchPreferences.kt index bbfb4e16eb..5c5637f781 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/SearchPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/SearchPreferences.kt @@ -69,6 +69,7 @@ fun SearchPreferences() { ) SwitchPreference( label = stringResource(R.string.allapps_match_qsb_style_label), + description = stringResource(R.string.allapps_match_qsb_style_description), adapter = prefs2.matchHotseatQsbStyle.getAdapter(), ) }