diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java b/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java index 0a17f59ec8..df229b7c48 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java @@ -289,8 +289,7 @@ public class QuoteView extends ConstraintLayout implements RecipientForeverObser QuoteViewColorTheme colorTheme = getColorTheme(); int foregroundColor = colorTheme.getForegroundColor(getContext()); - authorView.setSender(name, foregroundColor); - authorView.setLabel(memberLabel, foregroundColor, colorTheme.getLabelBackgroundColor(getContext())); + authorView.bind(name, foregroundColor, memberLabel, foregroundColor, colorTheme.getLabelBackgroundColor(getContext())); } private boolean isStoryReply() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 6cd5730f7d..ae2b8832d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -2026,8 +2026,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo if (groupThread && !messageRecord.isOutgoing()) { String senderName = recipient.getDisplayName(getContext()); int senderColor = colorizer.getIncomingGroupSenderColor(getContext(), messageRecord.getFromRecipient()); - senderWithLabelView.setSender(senderName, senderColor); - senderWithLabelView.setLabel(conversationMessage.getMemberLabel()); + senderWithLabelView.bind(senderName, senderColor, conversationMessage.getMemberLabel()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/SenderNameWithLabelView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/SenderNameWithLabelView.kt index adcdf5412f..6316616d74 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/SenderNameWithLabelView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/SenderNameWithLabelView.kt @@ -27,7 +27,7 @@ class SenderNameWithLabelView : AbstractComposeView { constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) init { - setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setViewCompositionStrategy(ViewCompositionStrategy.Default) } private var senderName: String by mutableStateOf("") @@ -37,6 +37,28 @@ class SenderNameWithLabelView : AbstractComposeView { private var memberLabel: MemberLabel? by mutableStateOf(null) + /** + * Sets sender and label state and forces fresh composition to avoid stale measurements from a previously bound item. + * Intended for use in a RecyclerView. + */ + fun bind(name: String, @ColorInt tintColor: Int, label: MemberLabel?) { + setSender(name, tintColor) + setLabel(label) + + // AbstractComposeView caches measurements across RecyclerView recycling. This forces fresh composition on the + // next measure to avoid stale cached measurements during recycling that can cause sender name / label clipping. + disposeComposition() + } + + /** + * Variant of [bind] with explicit label text/background colors. + */ + fun bind(name: String, @ColorInt tintColor: Int, label: MemberLabel?, @ColorInt textColor: Int, @ColorInt backgroundColor: Int) { + setSender(name, tintColor) + setLabel(label, textColor, backgroundColor) + disposeComposition() + } + fun setSender(name: String, @ColorInt tintColor: Int) { senderName = name senderColor = Color(tintColor) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt index bc53b91f88..359bfffee0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt @@ -631,8 +631,7 @@ open class V2ConversationItemTextOnlyViewHolder>( val tintColor = conversationContext.getColorizer().getIncomingGroupSenderColor(context, sender) nameWithLabelView.apply { - setSender(sender.getDisplayName(context), tintColor) - setLabel(conversationMessage.memberLabel) + bind(sender.getDisplayName(context), tintColor, conversationMessage.memberLabel) visible = true } diff --git a/app/src/main/res/layout/v2_quote_view.xml b/app/src/main/res/layout/v2_quote_view.xml index b0578dc6d1..843daaf7f7 100644 --- a/app/src/main/res/layout/v2_quote_view.xml +++ b/app/src/main/res/layout/v2_quote_view.xml @@ -19,9 +19,9 @@ app:layout_constraintTop_toTopOf="parent" tools:background="@color/signal_colorPrimary" /> - + app:layout_constraintVertical_chainStyle="packed"> + + + + @@ -142,7 +149,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:barrierDirection="bottom" - app:constraint_referenced_ids="quote_attachment_name_stub,quote_author,quote_text,media_type" /> + app:constraint_referenced_ids="quote_attachment_name_stub,quote_author_holder,quote_text,media_type" />