| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package android.media.cts; |
| |
| import android.media.AudioManager; |
| import android.media.Rating; |
| import android.media.VolumeProvider; |
| import android.media.session.MediaController; |
| import android.media.session.MediaSession; |
| import android.media.session.PlaybackState.CustomAction; |
| import android.net.Uri; |
| import android.os.Bundle; |
| import android.os.Handler; |
| import android.os.Looper; |
| import android.os.ResultReceiver; |
| import android.test.AndroidTestCase; |
| |
| /** |
| * Test {@link android.media.session.MediaController}. |
| */ |
| public class MediaControllerTest extends AndroidTestCase { |
| // The maximum time to wait for an operation. |
| private static final long TIME_OUT_MS = 3000L; |
| private static final String SESSION_TAG = "test-session"; |
| private static final String EXTRAS_KEY = "test-key"; |
| private static final String EXTRAS_VALUE = "test-val"; |
| |
| private final Object mWaitLock = new Object(); |
| private Handler mHandler = new Handler(Looper.getMainLooper()); |
| private MediaSession mSession; |
| private MediaSessionCallback mCallback = new MediaSessionCallback(); |
| private MediaController mController; |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| mSession = new MediaSession(getContext(), SESSION_TAG); |
| mSession.setCallback(mCallback, mHandler); |
| mController = mSession.getController(); |
| } |
| |
| public void testSendCommand() throws Exception { |
| synchronized (mWaitLock) { |
| mCallback.reset(); |
| final String command = "test-command"; |
| final Bundle extras = new Bundle(); |
| extras.putString(EXTRAS_KEY, EXTRAS_VALUE); |
| mController.sendCommand(command, extras, new ResultReceiver(null)); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnCommandCalled); |
| assertNotNull(mCallback.mCommandCallback); |
| assertEquals(command, mCallback.mCommand); |
| assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY)); |
| } |
| } |
| |
| public void testVolumeControl() throws Exception { |
| VolumeProvider vp = new VolumeProvider(VolumeProvider.VOLUME_CONTROL_ABSOLUTE, 11, 5) { |
| @Override |
| public void onSetVolumeTo(int volume) { |
| synchronized (mWaitLock) { |
| setCurrentVolume(volume); |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onAdjustVolume(int direction) { |
| synchronized (mWaitLock) { |
| switch (direction) { |
| case AudioManager.ADJUST_LOWER: |
| setCurrentVolume(getCurrentVolume() - 1); |
| break; |
| case AudioManager.ADJUST_RAISE: |
| setCurrentVolume(getCurrentVolume() + 1); |
| break; |
| } |
| mWaitLock.notify(); |
| } |
| } |
| }; |
| mSession.setPlaybackToRemote(vp); |
| |
| synchronized (mWaitLock) { |
| // test setVolumeTo |
| mController.setVolumeTo(7, 0); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertEquals(7, vp.getCurrentVolume()); |
| |
| // test adjustVolume |
| mController.adjustVolume(AudioManager.ADJUST_LOWER, 0); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertEquals(6, vp.getCurrentVolume()); |
| |
| mController.adjustVolume(AudioManager.ADJUST_RAISE, 0); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertEquals(7, vp.getCurrentVolume()); |
| } |
| } |
| |
| public void testTransportControlsAndMediaSessionCallback() throws Exception { |
| MediaController.TransportControls controls = mController.getTransportControls(); |
| synchronized (mWaitLock) { |
| mCallback.reset(); |
| controls.play(); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnPlayCalled); |
| |
| mCallback.reset(); |
| controls.pause(); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnPauseCalled); |
| |
| mCallback.reset(); |
| controls.stop(); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnStopCalled); |
| |
| mCallback.reset(); |
| controls.fastForward(); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnFastForwardCalled); |
| |
| mCallback.reset(); |
| controls.rewind(); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnRewindCalled); |
| |
| mCallback.reset(); |
| controls.skipToPrevious(); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnSkipToPreviousCalled); |
| |
| mCallback.reset(); |
| controls.skipToNext(); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnSkipToNextCalled); |
| |
| mCallback.reset(); |
| final long seekPosition = 1000; |
| controls.seekTo(seekPosition); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnSeekToCalled); |
| assertEquals(seekPosition, mCallback.mSeekPosition); |
| |
| mCallback.reset(); |
| final Rating rating = Rating.newStarRating(Rating.RATING_5_STARS, 3f); |
| controls.setRating(rating); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnSetRatingCalled); |
| assertEquals(rating.getRatingStyle(), mCallback.mRating.getRatingStyle()); |
| assertEquals(rating.getStarRating(), mCallback.mRating.getStarRating()); |
| |
| mCallback.reset(); |
| final String mediaId = "test-media-id"; |
| final Bundle extras = new Bundle(); |
| extras.putString(EXTRAS_KEY, EXTRAS_VALUE); |
| controls.playFromMediaId(mediaId, extras); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnPlayFromMediaIdCalled); |
| assertEquals(mediaId, mCallback.mMediaId); |
| assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY)); |
| |
| mCallback.reset(); |
| final String query = "test-query"; |
| controls.playFromSearch(query, extras); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnPlayFromSearchCalled); |
| assertEquals(query, mCallback.mQuery); |
| assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY)); |
| |
| mCallback.reset(); |
| final Uri uri = Uri.parse("content://test/popcorn.mod"); |
| controls.playFromUri(uri, extras); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnPlayFromUriCalled); |
| assertEquals(uri, mCallback.mUri); |
| assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY)); |
| |
| mCallback.reset(); |
| final String action = "test-action"; |
| controls.sendCustomAction(action, extras); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnCustomActionCalled); |
| assertEquals(action, mCallback.mAction); |
| assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY)); |
| |
| mCallback.reset(); |
| mCallback.mOnCustomActionCalled = false; |
| final CustomAction customAction = |
| new CustomAction.Builder(action, action, -1).setExtras(extras).build(); |
| controls.sendCustomAction(customAction, extras); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnCustomActionCalled); |
| assertEquals(action, mCallback.mAction); |
| assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY)); |
| |
| mCallback.reset(); |
| final long queueItemId = 1000; |
| controls.skipToQueueItem(queueItemId); |
| mWaitLock.wait(TIME_OUT_MS); |
| assertTrue(mCallback.mOnSkipToQueueItemCalled); |
| assertEquals(queueItemId, mCallback.mQueueItemId); |
| } |
| } |
| |
| private class MediaSessionCallback extends MediaSession.Callback { |
| private long mSeekPosition; |
| private long mQueueItemId; |
| private Rating mRating; |
| private String mMediaId; |
| private String mQuery; |
| private Uri mUri; |
| private String mAction; |
| private String mCommand; |
| private Bundle mExtras; |
| private ResultReceiver mCommandCallback; |
| |
| private boolean mOnPlayCalled; |
| private boolean mOnPauseCalled; |
| private boolean mOnStopCalled; |
| private boolean mOnFastForwardCalled; |
| private boolean mOnRewindCalled; |
| private boolean mOnSkipToPreviousCalled; |
| private boolean mOnSkipToNextCalled; |
| private boolean mOnSeekToCalled; |
| private boolean mOnSkipToQueueItemCalled; |
| private boolean mOnSetRatingCalled; |
| private boolean mOnPlayFromMediaIdCalled; |
| private boolean mOnPlayFromSearchCalled; |
| private boolean mOnPlayFromUriCalled; |
| private boolean mOnCustomActionCalled; |
| private boolean mOnCommandCalled; |
| |
| public void reset() { |
| mSeekPosition = -1; |
| mQueueItemId = -1; |
| mRating = null; |
| mMediaId = null; |
| mQuery = null; |
| mUri = null; |
| mAction = null; |
| mExtras = null; |
| mCommand = null; |
| mCommandCallback = null; |
| |
| mOnPlayCalled = false; |
| mOnPauseCalled = false; |
| mOnStopCalled = false; |
| mOnFastForwardCalled = false; |
| mOnRewindCalled = false; |
| mOnSkipToPreviousCalled = false; |
| mOnSkipToNextCalled = false; |
| mOnSkipToQueueItemCalled = false; |
| mOnSeekToCalled = false; |
| mOnSetRatingCalled = false; |
| mOnPlayFromMediaIdCalled = false; |
| mOnPlayFromSearchCalled = false; |
| mOnPlayFromUriCalled = false; |
| mOnCustomActionCalled = false; |
| mOnCommandCalled = false; |
| } |
| |
| @Override |
| public void onPlay() { |
| synchronized (mWaitLock) { |
| mOnPlayCalled = true; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onPause() { |
| synchronized (mWaitLock) { |
| mOnPauseCalled = true; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onStop() { |
| synchronized (mWaitLock) { |
| mOnStopCalled = true; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onFastForward() { |
| synchronized (mWaitLock) { |
| mOnFastForwardCalled = true; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onRewind() { |
| synchronized (mWaitLock) { |
| mOnRewindCalled = true; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onSkipToPrevious() { |
| synchronized (mWaitLock) { |
| mOnSkipToPreviousCalled = true; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onSkipToNext() { |
| synchronized (mWaitLock) { |
| mOnSkipToNextCalled = true; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onSeekTo(long pos) { |
| synchronized (mWaitLock) { |
| mOnSeekToCalled = true; |
| mSeekPosition = pos; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onSetRating(Rating rating) { |
| synchronized (mWaitLock) { |
| mOnSetRatingCalled = true; |
| mRating = rating; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onPlayFromMediaId(String mediaId, Bundle extras) { |
| synchronized (mWaitLock) { |
| mOnPlayFromMediaIdCalled = true; |
| mMediaId = mediaId; |
| mExtras = extras; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onPlayFromSearch(String query, Bundle extras) { |
| synchronized (mWaitLock) { |
| mOnPlayFromSearchCalled = true; |
| mQuery = query; |
| mExtras = extras; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onPlayFromUri(Uri uri, Bundle extras) { |
| synchronized (mWaitLock) { |
| mOnPlayFromUriCalled = true; |
| mUri = uri; |
| mExtras = extras; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onCustomAction(String action, Bundle extras) { |
| synchronized (mWaitLock) { |
| mOnCustomActionCalled= true; |
| mAction = action; |
| mExtras = extras; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onSkipToQueueItem(long id) { |
| synchronized (mWaitLock) { |
| mOnSkipToQueueItemCalled = true; |
| mQueueItemId = id; |
| mWaitLock.notify(); |
| } |
| } |
| |
| @Override |
| public void onCommand(String command, Bundle extras, ResultReceiver cb) { |
| synchronized (mWaitLock) { |
| mOnCommandCalled = true; |
| mCommand = command; |
| mExtras = extras; |
| mCommandCallback = cb; |
| mWaitLock.notify(); |
| } |
| } |
| } |
| } |