Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02ff2bc8 authored by Sherry Zhou's avatar Sherry Zhou
Browse files

Change textAnimator to modify weight in variable fonts

Test: atest TextAnimatorTest
Bug: 268068203
Change-Id: I77e5dea3580fbdff78f090f840cc48e17e77615e
parent 7a2bfa7c
Loading
Loading
Loading
Loading
+34 −6
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.animation.ValueAnimator
import android.graphics.Canvas
import android.graphics.Typeface
import android.graphics.fonts.Font
import android.graphics.fonts.FontVariationAxis
import android.text.Layout
import android.util.SparseArray

@@ -215,13 +216,40 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) {
            textInterpolator.targetPaint.textSize = textSize
        }
        if (weight >= 0) {
            // Paint#setFontVariationSettings creates Typeface instance from scratch. To reduce the
            // memory impact, cache the typeface result.
            val fontVariationArray =
                    FontVariationAxis.fromFontVariationSettings(
                        textInterpolator.targetPaint.fontVariationSettings
                    )
            if (fontVariationArray.isNullOrEmpty()) {
                textInterpolator.targetPaint.typeface =
                    typefaceCache.getOrElse(weight) {
                        textInterpolator.targetPaint.fontVariationSettings = "'$TAG_WGHT' $weight"
                        textInterpolator.targetPaint.typeface
                    }
            } else {
                val idx = fontVariationArray.indexOfFirst { it.tag == "$TAG_WGHT" }
                if (idx == -1) {
                    val updatedFontVariation =
                        textInterpolator.targetPaint.fontVariationSettings + ",'$TAG_WGHT' $weight"
                    textInterpolator.targetPaint.typeface =
                        typefaceCache.getOrElse(weight) {
                            textInterpolator.targetPaint.fontVariationSettings =
                                    updatedFontVariation
                            textInterpolator.targetPaint.typeface
                        }
                } else {
                    fontVariationArray[idx] = FontVariationAxis(
                            "$TAG_WGHT", weight.toFloat())
                    val updatedFontVariation =
                            FontVariationAxis.toFontVariationSettings(fontVariationArray)
                    textInterpolator.targetPaint.typeface =
                        typefaceCache.getOrElse(weight) {
                            textInterpolator.targetPaint.fontVariationSettings =
                                    updatedFontVariation
                            textInterpolator.targetPaint.typeface
                        }
                }
            }
        }
        if (color != null) {
            textInterpolator.targetPaint.color = color
+68 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.animation
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.graphics.Typeface
import android.graphics.fonts.FontVariationAxis
import android.testing.AndroidTestingRunner
import android.text.Layout
import android.text.StaticLayout
@@ -178,4 +179,71 @@ class TextAnimatorTest : SysuiTestCase() {

        assertThat(paint.typeface).isSameInstanceAs(prevTypeface)
    }

    @Test
    fun testSetTextStyle_addWeight() {
        testWeightChange("", 100, FontVariationAxis.fromFontVariationSettings("'wght' 100")!!)
    }

    @Test
    fun testSetTextStyle_changeWeight() {
        testWeightChange(
                "'wght' 500",
                100,
                FontVariationAxis.fromFontVariationSettings("'wght' 100")!!
        )
    }

    @Test
    fun testSetTextStyle_addWeightWithOtherAxis() {
        testWeightChange(
                "'wdth' 100",
                100,
                FontVariationAxis.fromFontVariationSettings("'wght' 100, 'wdth' 100")!!
        )
    }

    @Test
    fun testSetTextStyle_changeWeightWithOtherAxis() {
        testWeightChange(
                "'wght' 500, 'wdth' 100",
                100,
                FontVariationAxis.fromFontVariationSettings("'wght' 100, 'wdth' 100")!!
        )
    }

    private fun testWeightChange(
            initialFontVariationSettings: String,
            weight: Int,
            expectedFontVariationSettings: Array<FontVariationAxis>
    ) {
        val layout = makeLayout("Hello, World", PAINT)
        val valueAnimator = mock(ValueAnimator::class.java)
        val textInterpolator = mock(TextInterpolator::class.java)
        val paint =
                TextPaint().apply {
                    typeface = Typeface.createFromFile("/system/fonts/Roboto-Regular.ttf")
                    fontVariationSettings = initialFontVariationSettings
                }
        `when`(textInterpolator.targetPaint).thenReturn(paint)

        val textAnimator =
                TextAnimator(layout, {}).apply {
                    this.textInterpolator = textInterpolator
                    this.animator = valueAnimator
                }
        textAnimator.setTextStyle(weight = weight, animate = false)

        val resultFontVariationList =
                FontVariationAxis.fromFontVariationSettings(
                        textInterpolator.targetPaint.fontVariationSettings
                )
        expectedFontVariationSettings.forEach { expectedAxis ->
            val resultAxis = resultFontVariationList?.filter { it.tag == expectedAxis.tag }?.get(0)
            assertThat(resultAxis).isNotNull()
            if (resultAxis != null) {
                assertThat(resultAxis.styleValue).isEqualTo(expectedAxis.styleValue)
            }
        }
    }
}