OSDN Git Service

Fix race condition triggered by quick stop/start of Dream
authorErik Wolsheimer <ewol@google.com>
Wed, 17 May 2017 18:20:43 +0000 (11:20 -0700)
committerErik Wolsheimer <ewol@google.com>
Wed, 17 May 2017 18:20:43 +0000 (11:20 -0700)
Bug: 28455483
Change-Id: I20de24c68e468e61bb8fc704bacf73dc6df63b0a

services/core/java/com/android/server/dreams/DreamManagerService.java

index 79a4dee..cbc1039 100644 (file)
@@ -86,6 +86,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;
 
@@ -349,6 +350,11 @@ public final class DreamManagerService extends SystemService {
 
     private void startDreamLocked(final ComponentName name,
             final boolean isTest, final boolean canDoze, final int userId) {
+        if (mStopDreamRunnable != null) {
+            mHandler.removeCallbacks(mStopDreamRunnable);
+            mStopDreamRunnable = null;
+        }
+
         if (Objects.equal(mCurrentDreamName, name)
                 && mCurrentDreamIsTest == isTest
                 && mCurrentDreamCanDoze == canDoze
@@ -386,13 +392,15 @@ public final class DreamManagerService extends SystemService {
                 mCurrentDreamIsWaking = true;
             }
 
-            mHandler.post(new Runnable() {
+            mStopDreamRunnable = new Runnable() {
                 @Override
                 public void run() {
                     Slog.i(TAG, "Performing gentle wake from dream.");
                     mController.stopDream(immediate);
+                    mStopDreamRunnable = null;
                 }
-            });
+            };
+            mHandler.post(mStopDreamRunnable);
         }
     }