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