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