Prefer about over phone number.
This commit is contained in:
parent
e8ff1a04ed
commit
c75a9b577d
11 changed files with 29 additions and 330 deletions
|
@ -13,11 +13,11 @@ class ContactSelectionListAdapter(
|
||||||
context: Context,
|
context: Context,
|
||||||
displayCheckBox: Boolean,
|
displayCheckBox: Boolean,
|
||||||
displaySmsTag: DisplaySmsTag,
|
displaySmsTag: DisplaySmsTag,
|
||||||
displayPhoneNumber: DisplayPhoneNumber,
|
displaySecondaryInformation: DisplaySecondaryInformation,
|
||||||
onClickCallbacks: OnContactSelectionClick,
|
onClickCallbacks: OnContactSelectionClick,
|
||||||
longClickCallbacks: LongClickCallbacks,
|
longClickCallbacks: LongClickCallbacks,
|
||||||
storyContextMenuCallbacks: StoryContextMenuCallbacks
|
storyContextMenuCallbacks: StoryContextMenuCallbacks
|
||||||
) : ContactSearchAdapter(context, emptySet(), displayCheckBox, displaySmsTag, displayPhoneNumber, onClickCallbacks, longClickCallbacks, storyContextMenuCallbacks) {
|
) : ContactSearchAdapter(context, emptySet(), displayCheckBox, displaySmsTag, displaySecondaryInformation, onClickCallbacks, longClickCallbacks, storyContextMenuCallbacks) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
registerFactory(NewGroupModel::class.java, LayoutFactory({ NewGroupViewHolder(it, onClickCallbacks::onNewGroupClicked) }, R.layout.contact_selection_new_group_item))
|
registerFactory(NewGroupModel::class.java, LayoutFactory({ NewGroupViewHolder(it, onClickCallbacks::onNewGroupClicked) }, R.layout.contact_selection_new_group_item))
|
||||||
|
|
|
@ -338,7 +338,7 @@ public final class ContactSelectionListFragment extends LoggingFragment
|
||||||
selectionLimit,
|
selectionLimit,
|
||||||
isMulti,
|
isMulti,
|
||||||
ContactSearchAdapter.DisplaySmsTag.DEFAULT,
|
ContactSearchAdapter.DisplaySmsTag.DEFAULT,
|
||||||
ContactSearchAdapter.DisplayPhoneNumber.ALWAYS,
|
ContactSearchAdapter.DisplaySecondaryInformation.ALWAYS,
|
||||||
this::mapStateToConfiguration,
|
this::mapStateToConfiguration,
|
||||||
new ContactSearchMediator.SimpleCallbacks() {
|
new ContactSearchMediator.SimpleCallbacks() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -347,11 +347,11 @@ public final class ContactSelectionListFragment extends LoggingFragment
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
(context, fixedContacts, displayCheckBox, displaySmsTag, displayPhoneNumber, callbacks, longClickCallbacks, storyContextMenuCallbacks) -> new ContactSelectionListAdapter(
|
(context, fixedContacts, displayCheckBox, displaySmsTag, displaySecondaryInformation, callbacks, longClickCallbacks, storyContextMenuCallbacks) -> new ContactSelectionListAdapter(
|
||||||
context,
|
context,
|
||||||
displayCheckBox,
|
displayCheckBox,
|
||||||
displaySmsTag,
|
displaySmsTag,
|
||||||
displayPhoneNumber,
|
displaySecondaryInformation,
|
||||||
new ContactSelectionListAdapter.OnContactSelectionClick() {
|
new ContactSelectionListAdapter.OnContactSelectionClick() {
|
||||||
@Override
|
@Override
|
||||||
public void onNewGroupClicked() {
|
public void onNewGroupClicked() {
|
||||||
|
|
|
@ -40,28 +40,22 @@ import org.signal.core.util.concurrent.SimpleTask;
|
||||||
import org.signal.core.util.logging.Log;
|
import org.signal.core.util.logging.Log;
|
||||||
import org.thoughtcrime.securesms.components.menu.ActionItem;
|
import org.thoughtcrime.securesms.components.menu.ActionItem;
|
||||||
import org.thoughtcrime.securesms.components.menu.SignalContextMenu;
|
import org.thoughtcrime.securesms.components.menu.SignalContextMenu;
|
||||||
import org.thoughtcrime.securesms.contacts.ContactSelectionListItem;
|
|
||||||
import org.thoughtcrime.securesms.contacts.management.ContactsManagementRepository;
|
import org.thoughtcrime.securesms.contacts.management.ContactsManagementRepository;
|
||||||
import org.thoughtcrime.securesms.contacts.management.ContactsManagementViewModel;
|
import org.thoughtcrime.securesms.contacts.management.ContactsManagementViewModel;
|
||||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchData;
|
|
||||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey;
|
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey;
|
||||||
import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery;
|
import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery;
|
||||||
import org.thoughtcrime.securesms.conversation.ConversationIntents;
|
import org.thoughtcrime.securesms.conversation.ConversationIntents;
|
||||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||||
import org.thoughtcrime.securesms.groups.ui.creategroup.CreateGroupActivity;
|
import org.thoughtcrime.securesms.groups.ui.creategroup.CreateGroupActivity;
|
||||||
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
|
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||||
import org.thoughtcrime.securesms.util.CommunicationActions;
|
import org.thoughtcrime.securesms.util.CommunicationActions;
|
||||||
import org.thoughtcrime.securesms.util.FeatureFlags;
|
import org.thoughtcrime.securesms.util.FeatureFlags;
|
||||||
import org.thoughtcrime.securesms.util.LifecycleDisposable;
|
import org.thoughtcrime.securesms.util.LifecycleDisposable;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
|
||||||
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
|
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
|
@ -1,298 +0,0 @@
|
||||||
package org.thoughtcrime.securesms.contacts;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.SpannableStringBuilder;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.CheckBox;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
|
|
||||||
import org.signal.core.util.logging.Log;
|
|
||||||
import org.thoughtcrime.securesms.R;
|
|
||||||
import org.thoughtcrime.securesms.badges.BadgeImageView;
|
|
||||||
import org.thoughtcrime.securesms.components.AvatarImageView;
|
|
||||||
import org.thoughtcrime.securesms.components.FromTextView;
|
|
||||||
import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto;
|
|
||||||
import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto;
|
|
||||||
import org.thoughtcrime.securesms.conversation.colors.AvatarColor;
|
|
||||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
|
||||||
import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter;
|
|
||||||
import org.thoughtcrime.securesms.profiles.manage.UsernameState;
|
|
||||||
import org.thoughtcrime.securesms.recipients.LiveRecipient;
|
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientForeverObserver;
|
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
|
||||||
import org.thoughtcrime.securesms.util.SpanUtil;
|
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
|
||||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
|
|
||||||
public class ContactSelectionListItem extends ConstraintLayout implements RecipientForeverObserver {
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
private static final String TAG = Log.tag(ContactSelectionListItem.class);
|
|
||||||
|
|
||||||
private AvatarImageView contactPhotoImage;
|
|
||||||
private TextView numberView;
|
|
||||||
private FromTextView nameView;
|
|
||||||
private TextView labelView;
|
|
||||||
private CheckBox checkBox;
|
|
||||||
private View smsTag;
|
|
||||||
private BadgeImageView badge;
|
|
||||||
|
|
||||||
private String number;
|
|
||||||
private String chipName;
|
|
||||||
private int contactType;
|
|
||||||
private String contactName;
|
|
||||||
private String contactNumber;
|
|
||||||
private String contactLabel;
|
|
||||||
private String contactAbout;
|
|
||||||
private LiveRecipient recipient;
|
|
||||||
private GlideRequests glideRequests;
|
|
||||||
|
|
||||||
private final UsernameFallbackPhotoProvider usernameFallbackPhotoProvider = new UsernameFallbackPhotoProvider();
|
|
||||||
|
|
||||||
public ContactSelectionListItem(Context context) {
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ContactSelectionListItem(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onFinishInflate() {
|
|
||||||
super.onFinishInflate();
|
|
||||||
this.contactPhotoImage = findViewById(R.id.contact_photo_image);
|
|
||||||
this.numberView = findViewById(R.id.number);
|
|
||||||
this.labelView = findViewById(R.id.label);
|
|
||||||
this.nameView = findViewById(R.id.name);
|
|
||||||
this.checkBox = findViewById(R.id.check_box);
|
|
||||||
this.smsTag = findViewById(R.id.sms_tag);
|
|
||||||
this.badge = findViewById(R.id.contact_badge);
|
|
||||||
|
|
||||||
ViewUtil.setTextViewGravityStart(this.nameView, getContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onAttachedToWindow() {
|
|
||||||
super.onAttachedToWindow();
|
|
||||||
if (recipient != null) {
|
|
||||||
recipient.observeForever(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDetachedFromWindow() {
|
|
||||||
super.onDetachedFromWindow();
|
|
||||||
unbind();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void set(@NonNull GlideRequests glideRequests,
|
|
||||||
@Nullable RecipientId recipientId,
|
|
||||||
int type,
|
|
||||||
String name,
|
|
||||||
String number,
|
|
||||||
String label,
|
|
||||||
String about,
|
|
||||||
boolean checkboxVisible)
|
|
||||||
{
|
|
||||||
this.glideRequests = glideRequests;
|
|
||||||
this.number = number;
|
|
||||||
this.contactType = type;
|
|
||||||
this.contactName = name;
|
|
||||||
this.contactNumber = number;
|
|
||||||
this.contactLabel = label;
|
|
||||||
this.contactAbout = about;
|
|
||||||
|
|
||||||
this.contactPhotoImage.setFallbackPhotoProvider(null);
|
|
||||||
if (type == ContactRepository.NEW_PHONE_TYPE || type == ContactRepository.NEW_USERNAME_TYPE) {
|
|
||||||
this.recipient = null;
|
|
||||||
this.contactPhotoImage.setFallbackPhotoProvider(usernameFallbackPhotoProvider);
|
|
||||||
this.contactPhotoImage.setFallbackPhotoColor(AvatarColor.ON_SURFACE_VARIANT);
|
|
||||||
this.contactPhotoImage.setAvatar(glideRequests, null, false);
|
|
||||||
} else if (recipientId != null) {
|
|
||||||
if (this.recipient != null) {
|
|
||||||
this.recipient.removeForeverObserver(this);
|
|
||||||
}
|
|
||||||
this.recipient = Recipient.live(recipientId);
|
|
||||||
this.recipient.observeForever(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
Recipient recipientSnapshot = recipient != null ? recipient.get() : null;
|
|
||||||
|
|
||||||
if (recipientSnapshot != null && !recipientSnapshot.isResolving() && !recipientSnapshot.isMyStory()) {
|
|
||||||
contactName = recipientSnapshot.getDisplayName(getContext());
|
|
||||||
name = contactName;
|
|
||||||
} else if (recipient != null) {
|
|
||||||
name = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (recipientSnapshot == null || recipientSnapshot.isResolving() || recipientSnapshot.isRegistered() || recipientSnapshot.isDistributionList()) {
|
|
||||||
smsTag.setVisibility(GONE);
|
|
||||||
} else {
|
|
||||||
smsTag.setVisibility(VISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (recipientSnapshot == null || recipientSnapshot.isResolving()) {
|
|
||||||
this.contactPhotoImage.setAvatar(glideRequests, null, false);
|
|
||||||
setText(null, type, name, number, label, about);
|
|
||||||
} else if (recipientSnapshot.isMyStory()) {
|
|
||||||
this.contactPhotoImage.setRecipient(Recipient.self(), false);
|
|
||||||
setText(recipientSnapshot, type, name, number, label, about);
|
|
||||||
} else {
|
|
||||||
this.contactPhotoImage.setAvatar(glideRequests, recipientSnapshot, false);
|
|
||||||
setText(recipientSnapshot, type, name, number, label, about);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.checkBox.setVisibility(checkboxVisible ? View.VISIBLE : View.GONE);
|
|
||||||
|
|
||||||
if (recipientSnapshot == null || recipientSnapshot.isSelf()) {
|
|
||||||
badge.setBadge(null);
|
|
||||||
} else {
|
|
||||||
badge.setBadgeFromRecipient(recipientSnapshot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setChecked(boolean selected, boolean animate) {
|
|
||||||
checkBox.setChecked(selected);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setEnabled(boolean enabled) {
|
|
||||||
super.setEnabled(enabled);
|
|
||||||
this.checkBox.setEnabled(enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void unbind() {
|
|
||||||
if (recipient != null) {
|
|
||||||
recipient.removeForeverObserver(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
|
||||||
private void setText(@Nullable Recipient recipient, int type, String name, String number, String label, @Nullable String about) {
|
|
||||||
this.numberView.setVisibility(View.VISIBLE);
|
|
||||||
|
|
||||||
if (number == null || number.isEmpty()) {
|
|
||||||
this.nameView.setEnabled(false);
|
|
||||||
this.numberView.setText("");
|
|
||||||
this.labelView.setVisibility(View.GONE);
|
|
||||||
} else if (recipient != null && recipient.isGroup()) {
|
|
||||||
this.nameView.setEnabled(false);
|
|
||||||
this.numberView.setText(getGroupMemberCount(recipient));
|
|
||||||
this.labelView.setVisibility(View.GONE);
|
|
||||||
} else if (type == ContactRepository.PUSH_TYPE) {
|
|
||||||
this.numberView.setText(!Util.isEmpty(about) ? about : number);
|
|
||||||
this.nameView.setEnabled(true);
|
|
||||||
this.labelView.setVisibility(View.GONE);
|
|
||||||
} else if (type == ContactRepository.NEW_USERNAME_TYPE) {
|
|
||||||
this.numberView.setVisibility(View.GONE);
|
|
||||||
this.nameView.setEnabled(true);
|
|
||||||
this.labelView.setVisibility(View.GONE);
|
|
||||||
} else if (recipient != null && recipient.isDistributionList()) {
|
|
||||||
this.numberView.setText(getViewerCount(number));
|
|
||||||
this.labelView.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
this.numberView.setText(!Util.isEmpty(about) ? about : number);
|
|
||||||
this.nameView.setEnabled(true);
|
|
||||||
this.labelView.setText(label != null && !label.equals("null") ? getResources().getString(R.string.ContactSelectionListItem__dot_s, label) : "");
|
|
||||||
this.labelView.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (recipient != null) {
|
|
||||||
this.nameView.setText(recipient);
|
|
||||||
chipName = recipient.getShortDisplayName(getContext());
|
|
||||||
} else if (type == ContactRepository.NEW_USERNAME_TYPE && number != null) {
|
|
||||||
this.nameView.setText(presentUsername(number));
|
|
||||||
} else {
|
|
||||||
this.nameView.setText(name);
|
|
||||||
chipName = name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNumber() {
|
|
||||||
return number;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getChipName() {
|
|
||||||
return chipName;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getGroupMemberCount(@NonNull Recipient recipient) {
|
|
||||||
if (!recipient.isGroup()) {
|
|
||||||
throw new AssertionError();
|
|
||||||
}
|
|
||||||
int memberCount = recipient.getParticipantIds().size();
|
|
||||||
return getContext().getResources().getQuantityString(R.plurals.contact_selection_list_item__number_of_members, memberCount, memberCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getViewerCount(@NonNull String number) {
|
|
||||||
int viewerCount = Integer.parseInt(number);
|
|
||||||
return getContext().getResources().getQuantityString(R.plurals.contact_selection_list_item__number_of_viewers, viewerCount, viewerCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
private CharSequence presentUsername(@NonNull String username) {
|
|
||||||
if (username.contains(UsernameState.DELIMITER)) {
|
|
||||||
return username;
|
|
||||||
} else {
|
|
||||||
return new SpannableStringBuilder(username).append(SpanUtil.color(ContextCompat.getColor(getContext(), R.color.signal_colorOutline), UsernameState.DELIMITER));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public @Nullable LiveRecipient getRecipient() {
|
|
||||||
return recipient;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isUsernameType() {
|
|
||||||
return contactType == ContactRepository.NEW_USERNAME_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Optional<RecipientId> getRecipientId() {
|
|
||||||
return recipient != null ? Optional.of(recipient.getId()) : Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRecipientChanged(@NonNull Recipient recipient) {
|
|
||||||
if (this.recipient != null && this.recipient.getId().equals(recipient.getId())) {
|
|
||||||
contactName = recipient.getDisplayName(getContext());
|
|
||||||
contactAbout = recipient.getCombinedAboutAndEmoji();
|
|
||||||
|
|
||||||
if (recipient.isGroup() && recipient.getGroupId().isPresent()) {
|
|
||||||
contactNumber = recipient.getGroupId().get().toString();
|
|
||||||
} else if (recipient.hasE164()) {
|
|
||||||
contactNumber = PhoneNumberFormatter.prettyPrint(recipient.getE164().orElse(""));
|
|
||||||
} else if (!recipient.isDistributionList()) {
|
|
||||||
contactNumber = recipient.getEmail().orElse("");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (recipient.isMyStory()) {
|
|
||||||
contactPhotoImage.setRecipient(Recipient.self(), false);
|
|
||||||
} else {
|
|
||||||
contactPhotoImage.setAvatar(glideRequests, recipient, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
setText(recipient, contactType, contactName, contactNumber, contactLabel, contactAbout);
|
|
||||||
smsTag.setVisibility(recipient.isRegistered() || recipient.isDistributionList() ? GONE : VISIBLE);
|
|
||||||
badge.setBadgeFromRecipient(recipient);
|
|
||||||
} else {
|
|
||||||
Log.w(TAG, "Bad change! Local recipient doesn't match. Ignoring. Local: " + (this.recipient == null ? "null" : this.recipient.getId()) + ", Changed: " + recipient.getId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class UsernameFallbackPhotoProvider extends Recipient.FallbackPhotoProvider {
|
|
||||||
@Override
|
|
||||||
public @NonNull FallbackContactPhoto getPhotoForRecipientWithoutName() {
|
|
||||||
return new ResourceContactPhoto(R.drawable.ic_search_24, R.drawable.ic_search_24, R.drawable.ic_search_24);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -39,7 +39,7 @@ open class ContactSearchAdapter(
|
||||||
fixedContacts: Set<ContactSearchKey>,
|
fixedContacts: Set<ContactSearchKey>,
|
||||||
displayCheckBox: Boolean,
|
displayCheckBox: Boolean,
|
||||||
displaySmsTag: DisplaySmsTag,
|
displaySmsTag: DisplaySmsTag,
|
||||||
displayPhoneNumber: DisplayPhoneNumber,
|
displaySecondaryInformation: DisplaySecondaryInformation,
|
||||||
onClickCallbacks: ClickCallbacks,
|
onClickCallbacks: ClickCallbacks,
|
||||||
longClickCallbacks: LongClickCallbacks,
|
longClickCallbacks: LongClickCallbacks,
|
||||||
storyContextMenuCallbacks: StoryContextMenuCallbacks
|
storyContextMenuCallbacks: StoryContextMenuCallbacks
|
||||||
|
@ -47,7 +47,7 @@ open class ContactSearchAdapter(
|
||||||
|
|
||||||
init {
|
init {
|
||||||
registerStoryItems(this, displayCheckBox, onClickCallbacks::onStoryClicked, storyContextMenuCallbacks)
|
registerStoryItems(this, displayCheckBox, onClickCallbacks::onStoryClicked, storyContextMenuCallbacks)
|
||||||
registerKnownRecipientItems(this, fixedContacts, displayCheckBox, displaySmsTag, displayPhoneNumber, onClickCallbacks::onKnownRecipientClicked, longClickCallbacks::onKnownRecipientLongClick)
|
registerKnownRecipientItems(this, fixedContacts, displayCheckBox, displaySmsTag, displaySecondaryInformation, onClickCallbacks::onKnownRecipientClicked, longClickCallbacks::onKnownRecipientLongClick)
|
||||||
registerHeaders(this)
|
registerHeaders(this)
|
||||||
registerExpands(this, onClickCallbacks::onExpandClicked)
|
registerExpands(this, onClickCallbacks::onExpandClicked)
|
||||||
registerFactory(UnknownRecipientModel::class.java, LayoutFactory({ UnknownRecipientViewHolder(it, onClickCallbacks::onUnknownRecipientClicked, displayCheckBox) }, R.layout.contact_search_unknown_item))
|
registerFactory(UnknownRecipientModel::class.java, LayoutFactory({ UnknownRecipientViewHolder(it, onClickCallbacks::onUnknownRecipientClicked, displayCheckBox) }, R.layout.contact_search_unknown_item))
|
||||||
|
@ -84,13 +84,13 @@ open class ContactSearchAdapter(
|
||||||
fixedContacts: Set<ContactSearchKey>,
|
fixedContacts: Set<ContactSearchKey>,
|
||||||
displayCheckBox: Boolean,
|
displayCheckBox: Boolean,
|
||||||
displaySmsTag: DisplaySmsTag,
|
displaySmsTag: DisplaySmsTag,
|
||||||
displayPhoneNumber: DisplayPhoneNumber,
|
displaySecondaryInformation: DisplaySecondaryInformation,
|
||||||
recipientListener: OnClickedCallback<ContactSearchData.KnownRecipient>,
|
recipientListener: OnClickedCallback<ContactSearchData.KnownRecipient>,
|
||||||
recipientLongClickCallback: OnLongClickedCallback<ContactSearchData.KnownRecipient>
|
recipientLongClickCallback: OnLongClickedCallback<ContactSearchData.KnownRecipient>
|
||||||
) {
|
) {
|
||||||
mappingAdapter.registerFactory(
|
mappingAdapter.registerFactory(
|
||||||
RecipientModel::class.java,
|
RecipientModel::class.java,
|
||||||
LayoutFactory({ KnownRecipientViewHolder(it, fixedContacts, displayCheckBox, displaySmsTag, displayPhoneNumber, recipientListener, recipientLongClickCallback) }, R.layout.contact_search_item)
|
LayoutFactory({ KnownRecipientViewHolder(it, fixedContacts, displayCheckBox, displaySmsTag, displaySecondaryInformation, recipientListener, recipientLongClickCallback) }, R.layout.contact_search_item)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ open class ContactSearchAdapter(
|
||||||
private val fixedContacts: Set<ContactSearchKey>,
|
private val fixedContacts: Set<ContactSearchKey>,
|
||||||
displayCheckBox: Boolean,
|
displayCheckBox: Boolean,
|
||||||
displaySmsTag: DisplaySmsTag,
|
displaySmsTag: DisplaySmsTag,
|
||||||
private val displayPhoneNumber: DisplayPhoneNumber,
|
private val displaySecondaryInformation: DisplaySecondaryInformation,
|
||||||
onClick: OnClickedCallback<ContactSearchData.KnownRecipient>,
|
onClick: OnClickedCallback<ContactSearchData.KnownRecipient>,
|
||||||
private val onLongClick: OnLongClickedCallback<ContactSearchData.KnownRecipient>
|
private val onLongClick: OnLongClickedCallback<ContactSearchData.KnownRecipient>
|
||||||
) : BaseRecipientViewHolder<RecipientModel, ContactSearchData.KnownRecipient>(itemView, displayCheckBox, displaySmsTag, onClick), LetterHeaderDecoration.LetterHeaderItem {
|
) : BaseRecipientViewHolder<RecipientModel, ContactSearchData.KnownRecipient>(itemView, displayCheckBox, displaySmsTag, onClick), LetterHeaderDecoration.LetterHeaderItem {
|
||||||
|
@ -370,7 +370,10 @@ open class ContactSearchAdapter(
|
||||||
val count = recipient.participantIds.size
|
val count = recipient.participantIds.size
|
||||||
number.text = context.resources.getQuantityString(R.plurals.ContactSearchItems__group_d_members, count, count)
|
number.text = context.resources.getQuantityString(R.plurals.ContactSearchItems__group_d_members, count, count)
|
||||||
number.visible = true
|
number.visible = true
|
||||||
} else if (displayPhoneNumber == DisplayPhoneNumber.ALWAYS && recipient.hasE164()) {
|
} else if (displaySecondaryInformation == DisplaySecondaryInformation.ALWAYS && recipient.combinedAboutAndEmoji != null) {
|
||||||
|
number.text = recipient.combinedAboutAndEmoji
|
||||||
|
number.visible = true
|
||||||
|
} else if (displaySecondaryInformation == DisplaySecondaryInformation.ALWAYS && recipient.hasE164()) {
|
||||||
number.text = PhoneNumberFormatter.prettyPrint(recipient.requireE164())
|
number.text = PhoneNumberFormatter.prettyPrint(recipient.requireE164())
|
||||||
number.visible = true
|
number.visible = true
|
||||||
} else {
|
} else {
|
||||||
|
@ -608,7 +611,7 @@ open class ContactSearchAdapter(
|
||||||
NEVER
|
NEVER
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class DisplayPhoneNumber {
|
enum class DisplaySecondaryInformation {
|
||||||
NEVER,
|
NEVER,
|
||||||
ALWAYS
|
ALWAYS
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ import java.util.concurrent.TimeUnit
|
||||||
* @param selectionLimits [SelectionLimits] describing how large the result set can be.
|
* @param selectionLimits [SelectionLimits] describing how large the result set can be.
|
||||||
* @param displayCheckBox Whether or not to display checkboxes on items.
|
* @param displayCheckBox Whether or not to display checkboxes on items.
|
||||||
* @param displaySmsTag Whether or not to display the SMS tag on items.
|
* @param displaySmsTag Whether or not to display the SMS tag on items.
|
||||||
* @param displayPhoneNumber Whether or not to display phone numbers on known contacts.
|
* @param displaySecondaryInformation Whether or not to display phone numbers on known contacts.
|
||||||
* @param mapStateToConfiguration Maps a [ContactSearchState] to a [ContactSearchConfiguration]
|
* @param mapStateToConfiguration Maps a [ContactSearchState] to a [ContactSearchConfiguration]
|
||||||
* @param callbacks Hooks to help process, filter, and react to selection
|
* @param callbacks Hooks to help process, filter, and react to selection
|
||||||
* @param performSafetyNumberChecks Whether to perform safety number checks for selected users
|
* @param performSafetyNumberChecks Whether to perform safety number checks for selected users
|
||||||
|
@ -44,7 +44,7 @@ class ContactSearchMediator(
|
||||||
selectionLimits: SelectionLimits,
|
selectionLimits: SelectionLimits,
|
||||||
displayCheckBox: Boolean,
|
displayCheckBox: Boolean,
|
||||||
displaySmsTag: ContactSearchAdapter.DisplaySmsTag,
|
displaySmsTag: ContactSearchAdapter.DisplaySmsTag,
|
||||||
displayPhoneNumber: ContactSearchAdapter.DisplayPhoneNumber,
|
displaySecondaryInformation: ContactSearchAdapter.DisplaySecondaryInformation,
|
||||||
mapStateToConfiguration: (ContactSearchState) -> ContactSearchConfiguration,
|
mapStateToConfiguration: (ContactSearchState) -> ContactSearchConfiguration,
|
||||||
private val callbacks: Callbacks = SimpleCallbacks(),
|
private val callbacks: Callbacks = SimpleCallbacks(),
|
||||||
performSafetyNumberChecks: Boolean = true,
|
performSafetyNumberChecks: Boolean = true,
|
||||||
|
@ -71,7 +71,7 @@ class ContactSearchMediator(
|
||||||
fixedContacts = fixedContacts,
|
fixedContacts = fixedContacts,
|
||||||
displayCheckBox = displayCheckBox,
|
displayCheckBox = displayCheckBox,
|
||||||
displaySmsTag = displaySmsTag,
|
displaySmsTag = displaySmsTag,
|
||||||
displayPhoneNumber = displayPhoneNumber,
|
displaySecondaryInformation = displaySecondaryInformation,
|
||||||
callbacks = object : ContactSearchAdapter.ClickCallbacks {
|
callbacks = object : ContactSearchAdapter.ClickCallbacks {
|
||||||
override fun onStoryClicked(view: View, story: ContactSearchData.Story, isSelected: Boolean) {
|
override fun onStoryClicked(view: View, story: ContactSearchData.Story, isSelected: Boolean) {
|
||||||
toggleStorySelection(view, story, isSelected)
|
toggleStorySelection(view, story, isSelected)
|
||||||
|
@ -232,7 +232,7 @@ class ContactSearchMediator(
|
||||||
fixedContacts: Set<ContactSearchKey>,
|
fixedContacts: Set<ContactSearchKey>,
|
||||||
displayCheckBox: Boolean,
|
displayCheckBox: Boolean,
|
||||||
displaySmsTag: ContactSearchAdapter.DisplaySmsTag,
|
displaySmsTag: ContactSearchAdapter.DisplaySmsTag,
|
||||||
displayPhoneNumber: ContactSearchAdapter.DisplayPhoneNumber,
|
displaySecondaryInformation: ContactSearchAdapter.DisplaySecondaryInformation,
|
||||||
callbacks: ContactSearchAdapter.ClickCallbacks,
|
callbacks: ContactSearchAdapter.ClickCallbacks,
|
||||||
longClickCallbacks: ContactSearchAdapter.LongClickCallbacks,
|
longClickCallbacks: ContactSearchAdapter.LongClickCallbacks,
|
||||||
storyContextMenuCallbacks: ContactSearchAdapter.StoryContextMenuCallbacks
|
storyContextMenuCallbacks: ContactSearchAdapter.StoryContextMenuCallbacks
|
||||||
|
@ -245,12 +245,12 @@ class ContactSearchMediator(
|
||||||
fixedContacts: Set<ContactSearchKey>,
|
fixedContacts: Set<ContactSearchKey>,
|
||||||
displayCheckBox: Boolean,
|
displayCheckBox: Boolean,
|
||||||
displaySmsTag: ContactSearchAdapter.DisplaySmsTag,
|
displaySmsTag: ContactSearchAdapter.DisplaySmsTag,
|
||||||
displayPhoneNumber: ContactSearchAdapter.DisplayPhoneNumber,
|
displaySecondaryInformation: ContactSearchAdapter.DisplaySecondaryInformation,
|
||||||
callbacks: ContactSearchAdapter.ClickCallbacks,
|
callbacks: ContactSearchAdapter.ClickCallbacks,
|
||||||
longClickCallbacks: ContactSearchAdapter.LongClickCallbacks,
|
longClickCallbacks: ContactSearchAdapter.LongClickCallbacks,
|
||||||
storyContextMenuCallbacks: ContactSearchAdapter.StoryContextMenuCallbacks
|
storyContextMenuCallbacks: ContactSearchAdapter.StoryContextMenuCallbacks
|
||||||
): PagingMappingAdapter<ContactSearchKey> {
|
): PagingMappingAdapter<ContactSearchKey> {
|
||||||
return ContactSearchAdapter(context, fixedContacts, displayCheckBox, displaySmsTag, displayPhoneNumber, callbacks, longClickCallbacks, storyContextMenuCallbacks)
|
return ContactSearchAdapter(context, fixedContacts, displayCheckBox, displaySmsTag, displaySecondaryInformation, callbacks, longClickCallbacks, storyContextMenuCallbacks)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,7 +124,7 @@ class MultiselectForwardFragment :
|
||||||
FeatureFlags.shareSelectionLimit(),
|
FeatureFlags.shareSelectionLimit(),
|
||||||
!args.selectSingleRecipient,
|
!args.selectSingleRecipient,
|
||||||
ContactSearchAdapter.DisplaySmsTag.DEFAULT,
|
ContactSearchAdapter.DisplaySmsTag.DEFAULT,
|
||||||
ContactSearchAdapter.DisplayPhoneNumber.NEVER,
|
ContactSearchAdapter.DisplaySecondaryInformation.NEVER,
|
||||||
this::getConfiguration,
|
this::getConfiguration,
|
||||||
object : ContactSearchMediator.SimpleCallbacks() {
|
object : ContactSearchMediator.SimpleCallbacks() {
|
||||||
override fun onBeforeContactsSelected(view: View?, contactSearchKeys: Set<ContactSearchKey>): Set<ContactSearchKey> {
|
override fun onBeforeContactsSelected(view: View?, contactSearchKeys: Set<ContactSearchKey>): Set<ContactSearchKey> {
|
||||||
|
|
|
@ -298,7 +298,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode
|
||||||
SelectionLimits.NO_LIMITS,
|
SelectionLimits.NO_LIMITS,
|
||||||
false,
|
false,
|
||||||
ContactSearchAdapter.DisplaySmsTag.DEFAULT,
|
ContactSearchAdapter.DisplaySmsTag.DEFAULT,
|
||||||
ContactSearchAdapter.DisplayPhoneNumber.NEVER,
|
ContactSearchAdapter.DisplaySecondaryInformation.NEVER,
|
||||||
this::mapSearchStateToConfiguration,
|
this::mapSearchStateToConfiguration,
|
||||||
new ContactSearchMediator.SimpleCallbacks(),
|
new ContactSearchMediator.SimpleCallbacks(),
|
||||||
false,
|
false,
|
||||||
|
@ -306,7 +306,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode
|
||||||
fixedContacts,
|
fixedContacts,
|
||||||
displayCheckBox,
|
displayCheckBox,
|
||||||
displaySmsTag,
|
displaySmsTag,
|
||||||
displayPhoneNumber,
|
displaySecondaryInformation,
|
||||||
callbacks,
|
callbacks,
|
||||||
longClickCallbacks,
|
longClickCallbacks,
|
||||||
storyContextMenuCallbacks
|
storyContextMenuCallbacks
|
||||||
|
@ -317,7 +317,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode
|
||||||
fixedContacts,
|
fixedContacts,
|
||||||
displayCheckBox,
|
displayCheckBox,
|
||||||
displaySmsTag,
|
displaySmsTag,
|
||||||
displayPhoneNumber,
|
displaySecondaryInformation,
|
||||||
new ContactSearchClickCallbacks(callbacks),
|
new ContactSearchClickCallbacks(callbacks),
|
||||||
longClickCallbacks,
|
longClickCallbacks,
|
||||||
storyContextMenuCallbacks,
|
storyContextMenuCallbacks,
|
||||||
|
|
|
@ -28,13 +28,13 @@ class ConversationListSearchAdapter(
|
||||||
fixedContacts: Set<ContactSearchKey>,
|
fixedContacts: Set<ContactSearchKey>,
|
||||||
displayCheckBox: Boolean,
|
displayCheckBox: Boolean,
|
||||||
displaySmsTag: DisplaySmsTag,
|
displaySmsTag: DisplaySmsTag,
|
||||||
displayPhoneNumber: DisplayPhoneNumber,
|
displaySecondaryInformation: DisplaySecondaryInformation,
|
||||||
onClickedCallbacks: ConversationListSearchClickCallbacks,
|
onClickedCallbacks: ConversationListSearchClickCallbacks,
|
||||||
longClickCallbacks: LongClickCallbacks,
|
longClickCallbacks: LongClickCallbacks,
|
||||||
storyContextMenuCallbacks: StoryContextMenuCallbacks,
|
storyContextMenuCallbacks: StoryContextMenuCallbacks,
|
||||||
lifecycleOwner: LifecycleOwner,
|
lifecycleOwner: LifecycleOwner,
|
||||||
glideRequests: GlideRequests
|
glideRequests: GlideRequests
|
||||||
) : ContactSearchAdapter(context, fixedContacts, displayCheckBox, displaySmsTag, displayPhoneNumber, onClickedCallbacks, longClickCallbacks, storyContextMenuCallbacks) {
|
) : ContactSearchAdapter(context, fixedContacts, displayCheckBox, displaySmsTag, displaySecondaryInformation, onClickedCallbacks, longClickCallbacks, storyContextMenuCallbacks) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
registerFactory(
|
registerFactory(
|
||||||
|
|
|
@ -67,7 +67,7 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment(
|
||||||
selectionLimits = FeatureFlags.shareSelectionLimit(),
|
selectionLimits = FeatureFlags.shareSelectionLimit(),
|
||||||
displayCheckBox = true,
|
displayCheckBox = true,
|
||||||
displaySmsTag = ContactSearchAdapter.DisplaySmsTag.DEFAULT,
|
displaySmsTag = ContactSearchAdapter.DisplaySmsTag.DEFAULT,
|
||||||
displayPhoneNumber = ContactSearchAdapter.DisplayPhoneNumber.NEVER,
|
displaySecondaryInformation = ContactSearchAdapter.DisplaySecondaryInformation.NEVER,
|
||||||
mapStateToConfiguration = { state ->
|
mapStateToConfiguration = { state ->
|
||||||
ContactSearchConfiguration.build {
|
ContactSearchConfiguration.build {
|
||||||
query = state.query
|
query = state.query
|
||||||
|
|
|
@ -29,7 +29,7 @@ class ViewAllSignalConnectionsFragment : Fragment(R.layout.view_all_signal_conne
|
||||||
selectionLimits = SelectionLimits(0, 0),
|
selectionLimits = SelectionLimits(0, 0),
|
||||||
displayCheckBox = false,
|
displayCheckBox = false,
|
||||||
displaySmsTag = ContactSearchAdapter.DisplaySmsTag.IF_NOT_REGISTERED,
|
displaySmsTag = ContactSearchAdapter.DisplaySmsTag.IF_NOT_REGISTERED,
|
||||||
displayPhoneNumber = ContactSearchAdapter.DisplayPhoneNumber.NEVER,
|
displaySecondaryInformation = ContactSearchAdapter.DisplaySecondaryInformation.NEVER,
|
||||||
mapStateToConfiguration = { getConfiguration() },
|
mapStateToConfiguration = { getConfiguration() },
|
||||||
performSafetyNumberChecks = false
|
performSafetyNumberChecks = false
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Reference in a new issue