diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/view/ScMessageBubbleWrapView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/view/ScMessageBubbleWrapView.kt index 1b0f2aeaf7..92bd9d2fc6 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/view/ScMessageBubbleWrapView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/view/ScMessageBubbleWrapView.kt @@ -262,15 +262,15 @@ class ScMessageBubbleWrapView @JvmOverloads constructor(context: Context, attrs: if (messageLayout.isRealBubble || messageLayout.isPseudoBubble) { // Padding for bubble content: long for side with tail, short for other sides - val longPaddingDp: Int - val shortPaddingDp: Int + val longPadding: Int + val shortPadding: Int bubbleView.setBackgroundResource(messageLayout.bubbleDrawable) if (!messageLayout.isPseudoBubble) { - longPaddingDp = bubbleView.resources.getDimensionPixelSize(R.dimen.sc_bubble_inner_padding_long_side) - shortPaddingDp = bubbleView.resources.getDimensionPixelSize(R.dimen.sc_bubble_inner_padding_short_side) + longPadding = bubbleView.resources.getDimensionPixelSize(R.dimen.sc_bubble_inner_padding_long_side) + shortPadding = bubbleView.resources.getDimensionPixelSize(R.dimen.sc_bubble_inner_padding_short_side) } else { - longPaddingDp = bubbleView.resources.getDimensionPixelSize(R.dimen.sc_bubble_tail_size) - shortPaddingDp = 0//if (attributes.informationData.showInformation && !hideSenderInformation()) { 8 } else { 0 } + longPadding = bubbleView.resources.getDimensionPixelSize(R.dimen.sc_bubble_tail_size) + shortPadding = 0//if (attributes.informationData.showInformation && !hideSenderInformation()) { 8 } else { 0 } } if (messageLayout.reverseBubble != defaultRtl) { // Use left/right instead of start/end: bubbleView is always LTR @@ -283,17 +283,17 @@ class ScMessageBubbleWrapView @JvmOverloads constructor(context: Context, attrs: if (messageLayout.reverseBubble != defaultRtl) { // Use left/right instead of start/end: bubbleView is always LTR bubbleView.setPadding( - shortPaddingDp, - shortPaddingDp, - longPaddingDp, - shortPaddingDp + shortPadding, + shortPadding, + longPadding, + shortPadding ) } else { bubbleView.setPadding( - longPaddingDp, - shortPaddingDp, - shortPaddingDp, - shortPaddingDp + longPadding, + shortPadding, + shortPadding, + shortPadding ) } @@ -390,16 +390,16 @@ class ScMessageBubbleWrapView @JvmOverloads constructor(context: Context, attrs: // We need to align the non-bubble member name view to pseudo bubbles if (messageLayout.reverseBubble) { views.messageMemberNameView.setPaddingRelative( - shortPaddingDp, + shortPadding, 0, - longPaddingDp, + longPadding, 0 ) } else { views.messageMemberNameView.setPaddingRelative( - longPaddingDp, + longPadding, 0, - shortPaddingDp, + shortPadding, 0 ) } @@ -475,9 +475,7 @@ class ScMessageBubbleWrapView @JvmOverloads constructor(context: Context, attrs: if (informationData?.messageLayout is TimelineMessageLayout.ScBubble && getBubbleTimeLocation(informationData.messageLayout as TimelineMessageLayout.ScBubble) == BubbleThemeUtils.BUBBLE_TIME_BOTTOM) { // Guess text width for name and time - timeWidth = ceil(guessTextWidth(views.bubbleFooterMessageTimeView, informationData.time.toString())).toInt() + - views.bubbleFooterMessageTimeView.paddingLeft + - views.bubbleFooterMessageTimeView.paddingRight + timeWidth = ceil(guessTextWidth(views.bubbleFooterMessageTimeView, informationData.time.toString())).toInt() timeHeight = ceil(views.bubbleFooterMessageTimeView.textSize).toInt() + views.bubbleFooterMessageTimeView.paddingTop + views.bubbleFooterMessageTimeView.paddingBottom @@ -522,9 +520,9 @@ class ScMessageBubbleWrapView @JvmOverloads constructor(context: Context, attrs: val result = if (contentInBubble) { if (getBubbleTimeLocation(messageLayout) == BUBBLE_TIME_BOTTOM) { if (attributes.informationData.messageLayout.showDisplayName && !canHideSender) { - // Since timeView automatically gets enough space, either within or outside the viewStub, we just need to ensure the member name view has enough space - // Somehow not enough without extra space... - ceil(guessTextWidth(views.bubbleMessageMemberNameView, "$memberName ")).toInt() + // Since timeView automatically gets enough space, either within or outside the viewStub, + // we just need to ensure the member name view has enough space + ceil(guessTextWidth(views.bubbleMessageMemberNameView, memberName)).toInt() } else { // wrap_content works! 0 diff --git a/vector/src/main/java/im/vector/app/features/themes/BubbleThemeUtils.kt b/vector/src/main/java/im/vector/app/features/themes/BubbleThemeUtils.kt index 911e4a974d..0b9c4af371 100644 --- a/vector/src/main/java/im/vector/app/features/themes/BubbleThemeUtils.kt +++ b/vector/src/main/java/im/vector/app/features/themes/BubbleThemeUtils.kt @@ -2,6 +2,7 @@ package im.vector.app.features.themes import android.content.Context import android.graphics.Paint +import android.graphics.Typeface import android.os.Parcelable import android.widget.TextView import androidx.annotation.DimenRes @@ -104,13 +105,14 @@ fun guessTextWidth(view: TextView): Float { } fun guessTextWidth(view: TextView, text: CharSequence): Float { - return guessTextWidth(view.textSize, text); + return guessTextWidth(view.textSize, text, view.typeface) + view.paddingLeft + view.paddingRight } -fun guessTextWidth(textSize: Float, text: CharSequence): Float { +fun guessTextWidth(textSize: Float, text: CharSequence, typeface: Typeface? = null): Float { val paint = Paint() paint.textSize = textSize - return paint.measureText(text.toString()) + typeface?.let { paint.typeface = it } + return paint.measureText(text, 0, text.length) } @Parcelize