diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java index 50a4944453221..8a30a3bbe784f 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.ColorFilter; 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.AccessNetworkConstants; 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.fuelgauge.BatteryStatus; import com.android.settingslib.utils.BuildCompatUtils; import java.text.NumberFormat; +import java.util.List; public class Utils { @@ -638,4 +643,31 @@ public class Utils { (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 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 291f6a39105be..68a1e194c15bd 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.ContentResolver; 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.Implementation; 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 @@ public class UtilsTest { 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 @@ public class UtilsTest { 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 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 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 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(); + } }