blob: caf2a949124085bb5a115dcef655a438ae2e6b18 [file] [log] [blame]
/*
* 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();
}
}
}
}