Fix for testPlayVideo timeout (thanks to Jason Bayer for CountDownLatch).

Change-Id: I5ac61daf583f7a087c4b28b04c6167a1a7b98ea4
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
index d18d684..5ab9b6d 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -45,6 +45,8 @@
 
 import java.io.File;
 import java.io.FileDescriptor;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 @TestTargetClass(MediaPlayer.class)
 public class MediaPlayerTest extends ActivityInstrumentationTestCase2<MediaStubActivity> {
@@ -63,8 +65,8 @@
     private Context mContext;
     private Resources mResources;
     private CtsTestServer mServer;
-    private static Object sVideoSizeChanged;
-    private static Object sLock;
+    private CountDownLatch mVideoSizeChanged = new CountDownLatch(1);
+    private CountDownLatch mLock = new CountDownLatch(1);
     private static Looper sLooper = null;
     private static final int WAIT_FOR_COMMAND_TO_COMPLETE = 60000;  //1 min max.
 
@@ -77,16 +79,6 @@
      */
     private MediaPlayer mMediaPlayer = new MediaPlayer();
 
-    static MediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener =
-        new MediaPlayer.OnVideoSizeChangedListener() {
-            public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
-                synchronized (sVideoSizeChanged) {
-                    Log.v(TAG, "sizechanged notification received ...");
-                    sVideoSizeChanged.notify();
-                }
-            }
-        };
-
     private static class Monitor {
         private boolean signalled;
 
@@ -310,7 +302,7 @@
      * Initializes the message looper so that the mediaPlayer object can
      * receive the callback messages.
      */
-    private static void initializeMessageLooper() {
+    private void initializeMessageLooper() {
         new Thread() {
             @Override
             public void run() {
@@ -319,9 +311,7 @@
                 // Save the looper so that we can terminate this thread
                 // after we are done with it.
                 sLooper = Looper.myLooper();
-                synchronized (sLock) {
-                    sLock.notify();
-                }
+                mLock.countDown();
                 Looper.loop();  // Blocks forever until Looper.quit() is called.
                 Log.v(TAG, "initializeMessageLooper: quit.");
             }
@@ -342,38 +332,36 @@
         final float rightVolume = 0.5f;
         final int resid = R.raw.testvideo;
 
-        sLock = new Object();
-        sVideoSizeChanged = new Object();
-        MediaPlayer mp = new MediaPlayer();
+        mMediaPlayer.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
+            public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
+                mVideoSizeChanged.countDown();
+            }
+        });
         AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
-        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
+        mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
         afd.close();
-        mp.setDisplay(getActivity().getSurfaceHolder());
-        mp.setScreenOnWhilePlaying(true);
-        mp.prepare();
+        mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
+        mMediaPlayer.setScreenOnWhilePlaying(true);
+        mMediaPlayer.prepare();
 
         int videoWidth = 0;
         int videoHeight = 0;
-        synchronized (sLock) {
-            initializeMessageLooper();
-            try {
-                sLock.wait(WAIT_FOR_COMMAND_TO_COMPLETE);
-            } catch(Exception e) {
-                Log.v(TAG, "looper was interrupted.");
-                return;
-            }
-        }
+        initializeMessageLooper();
         try {
-             mp.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
-             synchronized (sVideoSizeChanged) {
-                 try {
-                     sVideoSizeChanged.wait(WAIT_FOR_COMMAND_TO_COMPLETE);
-                 } catch (Exception e) {
-                     Log.v(TAG, "wait was interrupted");
-                 }
+            mLock.await(WAIT_FOR_COMMAND_TO_COMPLETE, TimeUnit.MILLISECONDS);
+        } catch(Exception e) {
+            Log.v(TAG, "looper was interrupted.");
+            return;
+        }
+
+        try {
+             try {
+                 mVideoSizeChanged.await(WAIT_FOR_COMMAND_TO_COMPLETE, TimeUnit.MILLISECONDS);
+             } catch (InterruptedException e) {
+                 Log.v(TAG, "wait was interrupted");
              }
-             videoWidth = mp.getVideoWidth();
-             videoHeight = mp.getVideoHeight();
+             videoWidth = mMediaPlayer.getVideoWidth();
+             videoHeight = mMediaPlayer.getVideoHeight();
              terminateMessageLooper();
         } catch (Exception e) {
              Log.e(TAG, e.getMessage());
@@ -381,15 +369,15 @@
         assertEquals(expectedVideoWidth, videoWidth);
         assertEquals(expectedVideoHeight, videoHeight);
 
-        mp.start();
-        mp.setVolume(leftVolume, rightVolume);
+        mMediaPlayer.start();
+        mMediaPlayer.setVolume(leftVolume, rightVolume);
 
         // waiting to complete
-        while (mp.isPlaying()) {
+        while (mMediaPlayer.isPlaying()) {
             Thread.sleep(SLEEP_TIME);
         }
 
-        mp.release();
+        mMediaPlayer.release();
     }
 
     @TestTargets({