Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Verified Commit d2229b5c authored by Fahim M. Choudhury's avatar Fahim M. Choudhury
Browse files

fix: dismiss suggestions on outside click and conditionally request focus

- Add overlay to dismiss search suggestions when clicking outside the list
- Only request initial focus in SearchTopBar if a search has not been submitted yet, preventing unwanted keyboard popup when returning to the screen
parent 846be960
Loading
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -60,15 +60,18 @@ fun SearchTopBar(
    onClearQuery: () -> Unit,
    onSubmitSearch: (String) -> Unit,
    focusRequester: FocusRequester,
    requestInitialFocus: Boolean,
    modifier: Modifier = Modifier,
) {
    val keyboardController = LocalSoftwareKeyboardController.current

    // Request focus immediately so the keyboard shows on entry
    LaunchedEffect(Unit) {
    // Request focus only when explicitly asked (e.g., fresh entry), not when returning from details.
    LaunchedEffect(requestInitialFocus) {
        if (requestInitialFocus) {
            focusRequester.requestFocus()
            keyboardController?.show()
        }
    }

    Row(
        modifier = modifier.fillMaxWidth(),
@@ -180,6 +183,7 @@ private fun SearchTopBarPreview() {
            onClearQuery = {},
            onSubmitSearch = {},
            focusRequester = focusRequester,
            requestInitialFocus = true,
        )
    }
}
+24 −5
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@

package foundation.e.apps.ui.compose.screens

import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
@@ -54,6 +56,7 @@ fun SearchScreen(
    onClearQuery: () -> Unit,
    onSubmitSearch: (String) -> Unit,
    onSuggestionSelected: (String) -> Unit,
    onDismissSuggestions: () -> Unit,
    onTabSelected: (SearchTabType) -> Unit,
    fossPaging: Flow<PagingData<Application>>? = null,
    pwaPaging: Flow<PagingData<Application>>? = null,
@@ -81,6 +84,7 @@ fun SearchScreen(
                },
                onSubmitSearch = onSubmitSearch,
                focusRequester = focusRequester,
                requestInitialFocus = !state.hasSubmittedSearch,
            )
        },
    ) { innerPadding ->
@@ -127,6 +131,20 @@ fun SearchScreen(
            }

            if (state.isSuggestionVisible) {
                Box(
                    modifier = Modifier
                        .matchParentSize()
                        .zIndex(0.5f)
                        .clickable(
                            onClick = {
                                onDismissSuggestions()
                                focusManager.clearFocus(force = false)
                            },
                            indication = null,
                            interactionSource = remember { MutableInteractionSource() }
                        )
                )

                SearchSuggestionsDropdown(
                    suggestions = state.suggestions,
                    onSuggestionClick = {
@@ -166,6 +184,7 @@ private fun SearchScreenPreview() {
            onClearQuery = {},
            onSubmitSearch = {},
            onSuggestionSelected = {},
            onDismissSuggestions = {},
            onTabSelected = {},
            fossPaging = null,
            pwaPaging = null,
+1 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ class SearchFragmentV2 : Fragment(R.layout.fragment_search_v2) {
                    onClearQuery = { searchViewModelV2.onClearQuery() },
                    onSubmitSearch = { submitted -> searchViewModelV2.onSubmitSearch(submitted) },
                    onSuggestionSelected = { suggestion -> searchViewModelV2.onSuggestionSelected(suggestion) },
                    onDismissSuggestions = { searchViewModelV2.onDismissSuggestions() },
                    onTabSelected = { tab -> searchViewModelV2.onTabSelected(tab) },
                    fossPaging = searchViewModelV2.fossPagingFlow,
                    pwaPaging = searchViewModelV2.pwaPagingFlow,
+7 −1
Original line number Diff line number Diff line
@@ -188,6 +188,13 @@ class SearchViewModelV2 @Inject constructor(
        onSubmitSearch(suggestion)
    }

    fun onDismissSuggestions() {
        suggestionJob?.cancel()
        _uiState.update { current ->
            current.copy(isSuggestionVisible = false)
        }
    }

    fun onClearQuery() {
        suggestionJob?.cancel()
        _uiState.update { current ->
@@ -349,4 +356,3 @@ class SearchViewModelV2 @Inject constructor(
        )
    }
}