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

Commit f353ff4d authored by Alex Johnston's avatar Alex Johnston Committed by Android (Google) Code Review
Browse files

Merge "Update all usb ports in enableUsbDataSignal" into tm-dev

parents 9d0392bc d919b973
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.