From 5ec629f02027dcb6e2091ad412b2148b5f384f29 Mon Sep 17 00:00:00 2001 From: Badhri Jagan Sridharan Date: Fri, 16 Nov 2018 15:39:22 -0800 Subject: [PATCH] Log UsbDeviceAttached events for Audio devices UsbDeviceAttached is logged when the device has an audio interface. Info such as VID, PID, whether the device has hid or mass storage interface and the duration for which the usb device was connected would be logged as well. Bug: 118783261 Test: Manually tested by running: adb shell cmd stats print-logs, adb logcat | grep statsd | grep \(77\) Change-Id: I57bbfd22ef377553daa113968fe53c4fe0f8e4d2 --- cmds/statsd/src/atoms.proto | 6 ++++ .../android/server/usb/UsbHostManager.java | 31 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 41a2021097138..d5a32bd98d288 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -1207,6 +1207,12 @@ message UsbDeviceAttached { optional bool has_audio = 3; optional bool has_hid = 4; optional bool has_storage = 5; + enum State { + STATE_DISCONNECTED = 0; + STATE_CONNECTED = 1; + } + optional State state = 6; + optional int64 last_connect_duration_ms = 7; } diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java index 613ba0044f6ad..904d55e6d0f3b 100644 --- a/services/usb/java/com/android/server/usb/UsbHostManager.java +++ b/services/usb/java/com/android/server/usb/UsbHostManager.java @@ -32,7 +32,9 @@ import android.service.usb.UsbConnectionRecordProto; import android.service.usb.UsbHostManagerProto; import android.service.usb.UsbIsHeadsetProto; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Slog; +import android.util.StatsLog; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.IndentingPrintWriter; @@ -86,6 +88,7 @@ public class UsbHostManager { private int mNumConnects; // TOTAL # of connect/disconnect private final LinkedList mConnections = new LinkedList(); private ConnectionRecord mLastConnect; + private final ArrayMap mConnected = new ArrayMap<>(); /* * ConnectionRecord @@ -300,6 +303,11 @@ public class UsbHostManager { if (mode != ConnectionRecord.DISCONNECT) { mLastConnect = rec; } + if (mode == ConnectionRecord.CONNECT) { + mConnected.put(deviceAddress, rec); + } else if (mode == ConnectionRecord.DISCONNECT) { + mConnected.remove(deviceAddress); + } } private void logUsbDevice(UsbDescriptorParser descriptorParser) { @@ -408,6 +416,14 @@ public class UsbHostManager { // Tracking addConnectionRecord(deviceAddress, ConnectionRecord.CONNECT, parser.getRawDescriptors()); + + // Stats collection + if (parser.hasAudioInterface()) { + StatsLog.write(StatsLog.USB_DEVICE_ATTACHED, newDevice.getVendorId(), + newDevice.getProductId(), parser.hasAudioInterface(), + parser.hasHIDInterface(), parser.hasStorageInterface(), + StatsLog.USB_DEVICE_ATTACHED__STATE__STATE_CONNECTED, 0); + } } } @@ -432,9 +448,22 @@ public class UsbHostManager { mUsbAlsaManager.usbDeviceRemoved(deviceAddress); mSettingsManager.usbDeviceRemoved(device); getCurrentUserSettings().usbDeviceRemoved(device); - + ConnectionRecord current = mConnected.get(deviceAddress); // Tracking addConnectionRecord(deviceAddress, ConnectionRecord.DISCONNECT, null); + + if (current != null) { + UsbDescriptorParser parser = new UsbDescriptorParser(deviceAddress, + current.mDescriptors); + if (parser.hasAudioInterface()) { + // Stats collection + StatsLog.write(StatsLog.USB_DEVICE_ATTACHED, device.getVendorId(), + device.getProductId(), parser.hasAudioInterface(), + parser.hasHIDInterface(), parser.hasStorageInterface(), + StatsLog.USB_DEVICE_ATTACHED__STATE__STATE_DISCONNECTED, + System.currentTimeMillis() - current.mTimestamp); + } + } } else { Slog.d(TAG, "Removed device at " + deviceAddress + " was already gone"); }