1297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon/* 2297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * Copyright (C) 2016 The Android Open Source Project 3297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * 4297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * Licensed under the Apache License, Version 2.0 (the "License"); 5297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * you may not use this file except in compliance with the License. 6297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * You may obtain a copy of the License at 7297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * 8297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * http://www.apache.org/licenses/LICENSE-2.0 9297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * 10297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * Unless required by applicable law or agreed to in writing, software 11297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * distributed under the License is distributed on an "AS IS" BASIS, 12297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * See the License for the specific language governing permissions and 14297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * limitations under the License. 15297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon */ 16297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 17297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonpackage android.support.v4.media; 18297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 19297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport static android.support.test.InstrumentationRegistry.getInstrumentation; 20297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 21297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport static junit.framework.Assert.assertEquals; 2228cc3f625d85a7e9796f568854b851e315cba28eDonghyun Choimport static junit.framework.Assert.assertFalse; 238015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moonimport static junit.framework.Assert.assertNotNull; 2417fc09080d4abeacaef1304667dd8d0006c5a3d4Hyundo Moonimport static junit.framework.Assert.assertNull; 2528cc3f625d85a7e9796f568854b851e315cba28eDonghyun Choimport static junit.framework.Assert.assertTrue; 268015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moonimport static junit.framework.Assert.fail; 27297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 28297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport android.content.ComponentName; 29297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport android.os.Bundle; 30f21a3fb4d2023cc17983cab58931652063b66295Aurimas Liutikasimport android.support.test.filters.LargeTest; 31d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moonimport android.support.test.filters.MediumTest; 32297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport android.support.test.filters.SmallTest; 33297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport android.support.test.runner.AndroidJUnit4; 346d20a527c6adad79f5fb48ec8bc02d738db1e1d2Aurimas Liutikasimport android.support.testutils.PollingCheck; 35297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport android.support.v4.media.MediaBrowserCompat.MediaItem; 36297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 378015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moonimport org.junit.Before; 38297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport org.junit.Test; 39297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport org.junit.runner.RunWith; 40297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 41297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport java.util.ArrayList; 42297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonimport java.util.List; 43297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 44297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon/** 45297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * Test {@link android.support.v4.media.MediaBrowserCompat}. 46297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon */ 47297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon@RunWith(AndroidJUnit4.class) 48297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moonpublic class MediaBrowserCompatTest { 49297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 50297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // The maximum time to wait for an operation. 51297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private static final long TIME_OUT_MS = 3000L; 52297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 53297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon /** 54297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * To check {@link MediaBrowserCompat#unsubscribe} works properly, 55297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * we notify to the browser after the unsubscription that the media items have changed. 56297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * Then {@link MediaBrowserCompat.SubscriptionCallback#onChildrenLoaded} should not be called. 57297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * 58297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * The measured time from calling {@link StubMediaBrowserServiceCompat#notifyChildrenChanged} 59297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * to {@link MediaBrowserCompat.SubscriptionCallback#onChildrenLoaded} being called is about 60297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * 50ms. 61297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon * So we make the thread sleep for 100ms to properly check that the callback is not called. 62297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon */ 63297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private static final long SLEEP_MS = 100L; 64297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private static final ComponentName TEST_BROWSER_SERVICE = new ComponentName( 65297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon "android.support.mediacompat.test", 66297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon "android.support.v4.media.StubMediaBrowserServiceCompat"); 6728cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho private static final ComponentName TEST_REMOTE_BROWSER_SERVICE = new ComponentName( 6828cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho "android.support.mediacompat.test", 6928cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho "android.support.v4.media.StubRemoteMediaBrowserServiceCompat"); 70297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private static final ComponentName TEST_INVALID_BROWSER_SERVICE = new ComponentName( 71297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon "invalid.package", "invalid.ServiceClassName"); 72297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 73297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private MediaBrowserCompat mMediaBrowser; 748015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon private StubConnectionCallback mConnectionCallback; 758015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon private StubSubscriptionCallback mSubscriptionCallback; 768015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon private StubItemCallback mItemCallback; 778015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon 788015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon @Before 798015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void setUp() { 808015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mConnectionCallback = new StubConnectionCallback(); 818015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback = new StubSubscriptionCallback(); 828015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mItemCallback = new StubItemCallback(); 838015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 84297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 85297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Test 86297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @SmallTest 878015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testMediaBrowser() throws Exception { 88297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 8928cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho assertFalse(mMediaBrowser.isConnected()); 90297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 91297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon connectMediaBrowserService(); 9228cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho assertTrue(mMediaBrowser.isConnected()); 93297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 94297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon assertEquals(TEST_BROWSER_SERVICE, mMediaBrowser.getServiceComponent()); 95297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, mMediaBrowser.getRoot()); 96297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.EXTRAS_VALUE, 97297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mMediaBrowser.getExtras().getString(StubMediaBrowserServiceCompat.EXTRAS_KEY)); 98297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.sSession.getSessionToken(), 99297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mMediaBrowser.getSessionToken()); 100297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 101297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mMediaBrowser.disconnect(); 102297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon new PollingCheck(TIME_OUT_MS) { 103297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 104297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon protected boolean check() { 105297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon return !mMediaBrowser.isConnected(); 106297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 107297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon }.run(); 10828cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho } 10928cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho 11028cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho @Test 11128cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho @SmallTest 1128015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testMediaBrowserWithRemoteService() throws Exception { 11328cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho createMediaBrowser(TEST_REMOTE_BROWSER_SERVICE); 11428cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho assertFalse(mMediaBrowser.isConnected()); 11528cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho 11628cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho connectMediaBrowserService(); 11728cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho assertTrue(mMediaBrowser.isConnected()); 11828cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho 11928cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho assertEquals(TEST_REMOTE_BROWSER_SERVICE, mMediaBrowser.getServiceComponent()); 12028cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho assertEquals(StubRemoteMediaBrowserServiceCompat.MEDIA_ID_ROOT, mMediaBrowser.getRoot()); 12128cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho assertEquals(StubRemoteMediaBrowserServiceCompat.EXTRAS_VALUE, 12228cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho mMediaBrowser.getExtras().getString( 12328cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho StubRemoteMediaBrowserServiceCompat.EXTRAS_KEY)); 12428cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho 12528cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho mMediaBrowser.disconnect(); 12628cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho new PollingCheck(TIME_OUT_MS) { 12728cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho @Override 12828cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho protected boolean check() { 12928cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho return !mMediaBrowser.isConnected(); 13028cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho } 13128cc3f625d85a7e9796f568854b851e315cba28eDonghyun Cho }.run(); 132297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 133297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 134297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Test 135297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @SmallTest 1368015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testConnectTwice() throws Exception { 137297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 138297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon connectMediaBrowserService(); 139297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon try { 140297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mMediaBrowser.connect(); 141297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon fail(); 142297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } catch (IllegalStateException e) { 143297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // expected 144297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 145297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 146297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 147297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Test 148297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @SmallTest 1498015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testConnectionFailed() throws Exception { 150297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_INVALID_BROWSER_SERVICE); 151297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 152f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mConnectionCallback.mWaitLock) { 1538015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.connect(); 154f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mConnectionCallback.mWaitLock.wait(TIME_OUT_MS); 1558015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 1568015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertTrue(mConnectionCallback.mConnectionFailedCount > 0); 1578015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(0, mConnectionCallback.mConnectedCount); 1588015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(0, mConnectionCallback.mConnectionSuspendedCount); 159297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 160297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 161297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Test 162d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon @SmallTest 163f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo public void testReconnection() throws Exception { 1641903729b79dacd9436636ae6ebd36dac1edb2851Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 1651903729b79dacd9436636ae6ebd36dac1edb2851Hyundo Moon 166d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon getInstrumentation().runOnMainSync(new Runnable() { 167d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon @Override 168d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon public void run() { 169d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon mMediaBrowser.connect(); 170d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon // Reconnect before the first connection was established. 171d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon mMediaBrowser.disconnect(); 172d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon mMediaBrowser.connect(); 173d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon } 174d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon }); 175d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon 176d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon synchronized (mConnectionCallback.mWaitLock) { 177d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon mConnectionCallback.mWaitLock.wait(TIME_OUT_MS); 178d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon assertEquals(1, mConnectionCallback.mConnectedCount); 179d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon } 1801903729b79dacd9436636ae6ebd36dac1edb2851Hyundo Moon 181f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mSubscriptionCallback.mWaitLock) { 1828015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon // Test subscribe. 1838015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon resetCallbacks(); 1848015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.subscribe( 1858015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, mSubscriptionCallback); 186f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mSubscriptionCallback.mWaitLock.wait(TIME_OUT_MS); 1878015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertTrue(mSubscriptionCallback.mChildrenLoadedCount > 0); 1888015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, 1898015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastParentId); 190f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo } 1911903729b79dacd9436636ae6ebd36dac1edb2851Hyundo Moon 192f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mItemCallback.mWaitLock) { 1938015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon // Test getItem. 1948015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon resetCallbacks(); 1958015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.getItem( 1968015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN[0], mItemCallback); 197f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mItemCallback.mWaitLock.wait(TIME_OUT_MS); 198f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN[0], 199f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mItemCallback.mLastMediaItem.getMediaId()); 200f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo } 201f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo 202f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo // Reconnect after connection was established. 203f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mMediaBrowser.disconnect(); 204f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo resetCallbacks(); 205f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo connectMediaBrowserService(); 206f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo 207f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mItemCallback.mWaitLock) { 208f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo // Test getItem. 209f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo resetCallbacks(); 210f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mMediaBrowser.getItem( 211f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN[0], mItemCallback); 212f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mItemCallback.mWaitLock.wait(TIME_OUT_MS); 2138015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN[0], 2148015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mItemCallback.mLastMediaItem.getMediaId()); 2158015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 2161903729b79dacd9436636ae6ebd36dac1edb2851Hyundo Moon } 2171903729b79dacd9436636ae6ebd36dac1edb2851Hyundo Moon 2181903729b79dacd9436636ae6ebd36dac1edb2851Hyundo Moon @Test 219d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon @SmallTest 220f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo public void testConnectionCallbackNotCalledAfterDisconnect() { 221f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo createMediaBrowser(TEST_BROWSER_SERVICE); 222d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon 223d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon getInstrumentation().runOnMainSync(new Runnable() { 224d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon @Override 225d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon public void run() { 226d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon mMediaBrowser.connect(); 227d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon mMediaBrowser.disconnect(); 228d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon resetCallbacks(); 229d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon } 230d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon }); 231d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon 232f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo try { 233f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo Thread.sleep(SLEEP_MS); 234f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo } catch (InterruptedException e) { 235f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo fail("Unexpected InterruptedException occurred."); 236f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo } 237f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo assertEquals(0, mConnectionCallback.mConnectedCount); 238f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo assertEquals(0, mConnectionCallback.mConnectionFailedCount); 239f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo assertEquals(0, mConnectionCallback.mConnectionSuspendedCount); 240f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo } 241f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo 242f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo @Test 243f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo @SmallTest 244297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void testGetServiceComponentBeforeConnection() { 245297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 246297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon try { 247297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon ComponentName serviceComponent = mMediaBrowser.getServiceComponent(); 248297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon fail(); 249297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } catch (IllegalStateException e) { 250297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // expected 251297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 252297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 253297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 254297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Test 255297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @SmallTest 2568015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testSubscribe() throws Exception { 257297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 258297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon connectMediaBrowserService(); 259297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 260f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mSubscriptionCallback.mWaitLock) { 2618015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.subscribe( 2628015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, mSubscriptionCallback); 263f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mSubscriptionCallback.mWaitLock.wait(TIME_OUT_MS); 2648015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertTrue(mSubscriptionCallback.mChildrenLoadedCount > 0); 2658015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, 2668015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastParentId); 2678015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN.length, 2688015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastChildMediaItems.size()); 2698015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon for (int i = 0; i < StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN.length; ++i) { 2708015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN[i], 2718015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastChildMediaItems.get(i).getMediaId()); 2728015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 273297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 274297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 275297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // Test unsubscribe. 276297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon resetCallbacks(); 277297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mMediaBrowser.unsubscribe(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT); 278297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 279297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // After unsubscribing, make StubMediaBrowserServiceCompat notify that the children are 280297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // changed. 281297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon StubMediaBrowserServiceCompat.sInstance.notifyChildrenChanged( 282297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon StubMediaBrowserServiceCompat.MEDIA_ID_ROOT); 283297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon try { 284297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon Thread.sleep(SLEEP_MS); 285297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } catch (InterruptedException e) { 286297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon fail("Unexpected InterruptedException occurred."); 287297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 288297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // onChildrenLoaded should not be called. 289297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon assertEquals(0, mSubscriptionCallback.mChildrenLoadedCount); 290297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 291297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 2920f9cc644664ddf8227ab6b4f4b431f4e24c38725Donghyun Cho @Test 2930f9cc644664ddf8227ab6b4f4b431f4e24c38725Donghyun Cho @SmallTest 2948015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testSubscribeWithOptions() throws Exception { 295297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 296297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon connectMediaBrowserService(); 297297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon final int pageSize = 3; 298297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon final int lastPage = 299297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon (StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN.length - 1) / pageSize; 300297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon Bundle options = new Bundle(); 301297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon options.putInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, pageSize); 3028015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon 303f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mSubscriptionCallback.mWaitLock) { 3048015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon for (int page = 0; page <= lastPage; ++page) { 3058015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon resetCallbacks(); 3068015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon options.putInt(MediaBrowserCompat.EXTRA_PAGE, page); 3078015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.subscribe(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, options, 3088015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback); 309f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mSubscriptionCallback.mWaitLock.wait(TIME_OUT_MS); 3108015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertTrue(mSubscriptionCallback.mChildrenLoadedWithOptionCount > 0); 3118015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, 3128015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastParentId); 3138015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon if (page != lastPage) { 3148015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(pageSize, mSubscriptionCallback.mLastChildMediaItems.size()); 3158015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } else { 3168015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals( 3178015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon (StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN.length - 1) % pageSize 3188015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon + 1, 3198015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastChildMediaItems.size()); 3208015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 3218015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon // Check whether all the items in the current page are loaded. 3228015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon for (int i = 0; i < mSubscriptionCallback.mLastChildMediaItems.size(); ++i) { 3238015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals( 3248015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN[page * pageSize + i], 3258015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastChildMediaItems.get(i).getMediaId()); 326297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 327297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 328297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 329297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 330297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // Test unsubscribe with callback argument. 331297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon resetCallbacks(); 332297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mMediaBrowser.unsubscribe(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, 333297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mSubscriptionCallback); 334297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 335297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // After unsubscribing, make StubMediaBrowserServiceCompat notify that the children are 336297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // changed. 337297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon StubMediaBrowserServiceCompat.sInstance.notifyChildrenChanged( 338297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon StubMediaBrowserServiceCompat.MEDIA_ID_ROOT); 339297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon try { 340297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon Thread.sleep(SLEEP_MS); 341297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } catch (InterruptedException e) { 342297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon fail("Unexpected InterruptedException occurred."); 343297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 344297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // onChildrenLoaded should not be called. 345297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon assertEquals(0, mSubscriptionCallback.mChildrenLoadedCount); 346297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 347297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 348082f92c8357f91e7c12d038d71258d3bd61cb662Donghyun Cho @Test 349082f92c8357f91e7c12d038d71258d3bd61cb662Donghyun Cho @SmallTest 3508015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testSubscribeInvalidItem() throws Exception { 351297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 352297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon connectMediaBrowserService(); 353297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 354f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mSubscriptionCallback.mWaitLock) { 3558015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.subscribe(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, 3568015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback); 357f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mSubscriptionCallback.mWaitLock.wait(TIME_OUT_MS); 3588015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, 3598015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastErrorId); 3608015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 361297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 362297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 363082f92c8357f91e7c12d038d71258d3bd61cb662Donghyun Cho @Test 364082f92c8357f91e7c12d038d71258d3bd61cb662Donghyun Cho @SmallTest 3658015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testSubscribeInvalidItemWithOptions() throws Exception { 366297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 367297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon connectMediaBrowserService(); 368297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 369297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon final int pageSize = 5; 370297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon final int page = 2; 371297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon Bundle options = new Bundle(); 372297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon options.putInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, pageSize); 373297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon options.putInt(MediaBrowserCompat.EXTRA_PAGE, page); 374297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 375f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mSubscriptionCallback.mWaitLock) { 3768015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.subscribe(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, options, 3778015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback); 378f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mSubscriptionCallback.mWaitLock.wait(TIME_OUT_MS); 3798015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, 3808015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastErrorId); 3818015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertNotNull(mSubscriptionCallback.mLastOptions); 3828015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(page, 3838015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastOptions.getInt(MediaBrowserCompat.EXTRA_PAGE)); 3848015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(pageSize, 3858015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mSubscriptionCallback.mLastOptions.getInt(MediaBrowserCompat.EXTRA_PAGE_SIZE)); 3868015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 387297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 388297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 389297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Test 390d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon @SmallTest 3918015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testUnsubscribeForMultipleSubscriptions() throws Exception { 392297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 393297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon connectMediaBrowserService(); 394297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon final List<StubSubscriptionCallback> subscriptionCallbacks = new ArrayList<>(); 395297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon final int pageSize = 1; 396297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 397d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon // Subscribe four pages, one item per page. 398d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon for (int page = 0; page < 4; page++) { 399d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon final StubSubscriptionCallback callback = new StubSubscriptionCallback(); 400d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon subscriptionCallbacks.add(callback); 401d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon 402d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon Bundle options = new Bundle(); 403d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon options.putInt(MediaBrowserCompat.EXTRA_PAGE, page); 404d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon options.putInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, pageSize); 405d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon mMediaBrowser.subscribe(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, options, 406d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon callback); 407d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon synchronized (callback.mWaitLock) { 408d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon callback.mWaitLock.wait(TIME_OUT_MS); 4098015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 410d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon // Each onChildrenLoaded() must be called. 411d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon assertEquals(1, callback.mChildrenLoadedWithOptionCount); 412297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 413297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 414297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // Reset callbacks and unsubscribe. 415297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon for (StubSubscriptionCallback callback : subscriptionCallbacks) { 416297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon callback.reset(); 417297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 418297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mMediaBrowser.unsubscribe(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT); 419297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 420297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // After unsubscribing, make StubMediaBrowserServiceCompat notify that the children are 421297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // changed. 422297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon StubMediaBrowserServiceCompat.sInstance.notifyChildrenChanged( 423297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon StubMediaBrowserServiceCompat.MEDIA_ID_ROOT); 424297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon try { 425297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon Thread.sleep(SLEEP_MS); 426297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } catch (InterruptedException e) { 427297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon fail("Unexpected InterruptedException occurred."); 428297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 429297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 430297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // onChildrenLoaded should not be called. 431297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon for (StubSubscriptionCallback callback : subscriptionCallbacks) { 432297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon assertEquals(0, callback.mChildrenLoadedWithOptionCount); 433297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 434297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 435297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 4369fb50d40fdbcbf97da9071ed19acfdcd59f55506Hyundo Moon @Test 437d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon @MediumTest 4388015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testUnsubscribeWithSubscriptionCallbackForMultipleSubscriptions() throws Exception { 439297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 440297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon connectMediaBrowserService(); 441297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon final List<StubSubscriptionCallback> subscriptionCallbacks = new ArrayList<>(); 442297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon final int pageSize = 1; 443297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 444d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon // Subscribe four pages, one item per page. 445d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon for (int page = 0; page < 4; page++) { 446d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon final StubSubscriptionCallback callback = new StubSubscriptionCallback(); 447d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon subscriptionCallbacks.add(callback); 448d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon 449d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon Bundle options = new Bundle(); 450d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon options.putInt(MediaBrowserCompat.EXTRA_PAGE, page); 451d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon options.putInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, pageSize); 452d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon mMediaBrowser.subscribe(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, options, 453d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon callback); 454d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon synchronized (callback.mWaitLock) { 455d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon callback.mWaitLock.wait(TIME_OUT_MS); 4568015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 457d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon // Each onChildrenLoaded() must be called. 458d5cfe9d11f57fe4da2fa3ec57f7a2744d4fd5d2eHyundo Moon assertEquals(1, callback.mChildrenLoadedWithOptionCount); 459297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 460297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 461297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // Unsubscribe existing subscriptions one-by-one. 462297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon final int[] orderOfRemovingCallbacks = {2, 0, 3, 1}; 463297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon for (int i = 0; i < orderOfRemovingCallbacks.length; i++) { 464297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // Reset callbacks 465297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon for (StubSubscriptionCallback callback : subscriptionCallbacks) { 466297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon callback.reset(); 467297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 468297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 469297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // Remove one subscription 470297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mMediaBrowser.unsubscribe(StubMediaBrowserServiceCompat.MEDIA_ID_ROOT, 471297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon subscriptionCallbacks.get(orderOfRemovingCallbacks[i])); 472297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 473297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // Make StubMediaBrowserServiceCompat notify that the children are changed. 474297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon StubMediaBrowserServiceCompat.sInstance.notifyChildrenChanged( 475297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon StubMediaBrowserServiceCompat.MEDIA_ID_ROOT); 476297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon try { 477297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon Thread.sleep(SLEEP_MS); 478297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } catch (InterruptedException e) { 479297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon fail("Unexpected InterruptedException occurred."); 480297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 481297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 482297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon // Only the remaining subscriptionCallbacks should be called. 483297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon for (int j = 0; j < 4; j++) { 484297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon int childrenLoadedWithOptionsCount = subscriptionCallbacks 485297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon .get(orderOfRemovingCallbacks[j]).mChildrenLoadedWithOptionCount; 486297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon if (j <= i) { 487297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon assertEquals(0, childrenLoadedWithOptionsCount); 488297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } else { 489297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon assertEquals(1, childrenLoadedWithOptionsCount); 490297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 491297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 492297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 493297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 494297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 49567d13c805954bb8f477c66091cea5f5ea34be1c6Donghyun Cho @Test 49667d13c805954bb8f477c66091cea5f5ea34be1c6Donghyun Cho @SmallTest 4978015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testGetItem() throws Exception { 498297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 499297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon connectMediaBrowserService(); 500297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 501f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mItemCallback.mWaitLock) { 5028015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.getItem(StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN[0], 5038015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mItemCallback); 504f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mItemCallback.mWaitLock.wait(TIME_OUT_MS); 5058015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertNotNull(mItemCallback.mLastMediaItem); 5068015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_CHILDREN[0], 5078015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mItemCallback.mLastMediaItem.getMediaId()); 5088015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 509297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 510297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 51167d13c805954bb8f477c66091cea5f5ea34be1c6Donghyun Cho @Test 512f21a3fb4d2023cc17983cab58931652063b66295Aurimas Liutikas @LargeTest 5138015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testGetItemWhenOnLoadItemIsNotImplemented() throws Exception { 514297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 515297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon connectMediaBrowserService(); 516f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mItemCallback.mWaitLock) { 5178015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.getItem( 5188015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon StubMediaBrowserServiceCompat.MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED, 5198015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mItemCallback); 520f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mItemCallback.mWaitLock.wait(TIME_OUT_MS); 5218015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED, 5228015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mItemCallback.mLastErrorId); 5238015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 52417fc09080d4abeacaef1304667dd8d0006c5a3d4Hyundo Moon } 52517fc09080d4abeacaef1304667dd8d0006c5a3d4Hyundo Moon 52617fc09080d4abeacaef1304667dd8d0006c5a3d4Hyundo Moon @Test 52717fc09080d4abeacaef1304667dd8d0006c5a3d4Hyundo Moon @SmallTest 5288015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon public void testGetItemWhenMediaIdIsInvalid() throws Exception { 52917fc09080d4abeacaef1304667dd8d0006c5a3d4Hyundo Moon mItemCallback.mLastMediaItem = new MediaItem(new MediaDescriptionCompat.Builder() 53017fc09080d4abeacaef1304667dd8d0006c5a3d4Hyundo Moon .setMediaId("dummy_id").build(), MediaItem.FLAG_BROWSABLE); 53117fc09080d4abeacaef1304667dd8d0006c5a3d4Hyundo Moon 53217fc09080d4abeacaef1304667dd8d0006c5a3d4Hyundo Moon createMediaBrowser(TEST_BROWSER_SERVICE); 53317fc09080d4abeacaef1304667dd8d0006c5a3d4Hyundo Moon connectMediaBrowserService(); 534f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mItemCallback.mWaitLock) { 5358015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.getItem(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, mItemCallback); 536f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mItemCallback.mWaitLock.wait(TIME_OUT_MS); 5378015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertNull(mItemCallback.mLastMediaItem); 5388015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon assertNull(mItemCallback.mLastErrorId); 5398015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 540297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 541297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 542297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private void createMediaBrowser(final ComponentName component) { 543297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon getInstrumentation().runOnMainSync(new Runnable() { 544297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 545297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void run() { 546297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mMediaBrowser = new MediaBrowserCompat(getInstrumentation().getTargetContext(), 547297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon component, mConnectionCallback, null); 548297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 549297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon }); 550297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 551297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 5528015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon private void connectMediaBrowserService() throws Exception { 553f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo synchronized (mConnectionCallback.mWaitLock) { 5548015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mMediaBrowser.connect(); 555f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo mConnectionCallback.mWaitLock.wait(TIME_OUT_MS); 5568015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 557297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 558297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 559297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private void resetCallbacks() { 560297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mConnectionCallback.reset(); 561297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mSubscriptionCallback.reset(); 562297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mItemCallback.reset(); 563297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 564297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 5658015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon private class StubConnectionCallback extends MediaBrowserCompat.ConnectionCallback { 566f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo Object mWaitLock = new Object(); 567297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon volatile int mConnectedCount; 568297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon volatile int mConnectionFailedCount; 569297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon volatile int mConnectionSuspendedCount; 570297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 571297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void reset() { 572297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mConnectedCount = 0; 573297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mConnectionFailedCount = 0; 574297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mConnectionSuspendedCount = 0; 575297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 576297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 577297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 578297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void onConnected() { 5798015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon synchronized (mWaitLock) { 5808015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mConnectedCount++; 5818015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mWaitLock.notify(); 5828015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 583297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 584297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 585297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 586297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void onConnectionFailed() { 5878015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon synchronized (mWaitLock) { 5888015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mConnectionFailedCount++; 5898015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mWaitLock.notify(); 5908015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 591297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 592297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 593297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 594297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void onConnectionSuspended() { 5958015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon synchronized (mWaitLock) { 5968015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mConnectionSuspendedCount++; 5978015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mWaitLock.notify(); 5988015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 599297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 600297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 601297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 6028015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon private class StubSubscriptionCallback extends MediaBrowserCompat.SubscriptionCallback { 603f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo Object mWaitLock = new Object(); 604297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private volatile int mChildrenLoadedCount; 605297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private volatile int mChildrenLoadedWithOptionCount; 606297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private volatile String mLastErrorId; 607297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private volatile String mLastParentId; 608297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private volatile Bundle mLastOptions; 609297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private volatile List<MediaItem> mLastChildMediaItems; 610297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 611297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void reset() { 612297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mChildrenLoadedCount = 0; 613297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mChildrenLoadedWithOptionCount = 0; 614297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mLastErrorId = null; 615297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mLastParentId = null; 616297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mLastOptions = null; 617297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mLastChildMediaItems = null; 618297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 619297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 620297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 621297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void onChildrenLoaded(String parentId, List<MediaItem> children) { 6228015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon synchronized (mWaitLock) { 6238015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mChildrenLoadedCount++; 6248015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mLastParentId = parentId; 6258015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mLastChildMediaItems = children; 6268015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mWaitLock.notify(); 6278015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 628297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 629297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 630297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 631297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void onChildrenLoaded(String parentId, List<MediaItem> children, Bundle options) { 6328015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon synchronized (mWaitLock) { 6338015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mChildrenLoadedWithOptionCount++; 6348015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mLastParentId = parentId; 6358015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mLastOptions = options; 6368015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mLastChildMediaItems = children; 6378015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mWaitLock.notify(); 6388015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 639297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 640297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 641297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 642297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void onError(String id) { 6438015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon synchronized (mWaitLock) { 6448015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mLastErrorId = id; 6458015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mWaitLock.notify(); 6468015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 647297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 648297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 649297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 650297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void onError(String id, Bundle options) { 6518015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon synchronized (mWaitLock) { 6528015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mLastErrorId = id; 6538015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mLastOptions = options; 6548015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mWaitLock.notify(); 6558015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 656297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 657297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 658297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 6598015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon private class StubItemCallback extends MediaBrowserCompat.ItemCallback { 660f417a0bd9271d537d2f3142c4443fc55f901bdd3Sungsoo Object mWaitLock = new Object(); 661297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private volatile MediaItem mLastMediaItem; 662297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon private volatile String mLastErrorId; 663297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 664297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void reset() { 665297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mLastMediaItem = null; 666297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon mLastErrorId = null; 667297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 668297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 669297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 670297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void onItemLoaded(MediaItem item) { 6718015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon synchronized (mWaitLock) { 6728015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mLastMediaItem = item; 6738015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mWaitLock.notify(); 6748015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 675297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 676297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon 677297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon @Override 678297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon public void onError(String id) { 6798015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon synchronized (mWaitLock) { 6808015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mLastErrorId = id; 6818015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon mWaitLock.notify(); 6828015ff37f647b6eb87dc6e9fc42e57784cb38c50Hyundo Moon } 683297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 684297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon } 685297c8940c58e9feccdde0f89853a8f5661220c46Hyundo Moon} 686