1 /* 2 * Copyright (C) 2017 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 package com.android.settings.connecteddevice; 17 18 import static com.android.settings.core.BasePreferenceController.AVAILABLE; 19 import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; 20 21 import static com.google.common.truth.Truth.assertThat; 22 23 import static org.mockito.Matchers.anyString; 24 import static org.mockito.Mockito.doReturn; 25 import static org.mockito.Mockito.spy; 26 import static org.mockito.Mockito.verify; 27 import static org.mockito.Mockito.when; 28 29 import android.arch.lifecycle.LifecycleOwner; 30 import android.content.Context; 31 import android.content.pm.PackageManager; 32 import android.support.v7.preference.Preference; 33 import android.support.v7.preference.PreferenceGroup; 34 import android.support.v7.preference.PreferenceManager; 35 import android.support.v7.preference.PreferenceScreen; 36 37 import com.android.settings.bluetooth.ConnectedBluetoothDeviceUpdater; 38 import com.android.settings.connecteddevice.dock.DockUpdater; 39 import com.android.settings.connecteddevice.usb.ConnectedUsbDeviceUpdater; 40 import com.android.settings.dashboard.DashboardFragment; 41 import com.android.settings.testutils.SettingsRobolectricTestRunner; 42 43 import org.junit.Before; 44 import org.junit.Test; 45 import org.junit.runner.RunWith; 46 import org.mockito.Answers; 47 import org.mockito.Mock; 48 import org.mockito.MockitoAnnotations; 49 import org.robolectric.RuntimeEnvironment; 50 import org.robolectric.Shadows; 51 import org.robolectric.annotation.Config; 52 import org.robolectric.shadows.ShadowApplicationPackageManager; 53 54 @RunWith(SettingsRobolectricTestRunner.class) 55 @Config(shadows = ShadowApplicationPackageManager.class) 56 public class ConnectedDeviceGroupControllerTest { 57 58 private static final String PREFERENCE_KEY_1 = "pref_key_1"; 59 60 @Mock 61 private DashboardFragment mDashboardFragment; 62 @Mock 63 private ConnectedBluetoothDeviceUpdater mConnectedBluetoothDeviceUpdater; 64 @Mock 65 private ConnectedUsbDeviceUpdater mConnectedUsbDeviceUpdater; 66 @Mock 67 private DockUpdater mConnectedDockUpdater; 68 @Mock 69 private PreferenceScreen mPreferenceScreen; 70 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 71 private PreferenceManager mPreferenceManager; 72 73 private ShadowApplicationPackageManager mPackageManager; 74 private PreferenceGroup mPreferenceGroup; 75 private Context mContext; 76 private Preference mPreference; 77 private ConnectedDeviceGroupController mConnectedDeviceGroupController; 78 79 @Before setUp()80 public void setUp() { 81 MockitoAnnotations.initMocks(this); 82 83 mContext = RuntimeEnvironment.application; 84 mPreference = new Preference(mContext); 85 mPreference.setKey(PREFERENCE_KEY_1); 86 mPackageManager = (ShadowApplicationPackageManager) Shadows.shadowOf( 87 mContext.getPackageManager()); 88 mPreferenceGroup = spy(new PreferenceScreen(mContext, null)); 89 when(mPreferenceGroup.getPreferenceManager()).thenReturn(mPreferenceManager); 90 doReturn(mContext).when(mDashboardFragment).getContext(); 91 92 mConnectedDeviceGroupController = new ConnectedDeviceGroupController(mContext); 93 mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, 94 mConnectedUsbDeviceUpdater, mConnectedDockUpdater); 95 mConnectedDeviceGroupController.mPreferenceGroup = mPreferenceGroup; 96 } 97 98 @Test testOnDeviceAdded_firstAdd_becomeVisibleAndPreferenceAdded()99 public void testOnDeviceAdded_firstAdd_becomeVisibleAndPreferenceAdded() { 100 mConnectedDeviceGroupController.onDeviceAdded(mPreference); 101 102 assertThat(mPreferenceGroup.isVisible()).isTrue(); 103 assertThat(mPreferenceGroup.findPreference(PREFERENCE_KEY_1)).isEqualTo(mPreference); 104 } 105 106 @Test testOnDeviceRemoved_lastRemove_becomeInvisibleAndPreferenceRemoved()107 public void testOnDeviceRemoved_lastRemove_becomeInvisibleAndPreferenceRemoved() { 108 mPreferenceGroup.addPreference(mPreference); 109 110 mConnectedDeviceGroupController.onDeviceRemoved(mPreference); 111 112 assertThat(mPreferenceGroup.isVisible()).isFalse(); 113 assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0); 114 } 115 116 @Test testOnDeviceRemoved_notLastRemove_stillVisible()117 public void testOnDeviceRemoved_notLastRemove_stillVisible() { 118 mPreferenceGroup.setVisible(true); 119 mPreferenceGroup.addPreference(mPreference); 120 mPreferenceGroup.addPreference(new Preference(mContext)); 121 122 mConnectedDeviceGroupController.onDeviceRemoved(mPreference); 123 124 assertThat(mPreferenceGroup.isVisible()).isTrue(); 125 } 126 127 @Test testDisplayPreference_becomeInvisible()128 public void testDisplayPreference_becomeInvisible() { 129 doReturn(mPreferenceGroup).when(mPreferenceScreen).findPreference(anyString()); 130 131 mConnectedDeviceGroupController.displayPreference(mPreferenceScreen); 132 133 assertThat(mPreferenceGroup.isVisible()).isFalse(); 134 } 135 136 @Test testRegister()137 public void testRegister() { 138 // register the callback in onStart() 139 mConnectedDeviceGroupController.onStart(); 140 verify(mConnectedBluetoothDeviceUpdater).registerCallback(); 141 verify(mConnectedUsbDeviceUpdater).registerCallback(); 142 verify(mConnectedDockUpdater).registerCallback(); 143 } 144 145 @Test testUnregister()146 public void testUnregister() { 147 // unregister the callback in onStop() 148 mConnectedDeviceGroupController.onStop(); 149 verify(mConnectedBluetoothDeviceUpdater).unregisterCallback(); 150 verify(mConnectedUsbDeviceUpdater).unregisterCallback(); 151 verify(mConnectedDockUpdater).unregisterCallback(); 152 } 153 154 @Test testGetAvailabilityStatus_noBluetoothFeature_returnUnSupported()155 public void testGetAvailabilityStatus_noBluetoothFeature_returnUnSupported() { 156 mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false); 157 158 assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( 159 UNSUPPORTED_ON_DEVICE); 160 } 161 162 @Test testGetAvailabilityStatus_BluetoothFeature_returnSupported()163 public void testGetAvailabilityStatus_BluetoothFeature_returnSupported() { 164 mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true); 165 166 assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( 167 AVAILABLE); 168 } 169 } 170