Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package android.media.cts;
     17 
     18 import static android.media.cts.Utils.compareRemoteUserInfo;
     19 
     20 import android.content.Intent;
     21 import android.media.AudioManager;
     22 import android.media.Rating;
     23 import android.media.VolumeProvider;
     24 import android.media.session.MediaController;
     25 import android.media.session.MediaSession;
     26 import android.media.session.MediaSessionManager.RemoteUserInfo;
     27 import android.media.session.PlaybackState.CustomAction;
     28 import android.net.Uri;
     29 import android.os.Bundle;
     30 import android.os.Handler;
     31 import android.os.Looper;
     32 import android.os.Process;
     33 import android.os.ResultReceiver;
     34 import android.test.AndroidTestCase;
     35 import android.view.KeyEvent;
     36 
     37 /**
     38  * Test {@link android.media.session.MediaController}.
     39  */
     40 public class MediaControllerTest extends AndroidTestCase {
     41     // The maximum time to wait for an operation.
     42     private static final long TIME_OUT_MS = 3000L;
     43     private static final String SESSION_TAG = "test-session";
     44     private static final String EXTRAS_KEY = "test-key";
     45     private static final String EXTRAS_VALUE = "test-val";
     46 
     47     private final Object mWaitLock = new Object();
     48     private Handler mHandler = new Handler(Looper.getMainLooper());
     49     private MediaSession mSession;
     50     private MediaSessionCallback mCallback = new MediaSessionCallback();
     51     private MediaController mController;
     52     private RemoteUserInfo mControllerInfo;
     53 
     54     @Override
     55     protected void setUp() throws Exception {
     56         super.setUp();
     57         mSession = new MediaSession(getContext(), SESSION_TAG);
     58         mSession.setCallback(mCallback, mHandler);
     59         mController = mSession.getController();
     60         mControllerInfo = new RemoteUserInfo(
     61                 getContext().getPackageName(), Process.myPid(), Process.myUid());
     62     }
     63 
     64     public void testGetPackageName() {
     65         assertEquals(getContext().getPackageName(), mController.getPackageName());
     66     }
     67 
     68     public void testGetRatingType() {
     69         assertEquals("Default rating type of a session must be Rating.RATING_NONE",
     70                 Rating.RATING_NONE, mController.getRatingType());
     71 
     72         mSession.setRatingType(Rating.RATING_5_STARS);
     73         assertEquals(Rating.RATING_5_STARS, mController.getRatingType());
     74     }
     75 
     76     public void testGetSessionToken() throws Exception {
     77         assertEquals(mSession.getSessionToken(), mController.getSessionToken());
     78     }
     79 
     80     public void testSendCommand() throws Exception {
     81         synchronized (mWaitLock) {
     82             mCallback.reset();
     83             final String command = "test-command";
     84             final Bundle extras = new Bundle();
     85             extras.putString(EXTRAS_KEY, EXTRAS_VALUE);
     86             mController.sendCommand(command, extras, new ResultReceiver(null));
     87             mWaitLock.wait(TIME_OUT_MS);
     88             assertTrue(mCallback.mOnCommandCalled);
     89             assertNotNull(mCallback.mCommandCallback);
     90             assertEquals(command, mCallback.mCommand);
     91             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
     92             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
     93         }
     94     }
     95 
     96     public void testAdjustVolumeWithIllegalDirection() {
     97         // Call the method with illegal direction. System should not reboot.
     98         mController.adjustVolume(37, 0);
     99     }
    100 
    101     public void testVolumeControl() throws Exception {
    102         VolumeProvider vp = new VolumeProvider(VolumeProvider.VOLUME_CONTROL_ABSOLUTE, 11, 5) {
    103             @Override
    104             public void onSetVolumeTo(int volume) {
    105                 synchronized (mWaitLock) {
    106                     setCurrentVolume(volume);
    107                     mWaitLock.notify();
    108                 }
    109             }
    110 
    111             @Override
    112             public void onAdjustVolume(int direction) {
    113                 synchronized (mWaitLock) {
    114                     switch (direction) {
    115                         case AudioManager.ADJUST_LOWER:
    116                             setCurrentVolume(getCurrentVolume() - 1);
    117                             break;
    118                         case AudioManager.ADJUST_RAISE:
    119                             setCurrentVolume(getCurrentVolume() + 1);
    120                             break;
    121                     }
    122                     mWaitLock.notify();
    123                 }
    124             }
    125         };
    126         mSession.setPlaybackToRemote(vp);
    127 
    128         synchronized (mWaitLock) {
    129             // test setVolumeTo
    130             mController.setVolumeTo(7, 0);
    131             mWaitLock.wait(TIME_OUT_MS);
    132             assertEquals(7, vp.getCurrentVolume());
    133 
    134             // test adjustVolume
    135             mController.adjustVolume(AudioManager.ADJUST_LOWER, 0);
    136             mWaitLock.wait(TIME_OUT_MS);
    137             assertEquals(6, vp.getCurrentVolume());
    138 
    139             mController.adjustVolume(AudioManager.ADJUST_RAISE, 0);
    140             mWaitLock.wait(TIME_OUT_MS);
    141             assertEquals(7, vp.getCurrentVolume());
    142         }
    143     }
    144 
    145     public void testTransportControlsAndMediaSessionCallback() throws Exception {
    146         MediaController.TransportControls controls = mController.getTransportControls();
    147         final MediaSession.Callback callback = (MediaSession.Callback) mCallback;
    148 
    149         synchronized (mWaitLock) {
    150             mCallback.reset();
    151             controls.play();
    152             mWaitLock.wait(TIME_OUT_MS);
    153             assertTrue(mCallback.mOnPlayCalled);
    154             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    155 
    156             mCallback.reset();
    157             controls.pause();
    158             mWaitLock.wait(TIME_OUT_MS);
    159             assertTrue(mCallback.mOnPauseCalled);
    160             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    161 
    162             mCallback.reset();
    163             controls.stop();
    164             mWaitLock.wait(TIME_OUT_MS);
    165             assertTrue(mCallback.mOnStopCalled);
    166             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    167 
    168             mCallback.reset();
    169             controls.fastForward();
    170             mWaitLock.wait(TIME_OUT_MS);
    171             assertTrue(mCallback.mOnFastForwardCalled);
    172             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    173 
    174             mCallback.reset();
    175             controls.rewind();
    176             mWaitLock.wait(TIME_OUT_MS);
    177             assertTrue(mCallback.mOnRewindCalled);
    178             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    179 
    180             mCallback.reset();
    181             controls.skipToPrevious();
    182             mWaitLock.wait(TIME_OUT_MS);
    183             assertTrue(mCallback.mOnSkipToPreviousCalled);
    184             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    185 
    186             mCallback.reset();
    187             controls.skipToNext();
    188             mWaitLock.wait(TIME_OUT_MS);
    189             assertTrue(mCallback.mOnSkipToNextCalled);
    190             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    191 
    192             mCallback.reset();
    193             final long seekPosition = 1000;
    194             controls.seekTo(seekPosition);
    195             mWaitLock.wait(TIME_OUT_MS);
    196             assertTrue(mCallback.mOnSeekToCalled);
    197             assertEquals(seekPosition, mCallback.mSeekPosition);
    198             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    199 
    200             mCallback.reset();
    201             final Rating rating = Rating.newStarRating(Rating.RATING_5_STARS, 3f);
    202             controls.setRating(rating);
    203             mWaitLock.wait(TIME_OUT_MS);
    204             assertTrue(mCallback.mOnSetRatingCalled);
    205             assertEquals(rating.getRatingStyle(), mCallback.mRating.getRatingStyle());
    206             assertEquals(rating.getStarRating(), mCallback.mRating.getStarRating());
    207             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    208 
    209             mCallback.reset();
    210             final String mediaId = "test-media-id";
    211             final Bundle extras = new Bundle();
    212             extras.putString(EXTRAS_KEY, EXTRAS_VALUE);
    213             controls.playFromMediaId(mediaId, extras);
    214             mWaitLock.wait(TIME_OUT_MS);
    215             assertTrue(mCallback.mOnPlayFromMediaIdCalled);
    216             assertEquals(mediaId, mCallback.mMediaId);
    217             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
    218             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    219 
    220             mCallback.reset();
    221             final String query = "test-query";
    222             controls.playFromSearch(query, extras);
    223             mWaitLock.wait(TIME_OUT_MS);
    224             assertTrue(mCallback.mOnPlayFromSearchCalled);
    225             assertEquals(query, mCallback.mQuery);
    226             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
    227             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    228 
    229             mCallback.reset();
    230             final Uri uri = Uri.parse("content://test/popcorn.mod");
    231             controls.playFromUri(uri, extras);
    232             mWaitLock.wait(TIME_OUT_MS);
    233             assertTrue(mCallback.mOnPlayFromUriCalled);
    234             assertEquals(uri, mCallback.mUri);
    235             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
    236             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    237 
    238             mCallback.reset();
    239             final String action = "test-action";
    240             controls.sendCustomAction(action, extras);
    241             mWaitLock.wait(TIME_OUT_MS);
    242             assertTrue(mCallback.mOnCustomActionCalled);
    243             assertEquals(action, mCallback.mAction);
    244             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
    245             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    246 
    247             mCallback.reset();
    248             mCallback.mOnCustomActionCalled = false;
    249             final CustomAction customAction =
    250                     new CustomAction.Builder(action, action, -1).setExtras(extras).build();
    251             controls.sendCustomAction(customAction, extras);
    252             mWaitLock.wait(TIME_OUT_MS);
    253             assertTrue(mCallback.mOnCustomActionCalled);
    254             assertEquals(action, mCallback.mAction);
    255             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
    256             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    257 
    258             mCallback.reset();
    259             final long queueItemId = 1000;
    260             controls.skipToQueueItem(queueItemId);
    261             mWaitLock.wait(TIME_OUT_MS);
    262             assertTrue(mCallback.mOnSkipToQueueItemCalled);
    263             assertEquals(queueItemId, mCallback.mQueueItemId);
    264             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    265 
    266             mCallback.reset();
    267             controls.prepare();
    268             mWaitLock.wait(TIME_OUT_MS);
    269             assertTrue(mCallback.mOnPrepareCalled);
    270             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    271 
    272             mCallback.reset();
    273             controls.prepareFromMediaId(mediaId, extras);
    274             mWaitLock.wait(TIME_OUT_MS);
    275             assertTrue(mCallback.mOnPrepareFromMediaIdCalled);
    276             assertEquals(mediaId, mCallback.mMediaId);
    277             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
    278             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    279 
    280             mCallback.reset();
    281             controls.prepareFromSearch(query, extras);
    282             mWaitLock.wait(TIME_OUT_MS);
    283             assertTrue(mCallback.mOnPrepareFromSearchCalled);
    284             assertEquals(query, mCallback.mQuery);
    285             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
    286             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    287 
    288             mCallback.reset();
    289             controls.prepareFromUri(uri, extras);
    290             mWaitLock.wait(TIME_OUT_MS);
    291             assertTrue(mCallback.mOnPrepareFromUriCalled);
    292             assertEquals(uri, mCallback.mUri);
    293             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
    294             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    295 
    296             mCallback.reset();
    297             KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_STOP);
    298             mController.dispatchMediaButtonEvent(event);
    299             mWaitLock.wait(TIME_OUT_MS);
    300             assertTrue(mCallback.mOnMediaButtonEventCalled);
    301             // KeyEvent doesn't override equals.
    302             assertEquals(KeyEvent.ACTION_DOWN, mCallback.mKeyEvent.getAction());
    303             assertEquals(KeyEvent.KEYCODE_MEDIA_STOP, mCallback.mKeyEvent.getKeyCode());
    304             assertTrue(compareRemoteUserInfo(mControllerInfo, mCallback.mCallerInfo));
    305 
    306             // just call the callback once directly so it's marked as tested
    307             try {
    308                 callback.onPlay();
    309                 callback.onPause();
    310                 callback.onStop();
    311                 callback.onFastForward();
    312                 callback.onRewind();
    313                 callback.onSkipToPrevious();
    314                 callback.onSkipToNext();
    315                 callback.onSeekTo(mCallback.mSeekPosition);
    316                 callback.onSetRating(mCallback.mRating);
    317                 callback.onPlayFromMediaId(mCallback.mMediaId, mCallback.mExtras);
    318                 callback.onPlayFromSearch(mCallback.mQuery, mCallback.mExtras);
    319                 callback.onPlayFromUri(mCallback.mUri, mCallback.mExtras);
    320                 callback.onCustomAction(mCallback.mAction, mCallback.mExtras);
    321                 callback.onCustomAction(mCallback.mAction, mCallback.mExtras);
    322                 callback.onSkipToQueueItem(mCallback.mQueueItemId);
    323                 callback.onPrepare();
    324                 callback.onPrepareFromMediaId(mCallback.mMediaId, mCallback.mExtras);
    325                 callback.onPrepareFromSearch(mCallback.mQuery, mCallback.mExtras);
    326                 callback.onPrepareFromUri(Uri.parse("http://d.android.com"), mCallback.mExtras);
    327                 Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
    328                 mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, event);
    329                 callback.onMediaButtonEvent(mediaButtonIntent);
    330             } catch (IllegalStateException ex) {
    331                 // Expected, since the MediaSession.getCurrentControllerInfo() is called in every
    332                 // callback method, but no controller is sending any command.
    333             }
    334         }
    335     }
    336 
    337     /*
    338     public void testPlaybackInfo() {
    339         final int playbackType = MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL;
    340         final int volumeControl = VolumeProvider.VOLUME_CONTROL_ABSOLUTE;
    341         final int maxVolume = 10;
    342         final int currentVolume = 3;
    343 
    344         AudioAttributes audioAttributes = new AudioAttributes.Builder().build();
    345         MediaController.PlaybackInfo info = new MediaController.PlaybackInfo(
    346                 playbackType, audioAttributes, volumeControl, maxVolume, currentVolume);
    347 
    348         assertEquals(playbackType, info.getPlaybackType());
    349         assertEquals(audioAttributes, info.getAudioAttributes());
    350         assertEquals(volumeControl, info.getVolumeControl());
    351         assertEquals(maxVolume, info.getMaxVolume());
    352         assertEquals(currentVolume, info.getCurrentVolume());
    353     }
    354     */
    355 
    356     private class MediaSessionCallback extends MediaSession.Callback {
    357         private long mSeekPosition;
    358         private long mQueueItemId;
    359         private Rating mRating;
    360         private String mMediaId;
    361         private String mQuery;
    362         private Uri mUri;
    363         private String mAction;
    364         private String mCommand;
    365         private Bundle mExtras;
    366         private ResultReceiver mCommandCallback;
    367         private KeyEvent mKeyEvent;
    368         private RemoteUserInfo mCallerInfo;
    369 
    370         private boolean mOnPlayCalled;
    371         private boolean mOnPauseCalled;
    372         private boolean mOnStopCalled;
    373         private boolean mOnFastForwardCalled;
    374         private boolean mOnRewindCalled;
    375         private boolean mOnSkipToPreviousCalled;
    376         private boolean mOnSkipToNextCalled;
    377         private boolean mOnSeekToCalled;
    378         private boolean mOnSkipToQueueItemCalled;
    379         private boolean mOnSetRatingCalled;
    380         private boolean mOnPlayFromMediaIdCalled;
    381         private boolean mOnPlayFromSearchCalled;
    382         private boolean mOnPlayFromUriCalled;
    383         private boolean mOnCustomActionCalled;
    384         private boolean mOnCommandCalled;
    385         private boolean mOnPrepareCalled;
    386         private boolean mOnPrepareFromMediaIdCalled;
    387         private boolean mOnPrepareFromSearchCalled;
    388         private boolean mOnPrepareFromUriCalled;
    389         private boolean mOnMediaButtonEventCalled;
    390 
    391         public void reset() {
    392             mSeekPosition = -1;
    393             mQueueItemId = -1;
    394             mRating = null;
    395             mMediaId = null;
    396             mQuery = null;
    397             mUri = null;
    398             mAction = null;
    399             mExtras = null;
    400             mCommand = null;
    401             mCommandCallback = null;
    402             mKeyEvent = null;
    403             mCallerInfo = null;
    404 
    405             mOnPlayCalled = false;
    406             mOnPauseCalled = false;
    407             mOnStopCalled = false;
    408             mOnFastForwardCalled = false;
    409             mOnRewindCalled = false;
    410             mOnSkipToPreviousCalled = false;
    411             mOnSkipToNextCalled = false;
    412             mOnSkipToQueueItemCalled = false;
    413             mOnSeekToCalled = false;
    414             mOnSetRatingCalled = false;
    415             mOnPlayFromMediaIdCalled = false;
    416             mOnPlayFromSearchCalled = false;
    417             mOnPlayFromUriCalled = false;
    418             mOnCustomActionCalled = false;
    419             mOnCommandCalled = false;
    420             mOnPrepareCalled = false;
    421             mOnPrepareFromMediaIdCalled = false;
    422             mOnPrepareFromSearchCalled = false;
    423             mOnPrepareFromUriCalled = false;
    424             mOnMediaButtonEventCalled = false;
    425         }
    426 
    427         @Override
    428         public void onPlay() {
    429             synchronized (mWaitLock) {
    430                 mOnPlayCalled = true;
    431                 mCallerInfo = mSession.getCurrentControllerInfo();
    432                 mWaitLock.notify();
    433             }
    434         }
    435 
    436         @Override
    437         public void onPause() {
    438             synchronized (mWaitLock) {
    439                 mOnPauseCalled = true;
    440                 mCallerInfo = mSession.getCurrentControllerInfo();
    441                 mWaitLock.notify();
    442             }
    443         }
    444 
    445         @Override
    446         public void onStop() {
    447             synchronized (mWaitLock) {
    448                 mOnStopCalled = true;
    449                 mCallerInfo = mSession.getCurrentControllerInfo();
    450                 mWaitLock.notify();
    451             }
    452         }
    453 
    454         @Override
    455         public void onFastForward() {
    456             synchronized (mWaitLock) {
    457                 mOnFastForwardCalled = true;
    458                 mCallerInfo = mSession.getCurrentControllerInfo();
    459                 mWaitLock.notify();
    460             }
    461         }
    462 
    463         @Override
    464         public void onRewind() {
    465             synchronized (mWaitLock) {
    466                 mOnRewindCalled = true;
    467                 mCallerInfo = mSession.getCurrentControllerInfo();
    468                 mWaitLock.notify();
    469             }
    470         }
    471 
    472         @Override
    473         public void onSkipToPrevious() {
    474             synchronized (mWaitLock) {
    475                 mOnSkipToPreviousCalled = true;
    476                 mCallerInfo = mSession.getCurrentControllerInfo();
    477                 mWaitLock.notify();
    478             }
    479         }
    480 
    481         @Override
    482         public void onSkipToNext() {
    483             synchronized (mWaitLock) {
    484                 mOnSkipToNextCalled = true;
    485                 mCallerInfo = mSession.getCurrentControllerInfo();
    486                 mWaitLock.notify();
    487             }
    488         }
    489 
    490         @Override
    491         public void onSeekTo(long pos) {
    492             synchronized (mWaitLock) {
    493                 mOnSeekToCalled = true;
    494                 mSeekPosition = pos;
    495                 mCallerInfo = mSession.getCurrentControllerInfo();
    496                 mWaitLock.notify();
    497             }
    498         }
    499 
    500         @Override
    501         public void onSetRating(Rating rating) {
    502             synchronized (mWaitLock) {
    503                 mOnSetRatingCalled = true;
    504                 mRating = rating;
    505                 mCallerInfo = mSession.getCurrentControllerInfo();
    506                 mWaitLock.notify();
    507             }
    508         }
    509 
    510         @Override
    511         public void onPlayFromMediaId(String mediaId, Bundle extras) {
    512             synchronized (mWaitLock) {
    513                 mOnPlayFromMediaIdCalled = true;
    514                 mMediaId = mediaId;
    515                 mExtras = extras;
    516                 mCallerInfo = mSession.getCurrentControllerInfo();
    517                 mWaitLock.notify();
    518             }
    519         }
    520 
    521         @Override
    522         public void onPlayFromSearch(String query, Bundle extras) {
    523             synchronized (mWaitLock) {
    524                 mOnPlayFromSearchCalled = true;
    525                 mQuery = query;
    526                 mExtras = extras;
    527                 mCallerInfo = mSession.getCurrentControllerInfo();
    528                 mWaitLock.notify();
    529             }
    530         }
    531 
    532         @Override
    533         public void onPlayFromUri(Uri uri, Bundle extras) {
    534             synchronized (mWaitLock) {
    535                 mOnPlayFromUriCalled = true;
    536                 mUri = uri;
    537                 mExtras = extras;
    538                 mCallerInfo = mSession.getCurrentControllerInfo();
    539                 mWaitLock.notify();
    540             }
    541         }
    542 
    543         @Override
    544         public void onCustomAction(String action, Bundle extras) {
    545             synchronized (mWaitLock) {
    546                 mOnCustomActionCalled = true;
    547                 mAction = action;
    548                 mExtras = extras;
    549                 mCallerInfo = mSession.getCurrentControllerInfo();
    550                 mWaitLock.notify();
    551             }
    552         }
    553 
    554         @Override
    555         public void onSkipToQueueItem(long id) {
    556             synchronized (mWaitLock) {
    557                 mOnSkipToQueueItemCalled = true;
    558                 mQueueItemId = id;
    559                 mCallerInfo = mSession.getCurrentControllerInfo();
    560                 mWaitLock.notify();
    561             }
    562         }
    563 
    564         @Override
    565         public void onCommand(String command, Bundle extras, ResultReceiver cb) {
    566             synchronized (mWaitLock) {
    567                 mOnCommandCalled = true;
    568                 mCommand = command;
    569                 mExtras = extras;
    570                 mCommandCallback = cb;
    571                 mCallerInfo = mSession.getCurrentControllerInfo();
    572                 mWaitLock.notify();
    573             }
    574         }
    575 
    576         @Override
    577         public void onPrepare() {
    578             synchronized (mWaitLock) {
    579                 mOnPrepareCalled = true;
    580                 mCallerInfo = mSession.getCurrentControllerInfo();
    581                 mWaitLock.notify();
    582             }
    583         }
    584 
    585         @Override
    586         public void onPrepareFromMediaId(String mediaId, Bundle extras) {
    587             synchronized (mWaitLock) {
    588                 mOnPrepareFromMediaIdCalled = true;
    589                 mMediaId = mediaId;
    590                 mExtras = extras;
    591                 mCallerInfo = mSession.getCurrentControllerInfo();
    592                 mWaitLock.notify();
    593             }
    594         }
    595 
    596         @Override
    597         public void onPrepareFromSearch(String query, Bundle extras) {
    598             synchronized (mWaitLock) {
    599                 mOnPrepareFromSearchCalled = true;
    600                 mQuery = query;
    601                 mExtras = extras;
    602                 mCallerInfo = mSession.getCurrentControllerInfo();
    603                 mWaitLock.notify();
    604             }
    605         }
    606 
    607         @Override
    608         public void onPrepareFromUri(Uri uri, Bundle extras) {
    609             synchronized (mWaitLock) {
    610                 mOnPrepareFromUriCalled = true;
    611                 mUri = uri;
    612                 mExtras = extras;
    613                 mCallerInfo = mSession.getCurrentControllerInfo();
    614                 mWaitLock.notify();
    615             }
    616         }
    617 
    618         @Override
    619         public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
    620             synchronized (mWaitLock) {
    621                 mOnMediaButtonEventCalled = true;
    622                 mCallerInfo = mSession.getCurrentControllerInfo();
    623                 mKeyEvent = mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
    624                 mWaitLock.notify();
    625             }
    626             return super.onMediaButtonEvent(mediaButtonIntent);
    627         }
    628     }
    629 }
    630