From b40a702171deae260593144d3a13d03424d330eb Mon Sep 17 00:00:00 2001 From: Caitlin Cassidy Date: Fri, 1 Oct 2021 02:20:49 +0000 Subject: [PATCH] [Status Bar Refactor] Move PanelBar#updateScrimFraction into ScrimController. No need for PanelBar to calculate scrim values and notify ScrimController of them, when ScrimController can just calculate them directly. Test: Manually verifying scrim fraction is still updated correctly via logs Bug: 200063118 Change-Id: I37df95015002825adf7217c4144950e85485af84 --- .../NotificationPanelViewController.java | 2 +- .../systemui/statusbar/phone/PanelBar.java | 5 -- .../statusbar/phone/PhoneStatusBarView.java | 24 --------- .../statusbar/phone/ScrimController.java | 51 +++++++++++++++---- .../systemui/statusbar/phone/StatusBar.java | 16 ++++-- .../statusbar/phone/ScrimControllerTest.java | 44 ++++++++-------- 6 files changed, 76 insertions(+), 66 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 2f19d064d830..ae4b71e10295 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -3488,9 +3488,9 @@ public class NotificationPanelViewController extends PanelViewController { * cases, such as if there's a heads-up notification. */ public void setPanelScrimMinFraction(float minFraction) { - mBar.onPanelMinFractionChanged(minFraction); mMinFraction = minFraction; mDepthController.setPanelPullDownMinFraction(mMinFraction); + mScrimController.setPanelScrimMinFraction(mMinFraction); } public void clearNotificationEffects() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java index 1f1090d7168b..310fe73df1ea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -145,11 +145,6 @@ public abstract class PanelBar extends FrameLayout { return mPanel == null || mPanel.getView().dispatchTouchEvent(event); } - /** - * Percentage of panel expansion offset, caused by pulling down on a heads-up. - */ - abstract void onPanelMinFractionChanged(float minFraction); - /** * @param frac the fraction from the expansion in [0, 1] * @param expanded whether the panel is currently expanded; this is independent from the diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 1cca4777da0a..150d9c8fcce6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -18,8 +18,6 @@ package com.android.systemui.statusbar.phone; import static com.android.systemui.ScreenDecorations.DisplayCutoutView.boundsFromDirection; -import static java.lang.Float.isNaN; - import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; @@ -57,7 +55,6 @@ public class PhoneStatusBarView extends PanelBar { StatusBar mBar; private ScrimController mScrimController; - private float mMinFraction; private Runnable mHideExpandedRunnable = new Runnable() { @Override public void run() { @@ -267,21 +264,9 @@ public class PhoneStatusBarView extends PanelBar { return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event); } - @Override - public void onPanelMinFractionChanged(float minFraction) { - if (isNaN(minFraction)) { - throw new IllegalArgumentException("minFraction cannot be NaN"); - } - if (mMinFraction != minFraction) { - mMinFraction = minFraction; - updateScrimFraction(); - } - } - @Override public void panelExpansionChanged(float frac, boolean expanded) { super.panelExpansionChanged(frac, expanded); - updateScrimFraction(); if ((frac == 0 || frac == 1)) { if (mPanelExpansionStateChangedListener != null) { mPanelExpansionStateChangedListener.onPanelExpansionStateChanged(); @@ -302,15 +287,6 @@ public class PhoneStatusBarView extends PanelBar { mPanelEnabledProvider = panelEnabledProvider; } - private void updateScrimFraction() { - float scrimFraction = mPanelFraction; - if (mMinFraction < 1.0f) { - scrimFraction = Math.max((mPanelFraction - mMinFraction) / (1.0f - mMinFraction), - 0); - } - mScrimController.setPanelExpansion(scrimFraction); - } - public void updateResources() { mCutoutSideNudge = getResources().getDimensionPixelSize( R.dimen.display_cutout_margin_consumption); 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 a564637aa510..371ec7a6ea96 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -34,6 +34,7 @@ import android.view.ViewTreeObserver; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; +import androidx.annotation.FloatRange; import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; @@ -183,8 +184,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private float mScrimBehindAlphaKeyguard = KEYGUARD_SCRIM_ALPHA; private final float mDefaultScrimAlpha; - // Assuming the shade is expanded during initialization - private float mPanelExpansion = 1f; + private float mRawPanelExpansionFraction; + private float mPanelScrimMinFraction; + // Calculated based on mRawPanelExpansionFraction and mPanelScrimMinFraction + private float mPanelExpansionFraction = 1f; // Assume shade is expanded during initialization private float mQsExpansion; private boolean mQsBottomVisible; @@ -483,14 +486,39 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump * * The expansion fraction is tied to the scrim opacity. * - * @param fraction From 0 to 1 where 0 means collapsed and 1 expanded. + * See {@link PanelBar#panelExpansionChanged}. + * + * @param rawPanelExpansionFraction From 0 to 1 where 0 means collapsed and 1 expanded. */ - public void setPanelExpansion(float fraction) { - if (isNaN(fraction)) { - throw new IllegalArgumentException("Fraction should not be NaN"); + public void setRawPanelExpansionFraction( + @FloatRange(from = 0.0, to = 1.0) float rawPanelExpansionFraction) { + if (isNaN(rawPanelExpansionFraction)) { + throw new IllegalArgumentException("rawPanelExpansionFraction should not be NaN"); } - if (mPanelExpansion != fraction) { - mPanelExpansion = fraction; + mRawPanelExpansionFraction = rawPanelExpansionFraction; + calculateAndUpdatePanelExpansion(); + } + + /** See {@link NotificationPanelViewController#setPanelScrimMinFraction(float)}. */ + public void setPanelScrimMinFraction(float minFraction) { + if (isNaN(minFraction)) { + throw new IllegalArgumentException("minFraction should not be NaN"); + } + mPanelScrimMinFraction = minFraction; + calculateAndUpdatePanelExpansion(); + } + + private void calculateAndUpdatePanelExpansion() { + float panelExpansionFraction = mRawPanelExpansionFraction; + if (mPanelScrimMinFraction < 1.0f) { + panelExpansionFraction = Math.max( + (mRawPanelExpansionFraction - mPanelScrimMinFraction) + / (1.0f - mPanelScrimMinFraction), + 0); + } + + if (mPanelExpansionFraction != panelExpansionFraction) { + mPanelExpansionFraction = panelExpansionFraction; boolean relevantState = (mState == ScrimState.UNLOCKED || mState == ScrimState.KEYGUARD @@ -892,7 +920,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } private float getInterpolatedFraction() { - return Interpolators.getNotificationScrimAlpha(mPanelExpansion, false /* notification */); + return Interpolators.getNotificationScrimAlpha( + mPanelExpansionFraction, false /* notification */); } private void setScrimAlpha(ScrimView scrim, float alpha) { @@ -1228,8 +1257,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump pw.println(mTracking); pw.print(" mDefaultScrimAlpha="); pw.println(mDefaultScrimAlpha); - pw.print(" mExpansionFraction="); - pw.println(mPanelExpansion); + pw.print(" mPanelExpansionFraction="); + pw.println(mPanelExpansionFraction); pw.print(" mExpansionAffectsAlpha="); pw.println(mExpansionAffectsAlpha); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index e3b222c88740..6d02e4010ecc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -898,6 +898,8 @@ public class StatusBar extends SystemUI implements lockscreenShadeTransitionController.setStatusbar(this); mExpansionChangedListeners = new ArrayList<>(); + addExpansionChangedListener( + (expansion, expanded) -> mScrimController.setRawPanelExpansionFraction(expansion)); mBubbleExpandListener = (isExpanding, key) -> mContext.getMainExecutor().execute(() -> { @@ -1400,6 +1402,12 @@ public class StatusBar extends SystemUI implements mDeviceProvisionedController.addCallback(mUserSetupObserver); mUserSetupObserver.onUserSetupChanged(); + for (ExpansionChangedListener listener : mExpansionChangedListeners) { + // The initial expansion amount comes from mNotificationPanelViewController, so we + // should send the amount once we've fully set up that controller. + sendInitialExpansionAmount(listener); + } + // disable profiling bars, since they overlap and clutter the output on app windows ThreadedRenderer.overrideProperty("disableProfileBars", "true"); @@ -4227,9 +4235,11 @@ public class StatusBar extends SystemUI implements } private void sendInitialExpansionAmount(ExpansionChangedListener expansionChangedListener) { - expansionChangedListener.onExpansionChanged( - mNotificationPanelViewController.getExpandedFraction(), - mNotificationPanelViewController.isExpanded()); + if (mNotificationPanelViewController != null) { + expansionChangedListener.onExpansionChanged( + mNotificationPanelViewController.getExpandedFraction(), + mNotificationPanelViewController.isExpanded()); + } } public void removeExpansionChangedListener(@NonNull ExpansionChangedListener listener) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 5ebe900b52d4..705112afa93f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -623,7 +623,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void transitionToUnlocked() { - mScrimController.setPanelExpansion(0f); + mScrimController.setRawPanelExpansionFraction(0f); mScrimController.transitionTo(ScrimState.UNLOCKED); finishAnimationsImmediately(); assertScrimAlpha(Map.of( @@ -638,7 +638,7 @@ public class ScrimControllerTest extends SysuiTestCase { )); // Back scrim should be visible after start dragging - mScrimController.setPanelExpansion(0.3f); + mScrimController.setRawPanelExpansionFraction(0.3f); assertScrimAlpha(Map.of( mScrimInFront, TRANSPARENT, mNotificationsScrim, SEMI_TRANSPARENT, @@ -663,20 +663,20 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void panelExpansion() { - mScrimController.setPanelExpansion(0f); - mScrimController.setPanelExpansion(0.5f); + mScrimController.setRawPanelExpansionFraction(0f); + mScrimController.setRawPanelExpansionFraction(0.5f); mScrimController.transitionTo(ScrimState.UNLOCKED); finishAnimationsImmediately(); reset(mScrimBehind); - mScrimController.setPanelExpansion(0f); - mScrimController.setPanelExpansion(1.0f); + mScrimController.setRawPanelExpansionFraction(0f); + mScrimController.setRawPanelExpansionFraction(1.0f); finishAnimationsImmediately(); assertEquals("Scrim alpha should change after setPanelExpansion", mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f); - mScrimController.setPanelExpansion(0f); + mScrimController.setRawPanelExpansionFraction(0f); finishAnimationsImmediately(); assertEquals("Scrim alpha should change after setPanelExpansion", @@ -723,21 +723,21 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void panelExpansionAffectsAlpha() { - mScrimController.setPanelExpansion(0f); - mScrimController.setPanelExpansion(0.5f); + mScrimController.setRawPanelExpansionFraction(0f); + mScrimController.setRawPanelExpansionFraction(0.5f); mScrimController.transitionTo(ScrimState.UNLOCKED); finishAnimationsImmediately(); final float scrimAlpha = mScrimBehind.getViewAlpha(); reset(mScrimBehind); mScrimController.setExpansionAffectsAlpha(false); - mScrimController.setPanelExpansion(0.8f); + mScrimController.setRawPanelExpansionFraction(0.8f); verifyZeroInteractions(mScrimBehind); assertEquals("Scrim opacity shouldn't change when setExpansionAffectsAlpha " + "is false", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f); mScrimController.setExpansionAffectsAlpha(true); - mScrimController.setPanelExpansion(0.1f); + mScrimController.setRawPanelExpansionFraction(0.1f); finishAnimationsImmediately(); Assert.assertNotEquals("Scrim opacity should change when setExpansionAffectsAlpha " + "is true", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f); @@ -747,7 +747,7 @@ public class ScrimControllerTest extends SysuiTestCase { public void transitionToUnlockedFromOff() { // Simulate unlock with fingerprint without AOD mScrimController.transitionTo(ScrimState.OFF); - mScrimController.setPanelExpansion(0f); + mScrimController.setRawPanelExpansionFraction(0f); finishAnimationsImmediately(); mScrimController.transitionTo(ScrimState.UNLOCKED); @@ -769,7 +769,7 @@ public class ScrimControllerTest extends SysuiTestCase { public void transitionToUnlockedFromAod() { // Simulate unlock with fingerprint mScrimController.transitionTo(ScrimState.AOD); - mScrimController.setPanelExpansion(0f); + mScrimController.setRawPanelExpansionFraction(0f); finishAnimationsImmediately(); mScrimController.transitionTo(ScrimState.UNLOCKED); @@ -948,7 +948,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void testConservesExpansionOpacityAfterTransition() { mScrimController.transitionTo(ScrimState.UNLOCKED); - mScrimController.setPanelExpansion(0.5f); + mScrimController.setRawPanelExpansionFraction(0.5f); finishAnimationsImmediately(); final float expandedAlpha = mScrimBehind.getViewAlpha(); @@ -1075,7 +1075,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void testScrimsOpaque_whenShadeFullyExpanded() { mScrimController.transitionTo(ScrimState.UNLOCKED); - mScrimController.setPanelExpansion(1); + mScrimController.setRawPanelExpansionFraction(1); // notifications scrim alpha change require calling setQsPosition mScrimController.setQsPosition(0, 300); finishAnimationsImmediately(); @@ -1089,7 +1089,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void testScrimsVisible_whenShadeVisible() { mScrimController.transitionTo(ScrimState.UNLOCKED); - mScrimController.setPanelExpansion(0.3f); + mScrimController.setRawPanelExpansionFraction(0.3f); // notifications scrim alpha change require calling setQsPosition mScrimController.setQsPosition(0, 300); finishAnimationsImmediately(); @@ -1124,7 +1124,7 @@ public class ScrimControllerTest extends SysuiTestCase { public void testScrimsVisible_whenShadeVisible_clippingQs() { mScrimController.setClipsQsScrim(true); mScrimController.transitionTo(ScrimState.UNLOCKED); - mScrimController.setPanelExpansion(0.3f); + mScrimController.setRawPanelExpansionFraction(0.3f); // notifications scrim alpha change require calling setQsPosition mScrimController.setQsPosition(0.5f, 300); finishAnimationsImmediately(); @@ -1150,7 +1150,7 @@ public class ScrimControllerTest extends SysuiTestCase { public void testNotificationScrimTransparent_whenOnLockscreen() { mScrimController.transitionTo(ScrimState.KEYGUARD); // even if shade is not pulled down, panel has expansion of 1 on the lockscreen - mScrimController.setPanelExpansion(1); + mScrimController.setRawPanelExpansionFraction(1); mScrimController.setQsPosition(0f, /*qs panel bottom*/ 0); assertScrimAlpha(Map.of( @@ -1160,7 +1160,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void testNotificationScrimVisible_afterOpeningShadeFromLockscreen() { - mScrimController.setPanelExpansion(1); + mScrimController.setRawPanelExpansionFraction(1); mScrimController.transitionTo(ScrimState.SHADE_LOCKED); finishAnimationsImmediately(); @@ -1203,11 +1203,11 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void testNotificationTransparency_followsTransitionToFullShade() { mScrimController.transitionTo(ScrimState.SHADE_LOCKED); - mScrimController.setPanelExpansion(1.0f); + mScrimController.setRawPanelExpansionFraction(1.0f); finishAnimationsImmediately(); float shadeLockedAlpha = mNotificationsScrim.getViewAlpha(); mScrimController.transitionTo(ScrimState.KEYGUARD); - mScrimController.setPanelExpansion(1.0f); + mScrimController.setRawPanelExpansionFraction(1.0f); finishAnimationsImmediately(); float keyguardAlpha = mNotificationsScrim.getViewAlpha(); @@ -1227,7 +1227,7 @@ public class ScrimControllerTest extends SysuiTestCase { } private void assertAlphaAfterExpansion(ScrimView scrim, float expectedAlpha, float expansion) { - mScrimController.setPanelExpansion(expansion); + mScrimController.setRawPanelExpansionFraction(expansion); finishAnimationsImmediately(); // alpha is not changing linearly thus 0.2 of leeway when asserting assertEquals(expectedAlpha, mNotificationsScrim.getViewAlpha(), 0.2);