summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Galia Peycheva <galinap@google.com> 2023-01-26 14:41:57 +0000
committer Galia Peycheva <galinap@google.com> 2023-01-27 17:13:28 +0000
commit3e24dc3906dcacd9f6bf423bafd781a3d7e6a997 (patch)
tree5b8f54422e2a1c15623db0ab468dba2bda95f02c
parent7e9ff1ef7b1b5455755d1c0d2a1c31593d452ff2 (diff)
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)
-rw-r--r--services/core/java/com/android/server/dreams/DreamController.java4
-rw-r--r--services/core/java/com/android/server/dreams/DreamManagerService.java12
2 files changed, 15 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/dreams/DreamController.java b/services/core/java/com/android/server/dreams/DreamController.java
index db9deb1ceb69..f87a1461f9d2 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 bb1e3931c02e..148b80ea0447 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) {