From 28e2f22550dc8c763593c50a03c96b90d7b76b11 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 4 Feb 2020 13:17:44 -0500 Subject: [PATCH] Fix layout issues with reaction badges. --- .../conversation/ConversationItem.java | 18 +++++++-------- .../ConversationItemBodyBubble.java | 22 ++++++++++++++++++- .../reactions/ReactionsConversationView.java | 8 +++++-- 3 files changed, 36 insertions(+), 12 deletions(-) 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 b14f94f86c..c33e59c173 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -905,22 +905,22 @@ public class ConversationItem extends LinearLayout implements BindableConversati } private void setReactions(@NonNull MessageRecord current) { + bodyBubble.setOnSizeChangedListener(null); + if (current.getReactions().isEmpty()) { reactionsView.clear(); return; } - bodyBubble.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - setReactionsWithWidth(current); - bodyBubble.getViewTreeObserver().removeOnGlobalLayoutListener(this); - } - }); + if (bodyBubble.getWidth() != 0) { + setReactionsWithWidth(current, bodyBubble.getWidth()); + } + + bodyBubble.setOnSizeChangedListener((width, height) -> setReactionsWithWidth(current, width)); } - private void setReactionsWithWidth(@NonNull MessageRecord current) { - reactionsView.setReactions(current.getReactions(), bodyBubble.getWidth()); + private void setReactionsWithWidth(@NonNull MessageRecord current, int width) { + reactionsView.setReactions(current.getReactions(), width); reactionsView.setOnClickListener(v -> { if (eventListener == null) return; diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemBodyBubble.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemBodyBubble.java index 8743b62a18..5719292bf3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemBodyBubble.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemBodyBubble.java @@ -11,7 +11,8 @@ import org.thoughtcrime.securesms.components.Outliner; public class ConversationItemBodyBubble extends LinearLayout { - private @Nullable Outliner outliner; + @Nullable private Outliner outliner; + @Nullable private OnSizeChangedListener sizeChangedListener; public ConversationItemBodyBubble(Context context) { super(context); @@ -29,6 +30,10 @@ public class ConversationItemBodyBubble extends LinearLayout { this.outliner = outliner; } + public void setOnSizeChangedListener(@Nullable OnSizeChangedListener listener) { + this.sizeChangedListener = listener; + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); @@ -37,5 +42,20 @@ public class ConversationItemBodyBubble extends LinearLayout { outliner.draw(canvas, 0, getMeasuredWidth(), getMeasuredHeight(), 0); } + + @Override + protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { + if (sizeChangedListener != null) { + post(() -> { + if (sizeChangedListener != null) { + sizeChangedListener.onSizeChanged(width, height); + } + }); + } + } + + public interface OnSizeChangedListener { + void onSizeChanged(int width, int height); + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java index c341ecb2fd..a0d73e1436 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java @@ -16,7 +16,6 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.database.model.ReactionRecord; -import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.ThemeUtil; @@ -34,6 +33,7 @@ public class ReactionsConversationView extends LinearLayout { private boolean outgoing; private List records; + private int bubbleWidth; public ReactionsConversationView(Context context) { super(context); @@ -54,18 +54,22 @@ public class ReactionsConversationView extends LinearLayout { } } + + public void clear() { removeAllViews(); } public void setReactions(@NonNull List records, int bubbleWidth) { - if (records.equals(this.records)) { + if (records.equals(this.records) && this.bubbleWidth == bubbleWidth) { return; } this.records.clear(); this.records.addAll(records); + this.bubbleWidth = bubbleWidth; + List reactions = buildSortedReactionsList(records); removeAllViews();