diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java index d9d74b9d17a63..a2438552e8af6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java @@ -84,6 +84,14 @@ public class DozeScrimController implements StateListener { public void onCancelled() { pulseFinished(); } + + /** + * Whether to timeout wallpaper or not. + */ + @Override + public boolean shouldTimeoutWallpaper() { + return mPulseReason == DozeLog.PULSE_REASON_DOCKING; + } }; public DozeScrimController(DozeParameters dozeParameters) { 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 5dcbea22eea1b..3f38c049a977d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -284,15 +284,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // AOD wallpapers should fade away after a while. // Docking pulses may take a long time, wallpapers should also fade away after a while. - if (mWallpaperSupportsAmbientMode && mDozeParameters.getAlwaysOn() - && mState == ScrimState.AOD) { - if (!mWallpaperVisibilityTimedOut) { - mTimeTicker.schedule(mDozeParameters.getWallpaperAodDuration(), - AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); - } + mWallpaperVisibilityTimedOut = false; + if (shouldFadeAwayWallpaper()) { + mTimeTicker.schedule(mDozeParameters.getWallpaperAodDuration(), + AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); } else { mTimeTicker.cancel(); - mWallpaperVisibilityTimedOut = false; } if (mKeyguardUpdateMonitor.needsSlowUnlockTransition() && mState == ScrimState.UNLOCKED) { @@ -313,6 +310,23 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo dispatchScrimState(mScrimBehind.getViewAlpha()); } + private boolean shouldFadeAwayWallpaper() { + if (!mWallpaperSupportsAmbientMode) { + return false; + } + + if (mState == ScrimState.AOD && mDozeParameters.getAlwaysOn()) { + return true; + } + + if (mState == ScrimState.PULSING + && mCallback != null && mCallback.shouldTimeoutWallpaper()) { + return true; + } + + return false; + } + public ScrimState getState() { return mState; } @@ -387,6 +401,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo setOrAdaptCurrentAnimation(mScrimInFront); dispatchScrimState(mScrimBehind.getViewAlpha()); + + // Reset wallpaper timeout if it's already timeout like expanding panel while PULSING + // and docking. + if (mWallpaperVisibilityTimedOut) { + mWallpaperVisibilityTimedOut = false; + mTimeTicker.schedule(mDozeParameters.getWallpaperAodDuration(), + AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); + } } } @@ -925,6 +947,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } default void onCancelled() { } + /** Returns whether to timeout wallpaper or not. */ + default boolean shouldTimeoutWallpaper() { + return false; + } } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 191c983ad1564..d8e90a5840587 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -507,6 +507,38 @@ public class ScrimControllerTest extends SysuiTestCase { verify(mAlarmManager).cancel(any(AlarmManager.OnAlarmListener.class)); } + @Test + public void transitionToPulsing_withTimeoutWallpaperCallback_willHideWallpaper() { + mScrimController.setWallpaperSupportsAmbientMode(true); + + mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() { + @Override + public boolean shouldTimeoutWallpaper() { + return true; + } + }); + + verify(mAlarmManager).setExact(anyInt(), anyLong(), any(), any(), any()); + } + + @Test + public void transitionToPulsing_withDefaultCallback_wontHideWallpaper() { + mScrimController.setWallpaperSupportsAmbientMode(true); + + mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() {}); + + verify(mAlarmManager, never()).setExact(anyInt(), anyLong(), any(), any(), any()); + } + + @Test + public void transitionToPulsing_withoutCallback_wontHideWallpaper() { + mScrimController.setWallpaperSupportsAmbientMode(true); + + mScrimController.transitionTo(ScrimState.PULSING); + + verify(mAlarmManager, never()).setExact(anyInt(), anyLong(), any(), any(), any()); + } + @Test public void testConservesExpansionOpacityAfterTransition() { mScrimController.transitionTo(ScrimState.UNLOCKED);