Fix crash when selecting a group to add a recipient.

This commit is contained in:
jeffrey-signal
2026-02-17 11:38:58 -05:00
committed by Alex Hart
parent 2c4d3b3ee4
commit b81c1eb65c
7 changed files with 21 additions and 7 deletions

View File

@@ -342,6 +342,7 @@ public final class ContactSelectionListFragment extends LoggingFragment {
.map(r -> new ContactSearchKey.RecipientSearchKey(r, false))
.collect(java.util.stream.Collectors.toSet()),
selectionLimit,
isMulti,
new ContactSearchAdapter.DisplayOptions(
isMulti,
ContactSearchAdapter.DisplaySecondaryInformation.ALWAYS,

View File

@@ -43,6 +43,7 @@ class ContactSearchMediator(
private val fragment: Fragment,
private val fixedContacts: Set<ContactSearchKey> = setOf(),
selectionLimits: SelectionLimits,
private val isMultiSelect: Boolean = true,
displayOptions: ContactSearchAdapter.DisplayOptions,
mapStateToConfiguration: (ContactSearchState) -> ContactSearchConfiguration,
private val callbacks: Callbacks = SimpleCallbacks(),
@@ -61,6 +62,7 @@ class ContactSearchMediator(
fragment,
ContactSearchViewModel.Factory(
selectionLimits = selectionLimits,
isMultiSelect = isMultiSelect,
repository = ContactSearchRepository(),
performSafetyNumberChecks = performSafetyNumberChecks,
arbitraryRepository = arbitraryRepository,

View File

@@ -33,6 +33,7 @@ import org.whispersystems.signalservice.api.util.Preconditions
class ContactSearchViewModel(
private val savedStateHandle: SavedStateHandle,
private val selectionLimits: SelectionLimits,
private val isMultiSelect: Boolean,
private val contactSearchRepository: ContactSearchRepository,
private val performSafetyNumberChecks: Boolean,
private val arbitraryRepository: ArbitraryRepository?,
@@ -116,7 +117,11 @@ class ContactSearchViewModel(
safetyNumberRepository.batchSafetyNumberCheck(newSelectionEntries)
}
internalSelectedContacts.update { it + newSelectionEntries }
if (!isMultiSelect && newSelectionEntries.isNotEmpty()) {
internalSelectedContacts.update { newSelectionEntries.toSet() }
} else {
internalSelectedContacts.update { it + newSelectionEntries }
}
}
}
@@ -172,6 +177,7 @@ class ContactSearchViewModel(
class Factory(
private val selectionLimits: SelectionLimits,
private val isMultiSelect: Boolean = true,
private val repository: ContactSearchRepository,
private val performSafetyNumberChecks: Boolean,
private val arbitraryRepository: ArbitraryRepository?,
@@ -183,6 +189,7 @@ class ContactSearchViewModel(
ContactSearchViewModel(
savedStateHandle = handle,
selectionLimits = selectionLimits,
isMultiSelect = isMultiSelect,
contactSearchRepository = repository,
performSafetyNumberChecks = performSafetyNumberChecks,
arbitraryRepository = arbitraryRepository,

View File

@@ -123,16 +123,17 @@ class MultiselectForwardFragment :
contactSearchRecycler = view.findViewById(R.id.contact_selection_list)
contactSearchMediator = ContactSearchMediator(
this,
emptySet(),
RemoteConfig.shareSelectionLimit,
ContactSearchAdapter.DisplayOptions(
fragment = this,
fixedContacts = emptySet(),
selectionLimits = RemoteConfig.shareSelectionLimit,
isMultiSelect = !args.selectSingleRecipient,
displayOptions = ContactSearchAdapter.DisplayOptions(
displayCheckBox = !args.selectSingleRecipient,
displaySecondaryInformation = ContactSearchAdapter.DisplaySecondaryInformation.NEVER,
displayStoryRing = true
),
this::getConfiguration,
object : ContactSearchMediator.SimpleCallbacks() {
mapStateToConfiguration = this::getConfiguration,
callbacks = object : ContactSearchMediator.SimpleCallbacks() {
override fun onBeforeContactsSelected(view: View?, contactSearchKeys: Set<ContactSearchKey>): Set<ContactSearchKey> {
val filtered: Set<ContactSearchKey> = filterContacts(view, contactSearchKeys)
Log.d(TAG, "onBeforeContactsSelected() Attempting to select: ${contactSearchKeys.map { it.toString() }}, Filtered selection: ${filtered.map { it.toString() } }")

View File

@@ -285,6 +285,7 @@ public class ConversationListFragment extends MainFragment implements Conversati
contactSearchMediator = new ContactSearchMediator(this,
Collections.emptySet(),
SelectionLimits.NO_LIMITS,
false,
new ContactSearchAdapter.DisplayOptions(
false,
ContactSearchAdapter.DisplaySecondaryInformation.NEVER,

View File

@@ -66,6 +66,7 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment(
mediator = ContactSearchMediator(
fragment = this,
selectionLimits = RemoteConfig.shareSelectionLimit,
isMultiSelect = true,
displayOptions = ContactSearchAdapter.DisplayOptions(
displayCheckBox = true,
displaySecondaryInformation = ContactSearchAdapter.DisplaySecondaryInformation.NEVER

View File

@@ -28,6 +28,7 @@ class ViewAllSignalConnectionsFragment : Fragment(R.layout.view_all_signal_conne
val mediator = ContactSearchMediator(
fragment = this,
selectionLimits = SelectionLimits(0, 0),
isMultiSelect = false,
displayOptions = ContactSearchAdapter.DisplayOptions(
displayCheckBox = false,
displaySecondaryInformation = ContactSearchAdapter.DisplaySecondaryInformation.NEVER