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

Commit 53215d1f authored by Paul McLean's avatar Paul McLean
Browse files

Add dump of USB descriptors to the dumpsys for UsbHostManager service.

Cleaned up text formatting.

Bug: 65158441
Change-Id: Ie6531d42bb0d78f2b8af382329a973e629f23c5f
Test: Manual - connected USB headset, ran adb shell dumpsys usb. Examined output.
parent 563a5637
Loading
Loading
Loading
Loading
+38 −2
Original line number Original line Diff line number Diff line
@@ -22,8 +22,10 @@ import android.content.Context;
import android.hardware.usb.UsbConfiguration;
import android.hardware.usb.UsbConfiguration;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
import android.text.TextUtils;
@@ -32,8 +34,11 @@ import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.usb.descriptors.UsbDescriptorParser;
import com.android.server.usb.descriptors.UsbDescriptorParser;
import com.android.server.usb.descriptors.report.TextReportCanvas;
import com.android.server.usb.descriptors.tree.UsbDescriptorsTree;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashMap;


/**
/**
@@ -43,6 +48,8 @@ public class UsbHostManager {
    private static final String TAG = UsbHostManager.class.getSimpleName();
    private static final String TAG = UsbHostManager.class.getSimpleName();
    private static final boolean DEBUG = false;
    private static final boolean DEBUG = false;


    private final Context mContext;

    // contains all connected USB devices
    // contains all connected USB devices
    private final HashMap<String, UsbDevice> mDevices = new HashMap<>();
    private final HashMap<String, UsbDevice> mDevices = new HashMap<>();


@@ -69,6 +76,8 @@ public class UsbHostManager {


    public UsbHostManager(Context context, UsbAlsaManager alsaManager,
    public UsbHostManager(Context context, UsbAlsaManager alsaManager,
            UsbSettingsManager settingsManager) {
            UsbSettingsManager settingsManager) {
        mContext = context;

        mHostBlacklist = context.getResources().getStringArray(
        mHostBlacklist = context.getResources().getStringArray(
                com.android.internal.R.array.config_usbHostBlacklist);
                com.android.internal.R.array.config_usbHostBlacklist);
        mUsbAlsaManager = alsaManager;
        mUsbAlsaManager = alsaManager;
@@ -339,6 +348,33 @@ public class UsbHostManager {
            if (mUsbDeviceConnectionHandler != null) {
            if (mUsbDeviceConnectionHandler != null) {
                pw.println("Default USB Host Connection handler: " + mUsbDeviceConnectionHandler);
                pw.println("Default USB Host Connection handler: " + mUsbDeviceConnectionHandler);
            }
            }

            Collection<UsbDevice> devices = mDevices.values();
            if (devices.size() != 0) {
                pw.println("USB Peripheral Descriptors");
                for (UsbDevice device : devices) {
                    StringBuilder stringBuilder = new StringBuilder();

                    UsbDescriptorParser parser = new UsbDescriptorParser();
                    if (parser.parseDevice(device.getDeviceName())) {
                        UsbDescriptorsTree descriptorTree = new UsbDescriptorsTree();
                        descriptorTree.parse(parser);

                        UsbManager usbManager =
                                (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
                        UsbDeviceConnection connection = usbManager.openDevice(device);

                        descriptorTree.report(new TextReportCanvas(connection, stringBuilder));
                        connection.close();

                        stringBuilder.append("isHeadset[in: " + parser.isInputHeadset()
                                + " , out: " + parser.isOutputHeadset() + "]");
                    } else {
                        stringBuilder.append("Error Parsing USB Descriptors");
                    }
                    pw.println(stringBuilder.toString());
                }
            }
        }
        }
    }
    }


+1 −1
Original line number Original line Diff line number Diff line
@@ -102,6 +102,6 @@ public class UsbASFormat extends UsbACInterface {
    public void report(ReportCanvas canvas) {
    public void report(ReportCanvas canvas) {
        super.report(canvas);
        super.report(canvas);


        canvas.write(UsbStrings.getFormatName(getFormatType()));
        canvas.writeParagraph(UsbStrings.getFormatName(getFormatType()), /*emphasis*/false);
    }
    }
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -130,8 +130,8 @@ public final class UsbDeviceDescriptor extends UsbDescriptor {
        String subClasStr = UsbStrings.getClassName(devSubClass);
        String subClasStr = UsbStrings.getClassName(devSubClass);
        canvas.writeListItem("Class " + devClass + ": " + classStr + " Subclass"
        canvas.writeListItem("Class " + devClass + ": " + classStr + " Subclass"
                + devSubClass + ": " + subClasStr);
                + devSubClass + ": " + subClasStr);
        canvas.writeListItem("Vendor ID: " + getVendorID()
        canvas.writeListItem("Vendor ID: " + ReportCanvas.getHexString(getVendorID())
                + " Product ID: " + getProductID()
                + " Product ID: " + ReportCanvas.getHexString(getProductID())
                + " Product Release: " + ReportCanvas.getBCDString(getDeviceRelease()));
                + " Product Release: " + ReportCanvas.getBCDString(getDeviceRelease()));


        byte mfgIndex = getMfgIndex();
        byte mfgIndex = getMfgIndex();
+11 −13
Original line number Original line Diff line number Diff line
@@ -40,6 +40,12 @@ public final class TextReportCanvas extends ReportCanvas {
        mStringBuilder = stringBuilder;
        mStringBuilder = stringBuilder;
    }
    }


    private void writeListIndent() {
        for (int space = 0; space < mListIndent; space++) {
            mStringBuilder.append(" ");
        }
    }

    @Override
    @Override
    public void write(String text) {
    public void write(String text) {
        mStringBuilder.append(text);
        mStringBuilder.append(text);
@@ -47,7 +53,8 @@ public final class TextReportCanvas extends ReportCanvas {


    @Override
    @Override
    public void openHeader(int level) {
    public void openHeader(int level) {
        mStringBuilder.append("[" + level + " - ");
        writeListIndent();
        mStringBuilder.append("[");
    }
    }


    @Override
    @Override
@@ -56,7 +63,8 @@ public final class TextReportCanvas extends ReportCanvas {
    }
    }


    @Override
    @Override
    public void openParagraph(boolean inRed) {
    public void openParagraph(boolean emphasis) {
        writeListIndent();
    }
    }


    @Override
    @Override
@@ -75,24 +83,14 @@ public final class TextReportCanvas extends ReportCanvas {
        closeParagraph();
        closeParagraph();
    }
    }


    private void writeListIndent() {
        for (int space = 0; space < mListIndent; space++) {
            mStringBuilder.append(" ");
        }
    }

    @Override
    @Override
    public void openList() {
    public void openList() {
        mListIndent += LIST_INDENT_AMNT;
        mListIndent += LIST_INDENT_AMNT;
        writeListIndent();
        mStringBuilder.append("---->\n");
    }
    }


    @Override
    @Override
    public void closeList() {
    public void closeList() {
        writeListIndent();
        mListIndent -= LIST_INDENT_AMNT;
        mListIndent -= LIST_INDENT_AMNT;
        mStringBuilder.append("<----\n");
    }
    }


    @Override
    @Override
+5 −14
Original line number Original line Diff line number Diff line
@@ -38,6 +38,10 @@ public final class UsbStrings {
    private static HashMap<Integer, String> sTerminalNames;
    private static HashMap<Integer, String> sTerminalNames;
    private static HashMap<Integer, String> sFormatNames;
    private static HashMap<Integer, String> sFormatNames;


    static {
        allocUsbStrings();
    }

    private static void initDescriptorNames() {
    private static void initDescriptorNames() {
        sDescriptorNames = new HashMap<Byte, String>();
        sDescriptorNames = new HashMap<Byte, String>();
        sDescriptorNames.put(UsbDescriptor.DESCRIPTORTYPE_DEVICE, "Device");
        sDescriptorNames.put(UsbDescriptor.DESCRIPTORTYPE_DEVICE, "Device");
@@ -246,7 +250,7 @@ public final class UsbStrings {
    /**
    /**
     * Initializes string tables.
     * Initializes string tables.
     */
     */
    public static void allocUsbStrings() {
    private static void allocUsbStrings() {
        initDescriptorNames();
        initDescriptorNames();
        initACControlInterfaceNames();
        initACControlInterfaceNames();
        initACStreamingInterfaceNames();
        initACStreamingInterfaceNames();
@@ -257,19 +261,6 @@ public final class UsbStrings {
        initFormatNames();
        initFormatNames();
    }
    }


    /**
     * Deinitializes string tables.
     */
    public static void releaseUsbStrings() {
        sDescriptorNames = null;
        sACControlInterfaceNames = null;
        sACStreamingInterfaceNames = null;
        sClassNames = null;
        sAudioSubclassNames = null;
        sAudioEncodingNames = null;
        sTerminalNames = null;
    }

    /**
    /**
     * Retrieves the name for the specified descriptor ID.
     * Retrieves the name for the specified descriptor ID.
     */
     */
Loading