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
This commit is contained in:
Michal Brzezinski
2021-03-24 12:01:50 +00:00
parent b6521e0a8b
commit 8bec3cf08e
9 changed files with 206 additions and 52 deletions

View File

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

View File

@@ -51,6 +51,14 @@
sysui:ignoreRightInset="true"
/>
<com.android.systemui.statusbar.ScrimView
android:id="@+id/scrim_notifications"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:importantForAccessibility="no"
sysui:ignoreRightInset="true"
/>
<com.android.systemui.statusbar.LightRevealScrim
android:id="@+id/light_reveal_scrim"
android:layout_width="match_parent"

View File

@@ -712,6 +712,7 @@
<item name="keyguard_clock_line_spacing_scale_burmese" type="dimen" format="float">1</item>
<item name="scrim_behind_alpha" format="float" type="dimen">0.62</item>
<dimen name="notification_scrim_corner_radius">32dp</dimen>
<!-- The minimum amount the user needs to swipe to go to the camera / phone. -->
<dimen name="keyguard_min_swipe_amount">110dp</dimen>

View File

@@ -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);
}
}
}

View File

@@ -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);

View File

@@ -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.
* <p>
@@ -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());

View File

@@ -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;

View File

@@ -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);

View File

@@ -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<Void>) 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";
}