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

Commit 9fe66836 authored by Sherry Zhou's avatar Sherry Zhou Committed by Android (Google) Code Review
Browse files

Merge "Change textAnimator to modify weight in variable fonts" into tm-qpr-dev

parents f612fe0d 02ff2bc8
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)
            }
        }
    }
}