From 8bec3cf08e5a2b2a30d82efdaf8768a0521ffad0 Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Wed, 24 Mar 2021 12:01:50 +0000 Subject: [PATCH] Dual tone shade implementation Splitting behindScrim into two separate scrims: qs and notificatins. QsScrim role is solely to show dark background behind quick settings. NotificationsScrim serves as past behindScrim, that is takes fullscreen when on keyguard and draws notifications background. Bottom of the quick settings panel determines where qsScrim ends and notificationsScrim begins. Fixes: 183953523 Test: atest ScrimControllerTest Change-Id: I86897f23072281745cef23ef8eed51e06b21818b --- .../drawable/ScrimDrawable.java | 59 +++++++++- .../res/layout/super_notification_shade.xml | 8 ++ packages/SystemUI/res/values/dimens.xml | 1 + .../android/systemui/statusbar/ScrimView.java | 30 ++++- .../NotificationPanelViewController.java | 14 ++- .../statusbar/phone/ScrimController.java | 109 ++++++++++++------ .../systemui/statusbar/phone/ScrimState.java | 9 +- .../systemui/statusbar/phone/StatusBar.java | 4 +- .../statusbar/phone/ScrimControllerTest.java | 24 ++-- 9 files changed, 206 insertions(+), 52 deletions(-) diff --git a/core/java/com/android/internal/colorextraction/drawable/ScrimDrawable.java b/core/java/com/android/internal/colorextraction/drawable/ScrimDrawable.java index 7bd7acfab9f9e..1fc126eb161d3 100644 --- a/core/java/com/android/internal/colorextraction/drawable/ScrimDrawable.java +++ b/core/java/com/android/internal/colorextraction/drawable/ScrimDrawable.java @@ -24,7 +24,9 @@ import android.annotation.Nullable; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; +import android.graphics.Path; import android.graphics.PixelFormat; +import android.graphics.Rect; import android.graphics.Xfermode; import android.graphics.drawable.Drawable; import android.view.animation.DecelerateInterpolator; @@ -44,6 +46,9 @@ public class ScrimDrawable extends Drawable { private int mMainColor; private ValueAnimator mColorAnimation; private int mMainColorTo; + private float mCornerRadius; + private Rect mBounds; + private ConcaveInfo mConcaveInfo; public ScrimDrawable() { mPaint = new Paint(); @@ -127,15 +132,67 @@ public class ScrimDrawable extends Drawable { return PixelFormat.TRANSLUCENT; } + /** + * Enable drawable shape to have rounded corners with provided radius + */ + public void setRoundedCorners(float radius) { + mCornerRadius = radius; + } + + /** + * Make bottom edge concave with provided corner radius + */ + public void setBottomEdgeConcave(float radius) { + // only rounding top corners for clip out path + float[] cornerRadii = new float[]{radius, radius, radius, radius, 0, 0, 0, 0}; + mConcaveInfo = new ConcaveInfo(radius, cornerRadii); + } + @Override public void draw(@NonNull Canvas canvas) { mPaint.setColor(mMainColor); mPaint.setAlpha(mAlpha); - canvas.drawRect(getBounds(), mPaint); + if (mConcaveInfo != null) { + drawConcave(canvas); + } + canvas.drawRoundRect(getBounds().left, getBounds().top, getBounds().right, + getBounds().bottom + mCornerRadius, + /* x radius*/ mCornerRadius, /* y radius*/ mCornerRadius, mPaint); + } + + private void drawConcave(Canvas canvas) { + // checking if width of clip out path needs to change + if (mBounds == null + || getBounds().right != mBounds.right + || getBounds().left != mBounds.left) { + mConcaveInfo.mPath.reset(); + float left = getBounds().left; + float right = getBounds().right; + float top = 0f; + float bottom = mConcaveInfo.mPathOverlap; + mConcaveInfo.mPath.addRoundRect(left, top, right, bottom, + mConcaveInfo.mCornerRadii, Path.Direction.CW); + } + mBounds = getBounds(); + int translation = (int) (mBounds.bottom - mConcaveInfo.mPathOverlap); + canvas.translate(0, translation); + canvas.clipOutPath(mConcaveInfo.mPath); + canvas.translate(0, -translation); } @VisibleForTesting public int getMainColor() { return mMainColor; } + + private static class ConcaveInfo { + private final float mPathOverlap; + private final float[] mCornerRadii; + private final Path mPath = new Path(); + + ConcaveInfo(float pathOverlap, float[] cornerRadii) { + mPathOverlap = pathOverlap; + mCornerRadii = cornerRadii; + } + } } diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml index 1630244468e58..731030e6e9499 100644 --- a/packages/SystemUI/res/layout/super_notification_shade.xml +++ b/packages/SystemUI/res/layout/super_notification_shade.xml @@ -51,6 +51,14 @@ sysui:ignoreRightInset="true" /> + + 1 0.62 + 32dp 110dp diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java index 6023b7f6f4f7e..c811fdd2fe2ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java @@ -26,17 +26,18 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; -import android.os.Handler; import android.os.Looper; import android.util.AttributeSet; import android.view.View; +import androidx.annotation.DimenRes; import androidx.core.graphics.ColorUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.colorextraction.drawable.ScrimDrawable; +import com.android.systemui.R; import java.util.concurrent.Executor; @@ -47,6 +48,10 @@ import java.util.concurrent.Executor; * need to be careful to synchronize when necessary. */ public class ScrimView extends View { + + @DimenRes + private static final int CORNER_RADIUS = R.dimen.notification_scrim_corner_radius; + private final Object mColorLock = new Object(); @GuardedBy("mColorLock") @@ -260,4 +265,27 @@ public class ScrimView extends View { mExecutor.execute(r); } } + + /** + * Make bottom edge concave so overlap between layers is not visible for alphas between 0 and 1 + * @return height of concavity + */ + public float enableBottomEdgeConcave() { + if (mDrawable instanceof ScrimDrawable) { + float radius = getResources().getDimensionPixelSize(CORNER_RADIUS); + ((ScrimDrawable) mDrawable).setBottomEdgeConcave(radius); + return radius; + } + return 0; + } + + /** + * Enable view to have rounded corners with radius of {@link #CORNER_RADIUS} + */ + public void enableRoundedCorners() { + if (mDrawable instanceof ScrimDrawable) { + int radius = getResources().getDimensionPixelSize(CORNER_RADIUS); + ((ScrimDrawable) mDrawable).setRoundedCorners(radius); + } + } } 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 d3da0bce0a155..1b9355fcb2c47 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1991,10 +1991,22 @@ public class NotificationPanelViewController extends PanelViewController { float qsExpansionFraction = getQsExpansionFraction(); mQs.setQsExpansion(qsExpansionFraction, getHeaderTranslation()); mMediaHierarchyManager.setQsExpansion(qsExpansionFraction); - mScrimController.setQsExpansion(qsExpansionFraction); + mScrimController.setQsPosition(qsExpansionFraction, + calculateQsBottomPosition(qsExpansionFraction)); mNotificationStackScrollLayoutController.setQsExpansionFraction(qsExpansionFraction); } + private int calculateQsBottomPosition(float qsExpansionFraction) { + int qsBottomY = (int) getHeaderTranslation() + mQs.getQsMinExpansionHeight(); + if (qsExpansionFraction != 0.0) { + qsBottomY = (int) MathUtils.lerp( + qsBottomY, mQs.getDesiredHeight(), qsExpansionFraction); + } + // to account for shade overshooting animation, see setSectionPadding method + if (mSectionPadding > 0) qsBottomY += mSectionPadding; + return qsBottomY; + } + private String determineAccessibilityPaneTitle() { if (mQs != null && mQs.isCustomizing()) { return mResources.getString(R.string.accessibility_desc_quick_settings_edit); 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 270a0f8c5d5ec..681f450428ee3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -24,7 +24,6 @@ import android.animation.ValueAnimator; import android.annotation.IntDef; import android.app.AlarmManager; import android.graphics.Color; -import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Trace; import android.util.Log; @@ -49,7 +48,6 @@ import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dock.DockManager; -import com.android.systemui.statusbar.BlurUtils; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.notification.stack.ViewState; @@ -142,6 +140,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private ScrimState mState = ScrimState.UNINITIALIZED; private ScrimView mScrimInFront; + private ScrimView mNotificationsScrim; private ScrimView mScrimBehind; @Nullable private ScrimView mScrimForBubble; @@ -156,7 +155,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private final KeyguardVisibilityCallback mKeyguardVisibilityCallback; private final Handler mHandler; private final Executor mMainExecutor; - private final BlurUtils mBlurUtils; private GradientColors mColors; private boolean mNeedsDrawableColorUpdate; @@ -180,6 +178,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private float mInFrontAlpha = NOT_INITIALIZED; private float mBehindAlpha = NOT_INITIALIZED; + private float mNotificationsAlpha = NOT_INITIALIZED; private float mBubbleAlpha = NOT_INITIALIZED; private int mInFrontTint; @@ -209,12 +208,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump AlarmManager alarmManager, KeyguardStateController keyguardStateController, DelayedWakeLock.Builder delayedWakeLockBuilder, Handler handler, KeyguardUpdateMonitor keyguardUpdateMonitor, DockManager dockManager, - BlurUtils blurUtils, ConfigurationController configurationController, + ConfigurationController configurationController, FeatureFlags featureFlags, @Main Executor mainExecutor) { mScrimStateListener = lightBarController::setScrimState; mDefaultScrimAlpha = featureFlags.isShadeOpaque() ? BUSY_SCRIM_ALPHA : GAR_SCRIM_ALPHA; ScrimState.BUBBLE_EXPANDED.setBubbleAlpha(BUBBLE_SCRIM_ALPHA); - mBlurUtils = blurUtils; mKeyguardStateController = keyguardStateController; mDarkenWhileDragging = !mKeyguardStateController.canDismissLockScreen(); @@ -259,13 +257,16 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump /** * Attach the controller to the supplied views. */ - public void attachViews( - ScrimView scrimBehind, ScrimView scrimInFront, @Nullable ScrimView scrimForBubble) { - mScrimBehind = scrimBehind; + public void attachViews(ScrimView behindScrim, ScrimView notificationsScrim, + ScrimView scrimInFront, @Nullable ScrimView scrimForBubble) { + mNotificationsScrim = notificationsScrim; + mScrimBehind = behindScrim; mScrimInFront = scrimInFront; mScrimForBubble = scrimForBubble; updateThemeColors(); + mNotificationsScrim.enableRoundedCorners(); + if (mScrimBehindChangeRunnable != null) { mScrimBehind.setChangeRunnable(mScrimBehindChangeRunnable, mMainExecutor); mScrimBehindChangeRunnable = null; @@ -280,6 +281,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } mScrimBehind.setDefaultFocusHighlightEnabled(false); + mNotificationsScrim.setDefaultFocusHighlightEnabled(false); mScrimInFront.setDefaultFocusHighlightEnabled(false); if (mScrimForBubble != null) { mScrimForBubble.setDefaultFocusHighlightEnabled(false); @@ -344,6 +346,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump // We need to disable focus otherwise AOD would end up with a gray overlay. mScrimInFront.setFocusable(!state.isLowPowerState()); mScrimBehind.setFocusable(!state.isLowPowerState()); + mNotificationsScrim.setFocusable(!state.isLowPowerState()); // Cancel blanking transitions that were pending before we requested a new state if (mPendingFrameCallback != null) { @@ -484,18 +487,20 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } /** - * Current state of the QuickSettings expansion when pulling it from the top. + * Current state of the QuickSettings when pulling it from the top. * - * @param fraction From 0 to 1 where 0 means collapsed and 1 expanded. + * @param expansionFraction From 0 to 1 where 0 means collapsed and 1 expanded. + * @param qsPanelBottomY absolute Y position of qs panel bottom */ - public void setQsExpansion(float fraction) { - if (isNaN(fraction)) { + public void setQsPosition(float expansionFraction, int qsPanelBottomY) { + if (isNaN(expansionFraction)) { return; } - if (mQsExpansion != fraction) { - mQsExpansion = fraction; + shiftNotificationsScrim(qsPanelBottomY); + updateNotificationsScrimAlpha(qsPanelBottomY); + if (mQsExpansion != expansionFraction) { + mQsExpansion = expansionFraction; Log.d(TAG, "set qs fraction"); - boolean relevantState = (mState == ScrimState.SHADE_LOCKED || mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING @@ -507,6 +512,32 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } } + private void shiftNotificationsScrim(int qsPanelBottomY) { + if (qsPanelBottomY > 0) { + mNotificationsScrim.setTranslationY(qsPanelBottomY); + } else { + mNotificationsScrim.setTranslationY(0); + } + } + + private void updateNotificationsScrimAlpha(int qsPanelBottomY) { + float newAlpha = 0; + if (qsPanelBottomY > 0) { + float interpolator = 0; + if (mState == ScrimState.UNLOCKED || mState == ScrimState.SHADE_LOCKED) { + interpolator = getInterpolatedFraction(); + } else { + interpolator = mQsExpansion; + } + newAlpha = MathUtils.lerp(0, 1, interpolator); + } + if (newAlpha != mNotificationsAlpha) { + mNotificationsAlpha = newAlpha; + // update alpha without animating + mNotificationsScrim.setViewAlpha(newAlpha); + } + } + private void setOrAdaptCurrentAnimation(@Nullable View scrim) { if (scrim == null) { return; @@ -575,6 +606,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump return; } setOrAdaptCurrentAnimation(mScrimBehind); + setOrAdaptCurrentAnimation(mNotificationsScrim); setOrAdaptCurrentAnimation(mScrimInFront); setOrAdaptCurrentAnimation(mScrimForBubble); dispatchScrimState(mScrimBehind.getViewAlpha()); @@ -590,14 +622,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } } - /** - * Sets the given drawable as the background of the scrim that shows up behind the - * notifications. - */ - public void setScrimBehindDrawable(Drawable drawable) { - mScrimBehind.setDrawable(drawable); - } - /** * Sets the front scrim opacity in AOD so it's not as bright. *

@@ -667,10 +691,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mNeedsDrawableColorUpdate = false; // Only animate scrim color if the scrim view is actually visible boolean animateScrimInFront = mScrimInFront.getViewAlpha() != 0 && !mBlankScreen; - boolean animateScrimBehind = mScrimBehind.getViewAlpha() != 0 && !mBlankScreen; + boolean animateBehindScrim = mScrimBehind.getViewAlpha() != 0 && !mBlankScreen; + boolean animateScrimNotifications = mNotificationsScrim.getViewAlpha() != 0 + && !mBlankScreen; mScrimInFront.setColors(mColors, animateScrimInFront); - mScrimBehind.setColors(mColors, animateScrimBehind); + mScrimBehind.setColors(mColors, animateScrimNotifications); + mNotificationsScrim.setColors(mColors, animateScrimNotifications); dispatchScrimState(mScrimBehind.getViewAlpha()); } @@ -687,6 +714,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } setScrimAlpha(mScrimInFront, mInFrontAlpha); setScrimAlpha(mScrimBehind, mBehindAlpha); + setScrimAlpha(mNotificationsScrim, mNotificationsAlpha); if (mScrimForBubble != null) { boolean animateScrimForBubble = mScrimForBubble.getViewAlpha() != 0 && !mBlankScreen; @@ -744,7 +772,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (scrim == mScrimInFront) { return "front_scrim"; } else if (scrim == mScrimBehind) { - return "back_scrim"; + return "behind_scrim"; + } else if (scrim == mNotificationsScrim) { + return "notifications_scrim"; } else if (scrim == mScrimForBubble) { return "bubble_scrim"; } @@ -817,6 +847,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump return mInFrontAlpha; } else if (scrim == mScrimBehind) { return mBehindAlpha; + } else if (scrim == mNotificationsScrim) { + return mNotificationsAlpha; } else if (scrim == mScrimForBubble) { return mBubbleAlpha; } else { @@ -829,6 +861,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump return mInFrontTint; } else if (scrim == mScrimBehind) { return mBehindTint; + } else if (scrim == mNotificationsScrim) { + return Color.TRANSPARENT; } else if (scrim == mScrimForBubble) { return mBubbleTint; } else { @@ -858,8 +892,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } if (isAnimating(mScrimBehind) - || isAnimating(mScrimInFront) - || isAnimating(mScrimForBubble)) { + || isAnimating(mNotificationsScrim) + || isAnimating(mScrimInFront) + || isAnimating(mScrimForBubble)) { if (callback != null && callback != mCallback) { // Since we only notify the callback that we're finished once everything has // finished, we need to make sure that any changing callbacks are also invoked @@ -884,7 +919,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump // At the end of the animation we need to remove the tint. if (mState == ScrimState.UNLOCKED) { mInFrontTint = Color.TRANSPARENT; - mBehindTint = Color.TRANSPARENT; + mBehindTint = mState.getBehindTint(); mBubbleTint = Color.TRANSPARENT; updateScrimColor(mScrimInFront, mInFrontAlpha, mInFrontTint); updateScrimColor(mScrimBehind, mBehindAlpha, mBehindTint); @@ -996,12 +1031,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mScrimBehind.postOnAnimationDelayed(callback, 32 /* delayMillis */); } - public int getBackgroundColor() { - int color = mColors.getMainColor(); - return Color.argb((int) (mScrimBehind.getViewAlpha() * Color.alpha(color)), - Color.red(color), Color.green(color), Color.blue(color)); - } - public void setScrimBehindChangeRunnable(Runnable changeRunnable) { // TODO: remove this. This is necessary because of an order-of-operations limitation. // The fix is to move more of these class into @StatusBarScope @@ -1047,7 +1076,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimInFront.getTint())); - pw.print(" backScrim:"); + pw.print(" behindScrim:"); pw.print(" viewAlpha="); pw.print(mScrimBehind.getViewAlpha()); pw.print(" alpha="); @@ -1055,6 +1084,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimBehind.getTint())); + pw.print(" notificationsScrim:"); + pw.print(" viewAlpha="); + pw.print(mNotificationsScrim.getViewAlpha()); + pw.print(" alpha="); + pw.print(mNotificationsAlpha); + pw.print(" tint=0x"); + pw.println(Integer.toHexString(mNotificationsScrim.getTint())); + pw.print(" bubbleScrim:"); pw.print(" viewAlpha="); pw.print(mScrimForBubble.getViewAlpha()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java index b82863e75fe68..a9774d850fd92 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -129,6 +129,13 @@ public enum ScrimState { mBehindAlpha = mDefaultScrimAlpha; mBubbleAlpha = 0f; mFrontAlpha = 0f; + mBehindTint = Color.BLACK; + } + + // to make sure correct color is returned before "prepare" is called + @Override + public int getBehindTint() { + return Color.BLACK; } }, @@ -228,7 +235,7 @@ public enum ScrimState { mAnimateChange = !mLaunchingAffordanceWithPreview; mFrontTint = Color.TRANSPARENT; - mBehindTint = Color.TRANSPARENT; + mBehindTint = Color.BLACK; mBubbleTint = Color.TRANSPARENT; mBlankScreen = false; 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 d581c4b6f9b78..7c5759b4ee1d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1198,6 +1198,8 @@ public class StatusBar extends SystemUI implements DemoMode, }); ScrimView scrimBehind = mNotificationShadeWindowView.findViewById(R.id.scrim_behind); + ScrimView notificationsScrim = mNotificationShadeWindowView + .findViewById(R.id.scrim_notifications); ScrimView scrimInFront = mNotificationShadeWindowView.findViewById(R.id.scrim_in_front); ScrimView scrimForBubble = mBubblesManagerOptional.isPresent() ? mBubblesManagerOptional.get().getScrimForBubble() : null; @@ -1206,7 +1208,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationShadeWindowController.setScrimsVisibility(scrimsVisible); mLockscreenLockIconController.onScrimVisibilityChanged(scrimsVisible); }); - mScrimController.attachViews(scrimBehind, scrimInFront, scrimForBubble); + mScrimController.attachViews(scrimBehind, notificationsScrim, scrimInFront, scrimForBubble); mLightRevealScrim = mNotificationShadeWindowView.findViewById(R.id.light_reveal_scrim); mChargingRippleAnimationController.setViewHost(mNotificationShadeWindowView); 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 116e1b98debdf..123e4ef446b93 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 @@ -49,7 +49,6 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.DejankUtils; import com.android.systemui.SysuiTestCase; import com.android.systemui.dock.DockManager; -import com.android.systemui.statusbar.BlurUtils; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -79,6 +78,7 @@ public class ScrimControllerTest extends SysuiTestCase { private ScrimController mScrimController; private ScrimView mScrimBehind; + private ScrimView mNotificationsScrim; private ScrimView mScrimInFront; private ScrimView mScrimForBubble; private ScrimState mScrimState; @@ -104,8 +104,6 @@ public class ScrimControllerTest extends SysuiTestCase { @Mock private DockManager mDockManager; @Mock - private BlurUtils mBlurUtils; - @Mock private ConfigurationController mConfigurationController; @Mock private FeatureFlags mFeatureFlags; @@ -163,6 +161,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.onPreDraw(); // Force finish all animations. mLooper.processAllMessages(); + endAnimation(mNotificationsScrim); endAnimation(mScrimBehind); endAnimation(mScrimInFront); endAnimation(mScrimForBubble); @@ -189,6 +188,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimBehind = spy(new ScrimView(getContext())); mScrimInFront = new ScrimView(getContext()); mScrimForBubble = new ScrimView(getContext()); + mNotificationsScrim = new ScrimView(getContext()); mAlwaysOnEnabled = true; mLooper = TestableLooper.get(this); DejankUtils.setImmediate(true); @@ -201,7 +201,6 @@ public class ScrimControllerTest extends SysuiTestCase { when(mDozeParamenters.getAlwaysOn()).thenAnswer(invocation -> mAlwaysOnEnabled); when(mDozeParamenters.getDisplayNeedsBlanking()).thenReturn(true); - when(mBlurUtils.supportsBlursOnWindows()).thenReturn(true); doAnswer((Answer) invocation -> { mScrimState = invocation.getArgument(0); @@ -222,10 +221,11 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController = new ScrimController(mLightBarController, mDozeParamenters, mAlarmManager, mKeyguardStateController, mDelayedWakeLockBuilder, new FakeHandler(mLooper.getLooper()), mKeyguardUpdateMonitor, - mDockManager, mBlurUtils, mConfigurationController, mFeatureFlags, + mDockManager, mConfigurationController, mFeatureFlags, new FakeExecutor(new FakeSystemClock())); mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible); - mScrimController.attachViews(mScrimBehind, mScrimInFront, mScrimForBubble); + mScrimController.attachViews(mScrimBehind, mNotificationsScrim, mScrimInFront, + mScrimForBubble); mScrimController.setAnimatorListener(mAnimatorListener); mScrimController.setHasBackdrop(false); @@ -264,7 +264,7 @@ public class ScrimControllerTest extends SysuiTestCase { TRANSPARENT /* bubble */); assertScrimTint(false /* front */, - false /* behind */, + true /* behind */, false /* bubble */); } @@ -516,7 +516,7 @@ public class ScrimControllerTest extends SysuiTestCase { TRANSPARENT /* bubble */); assertScrimTint(false /* front */, - false /* behind */, + true /* behind */, false /* bubble */); // Back scrim should be visible after start dragging @@ -586,7 +586,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void qsExpansion() { reset(mScrimBehind); - mScrimController.setQsExpansion(1f); + mScrimController.setQsPosition(1f, 999 /* value doesn't matter */); finishAnimationsImmediately(); assertScrimAlpha(TRANSPARENT, OPAQUE, TRANSPARENT); @@ -636,7 +636,7 @@ public class ScrimControllerTest extends SysuiTestCase { // Make sure at the very end of the animation, we're reset to transparent assertScrimTint(false /* front */, - false /* behind */, + true /* behind */, false /* bubble */); } @@ -947,7 +947,9 @@ public class ScrimControllerTest extends SysuiTestCase { if (scrim == mScrimInFront) { return "front"; } else if (scrim == mScrimBehind) { - return "back"; + return "behind"; + } else if (scrim == mNotificationsScrim) { + return "notifications"; } else if (scrim == mScrimForBubble) { return "bubble"; }