Merge "Dual tone shade implementation" into sc-dev
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"
|
||||
|
||||
@@ -718,6 +718,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2002,11 +2002,23 @@ 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);
|
||||
mDepthController.setQsPanelExpansion(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;
|
||||
|
||||
|
||||
@@ -1215,6 +1215,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;
|
||||
@@ -1223,7 +1225,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);
|
||||
updateLightRevealScrimVisibility();
|
||||
|
||||
@@ -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