diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationBannerView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationBannerView.kt index 3073b0ad99..258783f16e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationBannerView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationBannerView.kt @@ -6,7 +6,6 @@ package org.thoughtcrime.securesms.conversation.v2 import android.content.Context -import android.text.SpannableStringBuilder import android.transition.ChangeBounds import android.transition.Slide import android.transition.TransitionManager @@ -15,8 +14,6 @@ import android.util.AttributeSet import android.view.Gravity import android.view.View import androidx.appcompat.widget.LinearLayoutCompat -import androidx.core.content.ContextCompat -import androidx.core.graphics.drawable.DrawableCompat import androidx.core.transition.addListener import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.identity.UnverifiedBannerView @@ -28,9 +25,7 @@ import org.thoughtcrime.securesms.database.model.IdentityRecord import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.profiles.spoofing.ReviewBannerView import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.ContextUtil import org.thoughtcrime.securesms.util.IdentityUtil -import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.views.Stub import org.thoughtcrime.securesms.util.visible @@ -114,20 +109,12 @@ class ConversationBannerView @JvmOverloads constructor( stub = reviewBannerStub ) { if (requestReviewState.individualReviewState != null) { - val message: CharSequence = SpannableStringBuilder() - .append(SpanUtil.bold(context.getString(R.string.ConversationFragment__review_requests_carefully))) - .append(" ") - .append(context.getString(R.string.ConversationFragment__signal_found_another_contact_with_the_same_name)) - - setBannerMessage(message) - - val drawable = ContextUtil.requireDrawable(context, R.drawable.symbol_info_24).mutate() - DrawableCompat.setTint(drawable, ContextCompat.getColor(context, R.color.signal_icon_tint_primary)) - setBannerIcon(drawable) - setOnClickListener { listener?.onRequestReviewIndividual(requestReviewState.individualReviewState.recipient.id) } + setBannerMessage(context.getString(R.string.ConversationFragment__review_banner_body)) + setBannerRecipients(requestReviewState.individualReviewState.target, requestReviewState.individualReviewState.firstDuplicate) + setOnClickListener { listener?.onRequestReviewIndividual(requestReviewState.individualReviewState.target.id) } } else if (requestReviewState.groupReviewState != null) { setBannerMessage(context.getString(R.string.ConversationFragment__d_group_members_have_the_same_name, requestReviewState.groupReviewState.count)) - setBannerRecipient(requestReviewState.groupReviewState.recipient) + setBannerRecipients(requestReviewState.groupReviewState.target, requestReviewState.groupReviewState.firstDuplicate) setOnClickListener { listener?.onReviewGroupMembers(requestReviewState.groupReviewState.groupId) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt index 980b27c5c1..896be87bbc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt @@ -370,8 +370,16 @@ class ConversationRepository( return@fromCallable RequestReviewState() } - if (group == null && ReviewUtil.isRecipientReviewSuggested(recipient.id)) { - return@fromCallable RequestReviewState(individualReviewState = IndividualReviewState(recipient)) + if (group == null) { + val recipientsToReview = ReviewUtil.getRecipientsToPromptForReview(recipient.id) + if (recipientsToReview.size > 0) { + return@fromCallable RequestReviewState( + individualReviewState = IndividualReviewState( + target = recipient, + firstDuplicate = Recipient.resolvedList(recipientsToReview)[0] + ) + ) + } } if (group != null && group.isV2Group) { @@ -383,6 +391,7 @@ class ConversationRepository( groupReviewState = GroupReviewState( groupId, duplicateRecipients[0], + duplicateRecipients[1], duplicateRecipients.size ) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RequestReviewState.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RequestReviewState.kt index f279ee727e..0b1716f5ee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RequestReviewState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RequestReviewState.kt @@ -22,8 +22,8 @@ data class RequestReviewState( } /** Recipient is in message request state and has similar name as someone else */ - data class IndividualReviewState(val recipient: Recipient) + data class IndividualReviewState(val target: Recipient, val firstDuplicate: Recipient) /** Group has multiple members with similar names */ - data class GroupReviewState(val groupId: GroupId.V2, val recipient: Recipient, val count: Int) + data class GroupReviewState(val groupId: GroupId.V2, val target: Recipient, val firstDuplicate: Recipient, val count: Int) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewBannerView.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewBannerView.java index 7d4c3f2cea..a4768c4253 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewBannerView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewBannerView.java @@ -69,9 +69,9 @@ public class ReviewBannerView extends FrameLayout { binding.bannerAvatarStroke.setVisibility(GONE); } - public void setBannerRecipient(@NonNull Recipient recipient) { - binding.bannerTopLeftAvatar.setAvatar(recipient); - binding.bannerBottomRightAvatar.setAvatar(recipient); + public void setBannerRecipients(@NonNull Recipient target, @NonNull Recipient dupe) { + binding.bannerTopLeftAvatar.setAvatar(target); + binding.bannerBottomRightAvatar.setAvatar(dupe); binding.bannerIcon.setVisibility(GONE); binding.bannerTopLeftAvatar.setVisibility(VISIBLE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardViewHolder.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardViewHolder.java index 63f6836e12..6052cfd6b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardViewHolder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardViewHolder.java @@ -83,13 +83,6 @@ class ReviewCardViewHolder extends RecyclerView.ViewHolder { binding.cardName.setText(name); - int titleTextResId = getTitleResId(reviewCard.getCardType()); - if (titleTextResId > 0) { - binding.cardTitle.setText(getTitleResId(reviewCard.getCardType())); - } else { - binding.cardTitle.setVisibility(View.GONE); - } - List rows = switch (reviewCard.getCardType()) { case MEMBER, REQUEST -> getNonContactSublines(reviewCard); case YOUR_CONTACT -> getContactSublines(reviewCard); @@ -253,14 +246,6 @@ class ReviewCardViewHolder extends RecyclerView.ViewHolder { void onSignalConnectionClicked(); } - private static @StringRes int getTitleResId(@NonNull ReviewCard.CardType cardType) { - return switch (cardType) { - case MEMBER -> -1; - case REQUEST -> R.string.ReviewCard__request; - case YOUR_CONTACT -> R.string.ReviewCard__your_contact; - }; - } - private static @StringRes int getActionLabelResId(@NonNull ReviewCard.Action action) { return switch (action) { case UPDATE_CONTACT -> R.string.ReviewCard__update_contact; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewUtil.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewUtil.java index 2926140d98..173ea4b773 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewUtil.java @@ -39,15 +39,17 @@ public final class ReviewUtil { * @return Whether or not multiple recipients share this profile name. */ @WorkerThread - public static boolean isRecipientReviewSuggested(@NonNull RecipientId recipientId) + public static List getRecipientsToPromptForReview(@NonNull RecipientId recipientId) { Recipient recipient = Recipient.resolved(recipientId); if (recipient.isGroup() || recipient.isSystemContact()) { - return false; + return Collections.emptyList(); } - return SignalDatabase.recipients().getSimilarRecipientIds(recipient).size() > 1; + return Stream.of(SignalDatabase.recipients().getSimilarRecipientIds(recipient)) + .filter(id -> !id.equals(recipientId)) + .toList(); } @WorkerThread diff --git a/app/src/main/res/layout/fragment_review.xml b/app/src/main/res/layout/fragment_review.xml index f9ed20c65d..5180707682 100644 --- a/app/src/main/res/layout/fragment_review.xml +++ b/app/src/main/res/layout/fragment_review.xml @@ -15,7 +15,7 @@ android:layout_marginBottom="18dp" android:layout_marginHorizontal="@dimen/core_ui__gutter" android:textAppearance="@style/Signal.Text.BodyMedium" - android:textColor="@color/signal_colorOutline" + android:textColor="@color/signal_colorOnSurfaceVariant" tools:text="@string/ReviewCardDialogFragment__d_group_members_have_the_same_name" /> - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aed8c9a792..998e6e53c3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -494,8 +494,8 @@ You can add notes for yourself in this chat. If your account has any linked devices, new notes will be synced. %1$d group members have the same name. Tap to review - Review requests carefully - Signal found another contact with the same name. + + This person has the same name as another contact Contact us Verify Not now @@ -4127,8 +4127,10 @@ \"%1$s\" has been unblocked. - Review Members - Review Request + + Review members + + Review request %1$d group members have the same name, review the members below and choose to take action. If you\'re not sure who the request is from, review the contacts below and take action. No other groups in common.