From d919b973cb90290ab9c7c57d470f3bb7ba58148d Mon Sep 17 00:00:00 2001 From: Alex Johnston Date: Thu, 3 Mar 2022 11:22:10 +0000 Subject: [PATCH] Update all usb ports in enableUsbDataSignal Bug: 217859816 Test: atest android.usb.cts.UsbManagerApiTest atest com.android.server.usbtest.UsbManagerApiTest atest com.android.server.devicepolicy.DevicePolicyManagerTest Change-Id: I1f5b00f993394fc933b56e93913fe7e73ab8b9cc --- .../java/android/hardware/usb/UsbManager.java | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java index 7ff74c68fc534..4fb6abdae5ff5 100644 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -17,6 +17,8 @@ package android.hardware.usb; +import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_FORCE; + import android.Manifest; import android.annotation.IntDef; import android.annotation.LongDef; @@ -36,8 +38,6 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.hardware.usb.gadget.V1_0.GadgetFunction; import android.hardware.usb.gadget.V1_2.UsbSpeed; -import android.hardware.usb.IUsbOperationInternal; -import android.hardware.usb.UsbPort; import android.os.Build; import android.os.Bundle; import android.os.ParcelFileDescriptor; @@ -1189,9 +1189,8 @@ public class UsbManager { /** * Enable/Disable the USB data signaling. *

- * Enables/Disables USB data path of the first port.. + * Enables/Disables USB data path of all USB ports. * It will force to stop or restore USB data signaling. - * Call UsbPort API if the device has more than one UsbPort. *

* * @param enable enable or disable USB data signaling @@ -1202,11 +1201,30 @@ public class UsbManager { */ @RequiresPermission(Manifest.permission.MANAGE_USB) public boolean enableUsbDataSignal(boolean enable) { - List usbPorts = getPorts(); - if (usbPorts.size() == 1) { - return usbPorts.get(0).enableUsbData(enable) == UsbPort.ENABLE_USB_DATA_SUCCESS; + return setUsbDataSignal(getPorts(), !enable, /* revertOnFailure= */ true); + } + + private boolean setUsbDataSignal(List usbPorts, boolean disable, + boolean revertOnFailure) { + List changedPorts = new ArrayList<>(); + for (int i = 0; i < usbPorts.size(); i++) { + UsbPort port = usbPorts.get(i); + if (isPortDisabled(port) != disable) { + changedPorts.add(port); + if (port.enableUsbData(!disable) != UsbPort.ENABLE_USB_DATA_SUCCESS + && revertOnFailure) { + Log.e(TAG, "Failed to set usb data signal for portID(" + port.getId() + ")"); + setUsbDataSignal(changedPorts, !disable, /* revertOnFailure= */ false); + return false; + } + } } - return false; + return true; + } + + private boolean isPortDisabled(UsbPort usbPort) { + return (getPortStatus(usbPort).getUsbDataStatus() & DATA_STATUS_DISABLED_FORCE) + == DATA_STATUS_DISABLED_FORCE; } /**