From 3e24dc3906dcacd9f6bf423bafd781a3d7e6a997 Mon Sep 17 00:00:00 2001 From: Galia Peycheva Date: Thu, 26 Jan 2023 14:41:57 +0000 Subject: [PATCH] Release doze wake lock when doze dream is stopped Before this CL, if the doze dream instance is replaced by another dream instance, the doze lock was never released. There is a check in the DreamManagerService#onDreamStopped path, that normally releases the doze lock in a normal wake up. But when the doze dream instance has been replaced by another dream instance, the doze dream token doesn't match the current dream token, and so the doze wake lock is never released. This causes the display to flicker right before entering AOD (dozing). This CL handles the case when a doze dream is replaced by a normal dream and releases the doze lock whenever a doze dream instance is stopped. Bug: 260094933 Test: manual - check that the flickering disappeared Change-Id: I3fdf10566ba57fadfa83a5d78038db68bf4a1150 (cherry picked from commit eeaba58c8ad976b3ae71c1afc8717169afdf8441) --- .../com/android/server/dreams/DreamController.java | 4 ++++ .../android/server/dreams/DreamManagerService.java | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/dreams/DreamController.java b/services/core/java/com/android/server/dreams/DreamController.java index db9deb1ceb69c..f87a1461f9d2c 100644 --- a/services/core/java/com/android/server/dreams/DreamController.java +++ b/services/core/java/com/android/server/dreams/DreamController.java @@ -244,7 +244,10 @@ final class DreamController { } mListener.onDreamStopped(dream.mToken); + } else if (dream.mCanDoze && !mCurrentDream.mCanDoze) { + mListener.stopDozing(dream.mToken); } + } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); } @@ -289,6 +292,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 bb1e3931c02e4..148b80ea0447c 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( @@ -765,6 +770,11 @@ public final class DreamManagerService extends SystemService { } } } + + @Override + public void stopDozing(Binder token) { + stopDozingInternal(token); + } }; private final ContentObserver mDozeEnabledObserver = new ContentObserver(null) {