Workaround for wrongly aligned textView for RTL locales

Change-Id: I77e48dbc8a0c93337d9c2d2c56025ae222d291d8
This commit is contained in:
SpiritCroc 2020-12-28 14:20:12 +01:00
parent 813d3679cd
commit dee1971814

View file

@ -1,6 +1,7 @@
package im.vector.app.core.ui.views
import android.content.Context
import android.graphics.Canvas
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
import kotlin.math.ceil
@ -19,10 +20,16 @@ class FooteredTextView @JvmOverloads constructor(
var footerWidth: Int = 0
//var widthLimit: Float = 0f
// Workaround to RTL languages with non-RTL content messages aligning left instead of start
private var requiredHorizontalCanvasMove = 0f
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
// First, let super measure the content for our normal TextView use
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
// Default case
requiredHorizontalCanvasMove = 0f
// Get max available width
//val widthMode = MeasureSpec.getMode(widthMeasureSpec)
val widthSize = MeasureSpec.getSize(widthMeasureSpec)
@ -70,6 +77,10 @@ class FooteredTextView @JvmOverloads constructor(
// Reserve extra horizontal footer space if necessary
if (widthWithHorizontalFooter > newWidth) {
newWidth = ceil(widthWithHorizontalFooter).toInt()
if (viewIsRtl) {
requiredHorizontalCanvasMove = widthWithHorizontalFooter - measuredWidth
}
}
} else {
// Reserve vertical footer space
@ -78,4 +89,13 @@ class FooteredTextView @JvmOverloads constructor(
setMeasuredDimension(newWidth, newHeight)
}
override fun onDraw(canvas: Canvas?) {
// Workaround to RTL languages with non-RTL content messages aligning left instead of start
if (requiredHorizontalCanvasMove > 0f) {
canvas?.translate(requiredHorizontalCanvasMove, 0f)
}
super.onDraw(canvas)
}
}