From 93535dc047240ddea582b9cadd8915b9e25aec44 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Fri, 11 Nov 2022 13:54:41 -0500 Subject: [PATCH] Prevent views from changing size in animation This reduces the jank in animation by reducing the measure calls, as the animating views do not change size. This means only using `wrap_content` or fixed non-zero sizes. Test: jank suite Test: atest CombinedShadeHeaderConstraintsTest Test: manual with different cutouts Test: perfetto trace Fixes: 258083936 Change-Id: Ia53411dd02f3fb0019d67a8ee3bc5111d13066f9 --- packages/SystemUI/res/xml/qqs_header.xml | 11 +++-- packages/SystemUI/res/xml/qs_header_new.xml | 13 +++--- ...mbinedShadeHeadersConstraintManagerImpl.kt | 1 - .../CombinedShadeHeaderConstraintsTest.kt | 43 +++++++++++++++++++ 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/packages/SystemUI/res/xml/qqs_header.xml b/packages/SystemUI/res/xml/qqs_header.xml index af4be1ade6561..e07a6c1dbc46b 100644 --- a/packages/SystemUI/res/xml/qqs_header.xml +++ b/packages/SystemUI/res/xml/qqs_header.xml @@ -25,7 +25,7 @@ android:id="@+id/clock"> @@ -80,12 +81,16 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="1" + app:layout_constraintHorizontal_chainStyle="packed" /> diff --git a/packages/SystemUI/res/xml/qs_header_new.xml b/packages/SystemUI/res/xml/qs_header_new.xml index d8a4e77529601..982c422f1fda2 100644 --- a/packages/SystemUI/res/xml/qs_header_new.xml +++ b/packages/SystemUI/res/xml/qs_header_new.xml @@ -43,6 +43,7 @@ app:layout_constraintBottom_toBottomOf="@id/carrier_group" app:layout_constraintEnd_toStartOf="@id/carrier_group" app:layout_constraintHorizontal_bias="0" + app:layout_constraintHorizontal_chainStyle="spread_inside" /> diff --git a/packages/SystemUI/src/com/android/systemui/shade/CombinedShadeHeadersConstraintManagerImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/CombinedShadeHeadersConstraintManagerImpl.kt index 4063af3cbc365..954534d42fdd3 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/CombinedShadeHeadersConstraintManagerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/CombinedShadeHeadersConstraintManagerImpl.kt @@ -92,7 +92,6 @@ object CombinedShadeHeadersConstraintManagerImpl : CombinedShadeHeadersConstrain centerEnd, ConstraintSet.END ) - constrainWidth(R.id.statusIcons, 0) }, qsConstraintsChanges = { setGuidelineBegin(centerStart, offsetFromEdge) diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/CombinedShadeHeaderConstraintsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/CombinedShadeHeaderConstraintsTest.kt index 0ce9056dc1d11..d7eb337efd3ba 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/CombinedShadeHeaderConstraintsTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/CombinedShadeHeaderConstraintsTest.kt @@ -24,6 +24,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.assertWithMessage import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -320,6 +321,48 @@ class CombinedShadeHeaderConstraintsTest : SysuiTestCase() { assertThat(changes.largeScreenConstraintsChanges).isNull() } + @Test + fun testRelevantViewsAreNotMatchConstraints() { + val views = mapOf( + R.id.clock to "clock", + R.id.date to "date", + R.id.statusIcons to "icons", + R.id.privacy_container to "privacy", + R.id.carrier_group to "carriers", + R.id.batteryRemainingIcon to "battery", + ) + views.forEach { (id, name) -> + assertWithMessage("$name has 0 height in qqs") + .that(qqsConstraint.getConstraint(id).layout.mHeight).isNotEqualTo(0) + assertWithMessage("$name has 0 width in qqs") + .that(qqsConstraint.getConstraint(id).layout.mWidth).isNotEqualTo(0) + assertWithMessage("$name has 0 height in qs") + .that(qsConstraint.getConstraint(id).layout.mHeight).isNotEqualTo(0) + assertWithMessage("$name has 0 width in qs") + .that(qsConstraint.getConstraint(id).layout.mWidth).isNotEqualTo(0) + } + } + + @Test + fun testCheckViewsDontChangeSizeBetweenAnimationConstraints() { + val views = mapOf( + R.id.clock to "clock", + R.id.date to "date", + R.id.statusIcons to "icons", + R.id.privacy_container to "privacy", + R.id.carrier_group to "carriers", + R.id.batteryRemainingIcon to "battery", + ) + views.forEach { (id, name) -> + assertWithMessage("$name changes height") + .that(qqsConstraint.getConstraint(id).layout.mHeight) + .isEqualTo(qsConstraint.getConstraint(id).layout.mHeight) + assertWithMessage("$name changes width") + .that(qqsConstraint.getConstraint(id).layout.mWidth) + .isEqualTo(qsConstraint.getConstraint(id).layout.mWidth) + } + } + private operator fun ConstraintsChanges.invoke() { qqsConstraintsChanges?.invoke(qqsConstraint) qsConstraintsChanges?.invoke(qsConstraint)