Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d919b973 authored by Alex Johnston's avatar Alex Johnston
Browse files

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
parent 7af8e713
Loading
Loading
Loading
Loading
+26 −8
Original line number Diff line number Diff line
@@ -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.
     * <p>
     * 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.
     * </p>
     *
     * @param enable enable or disable USB data signaling
@@ -1202,12 +1201,31 @@ public class UsbManager {
     */
    @RequiresPermission(Manifest.permission.MANAGE_USB)
    public boolean enableUsbDataSignal(boolean enable) {
        List<UsbPort> 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<UsbPort> usbPorts, boolean disable,
            boolean revertOnFailure) {
        List<UsbPort> 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 true;
    }

    private boolean isPortDisabled(UsbPort usbPort) {
        return (getPortStatus(usbPort).getUsbDataStatus() & DATA_STATUS_DISABLED_FORCE)
                == DATA_STATUS_DISABLED_FORCE;
    }

    /**
     * Returns a list of physical USB ports on the device.