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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user