Loading packages/SystemUI/res/layout/super_status_bar.xml +9 −1 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ </com.android.systemui.statusbar.BackDropView> <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind" android:id="@+id/scrim_for_bubble" android:layout_width="match_parent" android:layout_height="match_parent" android:importantForAccessibility="no" Loading @@ -56,6 +56,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind" android:layout_width="match_parent" android:layout_height="match_parent" android:importantForAccessibility="no" sysui:ignoreRightInset="true" /> <include layout="@layout/status_bar_expanded" android:layout_width="match_parent" android:layout_height="match_parent" Loading packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +2 −1 Original line number Diff line number Diff line Loading @@ -136,11 +136,12 @@ public class SystemUIFactory { } public ScrimController createScrimController(ScrimView scrimBehind, ScrimView scrimInFront, ScrimView scrimForBubble, LockscreenWallpaper lockscreenWallpaper, TriConsumer<ScrimState, Float, GradientColors> scrimStateListener, Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters, AlarmManager alarmManager) { return new ScrimController(scrimBehind, scrimInFront, scrimStateListener, return new ScrimController(scrimBehind, scrimInFront, scrimForBubble, scrimStateListener, scrimVisibleListener, dozeParameters, alarmManager); } Loading packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +3 −4 Original line number Diff line number Diff line Loading @@ -258,10 +258,9 @@ public class BubbleController implements ConfigurationController.ConfigurationLi if (mStackView == null) { mStackView = new BubbleStackView(mContext, mBubbleData, mSurfaceSynchronizer); ViewGroup sbv = mStatusBarWindowController.getStatusBarView(); // TODO(b/130237686): When you expand the shade on top of expanded bubble, there is no // scrim between bubble and the shade int bubblePosition = sbv.indexOfChild(sbv.findViewById(R.id.scrim_behind)) + 1; sbv.addView(mStackView, bubblePosition, int bubbleScrimIndex = sbv.indexOfChild(sbv.findViewById(R.id.scrim_for_bubble)); int stackIndex = bubbleScrimIndex + 1; // Show stack above bubble scrim. sbv.addView(mStackView, stackIndex, new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)); if (mExpandListener != null) { mStackView.setExpandListener(mExpandListener); Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +1 −1 Original line number Diff line number Diff line Loading @@ -513,7 +513,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange */ public void onScrimVisibilityChanged(@ScrimVisibility int scrimsVisible) { if (mWakeAndUnlockRunning && scrimsVisible == ScrimController.VISIBILITY_FULLY_TRANSPARENT) { && scrimsVisible == ScrimController.TRANSPARENT) { mWakeAndUnlockRunning = false; update(); } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +131 −81 Original line number Diff line number Diff line Loading @@ -78,23 +78,24 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo /** * When both scrims have 0 alpha. */ public static final int VISIBILITY_FULLY_TRANSPARENT = 0; public static final int TRANSPARENT = 0; /** * When scrims aren't transparent (alpha 0) but also not opaque (alpha 1.) */ public static final int VISIBILITY_SEMI_TRANSPARENT = 1; public static final int SEMI_TRANSPARENT = 1; /** * When at least 1 scrim is fully opaque (alpha set to 1.) */ public static final int VISIBILITY_FULLY_OPAQUE = 2; public static final int OPAQUE = 2; @IntDef(prefix = {"VISIBILITY_"}, value = { VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_SEMI_TRANSPARENT, VISIBILITY_FULLY_OPAQUE TRANSPARENT, SEMI_TRANSPARENT, OPAQUE }) @Retention(RetentionPolicy.SOURCE) public @interface ScrimVisibility {} public @interface ScrimVisibility { } /** * Default alpha value for most scrims. Loading Loading @@ -122,8 +123,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private ScrimState mState = ScrimState.UNINITIALIZED; private final Context mContext; protected final ScrimView mScrimBehind; protected final ScrimView mScrimInFront; protected final ScrimView mScrimBehind; protected final ScrimView mScrimForBubble; private final UnlockMethodCache mUnlockMethodCache; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final DozeParameters mDozeParameters; Loading Loading @@ -152,10 +156,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private Runnable mOnAnimationFinished; private boolean mDeferFinishedListener; private final Interpolator mInterpolator = new DecelerateInterpolator(); private float mCurrentInFrontAlpha = NOT_INITIALIZED; private float mCurrentBehindAlpha = NOT_INITIALIZED; private int mCurrentInFrontTint; private int mCurrentBehindTint; private float mInFrontAlpha = NOT_INITIALIZED; private float mBehindAlpha = NOT_INITIALIZED; private float mBubbleAlpha = NOT_INITIALIZED; private int mInFrontTint; private int mBehindTint; private int mBubbleTint; private boolean mWallpaperVisibilityTimedOut; private int mScrimsVisibility; private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener; Loading @@ -174,14 +183,18 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private boolean mWakeLockHeld; private boolean mKeyguardOccluded; public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, ScrimView scrimForBubble, TriConsumer<ScrimState, Float, GradientColors> scrimStateListener, Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters, AlarmManager alarmManager) { mScrimBehind = scrimBehind; mScrimInFront = scrimInFront; mScrimForBubble = scrimForBubble; mScrimStateListener = scrimStateListener; mScrimVisibleListener = scrimVisibleListener; mContext = scrimBehind.getContext(); mUnlockMethodCache = UnlockMethodCache.getInstance(mContext); mDarkenWhileDragging = !mUnlockMethodCache.canSkipBouncer(); Loading @@ -205,12 +218,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo final ScrimState[] states = ScrimState.values(); for (int i = 0; i < states.length; i++) { states[i].init(mScrimInFront, mScrimBehind, mDozeParameters); states[i].init(mScrimInFront, mScrimBehind, mScrimForBubble, mDozeParameters); states[i].setScrimBehindAlphaKeyguard(mScrimBehindAlphaKeyguard); } mScrimBehind.setDefaultFocusHighlightEnabled(false); mScrimInFront.setDefaultFocusHighlightEnabled(false); mScrimForBubble.setDefaultFocusHighlightEnabled(false); updateScrims(); } Loading Loading @@ -249,10 +263,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo mBlankScreen = state.getBlanksScreen(); mAnimateChange = state.getAnimateChange(); mAnimationDuration = state.getAnimationDuration(); mCurrentInFrontTint = state.getFrontTint(); mCurrentBehindTint = state.getBehindTint(); mCurrentInFrontAlpha = state.getFrontAlpha(); mCurrentBehindAlpha = state.getBehindAlpha(); mInFrontTint = state.getFrontTint(); mBehindTint = state.getBehindTint(); mBubbleTint = state.getBubbleTint(); mInFrontAlpha = state.getFrontAlpha(); mBehindAlpha = state.getBehindAlpha(); mBubbleAlpha = state.getBubbleAlpha(); applyExpansionToAlpha(); // Scrim might acquire focus when user is navigating with a D-pad or a keyboard. Loading Loading @@ -371,31 +389,29 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo if (mExpansionFraction != fraction) { mExpansionFraction = fraction; final boolean keyguardOrUnlocked = mState == ScrimState.UNLOCKED || mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING; if (!keyguardOrUnlocked || !mExpansionAffectsAlpha) { boolean relevantState = (mState == ScrimState.UNLOCKED || mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING || mState == ScrimState.BUBBLE_EXPANDED); if (!(relevantState && mExpansionAffectsAlpha)) { return; } applyExpansionToAlpha(); if (mUpdatePending) { return; } setOrAdaptCurrentAnimation(mScrimBehind); setOrAdaptCurrentAnimation(mScrimInFront); setOrAdaptCurrentAnimation(mScrimForBubble); dispatchScrimState(mScrimBehind.getViewAlpha()); } } private void setOrAdaptCurrentAnimation(View scrim) { if (!isAnimating(scrim)) { updateScrimColor(scrim, getCurrentScrimAlpha(scrim), getCurrentScrimTint(scrim)); } else { ValueAnimator previousAnimator = (ValueAnimator) scrim.getTag(TAG_KEY_ANIM); float alpha = getCurrentScrimAlpha(scrim); if (isAnimating(scrim)) { // Adapt current animation. ValueAnimator previousAnimator = (ValueAnimator) scrim.getTag(TAG_KEY_ANIM); float previousEndValue = (Float) scrim.getTag(TAG_END_ALPHA); float previousStartValue = (Float) scrim.getTag(TAG_START_ALPHA); float relativeDiff = alpha - previousEndValue; Loading @@ -403,6 +419,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo scrim.setTag(TAG_START_ALPHA, newStartValue); scrim.setTag(TAG_END_ALPHA, alpha); previousAnimator.setCurrentPlayTime(previousAnimator.getCurrentPlayTime()); } else { // Set animation. updateScrimColor(scrim, alpha, getCurrentScrimTint(scrim)); } } Loading @@ -411,27 +430,27 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo return; } if (mState == ScrimState.UNLOCKED) { if (mState == ScrimState.UNLOCKED || mState == ScrimState.BUBBLE_EXPANDED) { // Darken scrim as you pull down the shade when unlocked float behindFraction = getInterpolatedFraction(); behindFraction = (float) Math.pow(behindFraction, 0.8f); mCurrentBehindAlpha = behindFraction * GRADIENT_SCRIM_ALPHA_BUSY; mCurrentInFrontAlpha = 0; mBehindAlpha = behindFraction * GRADIENT_SCRIM_ALPHA_BUSY; mInFrontAlpha = 0; } else if (mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING) { // Either darken of make the scrim transparent when you // pull down the shade float interpolatedFract = getInterpolatedFraction(); float alphaBehind = mState.getBehindAlpha(); if (mDarkenWhileDragging) { mCurrentBehindAlpha = MathUtils.lerp(GRADIENT_SCRIM_ALPHA_BUSY, alphaBehind, mBehindAlpha = MathUtils.lerp(GRADIENT_SCRIM_ALPHA_BUSY, alphaBehind, interpolatedFract); mCurrentInFrontAlpha = 0; mInFrontAlpha = 0; } else { mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, alphaBehind, mBehindAlpha = MathUtils.lerp(0 /* start */, alphaBehind, interpolatedFract); mCurrentInFrontAlpha = 0; mInFrontAlpha = 0; } mCurrentBehindTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getBehindTint(), mBehindTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getBehindTint(), mState.getBehindTint(), interpolatedFract); } } Loading @@ -456,8 +475,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo */ public void setAodFrontScrimAlpha(float alpha) { if (mState == ScrimState.AOD && mDozeParameters.getAlwaysOn() && mCurrentInFrontAlpha != alpha) { mCurrentInFrontAlpha = alpha; && mInFrontAlpha != alpha) { mInFrontAlpha = alpha; updateScrims(); } Loading @@ -474,8 +493,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo if (mState == ScrimState.PULSING) { float newBehindAlpha = mState.getBehindAlpha(); if (mCurrentBehindAlpha != newBehindAlpha) { mCurrentBehindAlpha = newBehindAlpha; if (mBehindAlpha != newBehindAlpha) { mBehindAlpha = newBehindAlpha; updateScrims(); } } Loading @@ -497,8 +516,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // Only animate scrim color if the scrim view is actually visible boolean animateScrimInFront = mScrimInFront.getViewAlpha() != 0 && !mBlankScreen; boolean animateScrimBehind = mScrimBehind.getViewAlpha() != 0 && !mBlankScreen; boolean animateScrimForBubble = mScrimForBubble.getViewAlpha() != 0 && !mBlankScreen; mScrimInFront.setColors(mColors, animateScrimInFront); mScrimBehind.setColors(mColors, animateScrimBehind); mScrimForBubble.setColors(mColors, animateScrimForBubble); // Calculate minimum scrim opacity for white or black text. int textColor = mColors.supportsDarkText() ? Color.BLACK : Color.WHITE; Loading @@ -517,12 +539,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo boolean occludedKeyguard = (mState == ScrimState.PULSING || mState == ScrimState.AOD) && mKeyguardOccluded; if (aodWallpaperTimeout || occludedKeyguard) { mCurrentBehindAlpha = 1; mBehindAlpha = 1; } setScrimInFrontAlpha(mCurrentInFrontAlpha); setScrimBehindAlpha(mCurrentBehindAlpha); setScrimAlpha(mScrimInFront, mInFrontAlpha); setScrimAlpha(mScrimBehind, mBehindAlpha); setScrimAlpha(mScrimForBubble, mBubbleAlpha); dispatchScrimsVisible(); } Loading @@ -533,11 +554,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private void dispatchScrimsVisible() { final int currentScrimVisibility; if (mScrimInFront.getViewAlpha() == 1 || mScrimBehind.getViewAlpha() == 1) { currentScrimVisibility = VISIBILITY_FULLY_OPAQUE; currentScrimVisibility = OPAQUE; } else if (mScrimInFront.getViewAlpha() == 0 && mScrimBehind.getViewAlpha() == 0) { currentScrimVisibility = VISIBILITY_FULLY_TRANSPARENT; currentScrimVisibility = TRANSPARENT; } else { currentScrimVisibility = VISIBILITY_SEMI_TRANSPARENT; currentScrimVisibility = SEMI_TRANSPARENT; } if (mScrimsVisibility != currentScrimVisibility) { Loading @@ -558,14 +579,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } } private void setScrimBehindAlpha(float alpha) { setScrimAlpha(mScrimBehind, alpha); } private void setScrimInFrontAlpha(float alpha) { setScrimAlpha(mScrimInFront, alpha); } private void setScrimAlpha(ScrimView scrim, float alpha) { if (alpha == 0f) { scrim.setClickable(false); Loading @@ -576,17 +589,26 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo updateScrim(scrim, alpha); } private String getScrimName(ScrimView scrim) { if (scrim == mScrimInFront) { return "front_scrim"; } else if (scrim == mScrimBehind) { return "back_scrim"; } else if (scrim == mScrimForBubble) { return "bubble_scrim"; } return "unknown_scrim"; } private void updateScrimColor(View scrim, float alpha, int tint) { alpha = Math.max(0, Math.min(1.0f, alpha)); if (scrim instanceof ScrimView) { ScrimView scrimView = (ScrimView) scrim; Trace.traceCounter(Trace.TRACE_TAG_APP, scrim == mScrimInFront ? "front_scrim_alpha" : "back_scrim_alpha", Trace.traceCounter(Trace.TRACE_TAG_APP, getScrimName(scrimView) + "_alpha", (int) (alpha * 255)); Trace.traceCounter(Trace.TRACE_TAG_APP, scrim == mScrimInFront ? "front_scrim_tint" : "back_scrim_tint", Trace.traceCounter(Trace.TRACE_TAG_APP, getScrimName(scrimView) + "_tint", Color.alpha(tint)); scrimView.setTint(tint); Loading Loading @@ -643,9 +665,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private float getCurrentScrimAlpha(View scrim) { if (scrim == mScrimInFront) { return mCurrentInFrontAlpha; return mInFrontAlpha; } else if (scrim == mScrimBehind) { return mCurrentBehindAlpha; return mBehindAlpha; } else if (scrim == mScrimForBubble) { return mBubbleAlpha; } else { throw new IllegalArgumentException("Unknown scrim view"); } Loading @@ -653,9 +677,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private int getCurrentScrimTint(View scrim) { if (scrim == mScrimInFront) { return mCurrentInFrontTint; return mInFrontTint; } else if (scrim == mScrimBehind) { return mCurrentBehindTint; return mBehindTint; } else if (scrim == mScrimForBubble) { return mBubbleTint; } else { throw new IllegalArgumentException("Unknown scrim view"); } Loading Loading @@ -698,8 +724,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // When unlocking with fingerprint, we'll fade the scrims from black to transparent. // At the end of the animation we need to remove the tint. if (mState == ScrimState.UNLOCKED) { mCurrentInFrontTint = Color.TRANSPARENT; mCurrentBehindTint = Color.TRANSPARENT; mInFrontTint = Color.TRANSPARENT; mBehindTint = Color.TRANSPARENT; mBubbleTint = Color.TRANSPARENT; } } Loading Loading @@ -804,6 +831,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo /** * Executes a callback after the frame has hit the display. * * @param callback What to run. */ @VisibleForTesting Loading Loading @@ -847,16 +875,35 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println(" ScrimController: "); pw.print(" state: "); pw.println(mState); pw.print(" frontScrim:"); pw.print(" viewAlpha="); pw.print(mScrimInFront.getViewAlpha()); pw.print(" alpha="); pw.print(mCurrentInFrontAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimInFront.getTint())); pw.print(" backScrim:"); pw.print(" viewAlpha="); pw.print(mScrimBehind.getViewAlpha()); pw.print(" alpha="); pw.print(mCurrentBehindAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimBehind.getTint())); pw.print(" mTracking="); pw.println(mTracking); pw.print(" state: "); pw.println(mState); pw.print(" frontScrim:"); pw.print(" viewAlpha="); pw.print(mScrimInFront.getViewAlpha()); pw.print(" alpha="); pw.print(mInFrontAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimInFront.getTint())); pw.print(" backScrim:"); pw.print(" viewAlpha="); pw.print(mScrimBehind.getViewAlpha()); pw.print(" alpha="); pw.print(mBehindAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimBehind.getTint())); pw.print(" bubbleScrim:"); pw.print(" viewAlpha="); pw.print(mScrimForBubble.getViewAlpha()); pw.print(" alpha="); pw.print(mBubbleAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimForBubble.getTint())); pw.print(" mTracking="); pw.println(mTracking); } public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) { Loading Loading @@ -903,8 +950,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // in this case, back-scrim needs to be re-evaluated if (mState == ScrimState.AOD || mState == ScrimState.PULSING) { float newBehindAlpha = mState.getBehindAlpha(); if (mCurrentBehindAlpha != newBehindAlpha) { mCurrentBehindAlpha = newBehindAlpha; if (mBehindAlpha != newBehindAlpha) { mBehindAlpha = newBehindAlpha; updateScrims(); } } Loading @@ -919,10 +966,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo public interface Callback { default void onStart() { } default void onDisplayBlanked() { } default void onFinished() { } default void onCancelled() { } } Loading Loading
packages/SystemUI/res/layout/super_status_bar.xml +9 −1 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ </com.android.systemui.statusbar.BackDropView> <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind" android:id="@+id/scrim_for_bubble" android:layout_width="match_parent" android:layout_height="match_parent" android:importantForAccessibility="no" Loading @@ -56,6 +56,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind" android:layout_width="match_parent" android:layout_height="match_parent" android:importantForAccessibility="no" sysui:ignoreRightInset="true" /> <include layout="@layout/status_bar_expanded" android:layout_width="match_parent" android:layout_height="match_parent" Loading
packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +2 −1 Original line number Diff line number Diff line Loading @@ -136,11 +136,12 @@ public class SystemUIFactory { } public ScrimController createScrimController(ScrimView scrimBehind, ScrimView scrimInFront, ScrimView scrimForBubble, LockscreenWallpaper lockscreenWallpaper, TriConsumer<ScrimState, Float, GradientColors> scrimStateListener, Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters, AlarmManager alarmManager) { return new ScrimController(scrimBehind, scrimInFront, scrimStateListener, return new ScrimController(scrimBehind, scrimInFront, scrimForBubble, scrimStateListener, scrimVisibleListener, dozeParameters, alarmManager); } Loading
packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +3 −4 Original line number Diff line number Diff line Loading @@ -258,10 +258,9 @@ public class BubbleController implements ConfigurationController.ConfigurationLi if (mStackView == null) { mStackView = new BubbleStackView(mContext, mBubbleData, mSurfaceSynchronizer); ViewGroup sbv = mStatusBarWindowController.getStatusBarView(); // TODO(b/130237686): When you expand the shade on top of expanded bubble, there is no // scrim between bubble and the shade int bubblePosition = sbv.indexOfChild(sbv.findViewById(R.id.scrim_behind)) + 1; sbv.addView(mStackView, bubblePosition, int bubbleScrimIndex = sbv.indexOfChild(sbv.findViewById(R.id.scrim_for_bubble)); int stackIndex = bubbleScrimIndex + 1; // Show stack above bubble scrim. sbv.addView(mStackView, stackIndex, new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)); if (mExpandListener != null) { mStackView.setExpandListener(mExpandListener); Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +1 −1 Original line number Diff line number Diff line Loading @@ -513,7 +513,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange */ public void onScrimVisibilityChanged(@ScrimVisibility int scrimsVisible) { if (mWakeAndUnlockRunning && scrimsVisible == ScrimController.VISIBILITY_FULLY_TRANSPARENT) { && scrimsVisible == ScrimController.TRANSPARENT) { mWakeAndUnlockRunning = false; update(); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +131 −81 Original line number Diff line number Diff line Loading @@ -78,23 +78,24 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo /** * When both scrims have 0 alpha. */ public static final int VISIBILITY_FULLY_TRANSPARENT = 0; public static final int TRANSPARENT = 0; /** * When scrims aren't transparent (alpha 0) but also not opaque (alpha 1.) */ public static final int VISIBILITY_SEMI_TRANSPARENT = 1; public static final int SEMI_TRANSPARENT = 1; /** * When at least 1 scrim is fully opaque (alpha set to 1.) */ public static final int VISIBILITY_FULLY_OPAQUE = 2; public static final int OPAQUE = 2; @IntDef(prefix = {"VISIBILITY_"}, value = { VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_SEMI_TRANSPARENT, VISIBILITY_FULLY_OPAQUE TRANSPARENT, SEMI_TRANSPARENT, OPAQUE }) @Retention(RetentionPolicy.SOURCE) public @interface ScrimVisibility {} public @interface ScrimVisibility { } /** * Default alpha value for most scrims. Loading Loading @@ -122,8 +123,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private ScrimState mState = ScrimState.UNINITIALIZED; private final Context mContext; protected final ScrimView mScrimBehind; protected final ScrimView mScrimInFront; protected final ScrimView mScrimBehind; protected final ScrimView mScrimForBubble; private final UnlockMethodCache mUnlockMethodCache; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final DozeParameters mDozeParameters; Loading Loading @@ -152,10 +156,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private Runnable mOnAnimationFinished; private boolean mDeferFinishedListener; private final Interpolator mInterpolator = new DecelerateInterpolator(); private float mCurrentInFrontAlpha = NOT_INITIALIZED; private float mCurrentBehindAlpha = NOT_INITIALIZED; private int mCurrentInFrontTint; private int mCurrentBehindTint; private float mInFrontAlpha = NOT_INITIALIZED; private float mBehindAlpha = NOT_INITIALIZED; private float mBubbleAlpha = NOT_INITIALIZED; private int mInFrontTint; private int mBehindTint; private int mBubbleTint; private boolean mWallpaperVisibilityTimedOut; private int mScrimsVisibility; private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener; Loading @@ -174,14 +183,18 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private boolean mWakeLockHeld; private boolean mKeyguardOccluded; public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, ScrimView scrimForBubble, TriConsumer<ScrimState, Float, GradientColors> scrimStateListener, Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters, AlarmManager alarmManager) { mScrimBehind = scrimBehind; mScrimInFront = scrimInFront; mScrimForBubble = scrimForBubble; mScrimStateListener = scrimStateListener; mScrimVisibleListener = scrimVisibleListener; mContext = scrimBehind.getContext(); mUnlockMethodCache = UnlockMethodCache.getInstance(mContext); mDarkenWhileDragging = !mUnlockMethodCache.canSkipBouncer(); Loading @@ -205,12 +218,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo final ScrimState[] states = ScrimState.values(); for (int i = 0; i < states.length; i++) { states[i].init(mScrimInFront, mScrimBehind, mDozeParameters); states[i].init(mScrimInFront, mScrimBehind, mScrimForBubble, mDozeParameters); states[i].setScrimBehindAlphaKeyguard(mScrimBehindAlphaKeyguard); } mScrimBehind.setDefaultFocusHighlightEnabled(false); mScrimInFront.setDefaultFocusHighlightEnabled(false); mScrimForBubble.setDefaultFocusHighlightEnabled(false); updateScrims(); } Loading Loading @@ -249,10 +263,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo mBlankScreen = state.getBlanksScreen(); mAnimateChange = state.getAnimateChange(); mAnimationDuration = state.getAnimationDuration(); mCurrentInFrontTint = state.getFrontTint(); mCurrentBehindTint = state.getBehindTint(); mCurrentInFrontAlpha = state.getFrontAlpha(); mCurrentBehindAlpha = state.getBehindAlpha(); mInFrontTint = state.getFrontTint(); mBehindTint = state.getBehindTint(); mBubbleTint = state.getBubbleTint(); mInFrontAlpha = state.getFrontAlpha(); mBehindAlpha = state.getBehindAlpha(); mBubbleAlpha = state.getBubbleAlpha(); applyExpansionToAlpha(); // Scrim might acquire focus when user is navigating with a D-pad or a keyboard. Loading Loading @@ -371,31 +389,29 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo if (mExpansionFraction != fraction) { mExpansionFraction = fraction; final boolean keyguardOrUnlocked = mState == ScrimState.UNLOCKED || mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING; if (!keyguardOrUnlocked || !mExpansionAffectsAlpha) { boolean relevantState = (mState == ScrimState.UNLOCKED || mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING || mState == ScrimState.BUBBLE_EXPANDED); if (!(relevantState && mExpansionAffectsAlpha)) { return; } applyExpansionToAlpha(); if (mUpdatePending) { return; } setOrAdaptCurrentAnimation(mScrimBehind); setOrAdaptCurrentAnimation(mScrimInFront); setOrAdaptCurrentAnimation(mScrimForBubble); dispatchScrimState(mScrimBehind.getViewAlpha()); } } private void setOrAdaptCurrentAnimation(View scrim) { if (!isAnimating(scrim)) { updateScrimColor(scrim, getCurrentScrimAlpha(scrim), getCurrentScrimTint(scrim)); } else { ValueAnimator previousAnimator = (ValueAnimator) scrim.getTag(TAG_KEY_ANIM); float alpha = getCurrentScrimAlpha(scrim); if (isAnimating(scrim)) { // Adapt current animation. ValueAnimator previousAnimator = (ValueAnimator) scrim.getTag(TAG_KEY_ANIM); float previousEndValue = (Float) scrim.getTag(TAG_END_ALPHA); float previousStartValue = (Float) scrim.getTag(TAG_START_ALPHA); float relativeDiff = alpha - previousEndValue; Loading @@ -403,6 +419,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo scrim.setTag(TAG_START_ALPHA, newStartValue); scrim.setTag(TAG_END_ALPHA, alpha); previousAnimator.setCurrentPlayTime(previousAnimator.getCurrentPlayTime()); } else { // Set animation. updateScrimColor(scrim, alpha, getCurrentScrimTint(scrim)); } } Loading @@ -411,27 +430,27 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo return; } if (mState == ScrimState.UNLOCKED) { if (mState == ScrimState.UNLOCKED || mState == ScrimState.BUBBLE_EXPANDED) { // Darken scrim as you pull down the shade when unlocked float behindFraction = getInterpolatedFraction(); behindFraction = (float) Math.pow(behindFraction, 0.8f); mCurrentBehindAlpha = behindFraction * GRADIENT_SCRIM_ALPHA_BUSY; mCurrentInFrontAlpha = 0; mBehindAlpha = behindFraction * GRADIENT_SCRIM_ALPHA_BUSY; mInFrontAlpha = 0; } else if (mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING) { // Either darken of make the scrim transparent when you // pull down the shade float interpolatedFract = getInterpolatedFraction(); float alphaBehind = mState.getBehindAlpha(); if (mDarkenWhileDragging) { mCurrentBehindAlpha = MathUtils.lerp(GRADIENT_SCRIM_ALPHA_BUSY, alphaBehind, mBehindAlpha = MathUtils.lerp(GRADIENT_SCRIM_ALPHA_BUSY, alphaBehind, interpolatedFract); mCurrentInFrontAlpha = 0; mInFrontAlpha = 0; } else { mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, alphaBehind, mBehindAlpha = MathUtils.lerp(0 /* start */, alphaBehind, interpolatedFract); mCurrentInFrontAlpha = 0; mInFrontAlpha = 0; } mCurrentBehindTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getBehindTint(), mBehindTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getBehindTint(), mState.getBehindTint(), interpolatedFract); } } Loading @@ -456,8 +475,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo */ public void setAodFrontScrimAlpha(float alpha) { if (mState == ScrimState.AOD && mDozeParameters.getAlwaysOn() && mCurrentInFrontAlpha != alpha) { mCurrentInFrontAlpha = alpha; && mInFrontAlpha != alpha) { mInFrontAlpha = alpha; updateScrims(); } Loading @@ -474,8 +493,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo if (mState == ScrimState.PULSING) { float newBehindAlpha = mState.getBehindAlpha(); if (mCurrentBehindAlpha != newBehindAlpha) { mCurrentBehindAlpha = newBehindAlpha; if (mBehindAlpha != newBehindAlpha) { mBehindAlpha = newBehindAlpha; updateScrims(); } } Loading @@ -497,8 +516,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // Only animate scrim color if the scrim view is actually visible boolean animateScrimInFront = mScrimInFront.getViewAlpha() != 0 && !mBlankScreen; boolean animateScrimBehind = mScrimBehind.getViewAlpha() != 0 && !mBlankScreen; boolean animateScrimForBubble = mScrimForBubble.getViewAlpha() != 0 && !mBlankScreen; mScrimInFront.setColors(mColors, animateScrimInFront); mScrimBehind.setColors(mColors, animateScrimBehind); mScrimForBubble.setColors(mColors, animateScrimForBubble); // Calculate minimum scrim opacity for white or black text. int textColor = mColors.supportsDarkText() ? Color.BLACK : Color.WHITE; Loading @@ -517,12 +539,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo boolean occludedKeyguard = (mState == ScrimState.PULSING || mState == ScrimState.AOD) && mKeyguardOccluded; if (aodWallpaperTimeout || occludedKeyguard) { mCurrentBehindAlpha = 1; mBehindAlpha = 1; } setScrimInFrontAlpha(mCurrentInFrontAlpha); setScrimBehindAlpha(mCurrentBehindAlpha); setScrimAlpha(mScrimInFront, mInFrontAlpha); setScrimAlpha(mScrimBehind, mBehindAlpha); setScrimAlpha(mScrimForBubble, mBubbleAlpha); dispatchScrimsVisible(); } Loading @@ -533,11 +554,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private void dispatchScrimsVisible() { final int currentScrimVisibility; if (mScrimInFront.getViewAlpha() == 1 || mScrimBehind.getViewAlpha() == 1) { currentScrimVisibility = VISIBILITY_FULLY_OPAQUE; currentScrimVisibility = OPAQUE; } else if (mScrimInFront.getViewAlpha() == 0 && mScrimBehind.getViewAlpha() == 0) { currentScrimVisibility = VISIBILITY_FULLY_TRANSPARENT; currentScrimVisibility = TRANSPARENT; } else { currentScrimVisibility = VISIBILITY_SEMI_TRANSPARENT; currentScrimVisibility = SEMI_TRANSPARENT; } if (mScrimsVisibility != currentScrimVisibility) { Loading @@ -558,14 +579,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } } private void setScrimBehindAlpha(float alpha) { setScrimAlpha(mScrimBehind, alpha); } private void setScrimInFrontAlpha(float alpha) { setScrimAlpha(mScrimInFront, alpha); } private void setScrimAlpha(ScrimView scrim, float alpha) { if (alpha == 0f) { scrim.setClickable(false); Loading @@ -576,17 +589,26 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo updateScrim(scrim, alpha); } private String getScrimName(ScrimView scrim) { if (scrim == mScrimInFront) { return "front_scrim"; } else if (scrim == mScrimBehind) { return "back_scrim"; } else if (scrim == mScrimForBubble) { return "bubble_scrim"; } return "unknown_scrim"; } private void updateScrimColor(View scrim, float alpha, int tint) { alpha = Math.max(0, Math.min(1.0f, alpha)); if (scrim instanceof ScrimView) { ScrimView scrimView = (ScrimView) scrim; Trace.traceCounter(Trace.TRACE_TAG_APP, scrim == mScrimInFront ? "front_scrim_alpha" : "back_scrim_alpha", Trace.traceCounter(Trace.TRACE_TAG_APP, getScrimName(scrimView) + "_alpha", (int) (alpha * 255)); Trace.traceCounter(Trace.TRACE_TAG_APP, scrim == mScrimInFront ? "front_scrim_tint" : "back_scrim_tint", Trace.traceCounter(Trace.TRACE_TAG_APP, getScrimName(scrimView) + "_tint", Color.alpha(tint)); scrimView.setTint(tint); Loading Loading @@ -643,9 +665,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private float getCurrentScrimAlpha(View scrim) { if (scrim == mScrimInFront) { return mCurrentInFrontAlpha; return mInFrontAlpha; } else if (scrim == mScrimBehind) { return mCurrentBehindAlpha; return mBehindAlpha; } else if (scrim == mScrimForBubble) { return mBubbleAlpha; } else { throw new IllegalArgumentException("Unknown scrim view"); } Loading @@ -653,9 +677,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private int getCurrentScrimTint(View scrim) { if (scrim == mScrimInFront) { return mCurrentInFrontTint; return mInFrontTint; } else if (scrim == mScrimBehind) { return mCurrentBehindTint; return mBehindTint; } else if (scrim == mScrimForBubble) { return mBubbleTint; } else { throw new IllegalArgumentException("Unknown scrim view"); } Loading Loading @@ -698,8 +724,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // When unlocking with fingerprint, we'll fade the scrims from black to transparent. // At the end of the animation we need to remove the tint. if (mState == ScrimState.UNLOCKED) { mCurrentInFrontTint = Color.TRANSPARENT; mCurrentBehindTint = Color.TRANSPARENT; mInFrontTint = Color.TRANSPARENT; mBehindTint = Color.TRANSPARENT; mBubbleTint = Color.TRANSPARENT; } } Loading Loading @@ -804,6 +831,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo /** * Executes a callback after the frame has hit the display. * * @param callback What to run. */ @VisibleForTesting Loading Loading @@ -847,16 +875,35 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println(" ScrimController: "); pw.print(" state: "); pw.println(mState); pw.print(" frontScrim:"); pw.print(" viewAlpha="); pw.print(mScrimInFront.getViewAlpha()); pw.print(" alpha="); pw.print(mCurrentInFrontAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimInFront.getTint())); pw.print(" backScrim:"); pw.print(" viewAlpha="); pw.print(mScrimBehind.getViewAlpha()); pw.print(" alpha="); pw.print(mCurrentBehindAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimBehind.getTint())); pw.print(" mTracking="); pw.println(mTracking); pw.print(" state: "); pw.println(mState); pw.print(" frontScrim:"); pw.print(" viewAlpha="); pw.print(mScrimInFront.getViewAlpha()); pw.print(" alpha="); pw.print(mInFrontAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimInFront.getTint())); pw.print(" backScrim:"); pw.print(" viewAlpha="); pw.print(mScrimBehind.getViewAlpha()); pw.print(" alpha="); pw.print(mBehindAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimBehind.getTint())); pw.print(" bubbleScrim:"); pw.print(" viewAlpha="); pw.print(mScrimForBubble.getViewAlpha()); pw.print(" alpha="); pw.print(mBubbleAlpha); pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimForBubble.getTint())); pw.print(" mTracking="); pw.println(mTracking); } public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) { Loading Loading @@ -903,8 +950,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // in this case, back-scrim needs to be re-evaluated if (mState == ScrimState.AOD || mState == ScrimState.PULSING) { float newBehindAlpha = mState.getBehindAlpha(); if (mCurrentBehindAlpha != newBehindAlpha) { mCurrentBehindAlpha = newBehindAlpha; if (mBehindAlpha != newBehindAlpha) { mBehindAlpha = newBehindAlpha; updateScrims(); } } Loading @@ -919,10 +966,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo public interface Callback { default void onStart() { } default void onDisplayBlanked() { } default void onFinished() { } default void onCancelled() { } } Loading