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_UNSEARCHABLE; 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.ArgumentMatchers.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.content.Context; 30 import android.content.pm.PackageManager; 31 32 import androidx.preference.Preference; 33 import androidx.preference.PreferenceGroup; 34 import androidx.preference.PreferenceManager; 35 import androidx.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 42 import org.junit.Before; 43 import org.junit.Test; 44 import org.junit.runner.RunWith; 45 import org.mockito.Answers; 46 import org.mockito.Mock; 47 import org.mockito.MockitoAnnotations; 48 import org.robolectric.RobolectricTestRunner; 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(RobolectricTestRunner.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 mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true); 92 93 mConnectedDeviceGroupController = new ConnectedDeviceGroupController(mContext); 94 mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, 95 mConnectedUsbDeviceUpdater, mConnectedDockUpdater); 96 mConnectedDeviceGroupController.mPreferenceGroup = mPreferenceGroup; 97 } 98 99 @Test onDeviceAdded_firstAdd_becomeVisibleAndPreferenceAdded()100 public void onDeviceAdded_firstAdd_becomeVisibleAndPreferenceAdded() { 101 mConnectedDeviceGroupController.onDeviceAdded(mPreference); 102 103 assertThat(mPreferenceGroup.isVisible()).isTrue(); 104 assertThat((Preference) mPreferenceGroup.findPreference(PREFERENCE_KEY_1)) 105 .isEqualTo(mPreference); 106 } 107 108 @Test onDeviceRemoved_lastRemove_becomeInvisibleAndPreferenceRemoved()109 public void onDeviceRemoved_lastRemove_becomeInvisibleAndPreferenceRemoved() { 110 mPreferenceGroup.addPreference(mPreference); 111 112 mConnectedDeviceGroupController.onDeviceRemoved(mPreference); 113 114 assertThat(mPreferenceGroup.isVisible()).isFalse(); 115 assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0); 116 } 117 118 @Test onDeviceRemoved_notLastRemove_stillVisible()119 public void onDeviceRemoved_notLastRemove_stillVisible() { 120 mPreferenceGroup.setVisible(true); 121 mPreferenceGroup.addPreference(mPreference); 122 mPreferenceGroup.addPreference(new Preference(mContext)); 123 124 mConnectedDeviceGroupController.onDeviceRemoved(mPreference); 125 126 assertThat(mPreferenceGroup.isVisible()).isTrue(); 127 } 128 129 @Test displayPreference_becomeInvisible()130 public void displayPreference_becomeInvisible() { 131 doReturn(mPreferenceGroup).when(mPreferenceScreen).findPreference(anyString()); 132 133 mConnectedDeviceGroupController.displayPreference(mPreferenceScreen); 134 135 assertThat(mPreferenceGroup.isVisible()).isFalse(); 136 } 137 138 @Test onStart_shouldRegisterUpdaters()139 public void onStart_shouldRegisterUpdaters() { 140 // register the callback in onStart() 141 mConnectedDeviceGroupController.onStart(); 142 verify(mConnectedBluetoothDeviceUpdater).registerCallback(); 143 verify(mConnectedUsbDeviceUpdater).registerCallback(); 144 verify(mConnectedDockUpdater).registerCallback(); 145 } 146 147 @Test onStop_shouldUnregisterUpdaters()148 public void onStop_shouldUnregisterUpdaters() { 149 // unregister the callback in onStop() 150 mConnectedDeviceGroupController.onStop(); 151 verify(mConnectedBluetoothDeviceUpdater).unregisterCallback(); 152 verify(mConnectedUsbDeviceUpdater).unregisterCallback(); 153 verify(mConnectedDockUpdater).unregisterCallback(); 154 } 155 156 @Test getAvailabilityStatus_noBluetoothUsbDockFeature_returnUnSupported()157 public void getAvailabilityStatus_noBluetoothUsbDockFeature_returnUnSupported() { 158 mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false); 159 mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_ACCESSORY, false); 160 mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_HOST, false); 161 mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, 162 mConnectedUsbDeviceUpdater, null); 163 164 assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( 165 UNSUPPORTED_ON_DEVICE); 166 } 167 168 @Test getAvailabilityStatus_BluetoothFeature_returnSupported()169 public void getAvailabilityStatus_BluetoothFeature_returnSupported() { 170 mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true); 171 mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_ACCESSORY, false); 172 mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_HOST, false); 173 mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, 174 mConnectedUsbDeviceUpdater, null); 175 176 assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( 177 AVAILABLE_UNSEARCHABLE); 178 } 179 180 @Test getAvailabilityStatus_haveUsbFeature_returnSupported()181 public void getAvailabilityStatus_haveUsbFeature_returnSupported() { 182 mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false); 183 mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_ACCESSORY, false); 184 mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_HOST, true); 185 mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, 186 mConnectedUsbDeviceUpdater, null); 187 188 assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( 189 AVAILABLE_UNSEARCHABLE); 190 } 191 192 @Test getAvailabilityStatus_haveDockFeature_returnSupported()193 public void getAvailabilityStatus_haveDockFeature_returnSupported() { 194 mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false); 195 mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_ACCESSORY, false); 196 mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_HOST, false); 197 mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, 198 mConnectedUsbDeviceUpdater, mConnectedDockUpdater); 199 200 assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( 201 AVAILABLE_UNSEARCHABLE); 202 } 203 204 } 205