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

Commit 70811b33 authored by Sherry Zhou's avatar Sherry Zhou Committed by Automerger Merge Worker
Browse files

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

Merge "Change textAnimator to modify weight in variable fonts" into tm-qpr-dev am: 9fe66836 am: 468f6a49

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21271398



Change-Id: Ia1d51daf324eda941724dd0993fa77e2f430939f
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 3f329a27 468f6a49
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
@@ -179,4 +180,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)
            }
        }
    }
}