From 8896557ad5b6db17066d86de67de22ed7071d1b4 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Thu, 4 Nov 2021 10:03:06 -0400 Subject: [PATCH] Expansion animations Add expansion animation to the header. Only put layout params that change in the ConstraintSet so they are as small as possible. Layout params that don't change are set in the layout file. Test: manual Bug: 202847414 Change-Id: Ibd61bd02a0266da87eabe3be3d307af74df2c3dd --- .../res/layout/combined_qs_header.xml | 38 +++------ .../res/xml/combined_qs_header_scene.xml | 50 +++++++++++ packages/SystemUI/res/xml/qqs_header.xml | 85 +++++++------------ packages/SystemUI/res/xml/qs_header.xml | 85 ++++++++----------- packages/SystemUI/res/xml/split_header.xml | 78 +++++++---------- .../systemui/qs/QuickStatusBarHeader.java | 8 ++ .../phone/SplitShadeHeaderController.kt | 46 +++++++--- 7 files changed, 201 insertions(+), 189 deletions(-) create mode 100644 packages/SystemUI/res/xml/combined_qs_header_scene.xml diff --git a/packages/SystemUI/res/layout/combined_qs_header.xml b/packages/SystemUI/res/layout/combined_qs_header.xml index f0b59d825417d..1f10e5dfeed83 100644 --- a/packages/SystemUI/res/layout/combined_qs_header.xml +++ b/packages/SystemUI/res/layout/combined_qs_header.xml @@ -14,7 +14,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - + android:theme="@style/Theme.SystemUI.QuickSettings.Header" + app:layoutDescription="@xml/combined_qs_header_scene"> - \ No newline at end of file + \ No newline at end of file diff --git a/packages/SystemUI/res/xml/combined_qs_header_scene.xml b/packages/SystemUI/res/xml/combined_qs_header_scene.xml new file mode 100644 index 0000000000000..d61e4a95bb680 --- /dev/null +++ b/packages/SystemUI/res/xml/combined_qs_header_scene.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/xml/qqs_header.xml b/packages/SystemUI/res/xml/qqs_header.xml index fdf73d53e905e..3d7b549fc54b8 100644 --- a/packages/SystemUI/res/xml/qqs_header.xml +++ b/packages/SystemUI/res/xml/qqs_header.xml @@ -17,66 +17,45 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/qqs_header_constraint" +> + android:id="@+id/clock"> + + + android:id="@+id/date"> + + + android:id="@+id/carrier_group"> + + - - \ No newline at end of file diff --git a/packages/SystemUI/res/xml/qs_header.xml b/packages/SystemUI/res/xml/qs_header.xml index 72e518eab839d..6a0ab866966ce 100644 --- a/packages/SystemUI/res/xml/qs_header.xml +++ b/packages/SystemUI/res/xml/qs_header.xml @@ -17,63 +17,46 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/qs_header_constraint" +> + android:id="@+id/clock"> + + + android:id="@+id/date"> + + + + android:id="@+id/carrier_group"> + + - - - \ No newline at end of file diff --git a/packages/SystemUI/res/xml/split_header.xml b/packages/SystemUI/res/xml/split_header.xml index a3ee1e2fae645..44d42a05cd46e 100644 --- a/packages/SystemUI/res/xml/split_header.xml +++ b/packages/SystemUI/res/xml/split_header.xml @@ -17,61 +17,41 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/split_header_constraint"> + android:id="@+id/clock"> + + + android:id="@+id/date"> + + + android:id="@+id/carrier_group"> + + - - - \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index fbfba1b6d0d12..bddb6935d12b3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -309,6 +309,10 @@ public class QuickStatusBarHeader extends FrameLayout { } private void updateAnimators() { + if (mUseCombinedQSHeader) { + mTranslationAnimator = null; + return; + } updateAlphaAnimator(); int offset = mTopViewMeasureHeight; @@ -321,6 +325,10 @@ public class QuickStatusBarHeader extends FrameLayout { } private void updateAlphaAnimator() { + if (mUseCombinedQSHeader) { + mAlphaAnimator = null; + return; + } TouchAnimator.Builder builder = new TouchAnimator.Builder() .addFloat(mSecurityHeaderView, "alpha", 0, 1) // These views appear on expanding down diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt index bac4234389aa5..c814622ff0749 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt @@ -17,8 +17,7 @@ package com.android.systemui.statusbar.phone import android.view.View -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.constraintlayout.widget.ConstraintSet +import androidx.constraintlayout.motion.widget.MotionLayout import com.android.systemui.R import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.battery.BatteryMeterView @@ -39,6 +38,11 @@ class SplitShadeHeaderController @Inject constructor( batteryMeterViewController: BatteryMeterViewController ) { + companion object { + private val HEADER_TRANSITION_ID = R.id.header_transition + private val SPLIT_HEADER_TRANSITION_ID = R.id.split_header_transition + } + private val combinedHeaders = featureFlags.useCombinedQSHeaders() // TODO(b/194178072) Handle RSSI hiding when multi carrier private val iconManager: StatusBarIconController.IconManager @@ -59,6 +63,7 @@ class SplitShadeHeaderController @Inject constructor( } field = value updateVisibility() + updatePosition() } var splitShadeMode = false @@ -68,6 +73,7 @@ class SplitShadeHeaderController @Inject constructor( } field = value updateVisibility() + updateConstraints() } var shadeExpandedFraction = -1f @@ -83,13 +89,22 @@ class SplitShadeHeaderController @Inject constructor( if (visible && field != value) { field = value updateVisibility() + updatePosition() } } - private val constraintSplit = ConstraintSet() - .apply { load(statusBar.context, R.xml.split_header) } - private val constraintQQS = ConstraintSet().apply { load(statusBar.context, R.xml.qqs_header) } - private val constraintQS = ConstraintSet().apply { load(statusBar.context, R.xml.qs_header) } + init { + if (statusBar is MotionLayout) { + val context = statusBar.context + val resources = statusBar.resources + statusBar.getConstraintSet(R.id.qqs_header_constraint) + .load(context, resources.getXml(R.xml.qqs_header)) + statusBar.getConstraintSet(R.id.qs_header_constraint) + .load(context, resources.getXml(R.xml.qs_header)) + statusBar.getConstraintSet(R.id.split_header_constraint) + .load(context, resources.getXml(R.xml.split_header)) + } + } init { batteryMeterViewController.init() @@ -104,6 +119,8 @@ class SplitShadeHeaderController @Inject constructor( qsCarrierGroupController = qsCarrierGroupControllerBuilder .setQSCarrierGroup(statusBar.findViewById(R.id.carrier_group)) .build() + updateVisibility() + updateConstraints() } private fun updateVisibility() { @@ -118,20 +135,25 @@ class SplitShadeHeaderController @Inject constructor( statusBar.visibility = visibility visible = visibility == View.VISIBLE } - updateConstraints() } private fun updateConstraints() { if (!combinedHeaders) { return } - statusBar as ConstraintLayout + statusBar as MotionLayout if (splitShadeMode) { - constraintSplit.applyTo(statusBar) - } else if (qsExpandedFraction == 1f) { - constraintQS.applyTo(statusBar) + statusBar.setTransition(SPLIT_HEADER_TRANSITION_ID) } else { - constraintQQS.applyTo(statusBar) + statusBar.setTransition(HEADER_TRANSITION_ID) + statusBar.transitionToStart() + updatePosition() + } + } + + private fun updatePosition() { + if (statusBar is MotionLayout && !splitShadeMode && visible) { + statusBar.setProgress(qsExpandedFraction) } }