MediaController2Test.java revision 3a151f1283d08b40c12e4a17903ba421f23c4342
1fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang/* 2fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Copyright 2018 The Android Open Source Project 3fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 4fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Licensed under the Apache License, Version 2.0 (the "License"); 5fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * you may not use this file except in compliance with the License. 6fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * You may obtain a copy of the License at 7fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 8fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * http://www.apache.org/licenses/LICENSE-2.0 9fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 10fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Unless required by applicable law or agreed to in writing, software 11fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * distributed under the License is distributed on an "AS IS" BASIS, 12fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * See the License for the specific language governing permissions and 14fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * limitations under the License. 15fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 16fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 17fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangpackage androidx.media; 18fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 19e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moonimport static org.junit.Assert.assertEquals; 20fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertFalse; 21fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertNotEquals; 22fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertNotNull; 23fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertNull; 24fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertTrue; 25fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.fail; 26fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 27fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.app.PendingIntent; 28fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.content.Intent; 29fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.media.AudioManager; 30fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.net.Uri; 31fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.os.Build; 32fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.os.Bundle; 33fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.os.Handler; 34fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.os.HandlerThread; 35fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.os.Process; 36fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.os.ResultReceiver; 37fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.support.test.filters.FlakyTest; 38fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.support.test.filters.SdkSuppress; 39fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.support.test.filters.SmallTest; 40fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.support.test.runner.AndroidJUnit4; 41fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 42fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.annotation.NonNull; 43fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.media.MediaController2.ControllerCallback; 44e57a84cc8a3c62a777d4dcf48d1c7f6e58657bf6Jaewan Kimimport androidx.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback; 45fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.media.MediaSession2.ControllerInfo; 46fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.media.MediaSession2.SessionCallback; 47fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.media.TestServiceRegistry.SessionServiceCallback; 48fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.media.TestUtils.SyncHandler; 49fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 50fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport org.junit.After; 51fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport org.junit.Before; 52fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport org.junit.Ignore; 53fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport org.junit.Test; 54fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport org.junit.runner.RunWith; 55fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 56fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.lang.reflect.Method; 57fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.List; 58fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.concurrent.CountDownLatch; 59fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.concurrent.TimeUnit; 60fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.concurrent.atomic.AtomicReference; 61fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 62fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang/** 63fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Tests {@link MediaController2}. 64fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 65fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang// TODO(jaewan): Implement host-side test so controller and session can run in different processes. 66fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang// TODO(jaewan): Fix flaky failure -- see MediaController2Impl.getController() 67fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang// TODO(jaeawn): Revisit create/close session in the sHandler. It's no longer necessary. 68fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang@SdkSuppress(minSdkVersion = Build.VERSION_CODES.KITKAT) 69fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang@RunWith(AndroidJUnit4.class) 70fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang@SmallTest 71fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang@FlakyTest 72fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangpublic class MediaController2Test extends MediaSession2TestBase { 73fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private static final String TAG = "MediaController2Test"; 74fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 75fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang PendingIntent mIntent; 76fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaSession2 mSession; 77fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 mController; 78fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MockPlayer mPlayer; 79fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MockPlaylistAgent mMockAgent; 80fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 81fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Before 82fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 83fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void setUp() throws Exception { 84fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang super.setUp(); 85fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Intent sessionActivity = new Intent(mContext, MockActivity.class); 86fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Create this test specific MediaSession2 to use our own Handler. 87fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mIntent = PendingIntent.getActivity(mContext, 0, sessionActivity, 0); 88fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 89fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mPlayer = new MockPlayer(1); 90fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mMockAgent = new MockPlaylistAgent(); 91fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession = new MediaSession2.Builder(mContext) 92fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 93fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlaylistAgent(mMockAgent) 94fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, new SessionCallback() { 95fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 96fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public SessionCommandGroup2 onConnect(MediaSession2 session, 97fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang ControllerInfo controller) { 98fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (Process.myUid() == controller.getUid()) { 99fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return super.onConnect(session, controller); 100fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 101fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return null; 102fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 103fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 104fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 105fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onPlaylistMetadataChanged(MediaSession2 session, 106fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaPlaylistAgent playlistAgent, 107fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaMetadata2 metadata) { 108fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang super.onPlaylistMetadataChanged(session, playlistAgent, metadata); 109fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 110fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }) 111fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionActivity(mIntent) 112fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId(TAG).build(); 113fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController = createController(mSession.getToken()); 114fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang TestServiceRegistry.getInstance().setHandler(sHandler); 115fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 116fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 117fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @After 118fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 119fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void cleanUp() throws Exception { 120fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang super.cleanUp(); 121fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (mSession != null) { 122fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.close(); 123fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 124fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang TestServiceRegistry.getInstance().cleanUp(); 125fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 126fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 127fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 128fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Test if the {@link MediaSession2TestBase.TestControllerCallback} wraps the callback proxy 129fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * without missing any method. 130fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 131fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 132fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testTestControllerCallback() { 133fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 134fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang Method[] methods = TestControllerCallback.class.getMethods(); 135fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotNull(methods); 136fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang for (int i = 0; i < methods.length; i++) { 137fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // For any methods in the controller callback, TestControllerCallback should have 138fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // overriden the method and call matching API in the callback proxy. 139fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotEquals("TestControllerCallback should override " + methods[i] 140fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang + " and call callback proxy", 141fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang ControllerCallback.class, methods[i].getDeclaringClass()); 142fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 143fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 144fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 145fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 146fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testPlay() { 147fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 148fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.play(); 149fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try { 150fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mCountDownLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 151fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } catch (InterruptedException e) { 152fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang fail(e.getMessage()); 153fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 154fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mPlayCalled); 155fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 156fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 157fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 158fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testPause() { 159fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 160fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.pause(); 161fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try { 162fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mCountDownLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 163fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } catch (InterruptedException e) { 164fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang fail(e.getMessage()); 165fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 166fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mPauseCalled); 167fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 168fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 169fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 170fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testReset() { 171fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 172fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.reset(); 173fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try { 174fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mCountDownLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 175fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } catch (InterruptedException e) { 176fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang fail(e.getMessage()); 177fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 178fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mResetCalled); 179fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 180fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 181fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 182fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testPrepare() { 183fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 184fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.prepare(); 185fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try { 186fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mCountDownLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 187fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } catch (InterruptedException e) { 188fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang fail(e.getMessage()); 189fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 190fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mPrepareCalled); 191fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 192fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 193fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 194fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testSeekTo() { 195fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 196fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final long seekPosition = 12125L; 197fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.seekTo(seekPosition); 198fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try { 199fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mCountDownLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 200fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } catch (InterruptedException e) { 201fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang fail(e.getMessage()); 202fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 203fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mSeekToCalled); 204fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(seekPosition, mPlayer.mSeekPosition); 205fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 206fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 207fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 208fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testGettersAfterConnected() throws InterruptedException { 209fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 210fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int state = MediaPlayerBase.PLAYER_STATE_PLAYING; 211fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final long position = 150000; 212fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final long bufferedPosition = 900000; 213fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final float speed = 0.5f; 2143a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon final MediaItem2 currentMediaItem = TestUtils.createMediaItemWithMetadata(); 215fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 216fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mPlayer.mLastPlayerState = state; 217fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mPlayer.mCurrentPosition = position; 218fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mPlayer.mBufferedPosition = bufferedPosition; 219fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mPlayer.mPlaybackSpeed = speed; 2203a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon mMockAgent.mCurrentMediaItem = currentMediaItem; 221fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 2221e7820def08357c7a191557bccc34e435c9cf6d4Jaewan Kim long time1 = System.currentTimeMillis(); 223fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(mSession.getToken()); 2241e7820def08357c7a191557bccc34e435c9cf6d4Jaewan Kim long time2 = System.currentTimeMillis(); 225fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(state, controller.getPlayerState()); 226fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(bufferedPosition, controller.getBufferedPosition()); 227e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon assertEquals(speed, controller.getPlaybackSpeed(), 0.0f); 2281e7820def08357c7a191557bccc34e435c9cf6d4Jaewan Kim long positionLowerBound = (long) (position + speed * (System.currentTimeMillis() - time2)); 2291e7820def08357c7a191557bccc34e435c9cf6d4Jaewan Kim long currentPosition = controller.getCurrentPosition(); 2301e7820def08357c7a191557bccc34e435c9cf6d4Jaewan Kim long positionUpperBound = (long) (position + speed * (System.currentTimeMillis() - time1)); 2311e7820def08357c7a191557bccc34e435c9cf6d4Jaewan Kim assertTrue("curPos=" + currentPosition + ", lowerBound=" + positionLowerBound 2321e7820def08357c7a191557bccc34e435c9cf6d4Jaewan Kim + ", upperBound=" + positionUpperBound, 2331e7820def08357c7a191557bccc34e435c9cf6d4Jaewan Kim positionLowerBound <= currentPosition && currentPosition <= positionUpperBound); 2343a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon assertEquals(currentMediaItem, controller.getCurrentMediaItem()); 235fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 236fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 237fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 238fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testGetSessionActivity() { 239fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 240fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang PendingIntent sessionActivity = mController.getSessionActivity(); 241fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), sessionActivity.getCreatorPackage()); 242fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(Process.myUid(), sessionActivity.getCreatorUid()); 243fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 244fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 245fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 246fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testSetPlaylist() throws InterruptedException { 247fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 248fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final List<MediaItem2> list = TestUtils.createPlaylist(2); 249fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.setPlaylist(list, null /* Metadata */); 250fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 251fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 252fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mSetPlaylistCalled); 253fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNull(mMockAgent.mMetadata); 254fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 255fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotNull(mMockAgent.mPlaylist); 256fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(list.size(), mMockAgent.mPlaylist.size()); 257fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang for (int i = 0; i < list.size(); i++) { 258fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // MediaController2.setPlaylist does not ensure the equality of the items. 259fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(list.get(i).getMediaId(), mMockAgent.mPlaylist.get(i).getMediaId()); 260fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 261fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 262fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 263fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 264fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * This also tests {@link ControllerCallback#onPlaylistChanged( 265fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * MediaController2, List, MediaMetadata2)}. 266fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 267fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 268fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testGetPlaylist() throws InterruptedException { 269fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 270fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final List<MediaItem2> testList = TestUtils.createPlaylist(2); 271fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final AtomicReference<List<MediaItem2>> listFromCallback = new AtomicReference<>(); 272fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 273fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final ControllerCallback callback = new ControllerCallback() { 274fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 275fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onPlaylistChanged(MediaController2 controller, 276fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang List<MediaItem2> playlist, MediaMetadata2 metadata) { 277fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotNull(playlist); 278fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testList.size(), playlist.size()); 279fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang for (int i = 0; i < playlist.size(); i++) { 280fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testList.get(i).getMediaId(), playlist.get(i).getMediaId()); 281fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 282fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang listFromCallback.set(playlist); 283fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 284fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 285fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 286fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaPlaylistAgent agent = new MockPlaylistAgent() { 287fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 288fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public List<MediaItem2> getPlaylist() { 289fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return testList; 290fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 291fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 292fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 293fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 294fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testControllerCallback_onPlaylistChanged") 295fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, new SessionCallback() {}) 296fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlaylistAgent(agent) 297fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .build()) { 298fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController( 299fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang session.getToken(), true, callback); 300fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang agent.notifyPlaylistChanged(); 301fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 302fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(listFromCallback.get(), controller.getPlaylist()); 303fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 304fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 305fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 306fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 307fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testUpdatePlaylistMetadata() throws InterruptedException { 308fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 309fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaMetadata2 testMetadata = TestUtils.createMetadata(); 310fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.updatePlaylistMetadata(testMetadata); 311fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 312fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 313fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mUpdatePlaylistMetadataCalled); 314fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotNull(mMockAgent.mMetadata); 315fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testMetadata.getMediaId(), mMockAgent.mMetadata.getMediaId()); 316fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 317fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 318fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 319fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testGetPlaylistMetadata() throws InterruptedException { 320fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 321fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaMetadata2 testMetadata = TestUtils.createMetadata(); 322fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final AtomicReference<MediaMetadata2> metadataFromCallback = new AtomicReference<>(); 323fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 324fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final ControllerCallback callback = new ControllerCallback() { 325fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 326fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onPlaylistMetadataChanged(MediaController2 controller, 327fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaMetadata2 metadata) { 328fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotNull(testMetadata); 329fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testMetadata.getMediaId(), metadata.getMediaId()); 330fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang metadataFromCallback.set(metadata); 331fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 332fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 333fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 334fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaPlaylistAgent agent = new MockPlaylistAgent() { 335fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 336fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public MediaMetadata2 getPlaylistMetadata() { 337fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return testMetadata; 338fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 339fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 340fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 341fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 342fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testGetPlaylistMetadata") 343fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, new SessionCallback() {}) 344fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlaylistAgent(agent) 345fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .build()) { 346fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken(), true, callback); 347fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang agent.notifyPlaylistMetadataChanged(); 348fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 349fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(metadataFromCallback.get().getMediaId(), 350fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.getPlaylistMetadata().getMediaId()); 351fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 352fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 353fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 354e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon @Test 355e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon public void testSetPlaybackSpeed() throws Exception { 356e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon prepareLooper(); 357e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon final float speed = 1.5f; 358e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon mController.setPlaybackSpeed(speed); 359e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon assertTrue(mPlayer.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 360e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon assertEquals(speed, mPlayer.mPlaybackSpeed, 0.0f); 361e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon } 362e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon 363fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 364fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Test whether {@link MediaSession2#setPlaylist(List, MediaMetadata2)} is notified 365fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * through the 366fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * {@link ControllerCallback#onPlaylistMetadataChanged(MediaController2, MediaMetadata2)} 367fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * if the controller doesn't have {@link SessionCommand2#COMMAND_CODE_PLAYLIST_GET_LIST} but 368fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * {@link SessionCommand2#COMMAND_CODE_PLAYLIST_GET_LIST_METADATA}. 369fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 370fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 371fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testControllerCallback_onPlaylistMetadataChanged() throws InterruptedException { 372fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 373fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaItem2 item = TestUtils.createMediaItemWithMetadata(); 374fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final List<MediaItem2> list = TestUtils.createPlaylist(2); 375fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 376fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final ControllerCallback callback = new ControllerCallback() { 377fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 378fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onPlaylistMetadataChanged(MediaController2 controller, 379fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaMetadata2 metadata) { 380fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotNull(metadata); 381fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(item.getMediaId(), metadata.getMediaId()); 382fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 383fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 384fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 385fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback sessionCallback = new SessionCallback() { 386fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 387fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public SessionCommandGroup2 onConnect(MediaSession2 session, 388fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang ControllerInfo controller) { 389fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (Process.myUid() == controller.getUid()) { 390fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang SessionCommandGroup2 commands = new SessionCommandGroup2(); 391fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang commands.addCommand(new SessionCommand2( 392fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang SessionCommand2.COMMAND_CODE_PLAYLIST_GET_LIST_METADATA)); 393fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return commands; 394fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 395fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return super.onConnect(session, controller); 396fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 397fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 398fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaPlaylistAgent agent = new MockPlaylistAgent() { 399fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 400fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public MediaMetadata2 getPlaylistMetadata() { 401fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return item.getMetadata(); 402fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 403fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 404fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 405fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public List<MediaItem2> getPlaylist() { 406fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return list; 407fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 408fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 409fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 410fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 411fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testControllerCallback_onPlaylistMetadataChanged") 412fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, sessionCallback) 413fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlaylistAgent(agent) 414fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .build()) { 415fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken(), true, callback); 416fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang agent.notifyPlaylistMetadataChanged(); 417fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 418fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 419fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 420fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 421fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 422fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testAddPlaylistItem() throws InterruptedException { 423fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 424fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int testIndex = 12; 425fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaItem2 testMediaItem = TestUtils.createMediaItemWithMetadata(); 426fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.addPlaylistItem(testIndex, testMediaItem); 427fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 428fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 429fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mAddPlaylistItemCalled); 430fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testIndex, mMockAgent.mIndex); 431fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // MediaController2.addPlaylistItem does not ensure the equality of the items. 432fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testMediaItem.getMediaId(), mMockAgent.mItem.getMediaId()); 433fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 434fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 435fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 436fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testRemovePlaylistItem() throws InterruptedException { 437fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 438fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mMockAgent.mPlaylist = TestUtils.createPlaylist(2); 439fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 440fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Recreate controller for sending removePlaylistItem. 441fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // It's easier to ensure that MediaController2.getPlaylist() returns the playlist from the 442fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // agent. 443fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(mSession.getToken()); 444fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaItem2 targetItem = controller.getPlaylist().get(0); 445fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.removePlaylistItem(targetItem); 446fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 447fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 448fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mRemovePlaylistItemCalled); 449fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(targetItem, mMockAgent.mItem); 450fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 451fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 452fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 453fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testReplacePlaylistItem() throws InterruptedException { 454fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 455fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int testIndex = 12; 456fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaItem2 testMediaItem = TestUtils.createMediaItemWithMetadata(); 457fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.replacePlaylistItem(testIndex, testMediaItem); 458fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 459fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 460fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mReplacePlaylistItemCalled); 461fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // MediaController2.replacePlaylistItem does not ensure the equality of the items. 462fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testMediaItem.getMediaId(), mMockAgent.mItem.getMediaId()); 463fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 464fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 465fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 466fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testSkipToPreviousItem() throws InterruptedException { 467fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 468fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.skipToPreviousItem(); 469fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 470fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mSkipToPreviousItemCalled); 471fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 472fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 473fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 474fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testSkipToNextItem() throws InterruptedException { 475fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 476fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.skipToNextItem(); 477fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 478fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mSkipToNextItemCalled); 479fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 480fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 481fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 482fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testSkipToPlaylistItem() throws InterruptedException { 483fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 484fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(mSession.getToken()); 485fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaItem2 targetItem = TestUtils.createMediaItemWithMetadata(); 486fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.skipToPlaylistItem(targetItem); 487fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 488fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 489fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mSkipToPlaylistItemCalled); 490fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(targetItem, mMockAgent.mItem); 491fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 492fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 493fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 494fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * This also tests {@link ControllerCallback#onShuffleModeChanged(MediaController2, int)}. 495fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 496fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 497fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testGetShuffleMode() throws InterruptedException { 498fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 499fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int testShuffleMode = MediaPlaylistAgent.SHUFFLE_MODE_GROUP; 500fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaPlaylistAgent agent = new MockPlaylistAgent() { 501fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 502fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public int getShuffleMode() { 503fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return testShuffleMode; 504fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 505fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 506fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 507fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final ControllerCallback callback = new ControllerCallback() { 508fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 509fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onShuffleModeChanged(MediaController2 controller, int shuffleMode) { 510fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testShuffleMode, shuffleMode); 511fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 512fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 513fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 514fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.updatePlayer(mPlayer, agent, null); 515fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(mSession.getToken(), true, callback); 516fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang agent.notifyShuffleModeChanged(); 517fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 518fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testShuffleMode, controller.getShuffleMode()); 519fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 520fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 521fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 522fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testSetShuffleMode() throws InterruptedException { 523fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 524fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int testShuffleMode = MediaPlaylistAgent.SHUFFLE_MODE_GROUP; 525fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.setShuffleMode(testShuffleMode); 526fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 527fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 528fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mSetShuffleModeCalled); 529fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testShuffleMode, mMockAgent.mShuffleMode); 530fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 531fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 532fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 533fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * This also tests {@link ControllerCallback#onRepeatModeChanged(MediaController2, int)}. 534fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 535fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 536fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testGetRepeatMode() throws InterruptedException { 537fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 538fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int testRepeatMode = MediaPlaylistAgent.REPEAT_MODE_GROUP; 539fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaPlaylistAgent agent = new MockPlaylistAgent() { 540fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 541fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public int getRepeatMode() { 542fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return testRepeatMode; 543fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 544fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 545fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 546fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final ControllerCallback callback = new ControllerCallback() { 547fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 548fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onRepeatModeChanged(MediaController2 controller, int repeatMode) { 549fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testRepeatMode, repeatMode); 550fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 551fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 552fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 553fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.updatePlayer(mPlayer, agent, null); 554fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(mSession.getToken(), true, callback); 555fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang agent.notifyRepeatModeChanged(); 556fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 557fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testRepeatMode, controller.getRepeatMode()); 558fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 559fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 560fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 561fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testSetRepeatMode() throws InterruptedException { 562fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 563fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int testRepeatMode = MediaPlaylistAgent.REPEAT_MODE_GROUP; 564fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.setRepeatMode(testRepeatMode); 565fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 566fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 567fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mMockAgent.mSetRepeatModeCalled); 568fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testRepeatMode, mMockAgent.mRepeatMode); 569fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 570fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 571fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 572fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testSetVolumeTo() throws Exception { 573fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // TODO(jaewan): Also test with local volume. 574fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 575fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int maxVolume = 100; 576fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int currentVolume = 23; 577fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int volumeControlType = VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE; 578fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang TestVolumeProvider volumeProvider = 579fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang new TestVolumeProvider(volumeControlType, maxVolume, currentVolume); 580fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 581fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.updatePlayer(new MockPlayer(0), null, volumeProvider); 582fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaController2 controller = createController(mSession.getToken(), true, null); 583fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 584fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int targetVolume = 50; 585fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.setVolumeTo(targetVolume, 0 /* flags */); 586fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(volumeProvider.mLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 587fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(volumeProvider.mSetVolumeToCalled); 588fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(targetVolume, volumeProvider.mVolume); 589fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 590fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 591fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 592fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testAdjustVolume() throws Exception { 593fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // TODO(jaewan): Also test with local volume. 594fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 595fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int maxVolume = 100; 596fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int currentVolume = 23; 597fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int volumeControlType = VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE; 598fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang TestVolumeProvider volumeProvider = 599fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang new TestVolumeProvider(volumeControlType, maxVolume, currentVolume); 600fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 601fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.updatePlayer(new MockPlayer(0), null, volumeProvider); 602fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaController2 controller = createController(mSession.getToken(), true, null); 603fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 604fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int direction = AudioManager.ADJUST_RAISE; 605fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.adjustVolume(direction, 0 /* flags */); 606fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(volumeProvider.mLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 607fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(volumeProvider.mAdjustVolumeCalled); 608fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(direction, volumeProvider.mDirection); 609fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 610fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 611fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 612fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testGetPackageName() { 613fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 614fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), mController.getSessionToken().getPackageName()); 615fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 616fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 617fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 618fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testSendCustomCommand() throws InterruptedException { 619fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 620fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // TODO(jaewan): Need to revisit with the permission. 621fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCommand2 testCommand = 622fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang new SessionCommand2(SessionCommand2.COMMAND_CODE_PLAYBACK_PREPARE); 623fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Bundle testArgs = new Bundle(); 624fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testArgs.putString("args", "testSendCustomCommand"); 625fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 626fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 627fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback callback = new SessionCallback() { 628fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 629fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onCustomCommand(MediaSession2 session, ControllerInfo controller, 630fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang SessionCommand2 customCommand, Bundle args, ResultReceiver cb) { 631fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 632fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(testCommand, customCommand); 633fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(TestUtils.equals(testArgs, args)); 634fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNull(cb); 635fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 636fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 637fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 638fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.close(); 639fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession = new MediaSession2.Builder(mContext).setPlayer(mPlayer) 640fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, callback).setId(TAG).build(); 641fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaController2 controller = createController(mSession.getToken()); 642fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.sendCustomCommand(testCommand, testArgs, null); 643fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 644fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 645fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 646fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 647fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testControllerCallback_onConnected() throws InterruptedException { 648fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 649fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // createController() uses controller callback to wait until the controller becomes 650fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // available. 651fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(mSession.getToken()); 652fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotNull(controller); 653fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 654fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 655fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 656fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testControllerCallback_sessionRejects() throws InterruptedException { 657fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 658fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaSession2.SessionCallback sessionCallback = new SessionCallback() { 659fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 660fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public SessionCommandGroup2 onConnect(MediaSession2 session, 661fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang ControllerInfo controller) { 662fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return null; 663fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 664fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 665fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang sHandler.postAndSync(new Runnable() { 666fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 667fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void run() { 668fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.close(); 669fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession = new MediaSession2.Builder(mContext).setPlayer(mPlayer) 670fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, sessionCallback).build(); 671fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 672fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }); 673fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = 674fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang createController(mSession.getToken(), false, null); 675fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotNull(controller); 676fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang waitForConnect(controller, false); 677fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang waitForDisconnect(controller, true); 678fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 679fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 680fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 681fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testControllerCallback_releaseSession() throws InterruptedException { 682fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 683fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.close(); 684fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang waitForDisconnect(mController, true); 685fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 686fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 687fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 688fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testControllerCallback_close() throws InterruptedException { 689fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 690fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.close(); 691fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang waitForDisconnect(mController, true); 692fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 693fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 694fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 695fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testFastForward() throws InterruptedException { 696fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 697fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 698fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback callback = new SessionCallback() { 699fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 700fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onFastForward(MediaSession2 session, ControllerInfo controller) { 701fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 702fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 703fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 704fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 705fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 706fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 707fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, callback) 708fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testFastForward").build()) { 709fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken()); 710fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.fastForward(); 711fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 712fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 713fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 714fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 715fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 716fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testRewind() throws InterruptedException { 717fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 718fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 719fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback callback = new SessionCallback() { 720fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 721fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onRewind(MediaSession2 session, ControllerInfo controller) { 722fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 723fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 724fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 725fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 726fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 727fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 728fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, callback) 729fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testRewind").build()) { 730fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken()); 731fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.rewind(); 732fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 733fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 734fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 735fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 736fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 737fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testPlayFromSearch() throws InterruptedException { 738fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 739fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final String request = "random query"; 740fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Bundle bundle = new Bundle(); 741fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang bundle.putString("key", "value"); 742fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 743fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback callback = new SessionCallback() { 744fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 745fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onPlayFromSearch(MediaSession2 session, ControllerInfo controller, 746fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang String query, Bundle extras) { 747fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang super.onPlayFromSearch(session, controller, query, extras); 748fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 749fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(request, query); 750fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(TestUtils.equals(bundle, extras)); 751fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 752fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 753fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 754fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 755fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 756fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, callback) 757fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testPlayFromSearch").build()) { 758fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken()); 759fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.playFromSearch(request, bundle); 760fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 761fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 762fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 763fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 764fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 765fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testPlayFromUri() throws InterruptedException { 766fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 767fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Uri request = Uri.parse("foo://boo"); 768fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Bundle bundle = new Bundle(); 769fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang bundle.putString("key", "value"); 770fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 771fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback callback = new SessionCallback() { 772fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 773fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onPlayFromUri(MediaSession2 session, ControllerInfo controller, Uri uri, 774fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang Bundle extras) { 775fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 776fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(request, uri); 777fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(TestUtils.equals(bundle, extras)); 778fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 779fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 780fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 781fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 782fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 783fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, callback) 784fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testPlayFromUri").build()) { 785fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken()); 786fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.playFromUri(request, bundle); 787fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 788fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 789fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 790fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 791fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 792fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testPlayFromMediaId() throws InterruptedException { 793fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 794fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final String request = "media_id"; 795fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Bundle bundle = new Bundle(); 796fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang bundle.putString("key", "value"); 797fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 798fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback callback = new SessionCallback() { 799fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 800fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onPlayFromMediaId(MediaSession2 session, ControllerInfo controller, 801fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang String mediaId, Bundle extras) { 802fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 803fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(request, mediaId); 804fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(TestUtils.equals(bundle, extras)); 805fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 806fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 807fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 808fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 809fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 810fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, callback) 811fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testPlayFromMediaId").build()) { 812fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken()); 813fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.playFromMediaId(request, bundle); 814fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 815fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 816fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 817fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 818fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 819fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testPrepareFromSearch() throws InterruptedException { 820fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 821fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final String request = "random query"; 822fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Bundle bundle = new Bundle(); 823fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang bundle.putString("key", "value"); 824fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 825fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback callback = new SessionCallback() { 826fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 827fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onPrepareFromSearch(MediaSession2 session, ControllerInfo controller, 828fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang String query, Bundle extras) { 829fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 830fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(request, query); 831fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(TestUtils.equals(bundle, extras)); 832fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 833fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 834fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 835fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 836fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 837fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, callback) 838fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testPrepareFromSearch").build()) { 839fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken()); 840fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.prepareFromSearch(request, bundle); 841fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 842fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 843fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 844fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 845fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 846fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testPrepareFromUri() throws InterruptedException { 847fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 848fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Uri request = Uri.parse("foo://boo"); 849fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Bundle bundle = new Bundle(); 850fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang bundle.putString("key", "value"); 851fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 852fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback callback = new SessionCallback() { 853fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 854fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onPrepareFromUri(MediaSession2 session, ControllerInfo controller, Uri uri, 855fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang Bundle extras) { 856fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 857fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(request, uri); 858fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(TestUtils.equals(bundle, extras)); 859fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 860fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 861fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 862fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 863fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 864fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, callback) 865fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testPrepareFromUri").build()) { 866fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken()); 867fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.prepareFromUri(request, bundle); 868fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 869fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 870fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 871fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 872fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 873fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testPrepareFromMediaId() throws InterruptedException { 874fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 875fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final String request = "media_id"; 876fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Bundle bundle = new Bundle(); 877fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang bundle.putString("key", "value"); 878fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 879fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback callback = new SessionCallback() { 880fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 881fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onPrepareFromMediaId(MediaSession2 session, ControllerInfo controller, 882fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang String mediaId, Bundle extras) { 883fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 884fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(request, mediaId); 885fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(TestUtils.equals(bundle, extras)); 886fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 887fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 888fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 889fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 890fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 891fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, callback) 892fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testPrepareFromMediaId").build()) { 893fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken()); 894fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.prepareFromMediaId(request, bundle); 895fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 896fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 897fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 898fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 899fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 900fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testSetRating() throws InterruptedException { 901fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 902fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int ratingType = Rating2.RATING_5_STARS; 903fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final float ratingValue = 3.5f; 904fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Rating2 rating = Rating2.newStarRating(ratingType, ratingValue); 905fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final String mediaId = "media_id"; 906fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 907fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 908fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SessionCallback callback = new SessionCallback() { 909fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 910fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onSetRating(MediaSession2 session, ControllerInfo controller, 911fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang String mediaIdOut, Rating2 ratingOut) { 912fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 913fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mediaId, mediaIdOut); 914fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(rating, ratingOut); 915fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 916fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 917fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 918fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 919fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try (MediaSession2 session = new MediaSession2.Builder(mContext) 920fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 921fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, callback) 922fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testSetRating").build()) { 923fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = createController(session.getToken()); 924fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.setRating(mediaId, rating); 925fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 926fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 927fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 928fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 929fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 930fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testIsConnected() throws InterruptedException { 931fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 932fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mController.isConnected()); 933fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang sHandler.postAndSync(new Runnable() { 934fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 935fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void run() { 936fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.close(); 937fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 938fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }); 939fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang waitForDisconnect(mController, true); 940fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertFalse(mController.isConnected()); 941fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 942fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 943fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 944fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Test potential deadlock for calls between controller and session. 945fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 946fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 947fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testDeadlock() throws InterruptedException { 948fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 949fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang sHandler.postAndSync(new Runnable() { 950fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 951fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void run() { 952fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.close(); 953fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession = null; 954fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 955fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }); 956fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 957fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Two more threads are needed not to block test thread nor test wide thread (sHandler). 958fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final HandlerThread sessionThread = new HandlerThread("testDeadlock_session"); 959fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final HandlerThread testThread = new HandlerThread("testDeadlock_test"); 960fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang sessionThread.start(); 961fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testThread.start(); 962fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final SyncHandler sessionHandler = new SyncHandler(sessionThread.getLooper()); 963fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final Handler testHandler = new Handler(testThread.getLooper()); 964fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 965fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang try { 966fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MockPlayer player = new MockPlayer(0); 967fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang sessionHandler.postAndSync(new Runnable() { 968fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 969fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void run() { 970fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession = new MediaSession2.Builder(mContext) 971fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 972fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, new SessionCallback() {}) 973fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId("testDeadlock").build(); 974fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 975fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }); 976fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final MediaController2 controller = createController(mSession.getToken()); 977fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testHandler.post(new Runnable() { 978fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 979fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void run() { 980fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final int state = MediaPlayerBase.PLAYER_STATE_ERROR; 981fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang for (int i = 0; i < 100; i++) { 982fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // triggers call from session to controller. 983fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang player.notifyPlaybackState(state); 984fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // triggers call from controller to session. 985fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.play(); 986fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 987fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Repeat above 988fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang player.notifyPlaybackState(state); 989fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.pause(); 990fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang player.notifyPlaybackState(state); 991fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.reset(); 992fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang player.notifyPlaybackState(state); 993fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.skipToNextItem(); 994fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang player.notifyPlaybackState(state); 995fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.skipToPreviousItem(); 996fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 997fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // This may hang if deadlock happens. 998fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 999fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1000fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }); 1001fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 1002fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } finally { 1003fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (mSession != null) { 1004fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang sessionHandler.postAndSync(new Runnable() { 1005fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 1006fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void run() { 1007fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Clean up here because sessionHandler will be removed afterwards. 1008fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.close(); 1009fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession = null; 1010fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1011fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }); 1012fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1013fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (sessionThread != null) { 1014fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang sessionThread.quitSafely(); 1015fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1016fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (testThread != null) { 1017fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testThread.quitSafely(); 1018fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1019fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1020fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1021fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1022fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 1023fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testGetServiceToken() { 1024fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1025fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang SessionToken2 token = TestUtils.getServiceToken(mContext, MockMediaSessionService2.ID); 1026fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotNull(token); 1027fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), token.getPackageName()); 1028fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(MockMediaSessionService2.ID, token.getId()); 1029fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(SessionToken2.TYPE_SESSION_SERVICE, token.getType()); 1030fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1031fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1032fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 1033fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testConnectToService_sessionService() throws InterruptedException { 1034fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1035fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testConnectToService(MockMediaSessionService2.ID); 1036fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1037fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1038fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 1039fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testConnectToService_libraryService() throws InterruptedException { 1040fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1041fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testConnectToService(MockMediaLibraryService2.ID); 1042fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1043fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1044fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testConnectToService(String id) throws InterruptedException { 1045fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1046fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 1047e57a84cc8a3c62a777d4dcf48d1c7f6e58657bf6Jaewan Kim final MediaLibrarySessionCallback sessionCallback = new MediaLibrarySessionCallback() { 1048fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 1049fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public SessionCommandGroup2 onConnect(@NonNull MediaSession2 session, 1050fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @NonNull ControllerInfo controller) { 1051fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (Process.myUid() == controller.getUid()) { 1052fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (mSession != null) { 1053fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.close(); 1054fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1055fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession = session; 1056fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mPlayer = (MockPlayer) session.getPlayer(); 1057fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(mContext.getPackageName(), controller.getPackageName()); 1058fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertFalse(controller.isTrusted()); 1059fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 1060fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1061fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return super.onConnect(session, controller); 1062fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1063fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }; 1064fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang TestServiceRegistry.getInstance().setSessionCallback(sessionCallback); 1065fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1066fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController = createController(TestUtils.getServiceToken(mContext, id)); 1067fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 1068fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1069fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Test command from controller to session service 1070fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // TODO: Re enable when transport control works 1071fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /* 1072fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.play(); 1073fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 1074fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(mPlayer.mPlayCalled); 1075fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 1076fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1077fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Test command from session service to controller 1078fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // TODO(jaewan): Add equivalent tests again 1079fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /* 1080fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 1081fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.registerPlayerEventCallback((state) -> { 1082fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNotNull(state); 1083fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertEquals(PlaybackState.STATE_REWINDING, state.getState()); 1084fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 1085fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }, sHandler); 1086fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mPlayer.notifyPlaybackState( 1087fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang TestUtils.createPlaybackState(PlaybackState.STATE_REWINDING)); 1088fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 1089fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 1090fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1091fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1092fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 1093fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testControllerAfterSessionIsGone_session() throws InterruptedException { 1094fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1095fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testControllerAfterSessionIsClosed(mSession.getToken().getId()); 1096fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1097fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1098fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // TODO(jaewan): Re-enable this test 1099fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Ignore 1100fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 1101fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testControllerAfterSessionIsClosed_sessionService() throws InterruptedException { 1102fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1103fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /* 1104fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang connectToService(TestUtils.getServiceToken(mContext, MockMediaSessionService2.ID)); 1105fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testControllerAfterSessionIsClosed(MockMediaSessionService2.ID); 1106fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 1107fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1108fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1109fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 1110fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim public void testSubscribeRouteInfo() throws InterruptedException { 1111fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim prepareLooper(); 1112fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim final TestSessionCallback callback = new TestSessionCallback() { 1113fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim @Override 1114fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim public void onSubscribeRoutesInfo(@NonNull MediaSession2 session, 1115fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim @NonNull ControllerInfo controller) { 1116fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim assertEquals(mContext.getPackageName(), controller.getPackageName()); 1117fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim mLatch.countDown(); 1118fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim } 1119fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim 1120fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim @Override 1121fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim public void onUnsubscribeRoutesInfo(@NonNull MediaSession2 session, 1122fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim @NonNull ControllerInfo controller) { 1123fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim assertEquals(mContext.getPackageName(), controller.getPackageName()); 1124fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim mLatch.countDown(); 1125fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim } 1126fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim }; 1127fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim mSession.close(); 1128fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim mSession = new MediaSession2.Builder(mContext).setPlayer(mPlayer) 1129fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim .setSessionCallback(sHandlerExecutor, callback).setId(TAG).build(); 1130fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim final MediaController2 controller = createController(mSession.getToken()); 1131fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim 1132fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim callback.resetLatchCount(1); 1133fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim controller.subscribeRoutesInfo(); 1134fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim assertTrue(callback.mLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 1135fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim 1136fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim callback.resetLatchCount(1); 1137fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim controller.unsubscribeRoutesInfo(); 1138fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim assertTrue(callback.mLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 1139fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim } 1140fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim 1141fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim @Test 1142fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim public void testSelectRouteInfo() throws InterruptedException { 1143fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim prepareLooper(); 1144fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim final Bundle testRoute = new Bundle(); 1145fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim testRoute.putString("id", "testRoute"); 1146fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim final TestSessionCallback callback = new TestSessionCallback() { 1147fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim @Override 1148fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim public void onSelectRoute(@NonNull MediaSession2 session, 1149fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim @NonNull ControllerInfo controller, @NonNull Bundle route) { 1150fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim assertEquals(mContext.getPackageName(), controller.getPackageName()); 1151fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim assertTrue(TestUtils.equals(route, testRoute)); 1152fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim mLatch.countDown(); 1153fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim } 1154fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim }; 1155fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim mSession.close(); 1156fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim mSession = new MediaSession2.Builder(mContext).setPlayer(mPlayer) 1157fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim .setSessionCallback(sHandlerExecutor, callback).setId(TAG).build(); 1158fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim final MediaController2 controller = createController(mSession.getToken()); 1159fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim 1160fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim callback.resetLatchCount(1); 1161fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim controller.selectRoute(testRoute); 1162fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim assertTrue(callback.mLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); 1163fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim } 1164fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim 1165fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim @Test 1166fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testClose_beforeConnected() throws InterruptedException { 1167fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1168fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang MediaController2 controller = 1169fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang createController(mSession.getToken(), false, null); 1170fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang controller.close(); 1171fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1172fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1173fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 1174fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testClose_twice() { 1175fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1176fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.close(); 1177fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.close(); 1178fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1179fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1180fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 1181fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testClose_session() throws InterruptedException { 1182fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1183fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final String id = mSession.getToken().getId(); 1184fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.close(); 1185fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // close is done immediately for session. 1186fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testNoInteraction(); 1187fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1188fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Test whether the controller is notified about later close of the session or 1189fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // re-creation. 1190fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testControllerAfterSessionIsClosed(id); 1191fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1192fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1193fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Ignore 1194fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 1195fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testClose_sessionService() throws InterruptedException { 1196fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1197fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testCloseFromService(MockMediaSessionService2.ID); 1198fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1199fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1200fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Ignore 1201fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Test 1202fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void testClose_libraryService() throws InterruptedException { 1203fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang prepareLooper(); 1204fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testCloseFromService(MockMediaLibraryService2.ID); 1205fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1206fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1207fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private void testCloseFromService(String id) throws InterruptedException { 1208fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 1209fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang TestServiceRegistry.getInstance().setSessionServiceCallback(new SessionServiceCallback() { 1210fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 1211fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onCreated() { 1212fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Do nothing. 1213fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1214fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1215fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 1216fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onDestroyed() { 1217fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 1218fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1219fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }); 1220fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController = createController(TestUtils.getServiceToken(mContext, id)); 1221fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mController.close(); 1222fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Wait until close triggers onDestroy() of the session service. 1223fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 1224fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertNull(TestServiceRegistry.getInstance().getServiceInstance()); 1225fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testNoInteraction(); 1226fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1227fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Test whether the controller is notified about later close of the session or 1228fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // re-creation. 1229fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testControllerAfterSessionIsClosed(id); 1230fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1231fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1232fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private void testControllerAfterSessionIsClosed(final String id) throws InterruptedException { 1233fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // This cause session service to be died. 1234fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.close(); 1235fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang waitForDisconnect(mController, true); 1236fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testNoInteraction(); 1237fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1238fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Ensure that the controller cannot use newly create session with the same ID. 1239fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Recreated session has different session stub, so previously created controller 1240fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // shouldn't be available. 1241fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession = new MediaSession2.Builder(mContext) 1242fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setPlayer(mPlayer) 1243fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setSessionCallback(sHandlerExecutor, new SessionCallback() {}) 1244fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang .setId(id).build(); 1245fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang testNoInteraction(); 1246fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1247fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1248fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Test that mSession and mController doesn't interact. 1249fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Note that this method can be called after the mSession is died, so mSession may not have 1250fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // valid player. 1251fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private void testNoInteraction() throws InterruptedException { 1252fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // TODO: check that calls from the controller to session shouldn't be delivered. 1253fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1254fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // Calls from the session to controller shouldn't be delivered. 1255fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch latch = new CountDownLatch(1); 1256fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang setRunnableForOnCustomCommand(mController, new Runnable() { 1257fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 1258fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void run() { 1259fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang latch.countDown(); 1260fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1261fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang }); 1262fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang SessionCommand2 customCommand = new SessionCommand2("testNoInteraction", null); 1263fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSession.sendCustomCommand(customCommand, null); 1264fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang assertFalse(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); 1265fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang setRunnableForOnCustomCommand(mController, null); 1266fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1267fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1268fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // TODO(jaewan): Add test for service connect rejection, when we differentiate session 1269fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang // active/inactive and connection accept/refuse 1270fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1271fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang class TestVolumeProvider extends VolumeProviderCompat { 1272fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang final CountDownLatch mLatch = new CountDownLatch(1); 1273fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang boolean mSetVolumeToCalled; 1274fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang boolean mAdjustVolumeCalled; 1275fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang int mVolume; 1276fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang int mDirection; 1277fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1278fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang TestVolumeProvider(int controlType, int maxVolume, int currentVolume) { 1279fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang super(controlType, maxVolume, currentVolume); 1280fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1281fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1282fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 1283fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onSetVolumeTo(int volume) { 1284fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mSetVolumeToCalled = true; 1285fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mVolume = volume; 1286fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mLatch.countDown(); 1287fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1288fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 1289fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Override 1290fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public void onAdjustVolume(int direction) { 1291fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mAdjustVolumeCalled = true; 1292fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mDirection = direction; 1293fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mLatch.countDown(); 1294fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1295fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 1296fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim 1297fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim class TestSessionCallback extends SessionCallback { 1298fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim CountDownLatch mLatch; 1299fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim 1300fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim void resetLatchCount(int count) { 1301fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim mLatch = new CountDownLatch(count); 1302fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim } 1303fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim } 1304fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang} 1305