Add CTS tests for shuffle/repeat commands in MediaSession

Bug: 27317954
Change-Id: I7dd9ef5a378391ad00a252ba209938967b9cd255
diff --git a/tests/tests/media/src/android/media/cts/MediaControllerTest.java b/tests/tests/media/src/android/media/cts/MediaControllerTest.java
index a6da2d9..69247f5 100644
--- a/tests/tests/media/src/android/media/cts/MediaControllerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaControllerTest.java
@@ -21,6 +21,7 @@
 import android.media.VolumeProvider;
 import android.media.session.MediaController;
 import android.media.session.MediaSession;
+import android.media.session.PlaybackState;
 import android.media.session.PlaybackState.CustomAction;
 import android.net.Uri;
 import android.os.Bundle;
@@ -257,6 +258,20 @@
             assertTrue(mCallback.mOnPrepareFromUriCalled);
             assertEquals(uri, mCallback.mUri);
             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
+
+            mCallback.reset();
+            final int repeatMode = PlaybackState.REPEAT_MODE_ALL;
+            controls.setRepeatMode(repeatMode);
+            mWaitLock.wait(TIME_OUT_MS);
+            assertTrue(mCallback.mOnSetRepeatModeCalled);
+            assertEquals(repeatMode, mCallback.mRepeatMode);
+
+            mCallback.reset();
+            final boolean shuffleMode = true;
+            controls.setShuffleMode(shuffleMode);
+            mWaitLock.wait(TIME_OUT_MS);
+            assertTrue(mCallback.mOnSetShuffleModeCalled);
+            assertEquals(shuffleMode, mCallback.mShuffleMode);
         }
     }
 
@@ -288,6 +303,8 @@
         private String mCommand;
         private Bundle mExtras;
         private ResultReceiver mCommandCallback;
+        private int mRepeatMode;
+        private boolean mShuffleMode;
 
         private boolean mOnPlayCalled;
         private boolean mOnPauseCalled;
@@ -308,6 +325,8 @@
         private boolean mOnPrepareFromMediaIdCalled;
         private boolean mOnPrepareFromSearchCalled;
         private boolean mOnPrepareFromUriCalled;
+        private boolean mOnSetRepeatModeCalled;
+        private boolean mOnSetShuffleModeCalled;
 
         public void reset() {
             mSeekPosition = -1;
@@ -320,6 +339,8 @@
             mExtras = null;
             mCommand = null;
             mCommandCallback = null;
+            mShuffleMode = false;
+            mRepeatMode = PlaybackState.REPEAT_MODE_NONE;
 
             mOnPlayCalled = false;
             mOnPauseCalled = false;
@@ -340,6 +361,8 @@
             mOnPrepareFromMediaIdCalled = false;
             mOnPrepareFromSearchCalled = false;
             mOnPrepareFromUriCalled = false;
+            mOnSetRepeatModeCalled = false;
+            mOnSetShuffleModeCalled = false;
         }
 
         @Override
@@ -513,5 +536,23 @@
                 mWaitLock.notify();
             }
         }
+
+        @Override
+        public void onSetRepeatMode(int repeatMode) {
+            synchronized (mWaitLock) {
+                mOnSetRepeatModeCalled = true;
+                mRepeatMode = repeatMode;
+                mWaitLock.notify();
+            }
+        }
+
+        @Override
+        public void onSetShuffleMode(boolean shuffleMode) {
+            synchronized (mWaitLock) {
+                mOnSetShuffleModeCalled = true;
+                mShuffleMode = shuffleMode;
+                mWaitLock.notify();
+            }
+        }
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaSessionTest.java b/tests/tests/media/src/android/media/cts/MediaSessionTest.java
index 3ebe6e4..c812896 100644
--- a/tests/tests/media/src/android/media/cts/MediaSessionTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaSessionTest.java
@@ -208,6 +208,24 @@
             mSession.setSessionActivity(pi);
             assertEquals(pi, controller.getSessionActivity());
 
+            // test setRepeatMode
+            mCallback.resetLocked();
+            final int repeatMode = PlaybackState.REPEAT_MODE_ALL;
+            mSession.setRepeatMode(repeatMode);
+            mWaitLock.wait(TIME_OUT_MS);
+            assertTrue(mCallback.mOnRepeatModeChangedCalled);
+            assertEquals(repeatMode, mCallback.mRepeatMode);
+            assertEquals(repeatMode, controller.getRepeatMode());
+
+            // test setShuffleMode
+            mCallback.resetLocked();
+            final boolean shuffleMode = true;
+            mSession.setShuffleMode(shuffleMode);
+            mWaitLock.wait(TIME_OUT_MS);
+            assertTrue(mCallback.mOnShuffleModeChangedCalled);
+            assertEquals(shuffleMode, mCallback.mShuffleMode);
+            assertEquals(shuffleMode, controller.getShuffleMode());
+
             // test setActivity
             mSession.setActive(true);
             assertTrue(mSession.isActive());
@@ -349,6 +367,8 @@
         private volatile boolean mOnAudioInfoChangedCalled;
         private volatile boolean mOnSessionDestroyedCalled;
         private volatile boolean mOnSessionEventCalled;
+        private volatile boolean mOnRepeatModeChangedCalled;
+        private volatile boolean mOnShuffleModeChangedCalled;
 
         private volatile PlaybackState mPlaybackState;
         private volatile MediaMetadata mMediaMetadata;
@@ -357,6 +377,8 @@
         private volatile String mEvent;
         private volatile Bundle mExtras;
         private volatile MediaController.PlaybackInfo mPlaybackInfo;
+        private volatile int mRepeatMode;
+        private volatile boolean mShuffleMode;
 
         public void resetLocked() {
             mOnPlaybackStateChangedCalled = false;
@@ -367,6 +389,8 @@
             mOnAudioInfoChangedCalled = false;
             mOnSessionDestroyedCalled = false;
             mOnSessionEventCalled = false;
+            mOnRepeatModeChangedCalled = false;
+            mOnShuffleModeChangedCalled = false;
 
             mPlaybackState = null;
             mMediaMetadata = null;
@@ -374,6 +398,8 @@
             mTitle = null;
             mExtras = null;
             mPlaybackInfo = null;
+            mRepeatMode = PlaybackState.REPEAT_MODE_NONE;
+            mShuffleMode = false;
         }
 
         @Override
@@ -447,5 +473,23 @@
                 mWaitLock.notify();
             }
         }
+
+        @Override
+        public void onRepeatModeChanged(int repeatMode) {
+            synchronized (mWaitLock) {
+                mOnRepeatModeChangedCalled = true;
+                mRepeatMode = repeatMode;
+                mWaitLock.notify();
+            }
+        }
+
+        @Override
+        public void onShuffleModeChanged(boolean shuffleMode) {
+            synchronized (mWaitLock) {
+                mOnShuffleModeChangedCalled = true;
+                mShuffleMode = shuffleMode;
+                mWaitLock.notify();
+            }
+        }
     }
 }