am f73562c8: Fix Flakiness in MediaScannerNotificationTest

* commit 'f73562c8bf0af0d23fa7c72e7305345d57f8fd7f':
  Fix Flakiness in MediaScannerNotificationTest
diff --git a/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java b/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java
index 3c201ca..c753ff1 100644
--- a/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java
@@ -24,84 +24,53 @@
 import android.os.Environment;
 import android.test.AndroidTestCase;
 
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 public class MediaScannerNotificationTest extends AndroidTestCase {
-    private static final int MEDIA_SCANNER_TIME_OUT = 2000;
 
-    private ScannerNotificationReceiver mScannerStartedReceiver;
-    private ScannerNotificationReceiver mScannerFinishedReceiver;
-    private boolean mScannerStarted;
-    private boolean mScannerFinished;
-
-    public void testMediaScannerNotification() throws InterruptedException {
-        mScannerStarted = false;
-        mScannerFinished = false;
-
-        IntentFilter scannerStartedIntentFilter = new IntentFilter(
+    public void testMediaScannerNotification() throws Exception {
+        ScannerNotificationReceiver startedReceiver = new ScannerNotificationReceiver(
                 Intent.ACTION_MEDIA_SCANNER_STARTED);
-        scannerStartedIntentFilter.addDataScheme("file");
-        IntentFilter scannerFinshedIntentFilter = new IntentFilter(
-                Intent.ACTION_MEDIA_SCANNER_FINISHED);
-        scannerFinshedIntentFilter.addDataScheme("file");
-
-        mScannerStartedReceiver = new ScannerNotificationReceiver(
-                Intent.ACTION_MEDIA_SCANNER_STARTED);
-        mScannerFinishedReceiver = new ScannerNotificationReceiver(
+        ScannerNotificationReceiver finishedReceiver = new ScannerNotificationReceiver(
                 Intent.ACTION_MEDIA_SCANNER_FINISHED);
 
-        getContext().registerReceiver(mScannerStartedReceiver, scannerStartedIntentFilter);
-        getContext().registerReceiver(mScannerFinishedReceiver, scannerFinshedIntentFilter);
+        IntentFilter startedIntentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
+        startedIntentFilter.addDataScheme("file");
+        IntentFilter finshedIntentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_FINISHED);
+        finshedIntentFilter.addDataScheme("file");
 
-        getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
-            + Environment.getExternalStorageDirectory())));
-        mScannerStartedReceiver.waitForCalls(1, MEDIA_SCANNER_TIME_OUT);
-        mScannerFinishedReceiver.waitForCalls(1, MEDIA_SCANNER_TIME_OUT);
+        mContext.registerReceiver(startedReceiver, startedIntentFilter);
+        mContext.registerReceiver(finishedReceiver, finshedIntentFilter);
 
-        assertTrue(mScannerStarted);
-        assertTrue(mScannerFinished);
+        mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+                + Environment.getExternalStorageDirectory())));
+
+        startedReceiver.waitForBroadcast();
+        finishedReceiver.waitForBroadcast();
     }
 
-    class ScannerNotificationReceiver extends BroadcastReceiver {
-        private int mCalls;
-        private int mExpectedCalls;
-        private String mAction;
-        private Object mLock;
+    static class ScannerNotificationReceiver extends BroadcastReceiver {
+
+        private static final int TIMEOUT_MS = 30 * 1000;
+
+        private final String mAction;
+        private final CountDownLatch mLatch = new CountDownLatch(1);
 
         ScannerNotificationReceiver(String action) {
             mAction = action;
-            reset();
-            mLock = new Object();
-        }
-
-        void reset() {
-            mExpectedCalls = Integer.MAX_VALUE;
-            mCalls = 0;
         }
 
         @Override
         public void onReceive(Context context, Intent intent) {
             if (intent.getAction().equals(mAction)) {
-                if (mAction.equals(Intent.ACTION_MEDIA_SCANNER_STARTED)) {
-                    mScannerStarted = true;
-                } else if (mAction.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
-                    mScannerFinished = true;
-                }
-                synchronized (mLock) {
-                    mCalls += 1;
-                    if (mCalls >= mExpectedCalls) {
-                        mLock.notify();
-                    }
-                }
+                mLatch.countDown();
             }
         }
 
-        public void waitForCalls(int expectedCalls, long timeout) throws InterruptedException {
-            synchronized(mLock) {
-                mExpectedCalls = expectedCalls;
-                if (mCalls < mExpectedCalls) {
-                    mLock.wait(timeout);
-                }
-            }
+        public void waitForBroadcast() throws InterruptedException {
+            assertTrue("Failed to receive broadcast for " + mAction,
+                    mLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
         }
     }
 }