Adjust SearchToolbar soft keyboard behavior (#9282)

* Show soft keyboard when the text field is composed (a redo)
* Clear focus on text field when soft keyboard is hidden
* Request focus on text field and show soft keyboard
when clear button is clicked
This commit is contained in:
Ivan Iskandar
2023-03-31 20:24:44 +07:00
committed by GitHub
parent 1dd62af188
commit 7a1b599462
3 changed files with 75 additions and 17 deletions

View File

@@ -45,6 +45,7 @@ fun BrowseSourceToolbar(
var selectingDisplayMode by remember { mutableStateOf(false) }
SearchToolbar(
initialShowKeyboard = searchQuery.isNullOrEmpty(),
navigateUp = navigateUp,
titleContent = { AppBarTitle(title) },
searchQuery = searchQuery,

View File

@@ -23,7 +23,6 @@ import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
@@ -45,8 +44,10 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import eu.kanade.tachiyomi.R
import tachiyomi.presentation.core.util.clearFocusOnSoftKeyboardHide
import tachiyomi.presentation.core.util.runOnEnterKeyPressed
import tachiyomi.presentation.core.util.secondaryItemAlpha
import tachiyomi.presentation.core.util.showSoftKeyboard
const val SEARCH_DEBOUNCE_MILLIS = 250L
@@ -231,9 +232,9 @@ fun SearchToolbar(
scrollBehavior: TopAppBarScrollBehavior? = null,
visualTransformation: VisualTransformation = VisualTransformation.None,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
initialShowKeyboard: Boolean = true,
) {
val focusRequester = remember { FocusRequester() }
var searchClickCount by remember { mutableStateOf(0) }
AppBar(
titleContent = {
@@ -255,7 +256,9 @@ fun SearchToolbar(
modifier = Modifier
.fillMaxWidth()
.focusRequester(focusRequester)
.runOnEnterKeyPressed(action = searchAndClearFocus),
.runOnEnterKeyPressed(action = searchAndClearFocus)
.showSoftKeyboard(initialShowKeyboard)
.clearFocusOnSoftKeyboardHide(),
textStyle = MaterialTheme.typography.titleMedium.copy(
color = MaterialTheme.colorScheme.onBackground,
fontWeight = FontWeight.Normal,
@@ -294,10 +297,7 @@ fun SearchToolbar(
navigateUp = if (searchQuery == null) navigateUp else onClickCloseSearch,
actions = {
key("search") {
val onClick = {
searchClickCount++
onChangeSearchQuery("")
}
val onClick = { onChangeSearchQuery("") }
if (!searchEnabled) {
// Don't show search action
@@ -306,7 +306,12 @@ fun SearchToolbar(
Icon(Icons.Outlined.Search, contentDescription = stringResource(R.string.action_search))
}
} else if (searchQuery.isNotEmpty()) {
IconButton(onClick) {
IconButton(
onClick = {
onClick()
focusRequester.requestFocus()
},
) {
Icon(Icons.Outlined.Close, contentDescription = stringResource(R.string.action_reset))
}
}
@@ -317,15 +322,6 @@ fun SearchToolbar(
isActionMode = false,
scrollBehavior = scrollBehavior,
)
LaunchedEffect(searchClickCount) {
if (searchQuery == null) return@LaunchedEffect
if (searchClickCount == 0 && searchQuery.isNotEmpty()) return@LaunchedEffect
try {
focusRequester.requestFocus()
} catch (_: Throwable) {
// TextField is gone
}
}
}
sealed interface AppBar {