MediaSession2Test.java revision c227e5c8c58de8656a0a31a1f48bf66e49c4a19d
1fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang/*
2fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Copyright 2018 The Android Open Source Project
3fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang *
4fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Licensed under the Apache License, Version 2.0 (the "License");
5fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * you may not use this file except in compliance with the License.
6fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * You may obtain a copy of the License at
7fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang *
8fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang *      http://www.apache.org/licenses/LICENSE-2.0
9fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang *
10fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Unless required by applicable law or agreed to in writing, software
11fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * distributed under the License is distributed on an "AS IS" BASIS,
12fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * See the License for the specific language governing permissions and
14fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * limitations under the License.
15fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */
16fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
17fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangpackage androidx.media;
18fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
19fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static android.media.AudioAttributes.CONTENT_TYPE_MUSIC;
20fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
21f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moonimport static androidx.media.VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE;
22f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moonimport static androidx.media.VolumeProviderCompat.VOLUME_CONTROL_FIXED;
23f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moon
24fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertEquals;
25fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertFalse;
26fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertNotEquals;
27fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertNotNull;
28fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertNull;
29fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertSame;
30fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.assertTrue;
31fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport static org.junit.Assert.fail;
32fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
33fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.content.Context;
34fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.media.AudioManager;
35fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.os.Build;
36fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.os.Bundle;
37fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.os.Process;
38fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.os.ResultReceiver;
39fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.support.test.filters.SdkSuppress;
40fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.support.test.filters.SmallTest;
41fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.support.test.runner.AndroidJUnit4;
42fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
43fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.annotation.NonNull;
44fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Limimport androidx.annotation.Nullable;
45fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.media.MediaController2.ControllerCallback;
46fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.media.MediaController2.PlaybackInfo;
47fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.media.MediaSession2.CommandButton;
48fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.media.MediaSession2.ControllerInfo;
49fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.media.MediaSession2.SessionCallback;
50fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
51fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport junit.framework.Assert;
52fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
53fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport org.junit.After;
54fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport org.junit.Before;
55fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport org.junit.Ignore;
56fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport org.junit.Test;
57fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport org.junit.runner.RunWith;
58fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
59fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.ArrayList;
60fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.List;
61fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.Set;
62fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.concurrent.CountDownLatch;
63fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.concurrent.TimeUnit;
64fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
65fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang/**
66fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Tests {@link MediaSession2}.
67fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */
68fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang@SdkSuppress(minSdkVersion = Build.VERSION_CODES.KITKAT)
69fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang@RunWith(AndroidJUnit4.class)
70fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang@SmallTest
71fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangpublic class MediaSession2Test extends MediaSession2TestBase {
72fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    private static final String TAG = "MediaSession2Test";
73fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
74fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    private MediaSession2 mSession;
75fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    private MockPlayer mPlayer;
76fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    private MockPlaylistAgent mMockAgent;
77fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
78fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Before
79fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Override
80fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void setUp() throws Exception {
81fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        super.setUp();
82fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mPlayer = new MockPlayer(0);
83fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mMockAgent = new MockPlaylistAgent();
84fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
85fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession = new MediaSession2.Builder(mContext)
86fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlayer(mPlayer)
87fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlaylistAgent(mMockAgent)
88fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setSessionCallback(sHandlerExecutor, new SessionCallback() {
89fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    @Override
90fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    public SessionCommandGroup2 onConnect(MediaSession2 session,
91fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            ControllerInfo controller) {
92fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        if (Process.myUid() == controller.getUid()) {
93fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            return super.onConnect(session, controller);
94fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        }
95fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        return null;
96fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    }
97fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                }).build();
98fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
99fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
100fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @After
101fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Override
102fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void cleanUp() throws Exception {
103fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        super.cleanUp();
104fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.close();
105fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
106fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
107fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
108fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testBuilder() {
109fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
110fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        MediaSession2.Builder builder = new MediaSession2.Builder(mContext);
111fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        try {
112fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            builder.setPlayer(null);
113fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            fail("null player shouldn't be allowed");
114fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        } catch (IllegalArgumentException e) {
115fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            // expected. pass-through
116fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
117fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        try {
118fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            builder.setId(null);
119fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            fail("null id shouldn't be allowed");
120fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        } catch (IllegalArgumentException e) {
121fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            // expected. pass-through
122fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
123fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
124fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
125fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
126fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testPlayerStateChange() throws Exception {
127fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
128fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int targetState = MediaPlayerBase.PLAYER_STATE_PLAYING;
129fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latchForSessionCallback = new CountDownLatch(1);
130fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        sHandler.postAndSync(new Runnable() {
131fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
132fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void run() {
133fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mSession.close();
134fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mSession = new MediaSession2.Builder(mContext)
135fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        .setPlayer(mPlayer)
136fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        .setSessionCallback(sHandlerExecutor, new SessionCallback() {
137fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            @Override
138fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            public void onPlayerStateChanged(MediaSession2 session,
139fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                                    MediaPlayerBase player, int state) {
140fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                                assertEquals(targetState, state);
141fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                                latchForSessionCallback.countDown();
142fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            }
143fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        }).build();
144fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
145fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        });
146fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
147fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latchForControllerCallback = new CountDownLatch(1);
148fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaController2 controller =
149fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                createController(mSession.getToken(), true, new ControllerCallback() {
150fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    @Override
151fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    public void onPlayerStateChanged(MediaController2 controllerOut, int state) {
152fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        assertEquals(targetState, state);
153fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        latchForControllerCallback.countDown();
154fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    }
155fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                });
156fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
157ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        mPlayer.notifyPlaybackState(targetState);
158fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(latchForSessionCallback.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
159fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(latchForControllerCallback.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
160fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(targetState, controller.getPlayerState());
161fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
162fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
163fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
164ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon    public void testBufferingStateChange() throws Exception {
165ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        prepareLooper();
166ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        final List<MediaItem2> playlist = TestUtils.createPlaylist(5);
167ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon
168ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        final MediaItem2 targetItem = playlist.get(3);
169ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        final int targetBufferingState = MediaPlayerBase.BUFFERING_STATE_BUFFERING_COMPLETE;
170ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        final CountDownLatch latchForSessionCallback = new CountDownLatch(1);
171ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        sHandler.postAndSync(new Runnable() {
172ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon            @Override
173ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon            public void run() {
174ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                mSession.close();
175ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                mMockAgent.setPlaylist(playlist, null);
176ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                mSession = new MediaSession2.Builder(mContext)
177ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                        .setPlayer(mPlayer)
178ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                        .setPlaylistAgent(mMockAgent)
179ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                        .setSessionCallback(sHandlerExecutor, new SessionCallback() {
180ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                            @Override
181ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                            public void onBufferingStateChanged(MediaSession2 session,
182ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                                    MediaPlayerBase player, MediaItem2 item, int state) {
183ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                                assertEquals(targetItem, item);
184ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                                assertEquals(targetBufferingState, state);
185ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                                latchForSessionCallback.countDown();
186ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                            }
187ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                        }).build();
188ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon            }
189ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        });
190ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon
191ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        final CountDownLatch latchForControllerCallback = new CountDownLatch(1);
192ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        final MediaController2 controller =
193ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                createController(mSession.getToken(), true, new ControllerCallback() {
194ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                    @Override
195ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                    public void onBufferingStateChanged(MediaController2 controller,
196ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                            MediaItem2 item, int state) {
197ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                        assertEquals(targetItem, item);
198ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                        assertEquals(targetBufferingState, state);
199ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                        latchForControllerCallback.countDown();
200ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                    }
201ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon                });
202ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon
2031a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim        mPlayer.notifyBufferingStateChanged(targetItem.getDataSourceDesc(), targetBufferingState);
204ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        assertTrue(latchForSessionCallback.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
205ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        assertTrue(latchForControllerCallback.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
206ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        assertEquals(targetBufferingState, controller.getBufferingState());
207ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon    }
208ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon
209ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon    @Test
2101a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim    public void testSeekCompleted() throws Exception {
2111a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim        prepareLooper();
2121a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim        final long testPosition = 1001;
2131a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim        final CountDownLatch latch = new CountDownLatch(1);
2141a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim        final SessionCallback callback = new SessionCallback() {
2151a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim            @Override
2161a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim            public void onSeekCompleted(MediaSession2 session, MediaPlayerBase mpb, long position) {
2171a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim                assertEquals(mPlayer, mpb);
2181a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim                assertEquals(testPosition, position);
2191a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim                latch.countDown();
2201a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim            }
2211a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim        };
2221a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim
2231a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim        try (MediaSession2 session = new MediaSession2.Builder(mContext)
2241a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim                .setPlayer(mPlayer)
2251a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim                .setPlaylistAgent(mMockAgent)
2261a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim                .setId("testSeekCompleted")
2271a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim                .setSessionCallback(sHandlerExecutor, callback).build()) {
2281a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim            mPlayer.mCurrentPosition = testPosition;
2291a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim            mPlayer.notifySeekCompleted(testPosition);
2301a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
2311a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim        }
2321a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim    }
2331a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim
2341a125123e09a1f0e2991b1fce907970d8993667eJaewan Kim    @Test
235fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testCurrentDataSourceChanged() throws Exception {
236fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
237fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int listSize = 5;
238fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final List<MediaItem2> list = TestUtils.createPlaylist(listSize);
239fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mMockAgent.setPlaylist(list, null);
240fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
241fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaItem2 currentItem = list.get(3);
242ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        mMockAgent.mCurrentMediaItem = currentItem;
243ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon
244fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latchForSessionCallback = new CountDownLatch(1);
245fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        try (MediaSession2 session = new MediaSession2.Builder(mContext)
246fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlayer(mPlayer)
247fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlaylistAgent(mMockAgent)
248fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setId("testCurrentDataSourceChanged")
249fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setSessionCallback(sHandlerExecutor, new SessionCallback() {
250fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    @Override
251fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    public void onCurrentMediaItemChanged(MediaSession2 session,
252fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            MediaPlayerBase player, MediaItem2 itemOut) {
253fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        assertSame(currentItem, itemOut);
254fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        latchForSessionCallback.countDown();
255fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    }
256fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                }).build()) {
257fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
2583a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon            final CountDownLatch latchForControllerCallback = new CountDownLatch(1);
2593a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon            final MediaController2 controller =
2603a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon                    createController(mSession.getToken(), true, new ControllerCallback() {
2613a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon                        @Override
2623a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon                        public void onCurrentMediaItemChanged(MediaController2 controller,
2633a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon                                MediaItem2 item) {
2643a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon                            assertEquals(currentItem, item);
2653a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon                            latchForControllerCallback.countDown();
2663a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon                        }
2673a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon                    });
2683a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon
269fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            mPlayer.notifyCurrentDataSourceChanged(currentItem.getDataSourceDesc());
270fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertTrue(latchForSessionCallback.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
2713a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon            assertTrue(latchForControllerCallback.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
2723a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon            assertEquals(currentItem, controller.getCurrentMediaItem());
273fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
274fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
275fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
276fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
277fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testMediaPrepared() throws Exception {
278fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
279fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int listSize = 5;
280fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final List<MediaItem2> list = TestUtils.createPlaylist(listSize);
281fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mMockAgent.setPlaylist(list, null);
282fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
283fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaItem2 currentItem = list.get(3);
284fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
285fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latchForSessionCallback = new CountDownLatch(1);
286fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        try (MediaSession2 session = new MediaSession2.Builder(mContext)
287fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlayer(mPlayer)
288fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlaylistAgent(mMockAgent)
289fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setId("testMediaPrepared")
290fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setSessionCallback(sHandlerExecutor, new SessionCallback() {
291fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    @Override
292fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    public void onMediaPrepared(MediaSession2 session, MediaPlayerBase player,
293fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            MediaItem2 itemOut) {
294fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        assertSame(currentItem, itemOut);
295fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        latchForSessionCallback.countDown();
296fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    }
297fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                }).build()) {
298fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
299fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            mPlayer.notifyMediaPrepared(currentItem.getDataSourceDesc());
300fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertTrue(latchForSessionCallback.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
301fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            // TODO(jaewan): Test that controllers are also notified. (b/74505936)
302fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
303fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
304fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
305fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
306fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testBufferingStateChanged() throws Exception {
307fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
308fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int listSize = 5;
309fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final List<MediaItem2> list = TestUtils.createPlaylist(listSize);
310fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mMockAgent.setPlaylist(list, null);
311fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
312fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaItem2 currentItem = list.get(3);
313fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int buffState = MediaPlayerBase.BUFFERING_STATE_BUFFERING_COMPLETE;
314fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
315fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latchForSessionCallback = new CountDownLatch(1);
316fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        try (MediaSession2 session = new MediaSession2.Builder(mContext)
317fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlayer(mPlayer)
318fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlaylistAgent(mMockAgent)
319fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setId("testBufferingStateChanged")
320fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setSessionCallback(sHandlerExecutor, new SessionCallback() {
321fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    @Override
322fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    public void onBufferingStateChanged(MediaSession2 session,
323fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            MediaPlayerBase player, MediaItem2 itemOut, int stateOut) {
324fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        assertSame(currentItem, itemOut);
325fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        assertEquals(buffState, stateOut);
326fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        latchForSessionCallback.countDown();
327fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    }
328fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                }).build()) {
329fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
330fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            mPlayer.notifyBufferingStateChanged(currentItem.getDataSourceDesc(), buffState);
331fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertTrue(latchForSessionCallback.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
332fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            // TODO(jaewan): Test that controllers are also notified. (b/74505936)
333fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
334fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
335fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
336e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon    /**
337e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon     * This also tests {@link ControllerCallback#onPlaybackSpeedChanged(MediaController2, float)}
338e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon     * and {@link MediaController2#getPlaybackSpeed()}.
339e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon     */
340e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon    @Test
341e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon    public void testPlaybackSpeedChanged() throws Exception {
342e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        prepareLooper();
343e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        final float speed = 1.5f;
344e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        mPlayer.setPlaybackSpeed(speed);
345e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon
346e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        final CountDownLatch latchForSessionCallback = new CountDownLatch(1);
347e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        try (MediaSession2 session = new MediaSession2.Builder(mContext)
348e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                .setPlayer(mPlayer)
349e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                .setId("testPlaybackSpeedChanged")
350e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                .setSessionCallback(sHandlerExecutor, new SessionCallback() {
351e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                    @Override
352e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                    public void onPlaybackSpeedChanged(MediaSession2 session,
353e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                            MediaPlayerBase player, float speedOut) {
354e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                        assertEquals(speed, speedOut, 0.0f);
355e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                        latchForSessionCallback.countDown();
356e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                    }
357e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                }).build()) {
358e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon
359e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon            final CountDownLatch latchForControllerCallback = new CountDownLatch(1);
360e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon            final MediaController2 controller =
361e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                    createController(mSession.getToken(), true, new ControllerCallback() {
362e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                        @Override
363e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                        public void onPlaybackSpeedChanged(MediaController2 controller,
364e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                                float speedOut) {
365e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                            assertEquals(speed, speedOut, 0.0f);
366e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                            latchForControllerCallback.countDown();
367e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                        }
368e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon                    });
369e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon
370e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon            mPlayer.notifyPlaybackSpeedChanged(speed);
371e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon            assertTrue(latchForSessionCallback.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
372e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon            assertTrue(latchForControllerCallback.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
373e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon            assertEquals(speed, controller.getPlaybackSpeed(), 0.0f);
374e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        }
375e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon    }
376e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon
377fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
378fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testUpdatePlayer() throws Exception {
379fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
380fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int targetState = MediaPlayerBase.PLAYER_STATE_PLAYING;
381fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(1);
382fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        sHandler.postAndSync(new Runnable() {
383fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
384fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void run() {
385fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mSession.close();
386fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mSession = new MediaSession2.Builder(mContext).setPlayer(mPlayer)
387fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        .setSessionCallback(sHandlerExecutor, new SessionCallback() {
388fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            @Override
389fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            public void onPlayerStateChanged(MediaSession2 session,
390fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                                    MediaPlayerBase player, int state) {
391fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                                assertEquals(targetState, state);
392fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                                latch.countDown();
393fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            }
394fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        }).build();
395fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
396fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        });
397fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
398fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        MockPlayer player = new MockPlayer(0);
399fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
400fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        // Test if setPlayer doesn't crash with various situations.
401fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.updatePlayer(mPlayer, null, null);
402fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(mPlayer, mSession.getPlayer());
403fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        MediaPlaylistAgent agent = mSession.getPlaylistAgent();
404fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertNotNull(agent);
405fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
406fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.updatePlayer(player, null, null);
407fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(player, mSession.getPlayer());
408fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertNotNull(mSession.getPlaylistAgent());
409fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertNotEquals(agent, mSession.getPlaylistAgent());
410fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
411fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        player.notifyPlaybackState(MediaPlayerBase.PLAYER_STATE_PLAYING);
412fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
413fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
414fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
415fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
416c227e5c8c58de8656a0a31a1f48bf66e49c4a19dJaewan Kim    public void testUpdatePlayer_playbackInfo() throws Exception {
417fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
418fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        MockPlayer player = new MockPlayer(0);
419fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final AudioAttributesCompat attrs = new AudioAttributesCompat.Builder()
420fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setContentType(CONTENT_TYPE_MUSIC)
421fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .build();
422fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        player.setAudioAttributes(attrs);
423fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
424fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int maxVolume = 100;
425fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int currentVolume = 23;
426f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moon        final int volumeControlType = VOLUME_CONTROL_ABSOLUTE;
427f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moon        VolumeProviderCompat volumeProvider = new VolumeProviderCompat(
428f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moon                volumeControlType, maxVolume, currentVolume) { };
429fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
430fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(1);
431fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final ControllerCallback callback = new ControllerCallback() {
432fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
433fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void onPlaybackInfoChanged(MediaController2 controller, PlaybackInfo info) {
434fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                Assert.assertEquals(PlaybackInfo.PLAYBACK_TYPE_REMOTE, info.getPlaybackType());
435fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(attrs, info.getAudioAttributes());
436fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(volumeControlType, info.getPlaybackType());
437fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(maxVolume, info.getMaxVolume());
438fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(currentVolume, info.getCurrentVolume());
439fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                latch.countDown();
440fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
441fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        };
442fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
443fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.updatePlayer(player, null, null);
444fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
445fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaController2 controller = createController(mSession.getToken(), true, callback);
446fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        PlaybackInfo info = controller.getPlaybackInfo();
447fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertNotNull(info);
448fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(PlaybackInfo.PLAYBACK_TYPE_LOCAL, info.getPlaybackType());
449fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(attrs, info.getAudioAttributes());
450fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        AudioManager manager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
451f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moon
452f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moon        int localVolumeControlType = VOLUME_CONTROL_ABSOLUTE;
453f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moon        if (Build.VERSION.SDK_INT >= 21 && manager.isVolumeFixed()) {
454f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moon            localVolumeControlType = VOLUME_CONTROL_FIXED;
455f66f34b424baf93d223bb905184b5b6e1d086c5dHyundo Moon        }
456fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(localVolumeControlType, info.getControlType());
457fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), info.getMaxVolume());
458fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(manager.getStreamVolume(AudioManager.STREAM_MUSIC), info.getCurrentVolume());
459fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
460fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.updatePlayer(player, null, volumeProvider);
461fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
462fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
463fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        info = controller.getPlaybackInfo();
464fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertNotNull(info);
465fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(PlaybackInfo.PLAYBACK_TYPE_REMOTE, info.getPlaybackType());
466fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(attrs, info.getAudioAttributes());
467fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(volumeControlType, info.getControlType());
468fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(maxVolume, info.getMaxVolume());
469fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(currentVolume, info.getCurrentVolume());
470fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
471fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
472fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
473fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testPlay() throws Exception {
474fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
475fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.play();
476fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mPlayer.mPlayCalled);
477fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
478fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
479fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
480fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testPause() throws Exception {
481fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
482fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.pause();
483fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mPlayer.mPauseCalled);
484fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
485fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
486fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
487fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testReset() throws Exception {
488fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
489fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.reset();
490fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mPlayer.mResetCalled);
491fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
492fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
493fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
494fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testPrepare() throws Exception {
495fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
496fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.prepare();
497fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mPlayer.mPrepareCalled);
498fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
499fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
500fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
501fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSeekTo() throws Exception {
502fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
503fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final long pos = 1004L;
504fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.seekTo(pos);
505fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mPlayer.mSeekToCalled);
506fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(pos, mPlayer.mSeekPosition);
507fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
508fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
509fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
510e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon    public void testSetPlaybackSpeed() throws Exception {
511e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        prepareLooper();
512e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        final float speed = 1.5f;
513e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        mSession.setPlaybackSpeed(speed);
514e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        assertTrue(mPlayer.mSetPlaybackSpeedCalled);
515e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        assertEquals(speed, mPlayer.mPlaybackSpeed, 0.0f);
516e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon    }
517e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon
518e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon    @Test
519e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon    public void testGetPlaybackSpeed() throws Exception {
520e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        prepareLooper();
521e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        final float speed = 1.5f;
522e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        mPlayer.setPlaybackSpeed(speed);
523e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon        assertEquals(speed, mSession.getPlaybackSpeed(), 0.0f);
524e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon    }
525e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon
526e18fafc56c49f683278d91e16a7246c7b1e01badHyundo Moon    @Test
5273a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon    public void testGetCurrentMediaItem() {
5283a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon        prepareLooper();
5293a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon        MediaItem2 item = TestUtils.createMediaItemWithMetadata();
5303a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon        mMockAgent.mCurrentMediaItem = item;
5313a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon        assertEquals(item, mSession.getCurrentMediaItem());
5323a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon    }
5333a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon
5343a151f1283d08b40c12e4a17903ba421f23c4342Hyundo Moon    @Test
535fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSkipToPreviousItem() {
536fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
537fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.skipToPreviousItem();
538fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mMockAgent.mSkipToPreviousItemCalled);
539fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
540fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
541fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
542fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSkipToNextItem() throws Exception {
543fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
544fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.skipToNextItem();
545fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mMockAgent.mSkipToNextItemCalled);
546fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
547fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
548fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
549fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSkipToPlaylistItem() throws Exception {
550fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
551fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaItem2 testMediaItem = TestUtils.createMediaItemWithMetadata();
552fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.skipToPlaylistItem(testMediaItem);
553fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mMockAgent.mSkipToPlaylistItemCalled);
554fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertSame(testMediaItem, mMockAgent.mItem);
555fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
556fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
557fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
558fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testGetPlayerState() {
559fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
560fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int state = MediaPlayerBase.PLAYER_STATE_PLAYING;
561fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mPlayer.mLastPlayerState = state;
562fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(state, mSession.getPlayerState());
563fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
564fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
565fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
566ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon    public void testGetBufferingState() {
567ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        prepareLooper();
568ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        final int bufferingState = MediaPlayerBase.BUFFERING_STATE_BUFFERING_AND_PLAYABLE;
569ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        mPlayer.mLastBufferingState = bufferingState;
570ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon        assertEquals(bufferingState, mSession.getBufferingState());
571ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon    }
572ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon
573ebc904f04b5f4c011ec791b1b0e94660ac02fdbaHyundo Moon    @Test
574fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testGetPosition() {
575fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
576fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final long position = 150000;
577fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mPlayer.mCurrentPosition = position;
578fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(position, mSession.getCurrentPosition());
579fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
580fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
581fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
582fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testGetBufferedPosition() {
583fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
584fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final long bufferedPosition = 900000;
585fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mPlayer.mBufferedPosition = bufferedPosition;
586fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(bufferedPosition, mSession.getBufferedPosition());
587fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
588fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
589fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
590fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSetPlaylist() {
591fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
592fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final List<MediaItem2> list = TestUtils.createPlaylist(2);
593fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.setPlaylist(list, null);
594fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mMockAgent.mSetPlaylistCalled);
595fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertSame(list, mMockAgent.mPlaylist);
596fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertNull(mMockAgent.mMetadata);
597fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
598fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
599fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
600fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testGetPlaylist() {
601fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
602fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final List<MediaItem2> list = TestUtils.createPlaylist(2);
603fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mMockAgent.mPlaylist = list;
604fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(list, mSession.getPlaylist());
605fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
606fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
607fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
608fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testUpdatePlaylistMetadata() {
609fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
610fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaMetadata2 testMetadata = TestUtils.createMetadata();
611fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.updatePlaylistMetadata(testMetadata);
612fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mMockAgent.mUpdatePlaylistMetadataCalled);
613fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertSame(testMetadata, mMockAgent.mMetadata);
614fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
615fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
616fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
617fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testGetPlaylistMetadata() {
618fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
619fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaMetadata2 testMetadata = TestUtils.createMetadata();
620fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mMockAgent.mMetadata = testMetadata;
621fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(testMetadata, mSession.getPlaylistMetadata());
622fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
623fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
624fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
625fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSessionCallback_onPlaylistChanged() throws InterruptedException {
626fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
627fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final List<MediaItem2> list = TestUtils.createPlaylist(2);
628fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(1);
629fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mMockAgent.setPlaylist(list, null);
630fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
631fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final SessionCallback sessionCallback = new SessionCallback() {
632fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
633fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void onPlaylistChanged(MediaSession2 session, MediaPlaylistAgent playlistAgent,
634fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    List<MediaItem2> playlist, MediaMetadata2 metadata) {
635fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(mMockAgent, playlistAgent);
636fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(list, playlist);
637fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertNull(metadata);
638fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                latch.countDown();
639fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
640fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        };
641fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        try (MediaSession2 session = new MediaSession2.Builder(mContext)
642fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlayer(mPlayer)
643fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlaylistAgent(mMockAgent)
644fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setId("testSessionCallback")
645fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setSessionCallback(sHandlerExecutor, sessionCallback)
646fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .build()) {
647fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            mMockAgent.notifyPlaylistChanged();
648fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
649fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
650fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
651fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
652fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
653fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testAddPlaylistItem() {
654fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
655fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int testIndex = 12;
656fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaItem2 testMediaItem = TestUtils.createMediaItemWithMetadata();
657fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.addPlaylistItem(testIndex, testMediaItem);
658fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mMockAgent.mAddPlaylistItemCalled);
659fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(testIndex, mMockAgent.mIndex);
660fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertSame(testMediaItem, mMockAgent.mItem);
661fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
662fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
663fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
664fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testRemovePlaylistItem() {
665fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
666fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaItem2 testMediaItem = TestUtils.createMediaItemWithMetadata();
667fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.removePlaylistItem(testMediaItem);
668fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mMockAgent.mRemovePlaylistItemCalled);
669fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertSame(testMediaItem, mMockAgent.mItem);
670fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
671fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
672fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
673fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testReplacePlaylistItem() throws InterruptedException {
674fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
675fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int testIndex = 12;
676fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaItem2 testMediaItem = TestUtils.createMediaItemWithMetadata();
677fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.replacePlaylistItem(testIndex, testMediaItem);
678fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mMockAgent.mReplacePlaylistItemCalled);
679fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(testIndex, mMockAgent.mIndex);
680fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertSame(testMediaItem, mMockAgent.mItem);
681fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
682fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
683fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    /**
684fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang     * This also tests {@link SessionCallback#onShuffleModeChanged}
685fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang     */
686fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
687fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testGetShuffleMode() throws InterruptedException {
688fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
689fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int testShuffleMode = MediaPlaylistAgent.SHUFFLE_MODE_GROUP;
690fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mMockAgent.setShuffleMode(testShuffleMode);
691fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
692fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(1);
693fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final SessionCallback sessionCallback = new SessionCallback() {
694fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
695fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void onShuffleModeChanged(MediaSession2 session,
696fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    MediaPlaylistAgent playlistAgent, int shuffleMode) {
697fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(mMockAgent, playlistAgent);
698fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(testShuffleMode, shuffleMode);
699fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                latch.countDown();
700fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
701fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        };
702fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        try (MediaSession2 session = new MediaSession2.Builder(mContext)
703fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlayer(mPlayer)
704fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlaylistAgent(mMockAgent)
705fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setId("testGetShuffleMode")
706fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setSessionCallback(sHandlerExecutor, sessionCallback)
707fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .build()) {
708fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            mMockAgent.notifyShuffleModeChanged();
709fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
710fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
711fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
712fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
713fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
714fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSetShuffleMode() {
715fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
716fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int testShuffleMode = MediaPlaylistAgent.SHUFFLE_MODE_GROUP;
717fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.setShuffleMode(testShuffleMode);
718fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mMockAgent.mSetShuffleModeCalled);
719fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(testShuffleMode, mMockAgent.mShuffleMode);
720fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
721fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
722fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    /**
723fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang     * This also tests {@link SessionCallback#onShuffleModeChanged}
724fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang     */
725fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
726fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testGetRepeatMode() throws InterruptedException {
727fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
728fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int testRepeatMode = MediaPlaylistAgent.REPEAT_MODE_GROUP;
729fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mMockAgent.setRepeatMode(testRepeatMode);
730fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
731fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(1);
732fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final SessionCallback sessionCallback = new SessionCallback() {
733fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
734fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void onRepeatModeChanged(MediaSession2 session, MediaPlaylistAgent playlistAgent,
735fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    int repeatMode) {
736fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(mMockAgent, playlistAgent);
737fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(testRepeatMode, repeatMode);
738fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                latch.countDown();
739fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
740fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        };
741fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        try (MediaSession2 session = new MediaSession2.Builder(mContext)
742fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlayer(mPlayer)
743fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlaylistAgent(mMockAgent)
744fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setId("testGetRepeatMode")
745fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setSessionCallback(sHandlerExecutor, sessionCallback)
746fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .build()) {
747fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            mMockAgent.notifyRepeatModeChanged();
748fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
749fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
750fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
751fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
752fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
753fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSetRepeatMode() {
754fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
755fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int testRepeatMode = MediaPlaylistAgent.REPEAT_MODE_GROUP;
756fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.setRepeatMode(testRepeatMode);
757fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mMockAgent.mSetRepeatModeCalled);
758fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(testRepeatMode, mMockAgent.mRepeatMode);
759fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
760fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
761fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    // TODO(jaewan): Revisit
762fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Ignore
763fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
764fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testBadPlayer() throws InterruptedException {
765fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
766fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        // TODO(jaewan): Add equivalent tests again
767fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(4); // expected call + 1
768fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final BadPlayer player = new BadPlayer(0);
769fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
770fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.updatePlayer(player, null, null);
771fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.updatePlayer(mPlayer, null, null);
772fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        player.notifyPlaybackState(MediaPlayerBase.PLAYER_STATE_PAUSED);
773fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertFalse(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
774fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
775fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
776fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    // This bad player will keep push events to the listener that is previously
777fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    // registered by session.setPlayer().
778fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    private static class BadPlayer extends MockPlayer {
779fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        BadPlayer(int count) {
780fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            super(count);
781fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
782fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
783fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        @Override
784fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        public void unregisterPlayerEventCallback(
785fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                @NonNull MediaPlayerBase.PlayerEventCallback listener) {
786fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            // No-op.
787fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
788fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
789fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
790fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
791fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testOnCommandCallback() throws InterruptedException {
792fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
793fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MockOnCommandCallback callback = new MockOnCommandCallback();
794fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        sHandler.postAndSync(new Runnable() {
795fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
796fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void run() {
797fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mSession.close();
798fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mPlayer = new MockPlayer(1);
799fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mSession = new MediaSession2.Builder(mContext).setPlayer(mPlayer)
800fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        .setSessionCallback(sHandlerExecutor, callback).build();
801fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
802fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        });
803fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        MediaController2 controller = createController(mSession.getToken());
804fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        controller.pause();
805fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertFalse(mPlayer.mCountDownLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
806fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertFalse(mPlayer.mPauseCalled);
807fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(1, callback.commands.size());
808fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(SessionCommand2.COMMAND_CODE_PLAYBACK_PAUSE,
809fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                (long) callback.commands.get(0).getCommandCode());
810fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
811fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        controller.play();
812fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mPlayer.mCountDownLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
813fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(mPlayer.mPlayCalled);
814fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertFalse(mPlayer.mPauseCalled);
815fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(2, callback.commands.size());
816fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(SessionCommand2.COMMAND_CODE_PLAYBACK_PLAY,
817fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                (long) callback.commands.get(1).getCommandCode());
818fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
819fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
820fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
821fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testOnConnectCallback() throws InterruptedException {
822fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
823fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MockOnConnectCallback sessionCallback = new MockOnConnectCallback();
824fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        sHandler.postAndSync(new Runnable() {
825fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
826fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void run() {
827fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mSession.close();
828fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mSession = new MediaSession2.Builder(mContext).setPlayer(mPlayer)
829fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        .setSessionCallback(sHandlerExecutor, sessionCallback).build();
830fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
831fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        });
832fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        MediaController2 controller = createController(mSession.getToken(), false, null);
833fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertNotNull(controller);
834fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        waitForConnect(controller, false);
835fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        waitForDisconnect(controller, true);
836fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
837fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
838fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
839fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testOnDisconnectCallback() throws InterruptedException {
840fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
841fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(1);
842fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        try (MediaSession2 session = new MediaSession2.Builder(mContext)
843fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlayer(mPlayer)
844fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setId("testOnDisconnectCallback")
845fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setSessionCallback(sHandlerExecutor, new SessionCallback() {
846fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    @Override
847fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    public void onDisconnected(MediaSession2 session,
848fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                            ControllerInfo controller) {
849fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        assertEquals(Process.myUid(), controller.getUid());
850fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        latch.countDown();
851fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    }
852fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                }).build()) {
853fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            MediaController2 controller = createController(session.getToken());
854fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            controller.close();
855fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
856fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
857fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
858fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
859fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
860fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSetCustomLayout() throws InterruptedException {
861fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
862fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final List<CommandButton> buttons = new ArrayList<>();
863fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        buttons.add(new CommandButton.Builder()
864fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setCommand(new SessionCommand2(SessionCommand2.COMMAND_CODE_PLAYBACK_PLAY))
865fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setDisplayName("button").build());
866fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(1);
867fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final SessionCallback sessionCallback = new SessionCallback() {
868fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
869fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public SessionCommandGroup2 onConnect(MediaSession2 session,
870fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    ControllerInfo controller) {
871fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                if (mContext.getPackageName().equals(controller.getPackageName())) {
872fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    mSession.setCustomLayout(controller, buttons);
873fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                }
874fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                return super.onConnect(session, controller);
875fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
876fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        };
877fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
878fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        try (MediaSession2 session = new MediaSession2.Builder(mContext)
879fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setPlayer(mPlayer)
880fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setId("testSetCustomLayout")
881fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .setSessionCallback(sHandlerExecutor, sessionCallback)
882fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                .build()) {
883fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            if (mSession != null) {
884fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mSession.close();
885fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                mSession = session;
886fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
887fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            final ControllerCallback callback = new ControllerCallback() {
888fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                @Override
889fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                public void onCustomLayoutChanged(MediaController2 controller2,
890fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        List<CommandButton> layout) {
891fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    assertEquals(layout.size(), buttons.size());
892fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    for (int i = 0; i < layout.size(); i++) {
893fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        assertEquals(layout.get(i).getCommand(), buttons.get(i).getCommand());
894fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                        assertEquals(layout.get(i).getDisplayName(),
895fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                                buttons.get(i).getDisplayName());
896fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    }
897fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    latch.countDown();
898fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                }
899fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            };
900fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            final MediaController2 controller =
901fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    createController(session.getToken(), true, callback);
902fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
903fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
904fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
905fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
906fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
907fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSetAllowedCommands() throws InterruptedException {
908fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
909fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final SessionCommandGroup2 commands = new SessionCommandGroup2();
910fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        commands.addCommand(new SessionCommand2(SessionCommand2.COMMAND_CODE_PLAYBACK_PLAY));
911fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        commands.addCommand(new SessionCommand2(SessionCommand2.COMMAND_CODE_PLAYBACK_PAUSE));
912fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        commands.addCommand(new SessionCommand2(SessionCommand2.COMMAND_CODE_PLAYBACK_RESET));
913fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
914fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(1);
915fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final ControllerCallback callback = new ControllerCallback() {
916fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
917fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void onAllowedCommandsChanged(MediaController2 controller,
918fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    SessionCommandGroup2 commandsOut) {
919fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertNotNull(commandsOut);
920fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                Set<SessionCommand2> expected = commands.getCommands();
921fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                Set<SessionCommand2> actual = commandsOut.getCommands();
922fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
923fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertNotNull(actual);
924fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(expected.size(), actual.size());
925fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                for (SessionCommand2 command : expected) {
926fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    assertTrue(actual.contains(command));
927fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                }
928fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                latch.countDown();
929fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
930fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        };
931fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
932fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaController2 controller = createController(mSession.getToken(), true, callback);
933fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        ControllerInfo controllerInfo = getTestControllerInfo();
934fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertNotNull(controllerInfo);
935fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
936fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.setAllowedCommands(controllerInfo, commands);
937fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
938fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
939fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
940fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
941fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testSendCustomCommand() throws InterruptedException {
942fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
943fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final SessionCommand2 testCommand = new SessionCommand2(
944fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                SessionCommand2.COMMAND_CODE_PLAYBACK_PREPARE);
945fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final Bundle testArgs = new Bundle();
946fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        testArgs.putString("args", "testSendCustomAction");
947fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
948fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(2);
949fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final ControllerCallback callback = new ControllerCallback() {
950fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
951fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void onCustomCommand(MediaController2 controller, SessionCommand2 command,
952fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                    Bundle args, ResultReceiver receiver) {
953fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(testCommand, command);
954fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertTrue(TestUtils.equals(testArgs, args));
955fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertNull(receiver);
956fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                latch.countDown();
957fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
958fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        };
959fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaController2 controller =
960fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                createController(mSession.getToken(), true, callback);
961fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        // TODO(jaewan): Test with multiple controllers
962fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.sendCustomCommand(testCommand, testArgs);
963fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
964fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        ControllerInfo controllerInfo = getTestControllerInfo();
965fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertNotNull(controllerInfo);
966fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        // TODO(jaewan): Test receivers as well.
967fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.sendCustomCommand(controllerInfo, testCommand, testArgs, null);
968fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
969fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
970fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
971fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    @Test
972fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public void testNotifyError() throws InterruptedException {
973fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        prepareLooper();
974fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final int errorCode = MediaSession2.ERROR_CODE_NOT_AVAILABLE_IN_REGION;
975fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final Bundle extras = new Bundle();
976fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        extras.putString("args", "testNotifyError");
977fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
978fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final CountDownLatch latch = new CountDownLatch(1);
979fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final ControllerCallback callback = new ControllerCallback() {
980fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            @Override
981fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            public void onError(MediaController2 controller, int errorCodeOut, Bundle extrasOut) {
982fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(errorCode, errorCodeOut);
983fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertTrue(TestUtils.equals(extras, extrasOut));
984fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                latch.countDown();
985fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
986fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        };
987fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        final MediaController2 controller = createController(mSession.getToken(), true, callback);
988fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        // TODO(jaewan): Test with multiple controllers
989fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        mSession.notifyError(errorCode, extras);
990fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
991fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
992fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
993fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim    @Test
994fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim    public void testNotifyRoutesInfoChanged() throws InterruptedException {
995fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim        prepareLooper();
996fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim        final CountDownLatch latch = new CountDownLatch(1);
997fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim        final ControllerCallback callback = new ControllerCallback() {
998fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim            @Override
999fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim            public void onRoutesInfoChanged(@NonNull MediaController2 controller,
1000fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim                    @Nullable List<Bundle> routes) {
1001fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim                assertNull(routes);
1002fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim                latch.countDown();
1003fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim            }
1004fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim        };
1005fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim        final MediaController2 controller = createController(mSession.getToken(), true, callback);
1006fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim        ControllerInfo controllerInfo = getTestControllerInfo();
1007fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim        mSession.notifyRoutesInfoChanged(controllerInfo, null);
1008fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim        assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
1009fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim    }
1010fa1b27e361831b01f2d97d816f48c39ccf0ff539Sungsoo Lim
1011fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    private ControllerInfo getTestControllerInfo() {
1012fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        List<ControllerInfo> controllers = mSession.getConnectedControllers();
1013fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertNotNull(controllers);
1014fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        for (int i = 0; i < controllers.size(); i++) {
1015fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            if (Process.myUid() == controllers.get(i).getUid()) {
1016fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                return controllers.get(i);
1017fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
1018fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
1019fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        fail("Failed to get test controller info");
1020fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        return null;
1021fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
1022fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
1023fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public class MockOnConnectCallback extends SessionCallback {
1024fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        @Override
1025fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        public SessionCommandGroup2 onConnect(MediaSession2 session,
1026fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                ControllerInfo controllerInfo) {
1027fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            if (Process.myUid() != controllerInfo.getUid()) {
1028fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                return null;
1029fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
1030fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertEquals(mContext.getPackageName(), controllerInfo.getPackageName());
1031fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertEquals(Process.myUid(), controllerInfo.getUid());
1032fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertFalse(controllerInfo.isTrusted());
1033fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            // Reject all
1034fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            return null;
1035fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
1036fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
1037fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
1038fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    public class MockOnCommandCallback extends SessionCallback {
1039fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        public final ArrayList<SessionCommand2> commands = new ArrayList<>();
1040fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
1041fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        @Override
1042fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        public boolean onCommandRequest(MediaSession2 session, ControllerInfo controllerInfo,
1043fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                SessionCommand2 command) {
1044fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertEquals(mContext.getPackageName(), controllerInfo.getPackageName());
1045fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertEquals(Process.myUid(), controllerInfo.getUid());
1046fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertFalse(controllerInfo.isTrusted());
1047fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            commands.add(command);
1048fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            if (command.getCommandCode() == SessionCommand2.COMMAND_CODE_PLAYBACK_PAUSE) {
1049fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                return false;
1050fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
1051fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            return true;
1052fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
1053fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
1054fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
1055fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    private static void assertMediaItemListEquals(List<MediaItem2> a, List<MediaItem2> b) {
1056fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        if (a == null || b == null) {
1057fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertEquals(a, b);
1058fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
1059fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        assertEquals(a.size(), b.size());
1060fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
1061fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        for (int i = 0; i < a.size(); i++) {
1062fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            MediaItem2 aItem = a.get(i);
1063fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            MediaItem2 bItem = b.get(i);
1064fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
1065fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            if (aItem == null || bItem == null) {
1066fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                assertEquals(aItem, bItem);
1067fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang                continue;
1068fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            }
1069fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
1070fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertEquals(aItem.getMediaId(), bItem.getMediaId());
1071fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            assertEquals(aItem.getFlags(), bItem.getFlags());
1072fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            TestUtils.equals(aItem.getMetadata().toBundle(), bItem.getMetadata().toBundle());
1073fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang
1074fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            // Note: Here it does not check whether DataSourceDesc are equal,
1075fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang            // since there DataSourceDec is not comparable.
1076fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang        }
1077fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang    }
1078fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang}
1079