Add indicator for system contacts.

This commit is contained in:
Greyson Parrelli
2020-07-14 07:37:09 -07:00
committed by GitHub
parent 325e0c6781
commit d1b61bfed3
10 changed files with 142 additions and 21 deletions

View File

@@ -159,7 +159,7 @@ public class DirectoryHelper {
RegisteredState originalRegisteredState = recipient.resolve().getRegistered();
RegisteredState newRegisteredState = null;
if (recipient.getUuid().isPresent()) {
if (recipient.hasUuid() && !recipient.hasE164()) {
boolean isRegistered = isUuidRegistered(context, recipient);
if (isRegistered) {
recipientDatabase.markRegistered(recipient.getId(), recipient.getUuid().get());

View File

@@ -54,15 +54,15 @@ public class ConversationTitleView extends RelativeLayout {
public void onFinishInflate() {
super.onFinishInflate();
this.content = ViewUtil.findById(this, R.id.content);
this.title = ViewUtil.findById(this, R.id.title);
this.subtitle = ViewUtil.findById(this, R.id.subtitle);
this.verified = ViewUtil.findById(this, R.id.verified_indicator);
this.subtitleContainer = ViewUtil.findById(this, R.id.subtitle_container);
this.verifiedSubtitle = ViewUtil.findById(this, R.id.verified_subtitle);
this.avatar = ViewUtil.findById(this, R.id.contact_photo_image);
this.expirationBadgeContainer = ViewUtil.findById(this, R.id.expiration_badge_container);
this.expirationBadgeTime = ViewUtil.findById(this, R.id.expiration_badge);
this.content = findViewById(R.id.content);
this.title = findViewById(R.id.title);
this.subtitle = findViewById(R.id.subtitle);
this.verified = findViewById(R.id.verified_indicator);
this.subtitleContainer = findViewById(R.id.subtitle_container);
this.verifiedSubtitle = findViewById(R.id.verified_subtitle);
this.avatar = findViewById(R.id.contact_photo_image);
this.expirationBadgeContainer = findViewById(R.id.expiration_badge_container);
this.expirationBadgeTime = findViewById(R.id.expiration_badge);
ViewUtil.setTextViewGravityStart(this.title, getContext());
ViewUtil.setTextViewGravityStart(this.subtitle, getContext());
@@ -85,14 +85,22 @@ public class ConversationTitleView extends RelativeLayout {
if (recipient == null) setComposeTitle();
else setRecipientTitle(recipient);
int startDrawable = 0;
int endDrawable = 0;
if (recipient != null && recipient.isBlocked()) {
title.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_block_white_18dp, 0, 0, 0);
startDrawable = R.drawable.ic_block_white_18dp;
} else if (recipient != null && recipient.isMuted()) {
title.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_volume_off_white_18dp, 0, 0, 0);
} else {
title.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
startDrawable = R.drawable.ic_volume_off_white_18dp;
}
if (recipient != null && recipient.isSystemContact() && !recipient.isLocalNumber()) {
endDrawable = R.drawable.ic_profile_circle_outline_16;
}
title.setCompoundDrawablesRelativeWithIntrinsicBounds(startDrawable, 0, endDrawable, 0);
if (recipient != null) {
this.avatar.setAvatar(glideRequests, recipient, false);
}

View File

@@ -44,6 +44,7 @@ import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.profiles.edit.EditProfileActivity;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientExporter;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.ui.notifications.CustomNotificationsDialogFragment;
import org.thoughtcrime.securesms.util.DateUtils;
@@ -58,13 +59,17 @@ public class ManageRecipientFragment extends LoggingFragment {
private static final String RECIPIENT_ID = "RECIPIENT_ID";
private static final String FROM_CONVERSATION = "FROM_CONVERSATION";
private static final int RETURN_FROM_MEDIA = 405;
private static final int REQUEST_CODE_RETURN_FROM_MEDIA = 405;
private static final int REQUEST_CODE_ADD_CONTACT = 588;
private ManageRecipientViewModel viewModel;
private GroupMemberListView sharedGroupList;
private Toolbar toolbar;
private TextView title;
private TextView subtitle;
private View contactRow;
private TextView contactText;
private ImageView contactIcon;
private AvatarImageView avatar;
private ThreadPhotoRailView threadPhotoRailView;
private View mediaCard;
@@ -114,6 +119,9 @@ public class ManageRecipientFragment extends LoggingFragment {
avatar = view.findViewById(R.id.recipient_avatar);
toolbar = view.findViewById(R.id.toolbar);
contactRow = view.findViewById(R.id.recipient_contact_row);
contactText = view.findViewById(R.id.recipient_contact_text);
contactIcon = view.findViewById(R.id.recipient_contact_icon);
title = view.findViewById(R.id.name);
subtitle = view.findViewById(R.id.username_number);
sharedGroupList = view.findViewById(R.id.shared_group_list);
@@ -182,6 +190,7 @@ public class ManageRecipientFragment extends LoggingFragment {
notificationsCard.setVisibility(View.GONE);
groupMembershipCard.setVisibility(View.GONE);
blockUnblockCard.setVisibility(View.GONE);
contactRow.setVisibility(View.GONE);
} else {
viewModel.getVisibleSharedGroups().observe(getViewLifecycleOwner(), members -> sharedGroupList.setMembers(members));
viewModel.getSharedGroupsCountSummary().observe(getViewLifecycleOwner(), members -> groupsInCommonCount.setText(members));
@@ -246,12 +255,28 @@ public class ManageRecipientFragment extends LoggingFragment {
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RETURN_FROM_MEDIA) {
if (requestCode == REQUEST_CODE_RETURN_FROM_MEDIA) {
applyMediaCursorFactory();
} else if (requestCode == REQUEST_CODE_ADD_CONTACT) {
viewModel.onAddedToContacts();
}
}
private void presentRecipient(@NonNull Recipient recipient) {
if (recipient.isSystemContact()) {
contactText.setText(R.string.ManageRecipientActivity_this_person_is_in_your_contacts);
contactIcon.setVisibility(View.VISIBLE);
contactRow.setOnClickListener(v -> {
startActivity(new Intent(Intent.ACTION_VIEW, recipient.getContactUri()));
});
} else {
contactText.setText(R.string.ManageRecipientActivity_add_to_system_contacts);
contactIcon.setVisibility(View.GONE);
contactRow.setOnClickListener(v -> {
startActivityForResult(RecipientExporter.export(recipient).asAddContactIntent(), REQUEST_CODE_ADD_CONTACT);
});
}
disappearingMessagesCard.setVisibility(recipient.isRegistered() ? View.VISIBLE : View.GONE);
addToAGroup.setVisibility(recipient.isRegistered() ? View.VISIBLE : View.GONE);
@@ -294,7 +319,7 @@ public class ManageRecipientFragment extends LoggingFragment {
startActivityForResult(MediaPreviewActivity.intentFromMediaRecord(requireContext(),
mediaRecord,
ViewCompat.getLayoutDirection(threadPhotoRailView) == ViewCompat.LAYOUT_DIRECTION_LTR),
RETURN_FROM_MEDIA));
REQUEST_CODE_RETURN_FROM_MEDIA));
}
private void presentMuteState(@NonNull ManageRecipientViewModel.MuteState muteState) {

View File

@@ -10,10 +10,12 @@ import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.color.MaterialColor;
import org.thoughtcrime.securesms.color.MaterialColors;
import org.thoughtcrime.securesms.contacts.sync.DirectoryHelper;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.database.IdentityDatabase;
import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.OutgoingExpirationUpdateMessage;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
@@ -21,11 +23,14 @@ import org.thoughtcrime.securesms.sms.MessageSender;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
final class ManageRecipientRepository {
private static final String TAG = Log.tag(ManageRecipientRepository.class);
private final Context context;
private final RecipientId recipientId;
@@ -95,6 +100,16 @@ final class ManageRecipientRepository {
});
}
void refreshRecipient() {
SignalExecutors.UNBOUNDED.execute(() -> {
try {
DirectoryHelper.refreshDirectoryFor(context, Recipient.resolved(recipientId), false);
} catch (IOException e) {
Log.w(TAG, "Failed to refresh user after adding to contacts.");
}
});
}
@WorkerThread
@NonNull List<Recipient> getSharedGroups(@NonNull RecipientId recipientId) {
return Stream.of(DatabaseFactory.getGroupDatabase(context)

View File

@@ -257,6 +257,10 @@ public final class ManageRecipientViewModel extends ViewModel {
withRecipient(r -> CommunicationActions.startVideoCall(activity, r));
}
void onAddedToContacts() {
manageRecipientRepository.refreshRecipient();
}
static final class MediaCursor {
private final long threadId;
@NonNull private final CursorFactory mediaCursorFactory;