From 645dc3e7817bddea9db12c5e70dcdba90a37b196 Mon Sep 17 00:00:00 2001 From: MaxsTechReview Date: Sun, 25 Oct 2026 14:25:39 -0400 Subject: [PATCH] fix: close the Stores and Library search with its X or Back (#1567) --- .../com/droiddeck/launcher/ui/LibraryPage.kt | 1 + .../com/droiddeck/launcher/ui/StoresPage.kt | 28 +++++++++++++------ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/droiddeck/launcher/ui/LibraryPage.kt b/app/src/main/java/com/droiddeck/launcher/ui/LibraryPage.kt index d4dd41fe8..773f44ce7 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/LibraryPage.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/LibraryPage.kt @@ -206,6 +206,7 @@ internal fun LibraryPage(s: FrontEndState, a: FrontEndActions, selected: String, val open = selected.takeIf { it.startsWith("app:") } val back = { onSelect("games") } + BackHandler(enabled = open == null && LibraryView.query.isNotEmpty()) { LibraryView.query = "" } BackHandler(enabled = open != null) { back() } val lead = remember { FocusRequester() } var detailFocused by remember { mutableStateOf(false) } diff --git a/app/src/main/java/com/droiddeck/launcher/ui/StoresPage.kt b/app/src/main/java/com/droiddeck/launcher/ui/StoresPage.kt index e00ae0f09..a08342743 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/StoresPage.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/StoresPage.kt @@ -86,6 +86,7 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.automirrored.filled.Login import androidx.compose.foundation.basicMarquee @@ -833,6 +834,7 @@ private fun Storefront( clearSearchFocus: Boolean, onQuery: (String) -> Unit, onOpen: (String) -> Unit, ) { + BackHandler(enabled = query.isNotEmpty() && !clearSearchFocus) { onQuery("") } val ctx = LocalContext.current val library = StoresState.library[store] ?: emptyList() val shelves = StoresState.shelves[store] @@ -1072,6 +1074,12 @@ internal fun ModeHeader( var searching by remember { mutableStateOf(query.isNotEmpty()) } var focusOnOpen by remember { mutableStateOf(false) } val open by animateFloatAsState(if (searching) 1f else 0f, Motion.sp(0.75f, 420f), label = "searchOpen") + val close = { + searching = false + focusOnOpen = false + if (query.isNotEmpty()) onQuery("") + } + BackHandler(enabled = searching && !clearSearchFocus) { close() } Column(Modifier.fillMaxWidth()) { Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(6.dp), modifier = Modifier.fillMaxWidth().heightIn(min = 52.dp).padding(vertical = 4.dp)) { if (lead != null) lead() @@ -1081,14 +1089,18 @@ internal fun ModeHeader( ) BoxWithConstraints(Modifier.weight(1f), contentAlignment = Alignment.CenterStart) { if (searching || open > 0.01f) { - val w = androidx.compose.ui.unit.lerp(44.dp, maxWidth.coerceAtMost(520.dp), open) - Box(Modifier.width(w).graphicsLayer { alpha = (open * 1.6f).coerceAtMost(1f) }) { - AdbTextField( - value = query, onValueChange = onQuery, label = "", keyboardType = KeyboardType.Text, imeAction = ImeAction.Search, - placeholder = placeholder, compact = true, focusOnShow = focusOnOpen, - clearFocus = clearSearchFocus, - onFocusChange = { focused -> if (!focused && query.isEmpty()) { searching = false; focusOnOpen = false } }, - ) + val closable = maxWidth >= 80.dp + val w = androidx.compose.ui.unit.lerp(44.dp, (maxWidth - if (closable) 36.dp else 0.dp).coerceIn(44.dp, 520.dp), open) + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp)) { + Box(Modifier.width(w).graphicsLayer { alpha = (open * 1.6f).coerceAtMost(1f) }) { + AdbTextField( + value = query, onValueChange = onQuery, label = "", keyboardType = KeyboardType.Text, imeAction = ImeAction.Search, + placeholder = placeholder, compact = true, focusOnShow = focusOnOpen, + clearFocus = clearSearchFocus || !searching, + onFocusChange = { focused -> if (!focused && query.isEmpty()) { searching = false; focusOnOpen = false } }, + ) + } + if (searching && closable) SmallIconButton(Icons.Filled.Close, stringResource(R.string.common_close), tint = colors.onSurfaceVariant, onClick = close) } } else SearchIcon(stringResource(R.string.stores_search_open)) { searching = true; focusOnOpen = true } }