mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-03-01 14:16:49 +00:00
Update UI and strings for the duplicate name review screen.
This commit is contained in:
committed by
Cody Henthorne
parent
e7c018283a
commit
bdb34e16c6
@@ -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) }
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<ReviewTextRow> 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;
|
||||
|
||||
@@ -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<RecipientId> 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
|
||||
|
||||
Reference in New Issue
Block a user