From 64d5cbce3d839034c2d9e0702c77923bbf189b1b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 22 Feb 2023 16:08:39 -0500 Subject: [PATCH] Fix bug where you could choose to add someone already in a group. --- .../securesms/ContactSelectionListAdapter.kt | 4 ++- .../ContactSelectionListFragment.java | 4 ++- .../contacts/paged/ContactSearchAdapter.kt | 25 +++++++++++++++---- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListAdapter.kt index f0a61266c..afc44734f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListAdapter.kt @@ -5,19 +5,21 @@ import android.view.View import org.thoughtcrime.securesms.contacts.paged.ContactSearchAdapter import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration import org.thoughtcrime.securesms.contacts.paged.ContactSearchData +import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder class ContactSelectionListAdapter( context: Context, + fixedContacts: Set, displayCheckBox: Boolean, displaySmsTag: DisplaySmsTag, displaySecondaryInformation: DisplaySecondaryInformation, onClickCallbacks: OnContactSelectionClick, longClickCallbacks: LongClickCallbacks, storyContextMenuCallbacks: StoryContextMenuCallbacks -) : ContactSearchAdapter(context, emptySet(), displayCheckBox, displaySmsTag, displaySecondaryInformation, onClickCallbacks, longClickCallbacks, storyContextMenuCallbacks) { +) : ContactSearchAdapter(context, fixedContacts, displayCheckBox, displaySmsTag, displaySecondaryInformation, onClickCallbacks, longClickCallbacks, storyContextMenuCallbacks) { init { registerFactory(NewGroupModel::class.java, LayoutFactory({ NewGroupViewHolder(it, onClickCallbacks::onNewGroupClicked) }, R.layout.contact_selection_new_group_item)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index 65d42127a..39b285d8a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -84,6 +84,7 @@ import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import java.io.IOException; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; @@ -349,6 +350,7 @@ public final class ContactSelectionListFragment extends LoggingFragment false, (context, fixedContacts, displayCheckBox, displaySmsTag, displaySecondaryInformation, callbacks, longClickCallbacks, storyContextMenuCallbacks) -> new ContactSelectionListAdapter( context, + fixedContacts, displayCheckBox, displaySmsTag, displaySecondaryInformation, @@ -441,7 +443,7 @@ public final class ContactSelectionListFragment extends LoggingFragment } return currentSelection == null ? Collections.emptySet() - : Collections.unmodifiableSet(Stream.of(currentSelection).collect(Collectors.toSet())); + : Collections.unmodifiableSet(new HashSet<>(currentSelection)); } public boolean isMulti() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter.kt index 5f0da1e21..be65b4fea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter.kt @@ -384,9 +384,18 @@ open class ContactSearchAdapter( } override fun bindCheckbox(model: RecipientModel) { + super.bindCheckbox(model) + + if (fixedContacts.contains(model.knownRecipient.contactSearchKey)) { + checkbox.isChecked = true + } checkbox.isEnabled = !fixedContacts.contains(model.knownRecipient.contactSearchKey) } + override fun isEnabled(model: RecipientModel): Boolean { + return !fixedContacts.contains(model.knownRecipient.contactSearchKey) + } + override fun getHeaderLetter(): String? { return headerLetter } @@ -415,11 +424,12 @@ open class ContactSearchAdapter( protected val smsTag: View = itemView.findViewById(R.id.sms_tag) override fun bind(model: T) { - checkbox.visible = displayCheckBox - checkbox.isChecked = isSelected(model) + if (isEnabled(model)) { + itemView.setOnClickListener { onClick.onClicked(avatar, getData(model), isSelected(model)) } + bindLongPress(model) + } - itemView.setOnClickListener { onClick.onClicked(avatar, getData(model), isSelected(model)) } - bindLongPress(model) + bindCheckbox(model) if (payload.isNotEmpty()) { return @@ -434,7 +444,12 @@ open class ContactSearchAdapter( bindSmsTagField(model) } - protected open fun bindCheckbox(model: T) = Unit + protected open fun bindCheckbox(model: T) { + checkbox.visible = displayCheckBox + checkbox.isChecked = isSelected(model) + } + + protected open fun isEnabled(model: T): Boolean = true protected open fun bindAvatar(model: T) { avatar.setAvatar(getRecipient(model))