diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/AutoScaledEmojiTextView.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/AutoScaledEmojiTextView.java new file mode 100644 index 000000000..33e2a3c04 --- /dev/null +++ b/src/main/java/org/thoughtcrime/securesms/components/emoji/AutoScaledEmojiTextView.java @@ -0,0 +1,65 @@ +package org.thoughtcrime.securesms.components.emoji; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.util.TypedValue; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatTextView; + +import net.fellbaum.jemoji.Emoji; +import net.fellbaum.jemoji.EmojiManager; + +import java.util.List; + + +public class AutoScaledEmojiTextView extends AppCompatTextView { + + private float originalFontSize; + + public AutoScaledEmojiTextView(Context context) { + this(context, null); + } + + public AutoScaledEmojiTextView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public AutoScaledEmojiTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray typedArray = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.textSize}); + originalFontSize = typedArray.getDimensionPixelSize(0, 0); + typedArray.recycle(); + } + + @Override + public void setText(@Nullable CharSequence text, BufferType type) { + float scale = getTextScale(text); + super.setTextSize(TypedValue.COMPLEX_UNIT_PX, originalFontSize * scale); + super.setText(text, type); + } + + private float getTextScale(CharSequence text) { + if (text.length() > 16) { + return 1; + } + List emojis = EmojiManager.extractEmojisInOrder(text.toString()); + int emojiCount = emojis.size(); + if (emojiCount <= 8) { + int charCount = text.length(); + for (Emoji emoji : emojis) { + charCount -= emoji.getEmoji().length(); + } + if (charCount == 0) { // only emojis in text + float scale = 1.25f; + if (emojiCount <= 6) scale += 0.25f; + if (emojiCount <= 4) scale += 0.25f; + if (emojiCount <= 2) scale += 0.25f; + return scale; + } + } + return 1; + } + +} diff --git a/src/main/res/layout/conversation_item_received.xml b/src/main/res/layout/conversation_item_received.xml index e56f07ead..af1d1abb4 100644 --- a/src/main/res/layout/conversation_item_received.xml +++ b/src/main/res/layout/conversation_item_received.xml @@ -163,7 +163,7 @@ android:layout_marginLeft="@dimen/message_bubble_horizontal_padding" android:layout_marginRight="@dimen/message_bubble_horizontal_padding" /> - -