blob: 559187d2c38cef517717cfbbd3a9ed5b5237acc9 [file] [log] [blame]
hughchen61c1c9f2019-01-17 14:34:51 +08001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settingslib.media;
18
Tim Pengdbdfaef2020-03-11 11:30:01 +080019import static android.media.MediaRoute2ProviderService.REASON_UNKNOWN_ERROR;
20
hughchen61c1c9f2019-01-17 14:34:51 +080021import static com.google.common.truth.Truth.assertThat;
22
23import static org.mockito.ArgumentMatchers.any;
hughchen61c1c9f2019-01-17 14:34:51 +080024import static org.mockito.Mockito.mock;
25import static org.mockito.Mockito.never;
26import static org.mockito.Mockito.verify;
27import static org.mockito.Mockito.when;
28
hughchenb3d68f62020-02-11 14:30:14 +080029import android.bluetooth.BluetoothAdapter;
30import android.bluetooth.BluetoothDevice;
hughchen61c1c9f2019-01-17 14:34:51 +080031import android.content.Context;
Tim Pengdbdfaef2020-03-11 11:30:01 +080032import android.media.MediaRoute2Info;
33import android.media.MediaRouter2Manager;
hughchen61c1c9f2019-01-17 14:34:51 +080034
35import com.android.settingslib.bluetooth.A2dpProfile;
hughchenc0c11632019-03-07 16:21:17 +080036import com.android.settingslib.bluetooth.CachedBluetoothDevice;
hughchenb3d68f62020-02-11 14:30:14 +080037import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
hughchen61c1c9f2019-01-17 14:34:51 +080038import com.android.settingslib.bluetooth.HearingAidProfile;
39import com.android.settingslib.bluetooth.LocalBluetoothManager;
40import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
hughchenb3d68f62020-02-11 14:30:14 +080041import com.android.settingslib.testutils.shadow.ShadowBluetoothAdapter;
hughchen61c1c9f2019-01-17 14:34:51 +080042
43import org.junit.Before;
44import org.junit.Test;
45import org.junit.runner.RunWith;
46import org.mockito.Mock;
47import org.mockito.MockitoAnnotations;
48import org.robolectric.RobolectricTestRunner;
49import org.robolectric.RuntimeEnvironment;
hughchenb3d68f62020-02-11 14:30:14 +080050import org.robolectric.annotation.Config;
51import org.robolectric.shadow.api.Shadow;
hughchen61c1c9f2019-01-17 14:34:51 +080052
53import java.util.ArrayList;
54import java.util.List;
55
56@RunWith(RobolectricTestRunner.class)
hughchenb3d68f62020-02-11 14:30:14 +080057@Config(shadows = {ShadowBluetoothAdapter.class})
hughchen61c1c9f2019-01-17 14:34:51 +080058public class LocalMediaManagerTest {
59
Tim Pengdbdfaef2020-03-11 11:30:01 +080060 private static final String TEST_DEVICE_NAME_1 = "device_name_1";
61 private static final String TEST_DEVICE_NAME_2 = "device_name_2";
hughchen61c1c9f2019-01-17 14:34:51 +080062 private static final String TEST_DEVICE_ID_1 = "device_id_1";
63 private static final String TEST_DEVICE_ID_2 = "device_id_2";
64 private static final String TEST_DEVICE_ID_3 = "device_id_3";
65 private static final String TEST_CURRENT_DEVICE_ID = "currentDevice_id";
Tim Pengdbdfaef2020-03-11 11:30:01 +080066 private static final String TEST_PACKAGE_NAME = "com.test.playmusic";
hughchen61c1c9f2019-01-17 14:34:51 +080067
68 @Mock
69 private BluetoothMediaManager mBluetoothMediaManager;
70 @Mock
71 private InfoMediaManager mInfoMediaManager;
72 @Mock
73 private LocalBluetoothManager mLocalBluetoothManager;
74 @Mock
75 private LocalMediaManager.DeviceCallback mCallback;
76 @Mock
77 private HearingAidProfile mHapProfile;
78 @Mock
79 private A2dpProfile mA2dpProfile;
80 @Mock
81 private LocalBluetoothProfileManager mLocalProfileManager;
Tim Pengdbdfaef2020-03-11 11:30:01 +080082 @Mock
83 private MediaRouter2Manager mMediaRouter2Manager;
84 @Mock
85 private MediaRoute2Info mRouteInfo1;
86 @Mock
87 private MediaRoute2Info mRouteInfo2;
hughchen61c1c9f2019-01-17 14:34:51 +080088
89 private Context mContext;
90 private LocalMediaManager mLocalMediaManager;
hughchenb3d68f62020-02-11 14:30:14 +080091 private ShadowBluetoothAdapter mShadowBluetoothAdapter;
Tim Pengdbdfaef2020-03-11 11:30:01 +080092 private InfoMediaDevice mInfoMediaDevice1;
93 private InfoMediaDevice mInfoMediaDevice2;
hughchen61c1c9f2019-01-17 14:34:51 +080094
95 @Before
96 public void setUp() {
97 MockitoAnnotations.initMocks(this);
98 mContext = RuntimeEnvironment.application;
hughchenb3d68f62020-02-11 14:30:14 +080099 final List<BluetoothDevice> bluetoothDevices = new ArrayList<>();
100 mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
101 mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(bluetoothDevices);
Tim Pengdbdfaef2020-03-11 11:30:01 +0800102 when(mRouteInfo1.getName()).thenReturn(TEST_DEVICE_NAME_1);
103 when(mRouteInfo1.getId()).thenReturn(TEST_DEVICE_ID_1);
104 when(mRouteInfo2.getName()).thenReturn(TEST_DEVICE_NAME_2);
105 when(mRouteInfo2.getId()).thenReturn(TEST_DEVICE_ID_2);
hughchen61c1c9f2019-01-17 14:34:51 +0800106 when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalProfileManager);
107 when(mLocalProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile);
108 when(mLocalProfileManager.getHearingAidProfile()).thenReturn(mHapProfile);
109
Tim Pengdbdfaef2020-03-11 11:30:01 +0800110 mInfoMediaDevice1 = new InfoMediaDevice(mContext, mMediaRouter2Manager, mRouteInfo1,
111 TEST_PACKAGE_NAME);
112 mInfoMediaDevice2 = new InfoMediaDevice(mContext, mMediaRouter2Manager, mRouteInfo2,
113 TEST_PACKAGE_NAME);
hughchen61c1c9f2019-01-17 14:34:51 +0800114 mLocalMediaManager = new LocalMediaManager(mContext, mLocalBluetoothManager,
hughchendf7b8382020-02-03 17:48:49 +0800115 mInfoMediaManager, "com.test.packagename");
hughchen61c1c9f2019-01-17 14:34:51 +0800116 }
117
118 @Test
119 public void startScan_mediaDevicesListShouldBeClear() {
120 final MediaDevice device = mock(MediaDevice.class);
121 mLocalMediaManager.mMediaDevices.add(device);
122
123 assertThat(mLocalMediaManager.mMediaDevices).hasSize(1);
124 mLocalMediaManager.startScan();
125 assertThat(mLocalMediaManager.mMediaDevices).isEmpty();
126 }
127
128 @Test
129 public void connectDevice_deviceNotEqualCurrentConnectedDevice_connectDevice() {
130 final MediaDevice currentDevice = mock(MediaDevice.class);
131 final MediaDevice device = mock(MediaDevice.class);
132 mLocalMediaManager.mMediaDevices.add(currentDevice);
133 mLocalMediaManager.mMediaDevices.add(device);
134 mLocalMediaManager.mCurrentConnectedDevice = currentDevice;
135
136 when(device.getId()).thenReturn(TEST_DEVICE_ID_1);
137 when(currentDevice.getId()).thenReturn(TEST_CURRENT_DEVICE_ID);
138
139 mLocalMediaManager.registerCallback(mCallback);
140 mLocalMediaManager.connectDevice(device);
141
142 verify(currentDevice).disconnect();
143 verify(device).connect();
hughchen61c1c9f2019-01-17 14:34:51 +0800144 }
145
146 @Test
Tim Pengdbdfaef2020-03-11 11:30:01 +0800147 public void connectDevice_deviceNotEqualCurrentConnectedDevice_isConnectingState() {
148 mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice1);
149 mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice2);
150 mLocalMediaManager.mCurrentConnectedDevice = mInfoMediaDevice1;
151
152 mLocalMediaManager.registerCallback(mCallback);
153 mLocalMediaManager.connectDevice(mInfoMediaDevice2);
154
155 assertThat(mInfoMediaDevice2.getState()).isEqualTo(LocalMediaManager.MediaDeviceState
156 .STATE_CONNECTING);
157 }
158
159 @Test
160 public void connectDevice_deviceEqualCurrentConnectedDevice_notConnectingState() {
161 mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice1);
162 mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice2);
163 mLocalMediaManager.mCurrentConnectedDevice = mInfoMediaDevice1;
164
165 mLocalMediaManager.registerCallback(mCallback);
166 mLocalMediaManager.connectDevice(mInfoMediaDevice1);
167
168 assertThat(mInfoMediaDevice1.getState()).isNotEqualTo(LocalMediaManager.MediaDeviceState
169 .STATE_CONNECTING);
170 }
171
172 @Test
hughchenc0c11632019-03-07 16:21:17 +0800173 public void connectDevice_bluetoothDeviceNotConnected_connectBluetoothDevice() {
174 final MediaDevice device = mock(BluetoothMediaDevice.class);
175 final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
176 mLocalMediaManager.mMediaDevices.add(device);
177
178 when(device.getId()).thenReturn(TEST_DEVICE_ID_1);
179 when(((BluetoothMediaDevice) device).getCachedDevice()).thenReturn(cachedDevice);
180 when(cachedDevice.isConnected()).thenReturn(false);
181 when(cachedDevice.isBusy()).thenReturn(false);
182
183 mLocalMediaManager.registerCallback(mCallback);
184 mLocalMediaManager.connectDevice(device);
185
hughchen4ae21862020-01-14 15:55:29 +0800186 verify(cachedDevice).connect();
hughchenc0c11632019-03-07 16:21:17 +0800187 }
188
189 @Test
hughchen61c1c9f2019-01-17 14:34:51 +0800190 public void getMediaDeviceById_idExist_shouldReturnMediaDevice() {
191 final MediaDevice device1 = mock(MediaDevice.class);
192 final MediaDevice device2 = mock(MediaDevice.class);
193 mLocalMediaManager.mMediaDevices.add(device1);
194 mLocalMediaManager.mMediaDevices.add(device2);
195
196 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
197 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
198
199 final MediaDevice device = mLocalMediaManager
200 .getMediaDeviceById(mLocalMediaManager.mMediaDevices, TEST_DEVICE_ID_2);
201
202 assertThat(device.getId()).isEqualTo(TEST_DEVICE_ID_2);
203 }
204
205 @Test
206 public void getMediaDeviceById_idNotExist_shouldReturnNull() {
207 final MediaDevice device1 = mock(MediaDevice.class);
208 final MediaDevice device2 = mock(MediaDevice.class);
209 mLocalMediaManager.mMediaDevices.add(device1);
210 mLocalMediaManager.mMediaDevices.add(device2);
211
212 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
213 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
214
215 final MediaDevice device = mLocalMediaManager
216 .getMediaDeviceById(mLocalMediaManager.mMediaDevices, TEST_CURRENT_DEVICE_ID);
217
218 assertThat(device).isNull();
219 }
220
221 @Test
hughchendf7b8382020-02-03 17:48:49 +0800222 public void onDeviceAdded_addDevice() {
hughchen61c1c9f2019-01-17 14:34:51 +0800223 final MediaDevice device = mock(MediaDevice.class);
224
225 assertThat(mLocalMediaManager.mMediaDevices).isEmpty();
226 mLocalMediaManager.registerCallback(mCallback);
227 mLocalMediaManager.mMediaDeviceCallback.onDeviceAdded(device);
228
hughchendf7b8382020-02-03 17:48:49 +0800229 assertThat(mLocalMediaManager.mMediaDevices).hasSize(1);
hughchen61c1c9f2019-01-17 14:34:51 +0800230 verify(mCallback).onDeviceListUpdate(any());
231 }
232
233 @Test
234 public void onDeviceAdded_mediaDeviceNotExistAndPhoneDeviceExistInList_addMediaDevice() {
235 final MediaDevice device1 = mock(MediaDevice.class);
236 final MediaDevice device2 = mock(MediaDevice.class);
237 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
238 mLocalMediaManager.mMediaDevices.add(device1);
239 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
240
241 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
242 mLocalMediaManager.registerCallback(mCallback);
243 mLocalMediaManager.mMediaDeviceCallback.onDeviceAdded(device2);
244
245 assertThat(mLocalMediaManager.mMediaDevices).hasSize(3);
246 verify(mCallback).onDeviceListUpdate(any());
247 }
248
249 @Test
250 public void onDeviceAdded_mediaDeviceAndPhoneDeviceExistInList_doNothing() {
251 final MediaDevice device1 = mock(MediaDevice.class);
252 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
253 mLocalMediaManager.mMediaDevices.add(device1);
254 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
255
256 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
257 mLocalMediaManager.registerCallback(mCallback);
258 mLocalMediaManager.mMediaDeviceCallback.onDeviceAdded(device1);
259
260 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
261 verify(mCallback, never()).onDeviceListUpdate(any());
262 }
263
264 @Test
hughchendf7b8382020-02-03 17:48:49 +0800265 public void onDeviceListAdded_addDevicesList() {
hughchen61c1c9f2019-01-17 14:34:51 +0800266 final List<MediaDevice> devices = new ArrayList<>();
267 final MediaDevice device1 = mock(MediaDevice.class);
268 final MediaDevice device2 = mock(MediaDevice.class);
269 devices.add(device1);
270 devices.add(device2);
271
272 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
273 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
274
275 assertThat(mLocalMediaManager.mMediaDevices).isEmpty();
276 mLocalMediaManager.registerCallback(mCallback);
277 mLocalMediaManager.mMediaDeviceCallback.onDeviceListAdded(devices);
278
hughchendf7b8382020-02-03 17:48:49 +0800279 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
hughchen61c1c9f2019-01-17 14:34:51 +0800280 verify(mCallback).onDeviceListUpdate(any());
281 }
282
283 @Test
hughchendf7b8382020-02-03 17:48:49 +0800284 public void onDeviceListAdded_addDeviceList() {
hughchen61c1c9f2019-01-17 14:34:51 +0800285 final List<MediaDevice> devices = new ArrayList<>();
286 final MediaDevice device1 = mock(MediaDevice.class);
287 final MediaDevice device2 = mock(MediaDevice.class);
288 final MediaDevice device3 = mock(MediaDevice.class);
289 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
290 devices.add(device1);
291 devices.add(device2);
292 mLocalMediaManager.mMediaDevices.add(device3);
293 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
294
295 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
296 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
297 when(device3.getId()).thenReturn(TEST_DEVICE_ID_3);
298 when(mLocalMediaManager.mPhoneDevice.getId()).thenReturn("test_phone_id");
299
300 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
301 mLocalMediaManager.registerCallback(mCallback);
302 mLocalMediaManager.mMediaDeviceCallback.onDeviceListAdded(devices);
303
hughchendf7b8382020-02-03 17:48:49 +0800304 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
hughchen61c1c9f2019-01-17 14:34:51 +0800305 verify(mCallback).onDeviceListUpdate(any());
306 }
307
308 @Test
hughchendf7b8382020-02-03 17:48:49 +0800309 public void onDeviceRemoved_removeDevice() {
hughchen61c1c9f2019-01-17 14:34:51 +0800310 final MediaDevice device1 = mock(MediaDevice.class);
311 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
312 mLocalMediaManager.mMediaDevices.add(device1);
313 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
314
315 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
316 mLocalMediaManager.registerCallback(mCallback);
317 mLocalMediaManager.mMediaDeviceCallback.onDeviceRemoved(device1);
318
hughchendf7b8382020-02-03 17:48:49 +0800319 assertThat(mLocalMediaManager.mMediaDevices).hasSize(1);
hughchen61c1c9f2019-01-17 14:34:51 +0800320 verify(mCallback).onDeviceListUpdate(any());
321 }
322
323 @Test
324 public void onDeviceRemoved_phoneDeviceNotLastDeviceAfterRemoveMediaDevice_removeMediaDevice() {
325 final MediaDevice device1 = mock(MediaDevice.class);
326 final MediaDevice device2 = mock(MediaDevice.class);
327 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
328 mLocalMediaManager.mMediaDevices.add(device1);
329 mLocalMediaManager.mMediaDevices.add(device2);
330 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
331
332 assertThat(mLocalMediaManager.mMediaDevices).hasSize(3);
333 mLocalMediaManager.registerCallback(mCallback);
334 mLocalMediaManager.mMediaDeviceCallback.onDeviceRemoved(device2);
335
336 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
337 verify(mCallback).onDeviceListUpdate(any());
338 }
339
340 @Test
341 public void onDeviceRemoved_removeMediaDeviceNotInList_doNothing() {
342 final MediaDevice device1 = mock(MediaDevice.class);
343 final MediaDevice device2 = mock(MediaDevice.class);
344 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
345 mLocalMediaManager.mMediaDevices.add(device2);
346 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
347
348 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
349 mLocalMediaManager.registerCallback(mCallback);
350 mLocalMediaManager.mMediaDeviceCallback.onDeviceRemoved(device1);
351
352 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
353 verify(mCallback, never()).onDeviceListUpdate(any());
354 }
355
356 @Test
hughchendf7b8382020-02-03 17:48:49 +0800357 public void onDeviceListRemoved_removeAll() {
hughchen61c1c9f2019-01-17 14:34:51 +0800358 final List<MediaDevice> devices = new ArrayList<>();
359 final MediaDevice device1 = mock(MediaDevice.class);
360 final MediaDevice device2 = mock(MediaDevice.class);
361 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
362 devices.add(device1);
363 devices.add(device2);
364 mLocalMediaManager.mMediaDevices.add(device1);
365 mLocalMediaManager.mMediaDevices.add(device2);
366 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
367
368 assertThat(mLocalMediaManager.mMediaDevices).hasSize(3);
369 mLocalMediaManager.registerCallback(mCallback);
hughchendf7b8382020-02-03 17:48:49 +0800370 mLocalMediaManager.mMediaDeviceCallback
371 .onDeviceListRemoved(mLocalMediaManager.mMediaDevices);
hughchen61c1c9f2019-01-17 14:34:51 +0800372
373 assertThat(mLocalMediaManager.mMediaDevices).isEmpty();
374 verify(mCallback).onDeviceListUpdate(any());
375 }
376
377 @Test
378 public void onDeviceListRemoved_phoneDeviceNotLastDeviceAfterRemoveDeviceList_removeList() {
379 final List<MediaDevice> devices = new ArrayList<>();
380 final MediaDevice device1 = mock(MediaDevice.class);
381 final MediaDevice device2 = mock(MediaDevice.class);
382 final MediaDevice device3 = mock(MediaDevice.class);
383 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
384 devices.add(device1);
385 devices.add(device3);
386 mLocalMediaManager.mMediaDevices.add(device1);
387 mLocalMediaManager.mMediaDevices.add(device2);
388 mLocalMediaManager.mMediaDevices.add(device3);
389 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
390
391 assertThat(mLocalMediaManager.mMediaDevices).hasSize(4);
392 mLocalMediaManager.registerCallback(mCallback);
393 mLocalMediaManager.mMediaDeviceCallback.onDeviceListRemoved(devices);
394
395 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
396 verify(mCallback).onDeviceListUpdate(any());
397 }
398
399 @Test
hughchen61c1c9f2019-01-17 14:34:51 +0800400 public void onConnectedDeviceChanged_connectedAndCurrentDeviceAreDifferent_notifyThemChanged() {
401 final MediaDevice device1 = mock(MediaDevice.class);
402 final MediaDevice device2 = mock(MediaDevice.class);
403
404 mLocalMediaManager.mMediaDevices.add(device1);
405 mLocalMediaManager.mMediaDevices.add(device2);
406 mLocalMediaManager.mCurrentConnectedDevice = device1;
407
408 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
409 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
410
411 mLocalMediaManager.registerCallback(mCallback);
412 mLocalMediaManager.mMediaDeviceCallback.onConnectedDeviceChanged(TEST_DEVICE_ID_2);
413
414 assertThat(mLocalMediaManager.getCurrentConnectedDevice()).isEqualTo(device2);
hughchen29a8a182020-03-11 11:28:49 +0800415 verify(mCallback).onSelectedDeviceStateChanged(device2,
416 LocalMediaManager.MediaDeviceState.STATE_CONNECTED);
hughchen61c1c9f2019-01-17 14:34:51 +0800417 }
418
419 @Test
420 public void onConnectedDeviceChanged_connectedAndCurrentDeviceAreSame_doNothing() {
421 final MediaDevice device1 = mock(MediaDevice.class);
422 final MediaDevice device2 = mock(MediaDevice.class);
423
424 mLocalMediaManager.mMediaDevices.add(device1);
425 mLocalMediaManager.mMediaDevices.add(device2);
426 mLocalMediaManager.mCurrentConnectedDevice = device1;
427
428 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
429 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
430
431 mLocalMediaManager.registerCallback(mCallback);
432 mLocalMediaManager.mMediaDeviceCallback.onConnectedDeviceChanged(TEST_DEVICE_ID_1);
433
hughchene572b832020-01-08 18:07:18 +0800434 verify(mCallback, never()).onDeviceAttributesChanged();
hughchen61c1c9f2019-01-17 14:34:51 +0800435 }
hughchenc0c11632019-03-07 16:21:17 +0800436
437 @Test
Tim Pengdbdfaef2020-03-11 11:30:01 +0800438 public void onConnectedDeviceChanged_isConnectedState() {
439 mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice1);
440 mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice2);
441 mInfoMediaDevice1.setState(LocalMediaManager.MediaDeviceState.STATE_DISCONNECTED);
442
443 assertThat(mInfoMediaDevice1.getState()).isEqualTo(LocalMediaManager.MediaDeviceState
444 .STATE_DISCONNECTED);
445 mLocalMediaManager.registerCallback(mCallback);
446 mLocalMediaManager.mMediaDeviceCallback.onConnectedDeviceChanged(TEST_DEVICE_ID_1);
447
448 assertThat(mInfoMediaDevice1.getState()).isEqualTo(LocalMediaManager.MediaDeviceState
449 .STATE_CONNECTED);
450 }
451
452 @Test
hughchenc0c11632019-03-07 16:21:17 +0800453 public void onDeviceAttributesChanged_shouldDispatchDeviceListUpdate() {
454 mLocalMediaManager.registerCallback(mCallback);
455
456 mLocalMediaManager.mMediaDeviceCallback.onDeviceAttributesChanged();
457
hughchene572b832020-01-08 18:07:18 +0800458 verify(mCallback).onDeviceAttributesChanged();
hughchenc0c11632019-03-07 16:21:17 +0800459 }
timhypenga812e882020-02-04 17:15:48 +0800460
461 @Test
Tim Pengdbdfaef2020-03-11 11:30:01 +0800462 public void onRequestFailed_checkDevicesState() {
463 mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice1);
464 mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice2);
465 mInfoMediaDevice1.setState(LocalMediaManager.MediaDeviceState.STATE_CONNECTING);
466 mInfoMediaDevice2.setState(LocalMediaManager.MediaDeviceState.STATE_CONNECTED);
467
468 assertThat(mInfoMediaDevice1.getState()).isEqualTo(LocalMediaManager.MediaDeviceState
469 .STATE_CONNECTING);
470 assertThat(mInfoMediaDevice2.getState()).isEqualTo(LocalMediaManager.MediaDeviceState
471 .STATE_CONNECTED);
472 mLocalMediaManager.registerCallback(mCallback);
473 mLocalMediaManager.mMediaDeviceCallback.onRequestFailed(REASON_UNKNOWN_ERROR);
474
475 assertThat(mInfoMediaDevice1.getState()).isEqualTo(LocalMediaManager.MediaDeviceState
476 .STATE_CONNECTING_FAILED);
477 assertThat(mInfoMediaDevice2.getState()).isEqualTo(LocalMediaManager.MediaDeviceState
478 .STATE_CONNECTED);
479 }
480
481 @Test
timhypenga812e882020-02-04 17:15:48 +0800482 public void getActiveMediaDevice_checkList() {
483 final List<MediaDevice> devices = new ArrayList<>();
484 final MediaDevice device1 = mock(MediaDevice.class);
485 final MediaDevice device2 = mock(MediaDevice.class);
486 final MediaDevice device3 = mock(MediaDevice.class);
487 device1.mType = MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE;
488 device2.mType = MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE;
489 device3.mType = MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE;
490 when(device1.getClientPackageName()).thenReturn(TEST_DEVICE_ID_1);
491 when(device2.getClientPackageName()).thenReturn(TEST_DEVICE_ID_2);
492 when(device3.getClientPackageName()).thenReturn(TEST_DEVICE_ID_3);
493 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
494 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
495 when(device3.getId()).thenReturn(TEST_DEVICE_ID_3);
496 devices.add(device1);
497 devices.add(device2);
498 devices.add(device3);
499 mLocalMediaManager.registerCallback(mCallback);
500 mLocalMediaManager.mMediaDeviceCallback.onDeviceListAdded(devices);
501
502 List<MediaDevice> activeDevices = mLocalMediaManager.getActiveMediaDevice(
503 MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE);
504 assertThat(activeDevices).containsExactly(device1);
505
506 activeDevices = mLocalMediaManager.getActiveMediaDevice(
507 MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
508 assertThat(activeDevices).containsExactly(device2);
509
510 activeDevices = mLocalMediaManager.getActiveMediaDevice(
511 MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE);
512 assertThat(activeDevices).containsExactly(device3);
513 }
hughchenb3d68f62020-02-11 14:30:14 +0800514
515 @Test
516 public void onDeviceAttributesChanged_shouldBeCalled() {
517 mLocalMediaManager.registerCallback(mCallback);
518
519 mLocalMediaManager.mDeviceAttributeChangeCallback.onDeviceAttributesChanged();
520
521 verify(mCallback).onDeviceAttributesChanged();
522 }
523
524 @Test
525 public void onDeviceListAdded_haveDisconnectedDevice_addDisconnectedDevice() {
526 final List<MediaDevice> devices = new ArrayList<>();
527 final MediaDevice device1 = mock(MediaDevice.class);
528 final MediaDevice device2 = mock(MediaDevice.class);
529 final MediaDevice device3 = mock(MediaDevice.class);
530 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
531 devices.add(device1);
532 devices.add(device2);
533 mLocalMediaManager.mMediaDevices.add(device3);
534 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
535
536 final List<BluetoothDevice> bluetoothDevices = new ArrayList<>();
537 final BluetoothDevice bluetoothDevice = mock(BluetoothDevice.class);
538 final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
539 final CachedBluetoothDeviceManager cachedManager = mock(CachedBluetoothDeviceManager.class);
540 bluetoothDevices.add(bluetoothDevice);
541 mShadowBluetoothAdapter.setMostRecentlyConnectedDevices(bluetoothDevices);
542
543 when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(cachedManager);
544 when(cachedManager.findDevice(bluetoothDevice)).thenReturn(cachedDevice);
545 when(cachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
546 when(cachedDevice.isConnected()).thenReturn(false);
547
548 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
549 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
550 when(device3.getId()).thenReturn(TEST_DEVICE_ID_3);
551 when(mLocalMediaManager.mPhoneDevice.getId()).thenReturn("test_phone_id");
552
553 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
554 mLocalMediaManager.registerCallback(mCallback);
555 mLocalMediaManager.mMediaDeviceCallback.onDeviceListAdded(devices);
556
557 assertThat(mLocalMediaManager.mMediaDevices).hasSize(3);
558 verify(mCallback).onDeviceListUpdate(any());
559 }
hughchen063a35a2020-03-04 17:51:57 +0800560
561 @Test
562 public void onRequestFailed_shouldDispatchOnRequestFailed() {
563 mLocalMediaManager.registerCallback(mCallback);
564
565 mLocalMediaManager.mMediaDeviceCallback.onRequestFailed(1);
566
567 verify(mCallback).onRequestFailed(1);
568 }
hughchen61c1c9f2019-01-17 14:34:51 +0800569}