From f5942d8bd29a524604dd566df02ee3884f25e9e4 Mon Sep 17 00:00:00 2001 From: Aaron Liu Date: Tue, 15 Mar 2022 15:44:06 +0000 Subject: [PATCH] Bouncer: Adjust tracking animations. Fade backscrim in Fade bouncer in Fade clock out Added a separate file to calculate all of the scaling of the fractions. Bug: 222545469 Test: Manual Change-Id: Ia1186dce1b0eb393655749567c4eafa8a3e07d31 --- .../SystemUI/res-keyguard/values/dimens.xml | 3 + .../BouncerPanelExpansionCalculator.kt | 49 +++++++++++++ .../keyguard/KeyguardHostViewController.java | 12 ++-- .../phone/KeyguardClockPositionAlgorithm.java | 4 +- .../statusbar/phone/ScrimController.java | 11 ++- .../BouncerPanelExpansionCalculatorTest.kt | 71 +++++++++++++++++++ 6 files changed, 144 insertions(+), 6 deletions(-) create mode 100644 packages/SystemUI/src/com/android/keyguard/BouncerPanelExpansionCalculator.kt create mode 100644 packages/SystemUI/tests/src/com/android/keyguard/BouncerPanelExpansionCalculatorTest.kt diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml index 8d205c14144d2..9a6f5edae5ec3 100644 --- a/packages/SystemUI/res-keyguard/values/dimens.xml +++ b/packages/SystemUI/res-keyguard/values/dimens.xml @@ -129,4 +129,7 @@ 8dp 14sp 12dp + + + 80dp diff --git a/packages/SystemUI/src/com/android/keyguard/BouncerPanelExpansionCalculator.kt b/packages/SystemUI/src/com/android/keyguard/BouncerPanelExpansionCalculator.kt new file mode 100644 index 0000000000000..497d81f6bdc5c --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/BouncerPanelExpansionCalculator.kt @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.keyguard + +import android.util.MathUtils + +object BouncerPanelExpansionCalculator { + /** + * Scale the alpha/position of the host view. + */ + @JvmStatic + fun getHostViewScaledExpansion(fraction: Float): Float { + return when { + fraction >= 0.9f -> 1f + fraction < 0.6 -> 0f + else -> (fraction - 0.6f) / 0.3f + } + } + + /** + * Scale the alpha/tint of the back scrim. + */ + @JvmStatic + fun getBackScrimScaledExpansion(fraction: Float): Float { + return MathUtils.constrain((fraction - 0.9f) / 0.1f, 0f, 1f) + } + + /** + * This will scale the alpha/position of the clock. + */ + @JvmStatic + fun getKeyguardClockScaledExpansion(fraction: Float): Float { + return MathUtils.constrain((fraction - 0.7f) / 0.3f, 0f, 1f) + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java index b6910961bcb45..8c3e066849b9a 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java @@ -37,7 +37,6 @@ import com.android.keyguard.dagger.KeyguardBouncerScope; import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.util.ViewController; import java.io.File; @@ -64,6 +63,7 @@ public class KeyguardHostViewController extends ViewController private ActivityStarter.OnDismissAction mDismissAction; private Runnable mCancelAction; + private int mTranslationY; private final KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { @@ -322,12 +322,14 @@ public class KeyguardHostViewController extends ViewController /** * Fades and translates in/out the security screen. + * Fades in as expansion approaches 0. + * Animation duration is between 0.33f and 0.67f of panel expansion fraction. * @param fraction amount of the screen that should show. */ public void setExpansion(float fraction) { - float alpha = MathUtils.map(KeyguardBouncer.ALPHA_EXPANSION_THRESHOLD, 1, 1, 0, fraction); - mView.setAlpha(MathUtils.constrain(alpha, 0f, 1f)); - mView.setTranslationY(fraction * mView.getHeight()); + float scaledFraction = BouncerPanelExpansionCalculator.getHostViewScaledExpansion(fraction); + mView.setAlpha(MathUtils.constrain(1 - scaledFraction, 0f, 1f)); + mView.setTranslationY(scaledFraction * mTranslationY); } /** @@ -490,6 +492,8 @@ public class KeyguardHostViewController extends ViewController gravity = resources.getInteger(R.integer.keyguard_host_view_gravity); } + mTranslationY = resources + .getDimensionPixelSize(R.dimen.keyguard_host_view_translation_y); // Android SysUI uses a FrameLayout as the top-level, but Auto uses RelativeLayout. // We're just changing the gravity here though (which can't be applied to RelativeLayout), // so only attempt the update if mView is inside a FrameLayout. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index 732e5f0343a22..602d075b167d0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -23,6 +23,7 @@ import static com.android.systemui.statusbar.notification.NotificationUtils.inte import android.content.res.Resources; import android.util.MathUtils; +import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.keyguard.KeyguardStatusView; import com.android.systemui.R; import com.android.systemui.animation.Interpolators; @@ -169,7 +170,8 @@ public class KeyguardClockPositionAlgorithm { boolean isSplitShade, float udfpsTop, float clockBottom, boolean isClockTopAligned) { mMinTopMargin = keyguardStatusBarHeaderHeight + Math.max(mContainerTopPadding, userSwitchHeight); - mPanelExpansion = panelExpansion; + mPanelExpansion = BouncerPanelExpansionCalculator + .getKeyguardClockScaledExpansion(panelExpansion); mKeyguardStatusHeight = keyguardStatusHeight + mStatusViewBottomMargin; mUserSwitchHeight = userSwitchHeight; mUserSwitchPreferredY = userSwitchPreferredY; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 419661b766d69..1fc3c3c050ce8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -41,6 +41,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.graphics.ColorUtils; import com.android.internal.util.function.TriConsumer; +import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.settingslib.Utils; @@ -792,7 +793,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private Pair calculateBackStateForState(ScrimState state) { // Either darken of make the scrim transparent when you // pull down the shade - float interpolatedFract = getInterpolatedFraction(); + float interpolatedFract; + + if (state == ScrimState.KEYGUARD) { + interpolatedFract = BouncerPanelExpansionCalculator + .getBackScrimScaledExpansion(mPanelExpansionFraction); + } else { + interpolatedFract = getInterpolatedFraction(); + } + float stateBehind = mClipsQsScrim ? state.getNotifAlpha() : state.getBehindAlpha(); float behindAlpha; int behindTint; diff --git a/packages/SystemUI/tests/src/com/android/keyguard/BouncerPanelExpansionCalculatorTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/BouncerPanelExpansionCalculatorTest.kt new file mode 100644 index 0000000000000..6266bf146f5b3 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/BouncerPanelExpansionCalculatorTest.kt @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.keyguard + +import android.test.suitebuilder.annotation.SmallTest +import android.testing.AndroidTestingRunner +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class BouncerPanelExpansionCalculatorTest : SysuiTestCase() { + @Test + fun testGetHostViewScaledExpansion() { + assertThat(BouncerPanelExpansionCalculator.getHostViewScaledExpansion(1f)) + .isEqualTo(1f) + assertThat(BouncerPanelExpansionCalculator.getHostViewScaledExpansion(0.9f)) + .isEqualTo(1f) + assertThat(BouncerPanelExpansionCalculator.getHostViewScaledExpansion(0.59f)) + .isEqualTo(0f) + assertThat(BouncerPanelExpansionCalculator.getHostViewScaledExpansion(0f)) + .isEqualTo(0f) + assertEquals(BouncerPanelExpansionCalculator + .getHostViewScaledExpansion(0.8f), 2f / 3f, 0.01f) + } + + @Test + fun testGetBackScrimScaledExpansion() { + assertThat(BouncerPanelExpansionCalculator.getBackScrimScaledExpansion(1f)) + .isEqualTo(1f) + assertEquals(BouncerPanelExpansionCalculator + .getBackScrimScaledExpansion(0.95f), 1f / 2f, 0.01f) + assertThat(BouncerPanelExpansionCalculator.getBackScrimScaledExpansion(0.9f)) + .isEqualTo(0f) + assertThat(BouncerPanelExpansionCalculator.getBackScrimScaledExpansion(0.5f)) + .isEqualTo(0f) + assertThat(BouncerPanelExpansionCalculator.getBackScrimScaledExpansion(0f)) + .isEqualTo(0f) + } + + @Test + fun testGetKeyguardClockScaledExpansion() { + assertThat(BouncerPanelExpansionCalculator.getKeyguardClockScaledExpansion(1f)) + .isEqualTo(1f) + assertEquals(BouncerPanelExpansionCalculator + .getKeyguardClockScaledExpansion(0.8f), 1f / 3f, 0.01f) + assertThat(BouncerPanelExpansionCalculator.getKeyguardClockScaledExpansion(0.7f)) + .isEqualTo(0f) + assertThat(BouncerPanelExpansionCalculator.getBackScrimScaledExpansion(0.5f)) + .isEqualTo(0f) + assertThat(BouncerPanelExpansionCalculator.getBackScrimScaledExpansion(0f)) + .isEqualTo(0f) + } +}