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"; }