• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.settingslib;
17 
18 import static com.android.settingslib.Utils.STORAGE_MANAGER_ENABLED_PROPERTY;
19 
20 import static com.google.common.truth.Truth.assertThat;
21 
22 import static org.mockito.ArgumentMatchers.eq;
23 import static org.mockito.Mockito.mock;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.when;
26 
27 import android.app.ActivityManager;
28 import android.content.Context;
29 import android.content.Intent;
30 import android.content.res.Resources;
31 import android.hardware.usb.UsbManager;
32 import android.hardware.usb.UsbPort;
33 import android.hardware.usb.UsbPortStatus;
34 import android.hardware.usb.flags.Flags;
35 import android.location.LocationManager;
36 import android.media.AudioManager;
37 import android.os.BatteryManager;
38 import android.os.SystemProperties;
39 import android.os.UserHandle;
40 import android.platform.test.flag.junit.SetFlagsRule;
41 import android.provider.Settings;
42 import android.telephony.AccessNetworkConstants;
43 import android.telephony.NetworkRegistrationInfo;
44 import android.telephony.ServiceState;
45 import android.text.TextUtils;
46 
47 import org.junit.After;
48 import org.junit.Before;
49 import org.junit.Rule;
50 import org.junit.Test;
51 import org.junit.runner.RunWith;
52 import org.mockito.ArgumentMatcher;
53 import org.mockito.Mock;
54 import org.mockito.MockitoAnnotations;
55 import org.robolectric.RobolectricTestRunner;
56 import org.robolectric.RuntimeEnvironment;
57 import org.robolectric.annotation.Config;
58 import org.robolectric.annotation.Implementation;
59 import org.robolectric.annotation.Implements;
60 import org.robolectric.shadows.ShadowSettings;
61 
62 import java.util.ArrayList;
63 import java.util.List;
64 
65 @RunWith(RobolectricTestRunner.class)
66 @Config(shadows = {UtilsTest.ShadowLocationManager.class})
67 public class UtilsTest {
68     private static final double[] TEST_PERCENTAGES = {0, 0.4, 0.5, 0.6, 49, 49.3, 49.8, 50, 100};
69     private static final String TAG = "UtilsTest";
70     private static final String PERCENTAGE_0 = "0%";
71     private static final String PERCENTAGE_1 = "1%";
72     private static final String PERCENTAGE_49 = "49%";
73     private static final String PERCENTAGE_50 = "50%";
74     private static final String PERCENTAGE_100 = "100%";
75 
76     private AudioManager mAudioManager;
77     private Context mContext;
78     @Mock private LocationManager mLocationManager;
79     @Mock private ServiceState mServiceState;
80     @Mock private NetworkRegistrationInfo mNetworkRegistrationInfo;
81     @Mock private UsbPort mUsbPort;
82     @Mock private UsbManager mUsbManager;
83     @Mock private UsbPortStatus mUsbPortStatus;
84 
85     @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
86 
87     @Before
setUp()88     public void setUp() {
89         MockitoAnnotations.initMocks(this);
90         mContext = spy(RuntimeEnvironment.application);
91         when(mContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager);
92         when(mContext.getSystemService(UsbManager.class)).thenReturn(mUsbManager);
93         ShadowSettings.ShadowSecure.reset();
94         mAudioManager = mContext.getSystemService(AudioManager.class);
95     }
96 
97     @After
reset()98     public void reset() {
99         Settings.Secure.putInt(
100                 mContext.getContentResolver(), Utils.INCOMPATIBLE_CHARGER_WARNING_DISABLED, 0);
101     }
102 
103     @Test
testUpdateLocationEnabled()104     public void testUpdateLocationEnabled() {
105         int currentUserId = ActivityManager.getCurrentUser();
106         Utils.updateLocationEnabled(
107                 mContext, true, currentUserId, Settings.Secure.LOCATION_CHANGER_QUICK_SETTINGS);
108 
109         assertThat(
110                         Settings.Secure.getInt(
111                                 mContext.getContentResolver(),
112                                 Settings.Secure.LOCATION_CHANGER,
113                                 Settings.Secure.LOCATION_CHANGER_UNKNOWN))
114                 .isEqualTo(Settings.Secure.LOCATION_CHANGER_QUICK_SETTINGS);
115     }
116 
117     @Test
testFormatPercentage_RoundTrue_RoundUpIfPossible()118     public void testFormatPercentage_RoundTrue_RoundUpIfPossible() {
119         final String[] expectedPercentages = {
120             PERCENTAGE_0,
121             PERCENTAGE_0,
122             PERCENTAGE_1,
123             PERCENTAGE_1,
124             PERCENTAGE_49,
125             PERCENTAGE_49,
126             PERCENTAGE_50,
127             PERCENTAGE_50,
128             PERCENTAGE_100
129         };
130 
131         for (int i = 0, size = TEST_PERCENTAGES.length; i < size; i++) {
132             final String percentage = Utils.formatPercentage(TEST_PERCENTAGES[i], true);
133             assertThat(percentage).isEqualTo(expectedPercentages[i]);
134         }
135     }
136 
137     @Test
testFormatPercentage_RoundFalse_NoRound()138     public void testFormatPercentage_RoundFalse_NoRound() {
139         final String[] expectedPercentages = {
140             PERCENTAGE_0,
141             PERCENTAGE_0,
142             PERCENTAGE_0,
143             PERCENTAGE_0,
144             PERCENTAGE_49,
145             PERCENTAGE_49,
146             PERCENTAGE_49,
147             PERCENTAGE_50,
148             PERCENTAGE_100
149         };
150 
151         for (int i = 0, size = TEST_PERCENTAGES.length; i < size; i++) {
152             final String percentage = Utils.formatPercentage(TEST_PERCENTAGES[i], false);
153             assertThat(percentage).isEqualTo(expectedPercentages[i]);
154         }
155     }
156 
157     @Test
testGetDefaultStorageManagerDaysToRetain_storageManagerDaysToRetainUsesResources()158     public void testGetDefaultStorageManagerDaysToRetain_storageManagerDaysToRetainUsesResources() {
159         Resources resources = mock(Resources.class);
160         when(resources.getInteger(
161                         eq(
162                                 com.android.internal.R.integer
163                                         .config_storageManagerDaystoRetainDefault)))
164                 .thenReturn(60);
165         assertThat(Utils.getDefaultStorageManagerDaysToRetain(resources)).isEqualTo(60);
166     }
167 
168     @Test
testIsStorageManagerEnabled_UsesSystemProperties()169     public void testIsStorageManagerEnabled_UsesSystemProperties() {
170         SystemProperties.set(STORAGE_MANAGER_ENABLED_PROPERTY, "true");
171         assertThat(Utils.isStorageManagerEnabled(mContext)).isTrue();
172     }
173 
actionMatches(String expected)174     private static ArgumentMatcher<Intent> actionMatches(String expected) {
175         return intent -> TextUtils.equals(expected, intent.getAction());
176     }
177 
178     @Implements(value = LocationManager.class)
179     public static class ShadowLocationManager {
180 
181         @Implementation
setLocationEnabledForUser(boolean enabled, UserHandle userHandle)182         public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
183             // Do nothing
184         }
185     }
186 
187     @Test
isAudioModeOngoingCall_modeInCommunication_returnTrue()188     public void isAudioModeOngoingCall_modeInCommunication_returnTrue() {
189         mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
190 
191         assertThat(Utils.isAudioModeOngoingCall(mContext)).isTrue();
192     }
193 
194     @Test
isAudioModeOngoingCall_modeInCall_returnTrue()195     public void isAudioModeOngoingCall_modeInCall_returnTrue() {
196         mAudioManager.setMode(AudioManager.MODE_IN_CALL);
197 
198         assertThat(Utils.isAudioModeOngoingCall(mContext)).isTrue();
199     }
200 
201     @Test
isAudioModeOngoingCall_modeRingtone_returnTrue()202     public void isAudioModeOngoingCall_modeRingtone_returnTrue() {
203         mAudioManager.setMode(AudioManager.MODE_RINGTONE);
204 
205         assertThat(Utils.isAudioModeOngoingCall(mContext)).isTrue();
206     }
207 
208     @Test
isAudioModeOngoingCall_modeNormal_returnFalse()209     public void isAudioModeOngoingCall_modeNormal_returnFalse() {
210         mAudioManager.setMode(AudioManager.MODE_NORMAL);
211 
212         assertThat(Utils.isAudioModeOngoingCall(mContext)).isFalse();
213     }
214 
215     @Test
isInService_servicestateNull_returnFalse()216     public void isInService_servicestateNull_returnFalse() {
217         assertThat(Utils.isInService(null)).isFalse();
218     }
219 
220     @Test
isInService_voiceInService_returnTrue()221     public void isInService_voiceInService_returnTrue() {
222         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_IN_SERVICE);
223 
224         assertThat(Utils.isInService(mServiceState)).isTrue();
225     }
226 
227     @Test
isInService_voiceOutOfServiceDataInService_returnTrue()228     public void isInService_voiceOutOfServiceDataInService_returnTrue() {
229         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
230         when(mServiceState.getDataRegistrationState()).thenReturn(ServiceState.STATE_IN_SERVICE);
231         when(mServiceState.getNetworkRegistrationInfo(
232                         NetworkRegistrationInfo.DOMAIN_PS,
233                         AccessNetworkConstants.TRANSPORT_TYPE_WWAN))
234                 .thenReturn(mNetworkRegistrationInfo);
235         when(mNetworkRegistrationInfo.isInService()).thenReturn(true);
236 
237         assertThat(Utils.isInService(mServiceState)).isTrue();
238     }
239 
240     @Test
isInService_voiceOutOfServiceDataInServiceOnIwLan_returnFalse()241     public void isInService_voiceOutOfServiceDataInServiceOnIwLan_returnFalse() {
242         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
243         when(mServiceState.getNetworkRegistrationInfo(
244                         NetworkRegistrationInfo.DOMAIN_PS,
245                         AccessNetworkConstants.TRANSPORT_TYPE_WLAN))
246                 .thenReturn(mNetworkRegistrationInfo);
247         when(mServiceState.getDataRegistrationState()).thenReturn(ServiceState.STATE_IN_SERVICE);
248         when(mNetworkRegistrationInfo.isInService()).thenReturn(true);
249 
250         assertThat(Utils.isInService(mServiceState)).isFalse();
251     }
252 
253     @Test
isInService_voiceOutOfServiceDataNull_returnFalse()254     public void isInService_voiceOutOfServiceDataNull_returnFalse() {
255         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
256         when(mServiceState.getNetworkRegistrationInfo(
257                         NetworkRegistrationInfo.DOMAIN_PS,
258                         AccessNetworkConstants.TRANSPORT_TYPE_WWAN))
259                 .thenReturn(null);
260 
261         assertThat(Utils.isInService(mServiceState)).isFalse();
262     }
263 
264     @Test
isInService_voiceOutOfServiceDataOutOfService_returnFalse()265     public void isInService_voiceOutOfServiceDataOutOfService_returnFalse() {
266         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
267         when(mServiceState.getNetworkRegistrationInfo(
268                         NetworkRegistrationInfo.DOMAIN_PS,
269                         AccessNetworkConstants.TRANSPORT_TYPE_WWAN))
270                 .thenReturn(mNetworkRegistrationInfo);
271         when(mNetworkRegistrationInfo.isInService()).thenReturn(false);
272 
273         assertThat(Utils.isInService(mServiceState)).isFalse();
274     }
275 
276     @Test
isInService_ServiceStatePowerOff_returnFalse()277     public void isInService_ServiceStatePowerOff_returnFalse() {
278         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_POWER_OFF);
279 
280         assertThat(Utils.isInService(mServiceState)).isFalse();
281     }
282 
283     @Test
getCombinedServiceState_servicestateNull_returnOutOfService()284     public void getCombinedServiceState_servicestateNull_returnOutOfService() {
285         assertThat(Utils.getCombinedServiceState(null))
286                 .isEqualTo(ServiceState.STATE_OUT_OF_SERVICE);
287     }
288 
289     @Test
getCombinedServiceState_ServiceStatePowerOff_returnPowerOff()290     public void getCombinedServiceState_ServiceStatePowerOff_returnPowerOff() {
291         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_POWER_OFF);
292 
293         assertThat(Utils.getCombinedServiceState(mServiceState))
294                 .isEqualTo(ServiceState.STATE_POWER_OFF);
295     }
296 
297     @Test
getCombinedServiceState_voiceInService_returnInService()298     public void getCombinedServiceState_voiceInService_returnInService() {
299         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_IN_SERVICE);
300 
301         assertThat(Utils.getCombinedServiceState(mServiceState))
302                 .isEqualTo(ServiceState.STATE_IN_SERVICE);
303     }
304 
305     @Test
getCombinedServiceState_voiceOutOfServiceDataInService_returnInService()306     public void getCombinedServiceState_voiceOutOfServiceDataInService_returnInService() {
307         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
308         when(mServiceState.getNetworkRegistrationInfo(
309                         NetworkRegistrationInfo.DOMAIN_PS,
310                         AccessNetworkConstants.TRANSPORT_TYPE_WWAN))
311                 .thenReturn(mNetworkRegistrationInfo);
312         when(mNetworkRegistrationInfo.isInService()).thenReturn(true);
313 
314         assertThat(Utils.getCombinedServiceState(mServiceState))
315                 .isEqualTo(ServiceState.STATE_IN_SERVICE);
316     }
317 
318     @Test
getCombinedServiceState_voiceOutOfServiceDataInServiceOnIwLan_returnOutOfService()319     public void getCombinedServiceState_voiceOutOfServiceDataInServiceOnIwLan_returnOutOfService() {
320         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
321         when(mServiceState.getNetworkRegistrationInfo(
322                         NetworkRegistrationInfo.DOMAIN_PS,
323                         AccessNetworkConstants.TRANSPORT_TYPE_WLAN))
324                 .thenReturn(mNetworkRegistrationInfo);
325         when(mNetworkRegistrationInfo.isInService()).thenReturn(true);
326 
327         assertThat(Utils.getCombinedServiceState(mServiceState))
328                 .isEqualTo(ServiceState.STATE_OUT_OF_SERVICE);
329     }
330 
331     @Test
getCombinedServiceState_voiceOutOfServiceDataOutOfService_returnOutOfService()332     public void getCombinedServiceState_voiceOutOfServiceDataOutOfService_returnOutOfService() {
333         when(mServiceState.getVoiceRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
334         when(mServiceState.getDataRegistrationState())
335                 .thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
336 
337         assertThat(Utils.getCombinedServiceState(mServiceState))
338                 .isEqualTo(ServiceState.STATE_OUT_OF_SERVICE);
339     }
340 
341     @Test
getBatteryStatus_statusIsFull_returnFullString()342     public void getBatteryStatus_statusIsFull_returnFullString() {
343         final Intent intent =
344                 new Intent()
345                         .putExtra(BatteryManager.EXTRA_LEVEL, 100)
346                         .putExtra(BatteryManager.EXTRA_SCALE, 100);
347         final Resources resources = mContext.getResources();
348 
349         assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ false))
350                 .isEqualTo(resources.getString(R.string.battery_info_status_full));
351     }
352 
353     @Test
getBatteryStatus_statusIsFullAndUseCompactStatus_returnFullyChargedString()354     public void getBatteryStatus_statusIsFullAndUseCompactStatus_returnFullyChargedString() {
355         final Intent intent =
356                 new Intent()
357                         .putExtra(BatteryManager.EXTRA_LEVEL, 100)
358                         .putExtra(BatteryManager.EXTRA_SCALE, 100);
359         final Resources resources = mContext.getResources();
360 
361         assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ true))
362                 .isEqualTo(resources.getString(R.string.battery_info_status_full_charged));
363     }
364 
365     @Test
getBatteryStatus_batteryLevelIs100_returnFullString()366     public void getBatteryStatus_batteryLevelIs100_returnFullString() {
367         final Intent intent =
368                 new Intent()
369                         .putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_FULL);
370         final Resources resources = mContext.getResources();
371 
372         assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ false))
373                 .isEqualTo(resources.getString(R.string.battery_info_status_full));
374     }
375 
376     @Test
getBatteryStatus_batteryLevelIs100AndUseCompactStatus_returnFullyString()377     public void getBatteryStatus_batteryLevelIs100AndUseCompactStatus_returnFullyString() {
378         final Intent intent =
379                 new Intent()
380                         .putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_FULL);
381         final Resources resources = mContext.getResources();
382 
383         assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ true))
384                 .isEqualTo(resources.getString(R.string.battery_info_status_full_charged));
385     }
386 
387     @Test
getBatteryStatus_batteryLevel99_returnChargingString()388     public void getBatteryStatus_batteryLevel99_returnChargingString() {
389         final Intent intent = new Intent();
390         intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING);
391         intent.putExtra(BatteryManager.EXTRA_PLUGGED, BatteryManager.BATTERY_PLUGGED_USB);
392         final Resources resources = mContext.getResources();
393 
394         assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ false))
395                 .isEqualTo(resources.getString(R.string.battery_info_status_charging));
396     }
397 
398     @Test
getBatteryStatus_chargingDock_returnDockChargingString()399     public void getBatteryStatus_chargingDock_returnDockChargingString() {
400         final Intent intent = new Intent();
401         intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING);
402         intent.putExtra(BatteryManager.EXTRA_PLUGGED, BatteryManager.BATTERY_PLUGGED_DOCK);
403         final Resources resources = mContext.getResources();
404 
405         assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ false))
406                 .isEqualTo(resources.getString(R.string.battery_info_status_charging_dock));
407     }
408 
409     @Test
getBatteryStatus_chargingWireless_returnWirelessChargingString()410     public void getBatteryStatus_chargingWireless_returnWirelessChargingString() {
411         final Intent intent = new Intent();
412         intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING);
413         intent.putExtra(BatteryManager.EXTRA_PLUGGED, BatteryManager.BATTERY_PLUGGED_WIRELESS);
414         final Resources resources = mContext.getResources();
415 
416         assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ false))
417                 .isEqualTo(resources.getString(R.string.battery_info_status_charging_wireless));
418     }
419 
420     @Test
getBatteryStatus_chargingAndUseCompactStatus_returnCompactString()421     public void getBatteryStatus_chargingAndUseCompactStatus_returnCompactString() {
422         final Intent intent = new Intent();
423         intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING);
424         intent.putExtra(BatteryManager.EXTRA_PLUGGED, BatteryManager.BATTERY_PLUGGED_USB);
425         final Resources resources = mContext.getResources();
426 
427         assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ true))
428                 .isEqualTo(resources.getString(R.string.battery_info_status_charging));
429     }
430 
431     @Test
getBatteryStatus_chargingWirelessAndUseCompactStatus_returnCompactString()432     public void getBatteryStatus_chargingWirelessAndUseCompactStatus_returnCompactString() {
433         final Intent intent = new Intent();
434         intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING);
435         intent.putExtra(BatteryManager.EXTRA_PLUGGED, BatteryManager.BATTERY_PLUGGED_WIRELESS);
436         final Resources resources = mContext.getResources();
437 
438         assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ true))
439                 .isEqualTo(resources.getString(R.string.battery_info_status_charging));
440     }
441 
442     @Test
containsIncompatibleChargers_nullPorts_returnFalse()443     public void containsIncompatibleChargers_nullPorts_returnFalse() {
444         when(mUsbManager.getPorts()).thenReturn(null);
445         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
446     }
447 
448     @Test
containsIncompatibleChargers_emptyPorts_returnFalse()449     public void containsIncompatibleChargers_emptyPorts_returnFalse() {
450         when(mUsbManager.getPorts()).thenReturn(new ArrayList<>());
451         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
452     }
453 
454     @Test
containsIncompatibleChargers_nullPortStatus_returnFalse()455     public void containsIncompatibleChargers_nullPortStatus_returnFalse() {
456         final List<UsbPort> usbPorts = new ArrayList<>();
457         usbPorts.add(mUsbPort);
458         when(mUsbManager.getPorts()).thenReturn(usbPorts);
459         when(mUsbPort.getStatus()).thenReturn(null);
460 
461         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
462     }
463 
464     @Test
containsIncompatibleChargers_complianeWarningOther_returnTrue_flagDisabled()465     public void containsIncompatibleChargers_complianeWarningOther_returnTrue_flagDisabled() {
466         mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING);
467         mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_INPUT_POWER_LIMITED_WARNING);
468         setupIncompatibleCharging(UsbPortStatus.COMPLIANCE_WARNING_OTHER);
469 
470         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isTrue();
471     }
472 
473     @Test
containsIncompatibleChargers_complianeWarningPower_returnFalse_flagDisabled()474     public void containsIncompatibleChargers_complianeWarningPower_returnFalse_flagDisabled() {
475         mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING);
476         mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_INPUT_POWER_LIMITED_WARNING);
477         setupIncompatibleCharging(UsbPortStatus.COMPLIANCE_WARNING_INPUT_POWER_LIMITED);
478 
479         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
480     }
481 
482     @Test
containsIncompatibleChargers_complianeWarningOther_returnFalse_flagEnabled()483     public void containsIncompatibleChargers_complianeWarningOther_returnFalse_flagEnabled() {
484         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING);
485         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_INPUT_POWER_LIMITED_WARNING);
486         setupIncompatibleCharging(UsbPortStatus.COMPLIANCE_WARNING_OTHER);
487 
488         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
489     }
490 
491     @Test
containsIncompatibleChargers_complianeWarningPower_returnTrue_flagEnabled()492     public void containsIncompatibleChargers_complianeWarningPower_returnTrue_flagEnabled() {
493         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING);
494         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_INPUT_POWER_LIMITED_WARNING);
495         setupIncompatibleCharging(UsbPortStatus.COMPLIANCE_WARNING_INPUT_POWER_LIMITED);
496 
497         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isTrue();
498     }
499 
500     @Test
containsIncompatibleChargers_complianeWarningDebug_returnTrue()501     public void containsIncompatibleChargers_complianeWarningDebug_returnTrue() {
502         setupIncompatibleCharging(UsbPortStatus.COMPLIANCE_WARNING_DEBUG_ACCESSORY);
503         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isTrue();
504     }
505 
506     @Test
containsIncompatibleChargers_unexpectedWarningType_returnFalse()507     public void containsIncompatibleChargers_unexpectedWarningType_returnFalse() {
508         setupIncompatibleCharging(UsbPortStatus.COMPLIANCE_WARNING_BC_1_2);
509         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
510     }
511 
512     @Test
containsIncompatibleChargers_emptyComplianceWarnings_returnFalse()513     public void containsIncompatibleChargers_emptyComplianceWarnings_returnFalse() {
514         setupIncompatibleCharging();
515         when(mUsbPortStatus.getComplianceWarnings()).thenReturn(new int[1]);
516         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
517     }
518 
519     @Test
containsIncompatibleChargers_notSupportComplianceWarnings_returnFalse()520     public void containsIncompatibleChargers_notSupportComplianceWarnings_returnFalse() {
521         setupIncompatibleCharging();
522         when(mUsbPort.supportsComplianceWarnings()).thenReturn(false);
523 
524         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
525     }
526 
527     @Test
containsIncompatibleChargers_usbNotConnected_returnFalse()528     public void containsIncompatibleChargers_usbNotConnected_returnFalse() {
529         setupIncompatibleCharging();
530         when(mUsbPortStatus.isConnected()).thenReturn(false);
531 
532         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
533     }
534 
535     @Test
containsIncompatibleChargers_disableWarning_returnFalse()536     public void containsIncompatibleChargers_disableWarning_returnFalse() {
537         setupIncompatibleCharging();
538         Settings.Secure.putInt(
539                 mContext.getContentResolver(), Utils.INCOMPATIBLE_CHARGER_WARNING_DISABLED, 1);
540 
541         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
542     }
543 
setupIncompatibleCharging()544     private void setupIncompatibleCharging() {
545         setupIncompatibleCharging(UsbPortStatus.COMPLIANCE_WARNING_DEBUG_ACCESSORY);
546     }
547 
setupIncompatibleCharging(int complianceWarningType)548     private void setupIncompatibleCharging(int complianceWarningType) {
549         final List<UsbPort> usbPorts = new ArrayList<>();
550         usbPorts.add(mUsbPort);
551         when(mUsbManager.getPorts()).thenReturn(usbPorts);
552         when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus);
553         when(mUsbPort.supportsComplianceWarnings()).thenReturn(true);
554         when(mUsbPortStatus.isConnected()).thenReturn(true);
555         when(mUsbPortStatus.getComplianceWarnings()).thenReturn(new int[] {complianceWarningType});
556     }
557 }
558