Add a new utility to check the incompatible charger state
Add a new utility to check the incompatible charger state to provide
warning message for users on the SystemUI notification and Settings
banner tip https://docs.google.com/document/d/1lKC-WTxNq9JRJd_m2g1QOxyvHQgcL6MKjBlrBAEH6ms
Bug: 246960554
Test: make test RunSettingsLibRoboTests -j40
Change-Id: I8b87bce0a02199e7b4a1ea639383758a89f8057e
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index 50a4944..8a30a3b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -23,6 +23,9 @@
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.drawable.Drawable;
+import android.hardware.usb.UsbManager;
+import android.hardware.usb.UsbPort;
+import android.hardware.usb.UsbPortStatus;
import android.location.LocationManager;
import android.media.AudioManager;
import android.net.NetworkCapabilities;
@@ -40,6 +43,7 @@
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
+import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
@@ -55,6 +59,7 @@
import com.android.settingslib.utils.BuildCompatUtils;
import java.text.NumberFormat;
+import java.util.List;
public class Utils {
@@ -638,4 +643,31 @@
(VcnTransportInfo) networkCapabilities.getTransportInfo();
return vcnTransportInfo.getWifiInfo();
}
+
+ /** Whether there is any incompatible chargers in the current UsbPort? */
+ public static boolean containsIncompatibleChargers(Context context, String tag) {
+ final List<UsbPort> usbPortList =
+ context.getSystemService(UsbManager.class).getPorts();
+ if (usbPortList == null || usbPortList.isEmpty()) {
+ return false;
+ }
+ for (UsbPort usbPort : usbPortList) {
+ Log.d(tag, "usbPort: " + usbPort);
+ final UsbPortStatus usbStatus = usbPort.getStatus();
+ if (usbStatus == null || !usbStatus.isConnected()) {
+ continue;
+ }
+ final int[] complianceWarnings = usbStatus.getComplianceWarnings();
+ if (complianceWarnings == null || complianceWarnings.length == 0) {
+ continue;
+ }
+ for (int complianceWarningType : complianceWarnings) {
+ if (complianceWarningType != 0) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
index 291f6a3..68a1e19 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
@@ -29,6 +29,9 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
+import android.hardware.usb.UsbManager;
+import android.hardware.usb.UsbPort;
+import android.hardware.usb.UsbPortStatus;
import android.location.LocationManager;
import android.media.AudioManager;
import android.os.BatteryManager;
@@ -53,7 +56,9 @@
import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowSettings;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
@RunWith(RobolectricTestRunner.class)
@@ -74,12 +79,19 @@
private ServiceState mServiceState;
@Mock
private NetworkRegistrationInfo mNetworkRegistrationInfo;
+ @Mock
+ private UsbPort mUsbPort;
+ @Mock
+ private UsbManager mUsbManager;
+ @Mock
+ private UsbPortStatus mUsbPortStatus;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
when(mContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager);
+ when(mContext.getSystemService(UsbManager.class)).thenReturn(mUsbManager);
ShadowSecure.reset();
mAudioManager = mContext.getSystemService(AudioManager.class);
}
@@ -411,4 +423,50 @@
assertThat(Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ true)).isEqualTo(
resources.getString(R.string.battery_info_status_charging));
}
+
+ @Test
+ public void containsIncompatibleChargers_nullPorts_returnFalse() {
+ when(mUsbManager.getPorts()).thenReturn(null);
+ assertThat(Utils.containsIncompatibleChargers(mContext, "tag")).isFalse();
+ }
+
+ @Test
+ public void containsIncompatibleChargers_emptyPorts_returnFalse() {
+ when(mUsbManager.getPorts()).thenReturn(new ArrayList<>());
+ assertThat(Utils.containsIncompatibleChargers(mContext, "tag")).isFalse();
+ }
+
+ @Test
+ public void containsIncompatibleChargers_nullPortStatus_returnFalse() {
+ final List<UsbPort> usbPorts = new ArrayList<>();
+ usbPorts.add(mUsbPort);
+ when(mUsbManager.getPorts()).thenReturn(usbPorts);
+ when(mUsbPort.getStatus()).thenReturn(null);
+
+ assertThat(Utils.containsIncompatibleChargers(mContext, "tag")).isFalse();
+ }
+
+ @Test
+ public void containsIncompatibleChargers_returnTrue() {
+ final List<UsbPort> usbPorts = new ArrayList<>();
+ usbPorts.add(mUsbPort);
+ when(mUsbManager.getPorts()).thenReturn(usbPorts);
+ when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus);
+ when(mUsbPortStatus.isConnected()).thenReturn(true);
+ when(mUsbPortStatus.getComplianceWarnings()).thenReturn(new int[]{1});
+
+ assertThat(Utils.containsIncompatibleChargers(mContext, "tag")).isTrue();
+ }
+
+ @Test
+ public void containsIncompatibleChargers_emptyComplianceWarnings_returnFalse() {
+ final List<UsbPort> usbPorts = new ArrayList<>();
+ usbPorts.add(mUsbPort);
+ when(mUsbManager.getPorts()).thenReturn(usbPorts);
+ when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus);
+ when(mUsbPortStatus.isConnected()).thenReturn(true);
+ when(mUsbPortStatus.getComplianceWarnings()).thenReturn(new int[1]);
+
+ assertThat(Utils.containsIncompatibleChargers(mContext, "tag")).isFalse();
+ }
}