Fix recipient search bar configuration for add to groups screen.

This commit is contained in:
jeffrey-signal
2025-11-25 15:32:02 -05:00
parent d2c3861ac7
commit 1a5163fc47
4 changed files with 40 additions and 19 deletions

View File

@@ -28,12 +28,12 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import org.signal.core.ui.compose.DayNightPreviews
import org.signal.core.ui.compose.IconButtons.IconButton
import org.signal.core.ui.compose.Previews
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.recipients.ui.RecipientPicker.KeyboardType
/**
* A search input field for finding recipients.
@@ -47,15 +47,15 @@ fun RecipientSearchBar(
query: String,
onQueryChange: (String) -> Unit,
onSearch: (String) -> Unit,
modifier: Modifier = Modifier
modifier: Modifier = Modifier,
enabledKeyboardTypes: List<KeyboardType> = listOf(KeyboardType.Text, KeyboardType.Phone)
) {
val state = rememberSearchBarState()
var keyboardOptions by remember {
mutableStateOf(
KeyboardOptions(
keyboardType = KeyboardType.Text,
imeAction = ImeAction.Search
)
var keyboardType by remember(enabledKeyboardTypes) { mutableStateOf(enabledKeyboardTypes.first()) }
val keyboardOptions = remember(keyboardType) {
KeyboardOptions(
keyboardType = keyboardType.wrappedType,
imeAction = ImeAction.Search
)
}
@@ -87,10 +87,11 @@ fun RecipientSearchBar(
onClearQuery = { onQueryChange("") },
modifier = modifier
)
} else {
} else if (enabledKeyboardTypes.size > 1) {
KeyboardToggleButton(
keyboardType = keyboardOptions.keyboardType,
onKeyboardTypeChange = { keyboardOptions = keyboardOptions.copy(keyboardType = it) },
keyboardType = keyboardType,
enabledKeyboardTypes = enabledKeyboardTypes,
onKeyboardTypeChange = { keyboardType = it },
modifier = modifier
)
}
@@ -104,17 +105,20 @@ fun RecipientSearchBar(
@Composable
private fun KeyboardToggleButton(
keyboardType: KeyboardType,
enabledKeyboardTypes: List<KeyboardType>,
onKeyboardTypeChange: (KeyboardType) -> Unit = {},
modifier: Modifier = Modifier
) {
val nextTypeMap = remember(enabledKeyboardTypes) {
enabledKeyboardTypes.mapIndexed { index, type ->
val nextIndex = (index + 1) % enabledKeyboardTypes.size
type to enabledKeyboardTypes[nextIndex]
}.toMap()
}
IconButton(
onClick = {
onKeyboardTypeChange(
when (keyboardType) {
KeyboardType.Text -> KeyboardType.Phone
else -> KeyboardType.Text
}
)
onKeyboardTypeChange(nextTypeMap.getValue(keyboardType))
},
modifier = modifier
) {
@@ -125,7 +129,7 @@ private fun KeyboardToggleButton(
contentDescription = stringResource(R.string.RecipientSearchBar_accessibility_switch_to_numeric_keyboard)
)
else -> Icon(
KeyboardType.Phone -> Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_keyboard_24),
tint = MaterialTheme.colorScheme.onSurface,
contentDescription = stringResource(R.string.RecipientSearchBar_accessibility_switch_to_alphanumeric_keyboard)

View File

@@ -177,7 +177,9 @@ private fun AddToGroupsRecipientPicker(
modifier: Modifier = Modifier
) {
RecipientPicker(
searchBarHint = stringResource(R.string.AddToGroupActivity_search),
searchQuery = uiState.searchQuery,
enabledKeyboardTypes = listOf(RecipientPicker.KeyboardType.Text),
displayModes = setOf(RecipientPicker.DisplayMode.ACTIVE_GROUPS, RecipientPicker.DisplayMode.GROUPS_AFTER_CONTACTS),
selectionLimits = uiState.selectionLimits,
preselectedRecipients = uiState.existingGroupMemberships,

View File

@@ -28,6 +28,7 @@ import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.fragment.compose.rememberFragmentState
@@ -55,9 +56,12 @@ import org.thoughtcrime.securesms.recipients.PhoneNumber
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.recipients.ui.RecipientPicker.DisplayMode.Companion.flag
import org.thoughtcrime.securesms.recipients.ui.RecipientPicker.KeyboardType
import java.util.Optional
import java.util.function.Consumer
private typealias AndroidKeyboardType = androidx.compose.ui.text.input.KeyboardType
/**
* Provides a recipient search and selection UI.
*/
@@ -65,7 +69,9 @@ import java.util.function.Consumer
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun RecipientPicker(
searchBarHint: String = stringResource(R.string.RecipientSearchBar__search_name_or_number),
searchQuery: String,
enabledKeyboardTypes: List<KeyboardType> = listOf(KeyboardType.Text, KeyboardType.Phone),
displayModes: Set<RecipientPicker.DisplayMode> = setOf(RecipientPicker.DisplayMode.ALL),
selectionLimits: SelectionLimits? = ContactSelectionArguments.Defaults.SELECTION_LIMITS,
includeRecents: Boolean = ContactSelectionArguments.Defaults.INCLUDE_RECENTS,
@@ -97,9 +103,11 @@ fun RecipientPicker(
}
RecipientSearchBar(
hint = searchBarHint,
query = searchQuery,
onQueryChange = { filter -> callbacks.listActions.onSearchQueryChanged(query = filter) },
onSearch = {},
enabledKeyboardTypes = enabledKeyboardTypes,
modifier = Modifier
.focusRequester(focusRequester)
.fillMaxWidth()
@@ -469,4 +477,11 @@ object RecipientPicker {
get() = fold(initial = 0) { acc, displayMode -> acc or displayMode.flag }
}
}
enum class KeyboardType(
val wrappedType: AndroidKeyboardType
) {
Text(wrappedType = AndroidKeyboardType.Text),
Phone(wrappedType = AndroidKeyboardType.Phone)
}
}

View File

@@ -1227,11 +1227,11 @@
<string name="AddToGroupActivity_add_member">Add member?</string>
<string name="AddToGroupActivity_add_s_to_s">Add \"%1$s\" to \"%2$s\"?</string>
<string name="AddToGroupActivity_s_added_to_s">\"%1$s\" added to \"%2$s\".</string>
<string name="AddToGroupActivity_add_to_group">Add to group</string>
<string name="AddToGroupActivity_add_to_groups">Add to groups</string>
<string name="AddToGroupActivity_this_person_cant_be_added_to_legacy_groups">This person can\'t be added to legacy groups.</string>
<string name="AddToGroupActivity_add">Add</string>
<string name="AddToGroupActivity_add_to_a_group">Add to a group</string>
<string name="AddToGroupActivity_search">Search</string>
<!-- ChooseNewAdminActivity -->
<string name="ChooseNewAdminActivity_choose_new_admin">Choose new admin</string>