diff options
4 files changed, 67 insertions, 12 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 523724499d96..0c067ff38295 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -40,6 +40,8 @@ import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.volume.VolumeDialogControllerImpl; +import java.util.function.Consumer; + /** * Class factory to provide customizable SystemUI components. */ @@ -84,8 +86,10 @@ public class SystemUIFactory { public ScrimController createScrimController(LightBarController lightBarController, ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim, - LockscreenWallpaper lockscreenWallpaper) { - return new ScrimController(lightBarController, scrimBehind, scrimInFront, headsUpScrim); + LockscreenWallpaper lockscreenWallpaper, + Consumer<Boolean> scrimVisibleListener) { + return new ScrimController(lightBarController, scrimBehind, scrimInFront, headsUpScrim, + scrimVisibleListener); } public NotificationIconAreaController createNotificationIconAreaController(Context context, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 62d4b736d93a..eabf07bcbbd6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -25,6 +25,7 @@ import android.content.Context; import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.os.Trace; import android.util.MathUtils; import android.view.View; import android.view.ViewGroup; @@ -46,6 +47,8 @@ import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.statusbar.stack.ViewState; +import java.util.function.Consumer; + /** * Controls both the scrim behind the notifications and in front of the notifications (when a * security method gets shown). @@ -125,12 +128,16 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, private boolean mWakingUpFromAodInProgress; /** Wake up from AOD transition is animating; need to reset when animation finishes */ private boolean mWakingUpFromAodAnimationRunning; + private boolean mScrimsVisble; + private final Consumer<Boolean> mScrimVisibleListener; public ScrimController(LightBarController lightBarController, ScrimView scrimBehind, - ScrimView scrimInFront, View headsUpScrim) { + ScrimView scrimInFront, View headsUpScrim, + Consumer<Boolean> scrimVisibleListener) { mScrimBehind = scrimBehind; mScrimInFront = scrimInFront; mHeadsUpScrim = headsUpScrim; + mScrimVisibleListener = scrimVisibleListener; final Context context = scrimBehind.getContext(); mUnlockMethodCache = UnlockMethodCache.getInstance(context); mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context); @@ -192,7 +199,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, scheduleUpdate(); } + /** Prepares the wakeUpFromAod animation (while turning on screen); Forces black scrims. */ public void prepareWakeUpFromAod() { + if (mWakingUpFromAodInProgress) { + return; + } mWakingUpFromAodInProgress = true; mWakingUpFromAodStarting = true; mAnimateChange = false; @@ -200,10 +211,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, onPreDraw(); } + /** Starts the wakeUpFromAod animation (once screen is on); animate to transparent scrims. */ public void wakeUpFromAod() { if (mWakeAndUnlocking || mAnimateKeyguardFadingOut) { // Wake and unlocking has a separate transition that must not be interfered with. mWakingUpFromAodStarting = false; + mWakingUpFromAodInProgress = false; return; } if (mWakingUpFromAodStarting) { @@ -218,6 +231,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, mWakeAndUnlocking = true; mAnimatingDozeUnlock = true; mWakingUpFromAodStarting = false; + mWakingUpFromAodInProgress = false; scheduleUpdate(); } @@ -328,7 +342,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, } protected void updateScrims() { - // Make sure we have the right gradients if (mNeedsDrawableColorUpdate) { mNeedsDrawableColorUpdate = false; @@ -359,13 +372,24 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, setScrimInFrontAlpha(1f); setScrimBehindAlpha(0f); } - } else if (!mKeyguardShowing && !mBouncerShowing) { + } else if (!mKeyguardShowing && !mBouncerShowing && !mWakingUpFromAodStarting) { updateScrimNormal(); setScrimInFrontAlpha(0); } else { updateScrimKeyguard(); } mAnimateChange = false; + dispatchScrimsVisible(); + } + + private void dispatchScrimsVisible() { + boolean scrimsVisible = mScrimBehind.getViewAlpha() > 0 || mScrimInFront.getViewAlpha() > 0; + + if (mScrimsVisble != scrimsVisible) { + mScrimsVisble = scrimsVisible; + + mScrimVisibleListener.accept(scrimsVisible); + } } private void updateScrimKeyguard() { @@ -457,6 +481,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, alpha = Math.max(0, Math.min(1.0f, alpha)); scrimView.setViewAlpha(alpha); + Trace.traceCounter(Trace.TRACE_TAG_APP, + scrim == mScrimInFront ? "front_scrim_alpha" : "back_scrim_alpha", + (int) (alpha * 255)); + int dozeTint = Color.TRANSPARENT; boolean dozing = mAnimatingDozeUnlock || mDozing; @@ -464,6 +492,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, if (dozing || frontScrimDozing && scrim == mScrimInFront) { dozeTint = Color.BLACK; } + Trace.traceCounter(Trace.TRACE_TAG_APP, + scrim == mScrimInFront ? "front_scrim_tint" : "back_scrim_tint", + dozeTint == Color.BLACK ? 1 : 0); + scrimView.setTint(dozeTint); } else { scrim.setAlpha(alpha1); @@ -477,6 +509,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, float alpha = (float) animation.getAnimatedValue(); setCurrentScrimAlpha(scrim, alpha); updateScrimColor(scrim); + dispatchScrimsVisible(); }); anim.setInterpolator(getInterpolator()); anim.setStartDelay(mAnimationDelay); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 136c158bb69e..0b57e7c36c05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1132,7 +1132,12 @@ public class StatusBar extends SystemUI implements DemoMode, ScrimView scrimInFront = (ScrimView) mStatusBarWindow.findViewById(R.id.scrim_in_front); View headsUpScrim = mStatusBarWindow.findViewById(R.id.heads_up_scrim); mScrimController = SystemUIFactory.getInstance().createScrimController(mLightBarController, - scrimBehind, scrimInFront, headsUpScrim, mLockscreenWallpaper); + scrimBehind, scrimInFront, headsUpScrim, mLockscreenWallpaper, + scrimsVisible -> { + if (mStatusBarWindowManager != null) { + mStatusBarWindowManager.setScrimsVisible(scrimsVisible); + } + }); if (mScrimSrcModeEnabled) { Runnable runnable = new Runnable() { @Override @@ -5171,6 +5176,9 @@ public class StatusBar extends SystemUI implements DemoMode, mStackScroller.setAnimationsEnabled(true); mVisualStabilityManager.setScreenOn(true); mNotificationPanel.setTouchDisabled(false); + + maybePrepareWakeUpFromAod(); + mDozeServiceHost.stopDozing(); updateVisibleToUser(); updateIsKeyguard(); @@ -5183,11 +5191,7 @@ public class StatusBar extends SystemUI implements DemoMode, mFalsingManager.onScreenTurningOn(); mNotificationPanel.onScreenTurningOn(); - int wakefulness = mWakefulnessLifecycle.getWakefulness(); - if (mDozing && (wakefulness == WAKEFULNESS_WAKING - || wakefulness == WAKEFULNESS_ASLEEP) && !isPulsing()) { - mScrimController.prepareWakeUpFromAod(); - } + maybePrepareWakeUpFromAod(); if (mLaunchCameraOnScreenTurningOn) { mNotificationPanel.launchCamera(false, mLastCameraLaunchSource); @@ -5216,6 +5220,14 @@ public class StatusBar extends SystemUI implements DemoMode, return mWakefulnessLifecycle.getWakefulness(); } + private void maybePrepareWakeUpFromAod() { + int wakefulness = mWakefulnessLifecycle.getWakefulness(); + if (mDozing && (wakefulness == WAKEFULNESS_WAKING + || wakefulness == WAKEFULNESS_ASLEEP) && !isPulsing()) { + mScrimController.prepareWakeUpFromAod(); + } + } + private void vibrateForCameraGesture() { // Make sure to pass -1 for repeat so VibratorService doesn't stop us when going to sleep. mVibrator.vibrate(mCameraLaunchGestureVibePattern, -1 /* repeat */); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java index 836b2ef7e149..d886508a7ffd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java @@ -186,7 +186,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D private boolean isExpanded(State state) { return !state.forceCollapsed && (state.isKeyguardShowingAndNotOccluded() || state.panelVisible || state.keyguardFadingAway || state.bouncerShowing - || state.headsUpShowing); + || state.headsUpShowing || state.scrimsVisible); } private void applyFitsSystemWindows(State state) { @@ -325,6 +325,11 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D apply(mCurrentState); } + public void setScrimsVisible(boolean scrimsVisible) { + mCurrentState.scrimsVisible = scrimsVisible; + apply(mCurrentState); + } + public void setHeadsUpShowing(boolean showing) { mCurrentState.headsUpShowing = showing; apply(mCurrentState); @@ -426,6 +431,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D boolean remoteInputActive; boolean forcePluginOpen; boolean dozing; + boolean scrimsVisible; private boolean isKeyguardShowingAndNotOccluded() { return keyguardShowing && !keyguardOccluded; |