1182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon/*
2182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon * Copyright (C) 2016 The Android Open Source Project
3182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon *
4182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon * Licensed under the Apache License, Version 2.0 (the "License");
5182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon * you may not use this file except in compliance with the License.
6182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon * You may obtain a copy of the License at
7182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon *
8182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon *      http://www.apache.org/licenses/LICENSE-2.0
9182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon *
10182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon * Unless required by applicable law or agreed to in writing, software
11182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon * distributed under the License is distributed on an "AS IS" BASIS,
12182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon * See the License for the specific language governing permissions and
14182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon * limitations under the License.
15182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon */
16182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonpackage android.support.v4.media.session;
17182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
18182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport static android.support.test.InstrumentationRegistry.getContext;
19182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport static android.support.test.InstrumentationRegistry.getInstrumentation;
20182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
21182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport static org.junit.Assert.assertEquals;
22182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport static org.junit.Assert.assertNotNull;
23182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport static org.junit.Assert.assertTrue;
24c10aca3fa402839d997db961d88d34b0d82ee7d7Hyundo Moonimport static org.junit.Assert.fail;
25182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
26182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport android.media.AudioManager;
277ec07680309116890213ff39ae753b719a66eadbHyundo Moonimport android.media.session.MediaController;
287ec07680309116890213ff39ae753b719a66eadbHyundo Moonimport android.media.session.MediaSession;
297ec07680309116890213ff39ae753b719a66eadbHyundo Moonimport android.media.session.PlaybackState;
30182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport android.net.Uri;
317ec07680309116890213ff39ae753b719a66eadbHyundo Moonimport android.os.Build;
32182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport android.os.Bundle;
33182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport android.os.Handler;
34182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport android.os.Looper;
35182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport android.os.ResultReceiver;
367ec07680309116890213ff39ae753b719a66eadbHyundo Moonimport android.os.SystemClock;
37182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport android.support.test.filters.SmallTest;
38182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport android.support.test.runner.AndroidJUnit4;
39db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moonimport android.support.v4.media.MediaDescriptionCompat;
40182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport android.support.v4.media.RatingCompat;
41182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport android.support.v4.media.VolumeProviderCompat;
42182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
43182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport org.junit.After;
44182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport org.junit.Before;
45182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport org.junit.Test;
46182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonimport org.junit.runner.RunWith;
47182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
4865cde2c4554985493a2e7560b5e71c5f24969287Sungsooimport java.util.ArrayList;
4965cde2c4554985493a2e7560b5e71c5f24969287Sungsooimport java.util.List;
5065cde2c4554985493a2e7560b5e71c5f24969287Sungsoo
51182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon/**
52182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon * Test {@link MediaControllerCompat}.
53182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon */
54182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon@RunWith(AndroidJUnit4.class)
55182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moonpublic class MediaControllerCompatTest {
56182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    // The maximum time to wait for an operation.
57182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private static final long TIME_OUT_MS = 3000L;
58182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private static final String SESSION_TAG = "test-session";
59182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private static final String EXTRAS_KEY = "test-key";
60182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private static final String EXTRAS_VALUE = "test-val";
61182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private static final float DELTA = 1e-4f;
62e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho    private static final boolean ENABLED = true;
63e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho    private static final boolean DISABLED = false;
647ec07680309116890213ff39ae753b719a66eadbHyundo Moon    private static final long TEST_POSITION = 1000000L;
657ec07680309116890213ff39ae753b719a66eadbHyundo Moon    private static final float TEST_PLAYBACK_SPEED = 3.0f;
667ec07680309116890213ff39ae753b719a66eadbHyundo Moon
67182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
68182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private final Object mWaitLock = new Object();
69182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private Handler mHandler = new Handler(Looper.getMainLooper());
70182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private MediaSessionCompat mSession;
71182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private MediaSessionCallback mCallback = new MediaSessionCallback();
72182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private MediaControllerCompat mController;
73182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
74182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @Before
75182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    public void setUp() throws Exception {
76182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        getInstrumentation().runOnMainSync(new Runnable() {
77182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            @Override
78182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            public void run() {
79182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mSession = new MediaSessionCompat(getContext(), SESSION_TAG);
80182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mSession.setCallback(mCallback, mHandler);
81db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon                mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS);
82182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mController = mSession.getController();
83182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
84182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        });
85182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    }
86182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
87182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @After
88182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    public void tearDown() throws Exception {
89182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        mSession.release();
90182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    }
91182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
92182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @Test
93182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @SmallTest
94182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    public void testGetPackageName() {
95182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        assertEquals(getContext().getPackageName(), mController.getPackageName());
96182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    }
97182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
98182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @Test
99182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @SmallTest
100182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    public void testGetRatingType() {
101182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        assertEquals("Default rating type of a session must be RatingCompat.RATING_NONE",
102182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                RatingCompat.RATING_NONE, mController.getRatingType());
103182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
104182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        mSession.setRatingType(RatingCompat.RATING_5_STARS);
105182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        assertEquals(RatingCompat.RATING_5_STARS, mController.getRatingType());
106182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    }
107182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
108182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @Test
109182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @SmallTest
110182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    public void testGetSessionToken() throws Exception {
111182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        assertEquals(mSession.getSessionToken(), mController.getSessionToken());
112182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    }
113182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
114182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @Test
115182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @SmallTest
116182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    public void testSendCommand() throws Exception {
117182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        synchronized (mWaitLock) {
118182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
119182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final String command = "test-command";
120182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final Bundle extras = new Bundle();
121182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            extras.putString(EXTRAS_KEY, EXTRAS_VALUE);
122182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mController.sendCommand(command, extras, new ResultReceiver(null));
123182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
124182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnCommandCalled);
125182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertNotNull(mCallback.mCommandCallback);
126182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(command, mCallback.mCommand);
127182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
128182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
129182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    }
130182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
131db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon    @Test
132db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon    @SmallTest
133db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon    public void testAddRemoveQueueItems() throws Exception {
13465cde2c4554985493a2e7560b5e71c5f24969287Sungsoo        final String mediaId1 = "media_id_1";
13565cde2c4554985493a2e7560b5e71c5f24969287Sungsoo        final String mediaTitle1 = "media_title_1";
13665cde2c4554985493a2e7560b5e71c5f24969287Sungsoo        MediaDescriptionCompat itemDescription1 = new MediaDescriptionCompat.Builder()
13765cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                .setMediaId(mediaId1).setTitle(mediaTitle1).build();
13865cde2c4554985493a2e7560b5e71c5f24969287Sungsoo
13965cde2c4554985493a2e7560b5e71c5f24969287Sungsoo        final String mediaId2 = "media_id_2";
14065cde2c4554985493a2e7560b5e71c5f24969287Sungsoo        final String mediaTitle2 = "media_title_2";
14165cde2c4554985493a2e7560b5e71c5f24969287Sungsoo        MediaDescriptionCompat itemDescription2 = new MediaDescriptionCompat.Builder()
14265cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                .setMediaId(mediaId2).setTitle(mediaTitle2).build();
143db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon
144db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        synchronized (mWaitLock) {
145db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mCallback.reset();
14665cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            mController.addQueueItem(itemDescription1);
147db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
148db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            assertTrue(mCallback.mOnAddQueueItemCalled);
149db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            assertEquals(-1, mCallback.mQueueIndex);
15065cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            assertEquals(mediaId1, mCallback.mQueueDescription.getMediaId());
15165cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            assertEquals(mediaTitle1, mCallback.mQueueDescription.getTitle());
152db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon
153db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mCallback.reset();
15465cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            mController.addQueueItem(itemDescription2, 0);
155db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
156db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            assertTrue(mCallback.mOnAddQueueItemAtCalled);
157db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            assertEquals(0, mCallback.mQueueIndex);
15865cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            assertEquals(mediaId2, mCallback.mQueueDescription.getMediaId());
15965cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            assertEquals(mediaTitle2, mCallback.mQueueDescription.getTitle());
160db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon
161db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mCallback.reset();
162db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mController.removeQueueItemAt(0);
163db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
16465cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            assertTrue(mCallback.mOnRemoveQueueItemCalled);
16565cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            assertEquals(mediaId2, mCallback.mQueueDescription.getMediaId());
16665cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            assertEquals(mediaTitle2, mCallback.mQueueDescription.getTitle());
167db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon
168db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mCallback.reset();
16965cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            mController.removeQueueItem(itemDescription1);
170db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
171db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            assertTrue(mCallback.mOnRemoveQueueItemCalled);
17265cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            assertEquals(mediaId1, mCallback.mQueueDescription.getMediaId());
17365cde2c4554985493a2e7560b5e71c5f24969287Sungsoo            assertEquals(mediaTitle1, mCallback.mQueueDescription.getTitle());
174c10aca3fa402839d997db961d88d34b0d82ee7d7Hyundo Moon
175c10aca3fa402839d997db961d88d34b0d82ee7d7Hyundo Moon            // Try to modify the queue when the session does not support queue management.
176c10aca3fa402839d997db961d88d34b0d82ee7d7Hyundo Moon            mSession.setFlags(0);
177c10aca3fa402839d997db961d88d34b0d82ee7d7Hyundo Moon            try {
17865cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                mController.addQueueItem(itemDescription1);
179c10aca3fa402839d997db961d88d34b0d82ee7d7Hyundo Moon                fail();
180c10aca3fa402839d997db961d88d34b0d82ee7d7Hyundo Moon            } catch (UnsupportedOperationException e) {
181c10aca3fa402839d997db961d88d34b0d82ee7d7Hyundo Moon                // Expected.
182c10aca3fa402839d997db961d88d34b0d82ee7d7Hyundo Moon            }
183db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        }
184db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon    }
185db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon
186182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    // TODO: Uncomment after fixing this test. This test causes an Exception on System UI.
187182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    // @Test
188182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    // @SmallTest
189182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    public void testVolumeControl() throws Exception {
190182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        VolumeProviderCompat vp =
191182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE, 11, 5) {
192182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            @Override
193182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            public void onSetVolumeTo(int volume) {
194182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                synchronized (mWaitLock) {
195182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                    setCurrentVolume(volume);
196182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                    mWaitLock.notify();
197182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                }
198182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
199182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
200182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            @Override
201182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            public void onAdjustVolume(int direction) {
202182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                synchronized (mWaitLock) {
203182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                    switch (direction) {
204182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                        case AudioManager.ADJUST_LOWER:
205182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                            setCurrentVolume(getCurrentVolume() - 1);
206182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                            break;
207182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                        case AudioManager.ADJUST_RAISE:
208182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                            setCurrentVolume(getCurrentVolume() + 1);
209182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                            break;
210182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                    }
211182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                    mWaitLock.notify();
212182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                }
213182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
214182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        };
215182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        mSession.setPlaybackToRemote(vp);
216182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
217182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        synchronized (mWaitLock) {
218182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            // test setVolumeTo
219182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mController.setVolumeTo(7, 0);
220182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
221182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(7, vp.getCurrentVolume());
222182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
223182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            // test adjustVolume
224182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mController.adjustVolume(AudioManager.ADJUST_LOWER, 0);
225182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
226182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(6, vp.getCurrentVolume());
227182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
228182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mController.adjustVolume(AudioManager.ADJUST_RAISE, 0);
229182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
230182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(7, vp.getCurrentVolume());
231182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
232182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    }
233182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
234182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @Test
235182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @SmallTest
236182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    public void testTransportControlsAndMediaSessionCallback() throws Exception {
237182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        MediaControllerCompat.TransportControls controls = mController.getTransportControls();
238182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        synchronized (mWaitLock) {
239182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
240182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.play();
241182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
242182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnPlayCalled);
243182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
244182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
245182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.pause();
246182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
247182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnPauseCalled);
248182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
249182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
250182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.stop();
251182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
252182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnStopCalled);
253182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
254182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
255182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.fastForward();
256182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
257182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnFastForwardCalled);
258182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
259182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
260182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.rewind();
261182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
262182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnRewindCalled);
263182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
264182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
265182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.skipToPrevious();
266182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
267182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnSkipToPreviousCalled);
268182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
269182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
270182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.skipToNext();
271182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
272182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnSkipToNextCalled);
273182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
274182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
275182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final long seekPosition = 1000;
276182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.seekTo(seekPosition);
277182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
278182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnSeekToCalled);
279182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(seekPosition, mCallback.mSeekPosition);
280182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
281182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
282182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final RatingCompat rating =
283182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                    RatingCompat.newStarRating(RatingCompat.RATING_5_STARS, 3f);
284182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.setRating(rating);
285182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
286182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnSetRatingCalled);
287182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(rating.getRatingStyle(), mCallback.mRating.getRatingStyle());
288182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(rating.getStarRating(), mCallback.mRating.getStarRating(), DELTA);
289182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
290182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
291182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final String mediaId = "test-media-id";
292182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final Bundle extras = new Bundle();
293182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            extras.putString(EXTRAS_KEY, EXTRAS_VALUE);
294182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.playFromMediaId(mediaId, extras);
295182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
296182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnPlayFromMediaIdCalled);
297182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(mediaId, mCallback.mMediaId);
298182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
299182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
300182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
301182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final String query = "test-query";
302182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.playFromSearch(query, extras);
303182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
304182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnPlayFromSearchCalled);
305182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(query, mCallback.mQuery);
306182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
307182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
308182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
309182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final Uri uri = Uri.parse("content://test/popcorn.mod");
310182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.playFromUri(uri, extras);
311182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
312182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnPlayFromUriCalled);
313182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(uri, mCallback.mUri);
314182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
315182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
316182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
317182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final String action = "test-action";
318182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.sendCustomAction(action, extras);
319182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
320182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnCustomActionCalled);
321182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(action, mCallback.mAction);
322182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
323182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
324182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
325182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.mOnCustomActionCalled = false;
326182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final PlaybackStateCompat.CustomAction customAction =
327182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                    new PlaybackStateCompat.CustomAction.Builder(action, action, -1)
328182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                            .setExtras(extras)
329182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                            .build();
330182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.sendCustomAction(customAction, extras);
331182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
332182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnCustomActionCalled);
333182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(action, mCallback.mAction);
334182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
335182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
336182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
337182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final long queueItemId = 1000;
338182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.skipToQueueItem(queueItemId);
339182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
340182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnSkipToQueueItemCalled);
341182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(queueItemId, mCallback.mQueueItemId);
342182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
343182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
344182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.prepare();
345182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
346182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnPrepareCalled);
347182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
348182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
349182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.prepareFromMediaId(mediaId, extras);
350182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
351182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnPrepareFromMediaIdCalled);
352182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(mediaId, mCallback.mMediaId);
353182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
354182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
355182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
356182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.prepareFromSearch(query, extras);
357182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
358182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnPrepareFromSearchCalled);
359182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(query, mCallback.mQuery);
360182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
361182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
362182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
363182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.prepareFromUri(uri, extras);
364182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
365182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnPrepareFromUriCalled);
366182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(uri, mCallback.mUri);
367182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
368182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
369182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
370e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            controls.setCaptioningEnabled(ENABLED);
371e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            mWaitLock.wait(TIME_OUT_MS);
372e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            assertTrue(mCallback.mOnSetCaptioningEnabledCalled);
373e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            assertEquals(ENABLED, mCallback.mCaptioningEnabled);
374e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho
375e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            mCallback.reset();
376182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            final int repeatMode = PlaybackStateCompat.REPEAT_MODE_ALL;
377182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            controls.setRepeatMode(repeatMode);
378182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
379182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnSetRepeatModeCalled);
380182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertEquals(repeatMode, mCallback.mRepeatMode);
381182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
382182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCallback.reset();
383e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            controls.setShuffleModeEnabled(ENABLED);
384182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
385182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            assertTrue(mCallback.mOnSetShuffleModeEnabledCalled);
386e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            assertEquals(ENABLED, mCallback.mShuffleModeEnabled);
38774198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon
38874198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon            mCallback.reset();
38974198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon            controls.setShuffleMode(PlaybackStateCompat.SHUFFLE_MODE_ALL);
39074198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon            mWaitLock.wait(TIME_OUT_MS);
39174198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon            assertTrue(mCallback.mOnSetShuffleModeCalled);
39274198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon            assertEquals(PlaybackStateCompat.SHUFFLE_MODE_ALL, mCallback.mShuffleMode);
393182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
394182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    }
395182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
396182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @Test
397182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    @SmallTest
398182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    public void testPlaybackInfo() {
399182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        final int playbackType = MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_LOCAL;
400182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        final int volumeControl = VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE;
401182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        final int maxVolume = 10;
402182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        final int currentVolume = 3;
403182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
404182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        int audioStream = 77;
405182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        MediaControllerCompat.PlaybackInfo info = new MediaControllerCompat.PlaybackInfo(
406182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                playbackType, audioStream, volumeControl, maxVolume, currentVolume);
407182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
408182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        assertEquals(playbackType, info.getPlaybackType());
409182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        assertEquals(audioStream, info.getAudioStream());
410182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        assertEquals(volumeControl, info.getVolumeControl());
411182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        assertEquals(maxVolume, info.getMaxVolume());
412182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        assertEquals(currentVolume, info.getCurrentVolume());
413182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    }
414182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
4157ec07680309116890213ff39ae753b719a66eadbHyundo Moon    @Test
4167ec07680309116890213ff39ae753b719a66eadbHyundo Moon    @SmallTest
4177ec07680309116890213ff39ae753b719a66eadbHyundo Moon    public void testGetPlaybackStateWithPositionUpdate() throws InterruptedException {
4187ec07680309116890213ff39ae753b719a66eadbHyundo Moon        final long stateSetTime = SystemClock.elapsedRealtime();
4197ec07680309116890213ff39ae753b719a66eadbHyundo Moon        PlaybackStateCompat stateIn = new PlaybackStateCompat.Builder()
4207ec07680309116890213ff39ae753b719a66eadbHyundo Moon                .setState(PlaybackStateCompat.STATE_PLAYING, TEST_POSITION, TEST_PLAYBACK_SPEED,
4217ec07680309116890213ff39ae753b719a66eadbHyundo Moon                        stateSetTime)
4227ec07680309116890213ff39ae753b719a66eadbHyundo Moon                .build();
4237ec07680309116890213ff39ae753b719a66eadbHyundo Moon        mSession.setPlaybackState(stateIn);
4247ec07680309116890213ff39ae753b719a66eadbHyundo Moon
4257ec07680309116890213ff39ae753b719a66eadbHyundo Moon        final long waitDuration = 100L;
4267ec07680309116890213ff39ae753b719a66eadbHyundo Moon        Thread.sleep(waitDuration);
4277ec07680309116890213ff39ae753b719a66eadbHyundo Moon
4287ec07680309116890213ff39ae753b719a66eadbHyundo Moon        final long expectedUpdateTime = waitDuration + stateSetTime;
4297ec07680309116890213ff39ae753b719a66eadbHyundo Moon        final long expectedPosition = (long) (TEST_PLAYBACK_SPEED * waitDuration) + TEST_POSITION;
4307ec07680309116890213ff39ae753b719a66eadbHyundo Moon
4317ec07680309116890213ff39ae753b719a66eadbHyundo Moon        final double updateTimeTolerance = 30L;
4327ec07680309116890213ff39ae753b719a66eadbHyundo Moon        final double positionTolerance = updateTimeTolerance * TEST_PLAYBACK_SPEED;
4337ec07680309116890213ff39ae753b719a66eadbHyundo Moon
4347ec07680309116890213ff39ae753b719a66eadbHyundo Moon        PlaybackStateCompat stateOut = mSession.getController().getPlaybackState();
4357ec07680309116890213ff39ae753b719a66eadbHyundo Moon        assertEquals(expectedUpdateTime, stateOut.getLastPositionUpdateTime(), updateTimeTolerance);
4367ec07680309116890213ff39ae753b719a66eadbHyundo Moon        assertEquals(expectedPosition, stateOut.getPosition(), positionTolerance);
4377ec07680309116890213ff39ae753b719a66eadbHyundo Moon
4387ec07680309116890213ff39ae753b719a66eadbHyundo Moon        // Compare the result with MediaController.getPlaybackState().
4397ec07680309116890213ff39ae753b719a66eadbHyundo Moon        if (Build.VERSION.SDK_INT >= 21) {
4407ec07680309116890213ff39ae753b719a66eadbHyundo Moon            MediaController controller = new MediaController(
4417ec07680309116890213ff39ae753b719a66eadbHyundo Moon                    getContext(), (MediaSession.Token) mSession.getSessionToken().getToken());
4427ec07680309116890213ff39ae753b719a66eadbHyundo Moon            PlaybackState state = controller.getPlaybackState();
4437ec07680309116890213ff39ae753b719a66eadbHyundo Moon            assertEquals(state.getLastPositionUpdateTime(), stateOut.getLastPositionUpdateTime(),
4447ec07680309116890213ff39ae753b719a66eadbHyundo Moon                    updateTimeTolerance);
4457ec07680309116890213ff39ae753b719a66eadbHyundo Moon            assertEquals(state.getPosition(), stateOut.getPosition(), positionTolerance);
4467ec07680309116890213ff39ae753b719a66eadbHyundo Moon        }
4477ec07680309116890213ff39ae753b719a66eadbHyundo Moon    }
4487ec07680309116890213ff39ae753b719a66eadbHyundo Moon
449182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    private class MediaSessionCallback extends MediaSessionCompat.Callback {
450182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private long mSeekPosition;
451182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private long mQueueItemId;
452182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private RatingCompat mRating;
453182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private String mMediaId;
454182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private String mQuery;
455182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private Uri mUri;
456182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private String mAction;
457182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private String mCommand;
458182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private Bundle mExtras;
459182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private ResultReceiver mCommandCallback;
460e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho        private boolean mCaptioningEnabled;
461182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private int mRepeatMode;
462182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mShuffleModeEnabled;
46374198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon        private int mShuffleMode;
464db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        private int mQueueIndex;
465db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        private MediaDescriptionCompat mQueueDescription;
46665cde2c4554985493a2e7560b5e71c5f24969287Sungsoo        private List<MediaSessionCompat.QueueItem> mQueue = new ArrayList<>();
467182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
468182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnPlayCalled;
469182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnPauseCalled;
470182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnStopCalled;
471182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnFastForwardCalled;
472182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnRewindCalled;
473182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnSkipToPreviousCalled;
474182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnSkipToNextCalled;
475182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnSeekToCalled;
476182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnSkipToQueueItemCalled;
477182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnSetRatingCalled;
478182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnPlayFromMediaIdCalled;
479182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnPlayFromSearchCalled;
480182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnPlayFromUriCalled;
481182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnCustomActionCalled;
482182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnCommandCalled;
483182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnPrepareCalled;
484182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnPrepareFromMediaIdCalled;
485182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnPrepareFromSearchCalled;
486182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnPrepareFromUriCalled;
487e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho        private boolean mOnSetCaptioningEnabledCalled;
488182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnSetRepeatModeCalled;
489182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        private boolean mOnSetShuffleModeEnabledCalled;
49074198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon        private boolean mOnSetShuffleModeCalled;
491db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        private boolean mOnAddQueueItemCalled;
492db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        private boolean mOnAddQueueItemAtCalled;
493db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        private boolean mOnRemoveQueueItemCalled;
494182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
495182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void reset() {
496182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mSeekPosition = -1;
497182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mQueueItemId = -1;
498182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mRating = null;
499182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mMediaId = null;
500182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mQuery = null;
501182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mUri = null;
502182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mAction = null;
503182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mExtras = null;
504182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCommand = null;
505182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mCommandCallback = null;
506e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            mCaptioningEnabled = false;
507182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mShuffleModeEnabled = false;
508182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mRepeatMode = PlaybackStateCompat.REPEAT_MODE_NONE;
50974198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon            mShuffleMode = PlaybackStateCompat.SHUFFLE_MODE_NONE;
510db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mQueueIndex = -1;
511db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mQueueDescription = null;
512182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
513182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnPlayCalled = false;
514182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnPauseCalled = false;
515182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnStopCalled = false;
516182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnFastForwardCalled = false;
517182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnRewindCalled = false;
518182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnSkipToPreviousCalled = false;
519182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnSkipToNextCalled = false;
520182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnSkipToQueueItemCalled = false;
521182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnSeekToCalled = false;
522182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnSetRatingCalled = false;
523182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnPlayFromMediaIdCalled = false;
524182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnPlayFromSearchCalled = false;
525182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnPlayFromUriCalled = false;
526182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnCustomActionCalled = false;
527182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnCommandCalled = false;
528182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnPrepareCalled = false;
529182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnPrepareFromMediaIdCalled = false;
530182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnPrepareFromSearchCalled = false;
531182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnPrepareFromUriCalled = false;
532e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            mOnSetCaptioningEnabledCalled = false;
533182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnSetRepeatModeCalled = false;
534182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            mOnSetShuffleModeEnabledCalled = false;
53574198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon            mOnSetShuffleModeCalled = false;
536db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mOnAddQueueItemCalled = false;
537db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mOnAddQueueItemAtCalled = false;
538db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            mOnRemoveQueueItemCalled = false;
539182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
540182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
541182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
542182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onPlay() {
543182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
544182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnPlayCalled = true;
545182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
546182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
547182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
548182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
549182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
550182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onPause() {
551182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
552182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnPauseCalled = true;
553182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
554182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
555182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
556182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
557182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
558182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onStop() {
559182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
560182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnStopCalled = true;
561182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
562182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
563182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
564182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
565182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
566182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onFastForward() {
567182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
568182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnFastForwardCalled = true;
569182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
570182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
571182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
572182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
573182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
574182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onRewind() {
575182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
576182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnRewindCalled = true;
577182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
578182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
579182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
580182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
581182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
582182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onSkipToPrevious() {
583182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
584182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnSkipToPreviousCalled = true;
585182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
586182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
587182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
588182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
589182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
590182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onSkipToNext() {
591182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
592182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnSkipToNextCalled = true;
593182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
594182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
595182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
596182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
597182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
598182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onSeekTo(long pos) {
599182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
600182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnSeekToCalled = true;
601182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mSeekPosition = pos;
602182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
603182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
604182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
605182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
606182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
607182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onSetRating(RatingCompat rating) {
608182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
609182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnSetRatingCalled = true;
610182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mRating = rating;
611182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
612182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
613182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
614182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
615182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
616182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onPlayFromMediaId(String mediaId, Bundle extras) {
617182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
618182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnPlayFromMediaIdCalled = true;
619182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mMediaId = mediaId;
620182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mExtras = extras;
621182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
622182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
623182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
624182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
625182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
626182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onPlayFromSearch(String query, Bundle extras) {
627182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
628182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnPlayFromSearchCalled = true;
629182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mQuery = query;
630182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mExtras = extras;
631182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
632182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
633182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
634182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
635182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
636182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onPlayFromUri(Uri uri, Bundle extras) {
637182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
638182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnPlayFromUriCalled = true;
639182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mUri = uri;
640182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mExtras = extras;
641182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
642182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
643182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
644182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
645182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
646182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onCustomAction(String action, Bundle extras) {
647182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
648182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnCustomActionCalled = true;
649182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mAction = action;
650182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mExtras = extras;
651182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
652182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
653182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
654182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
655182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
656182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onSkipToQueueItem(long id) {
657182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
658182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnSkipToQueueItemCalled = true;
659182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mQueueItemId = id;
660182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
661182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
662182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
663182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
664182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
665182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onCommand(String command, Bundle extras, ResultReceiver cb) {
666182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
667182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnCommandCalled = true;
668182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mCommand = command;
669182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mExtras = extras;
670182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mCommandCallback = cb;
671182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
672182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
673182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
674182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
675182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
676182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onPrepare() {
677182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
678182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnPrepareCalled = true;
679182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
680182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
681182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
682182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
683182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
684182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onPrepareFromMediaId(String mediaId, Bundle extras) {
685182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
686182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnPrepareFromMediaIdCalled = true;
687182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mMediaId = mediaId;
688182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mExtras = extras;
689182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
690182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
691182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
692182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
693182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
694182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onPrepareFromSearch(String query, Bundle extras) {
695182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
696182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnPrepareFromSearchCalled = true;
697182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mQuery = query;
698182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mExtras = extras;
699182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
700182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
701182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
702182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
703182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
704182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onPrepareFromUri(Uri uri, Bundle extras) {
705182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
706182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnPrepareFromUriCalled = true;
707182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mUri = uri;
708182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mExtras = extras;
709182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
710182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
711182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
712182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
713182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
714182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onSetRepeatMode(int repeatMode) {
715182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
716182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnSetRepeatModeCalled = true;
717182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mRepeatMode = repeatMode;
718182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
719182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
720182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
721182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon
722182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        @Override
723db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        public void onAddQueueItem(MediaDescriptionCompat description) {
724db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            synchronized (mWaitLock) {
725db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon                mOnAddQueueItemCalled = true;
726db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon                mQueueDescription = description;
72765cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                mQueue.add(new MediaSessionCompat.QueueItem(description, mQueue.size()));
72865cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                mSession.setQueue(mQueue);
729db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon                mWaitLock.notify();
730db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            }
731db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        }
732db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon
733db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        @Override
734db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        public void onAddQueueItem(MediaDescriptionCompat description, int index) {
735db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            synchronized (mWaitLock) {
736db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon                mOnAddQueueItemAtCalled = true;
737db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon                mQueueIndex = index;
738db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon                mQueueDescription = description;
73965cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                mQueue.add(index, new MediaSessionCompat.QueueItem(description, mQueue.size()));
74065cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                mSession.setQueue(mQueue);
741db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon                mWaitLock.notify();
742db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            }
743db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        }
744db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon
745db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        @Override
746db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        public void onRemoveQueueItem(MediaDescriptionCompat description) {
747db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            synchronized (mWaitLock) {
748db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon                mOnRemoveQueueItemCalled = true;
74965cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                String mediaId = description.getMediaId();
75065cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                for (int i = mQueue.size() - 1; i >= 0; --i) {
75165cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                    if (mediaId.equals(mQueue.get(i).getDescription().getMediaId())) {
75265cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                        mQueueDescription = mQueue.remove(i).getDescription();
75365cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                        mSession.setQueue(mQueue);
75465cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                        break;
75565cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                    }
75665cde2c4554985493a2e7560b5e71c5f24969287Sungsoo                }
757db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon                mWaitLock.notify();
758db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon            }
759db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        }
760db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon
761db6b58731980f2972bfec455abbf2b82ad773a8dHyundo Moon        @Override
762e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho        public void onSetCaptioningEnabled(boolean enabled) {
763e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            synchronized (mWaitLock) {
764e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho                mOnSetCaptioningEnabledCalled = true;
765e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho                mCaptioningEnabled = enabled;
766e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho                mWaitLock.notify();
767e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho            }
768e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho        }
769e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho
770e90c068c82ce62a0069c4e88f6b26e92468231d6Donghyun Cho        @Override
771182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        public void onSetShuffleModeEnabled(boolean enabled) {
772182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            synchronized (mWaitLock) {
773182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mOnSetShuffleModeEnabledCalled = true;
774182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mShuffleModeEnabled = enabled;
775182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon                mWaitLock.notify();
776182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon            }
777182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon        }
77874198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon
77974198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon        @Override
78074198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon        public void onSetShuffleMode(int shuffleMode) {
78174198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon            synchronized (mWaitLock) {
78274198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon                mOnSetShuffleModeCalled = true;
78374198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon                mShuffleMode = shuffleMode;
78474198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon                mWaitLock.notify();
78574198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon            }
78674198cdcc6e4f53c7c6586d99ff727886de2441aHyundo Moon        }
787182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon    }
788182e4c394eb936f191cd4f615d6cbadeef6e902dHyundo Moon}
789