diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java index 5292d3e5fd3b0..3f743b79cd25f 100644 --- a/services/core/java/com/android/server/dreams/DreamManagerService.java +++ b/services/core/java/com/android/server/dreams/DreamManagerService.java @@ -85,6 +85,7 @@ public final class DreamManagerService extends SystemService { private boolean mCurrentDreamCanDoze; private boolean mCurrentDreamIsDozing; private boolean mCurrentDreamIsWaking; + private Runnable mStopDreamRunnable; private int mCurrentDreamDozeScreenState = Display.STATE_UNKNOWN; private int mCurrentDreamDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT; @@ -353,6 +354,12 @@ public final class DreamManagerService extends SystemService { && mCurrentDreamCanDoze == canDoze && mCurrentDreamUserId == userId) { Slog.i(TAG, "Already in target dream."); + // If dream is waking, cancel the wake. + mCurrentDreamIsWaking = false; + if (mStopDreamRunnable != null) { + mHandler.removeCallbacks(mStopDreamRunnable); + mStopDreamRunnable = null; + } return; } @@ -385,13 +392,23 @@ public final class DreamManagerService extends SystemService { mCurrentDreamIsWaking = true; } - mHandler.post(new Runnable() { + if (mStopDreamRunnable != null) { + mHandler.removeCallbacks(mStopDreamRunnable); + mStopDreamRunnable = null; + } + mStopDreamRunnable = new Runnable() { @Override public void run() { - Slog.i(TAG, "Performing gentle wake from dream."); - mController.stopDream(immediate); + synchronized (mLock) { + Slog.i(TAG, "Performing gentle wake from dream."); + mController.stopDream(immediate); + if (mStopDreamRunnable == this) { + mStopDreamRunnable = null; + } + } } - }); + }; + mHandler.post(mStopDreamRunnable); } }