Merge "Fix the use of WakeLock." into nyc-andromeda-dev
diff --git a/src/com/android/documentsui/services/FileOperationService.java b/src/com/android/documentsui/services/FileOperationService.java
index d8485ba..3b0e5d2 100644
--- a/src/com/android/documentsui/services/FileOperationService.java
+++ b/src/com/android/documentsui/services/FileOperationService.java
@@ -183,12 +183,12 @@
                 return;
             }
 
-            mWakeLock.acquire();
-
             assert (job != null);
             if (DEBUG) Log.d(TAG, "Scheduling job " + job.id + ".");
             Future<?> future = getExecutorService(operation.getOpType()).submit(job);
             mRunning.put(jobId, new JobRecord(job, future));
+
+            mWakeLock.acquire();
         }
     }
 
@@ -245,6 +245,11 @@
         assert(record != null);
         record.job.cleanup();
 
+        mWakeLock.release();
+        if (!mWakeLock.isHeld()) {
+            mWakeLock = null;
+        }
+
         if (mRunning.isEmpty()) {
             shutdown();
         }
@@ -256,8 +261,6 @@
      */
     private void shutdown() {
         if (DEBUG) Log.d(TAG, "Shutting down. Last serviceId was " + mLastServiceId);
-        mWakeLock.release();
-        mWakeLock = null;
 
         // Turns out, for us, stopSelfResult always returns false in tests,
         // so we can't guard executor shutdown. For this reason we move
diff --git a/tests/common/com/android/documentsui/testing/TestScheduledExecutorService.java b/tests/common/com/android/documentsui/testing/TestScheduledExecutorService.java
index f5001ee..ef4f545 100644
--- a/tests/common/com/android/documentsui/testing/TestScheduledExecutorService.java
+++ b/tests/common/com/android/documentsui/testing/TestScheduledExecutorService.java
@@ -21,6 +21,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Delayed;
@@ -137,8 +138,11 @@
     }
 
     public void runAll() {
-        for (TestFuture future : scheduled) {
+        final Iterator<TestFuture> iter = scheduled.iterator();
+        while (iter.hasNext()) {
+            TestFuture future = iter.next();
             future.runnable.run();
+            iter.remove();
         }
     }
 
diff --git a/tests/unit/com/android/documentsui/services/FileOperationServiceTest.java b/tests/unit/com/android/documentsui/services/FileOperationServiceTest.java
index 3c4d74a..56ddae8 100644
--- a/tests/unit/com/android/documentsui/services/FileOperationServiceTest.java
+++ b/tests/unit/com/android/documentsui/services/FileOperationServiceTest.java
@@ -90,9 +90,15 @@
 
     @Override
     protected void tearDown() {
+        // Release all possibly held wake lock here
+        mExecutor.runAll();
+        mDeletionExecutor.runAll();
+
         // There are lots of progress notifications generated in this test case.
         // Dismiss all of them here.
-        mHandler.dispatchAllMessages();
+        while (mHandler.hasScheduledMessage()) {
+            mHandler.dispatchAllMessages();
+        }
     }
 
     public void testRunsCopyJobs() throws Exception {