diff --git a/services/core/java/com/android/server/dreams/DreamController.java b/services/core/java/com/android/server/dreams/DreamController.java index e5357f61d076e..c38fea21b5a42 100644 --- a/services/core/java/com/android/server/dreams/DreamController.java +++ b/services/core/java/com/android/server/dreams/DreamController.java @@ -281,7 +281,10 @@ final class DreamController { new int[] {ACTIVITY_TYPE_DREAM}); mListener.onDreamStopped(dream.mToken); + } else if (dream.mCanDoze && !mCurrentDream.mCanDoze) { + mListener.stopDozing(dream.mToken); } + } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); } @@ -327,6 +330,7 @@ final class DreamController { */ public interface Listener { void onDreamStopped(Binder token); + void stopDozing(Binder token); } private final class DreamRecord implements DeathRecipient, ServiceConnection { diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java index a4d2d03a7ca8b..d9cdba7af9150 100644 --- a/services/core/java/com/android/server/dreams/DreamManagerService.java +++ b/services/core/java/com/android/server/dreams/DreamManagerService.java @@ -499,7 +499,12 @@ public final class DreamManagerService extends SystemService { } synchronized (mLock) { - if (mCurrentDream != null && mCurrentDream.token == token && mCurrentDream.isDozing) { + if (mCurrentDream == null) { + return; + } + + final boolean sameDream = mCurrentDream.token == token; + if ((sameDream && mCurrentDream.isDozing) || (!sameDream && !mCurrentDream.isDozing)) { mCurrentDream.isDozing = false; mDozeWakeLock.release(); mPowerManagerInternal.setDozeOverrideFromDreamManager( @@ -768,6 +773,11 @@ public final class DreamManagerService extends SystemService { } } } + + @Override + public void stopDozing(Binder token) { + stopDozingInternal(token); + } }; private final ContentObserver mDozeEnabledObserver = new ContentObserver(null) {