Merge changes from topic "118783261"
* changes:
Log connection duration.
Log UsbConnectorStateChanged events
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 78d8e29..0c78fd1 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -1265,14 +1265,18 @@
* Logs when something is plugged into or removed from the USB-C connector.
*
* Logged from:
- * Vendor USB HAL.
+ * UsbService
*/
message UsbConnectorStateChanged {
enum State {
- DISCONNECTED = 0;
- CONNECTED = 1;
+ STATE_DISCONNECTED = 0;
+ STATE_CONNECTED = 1;
}
optional State state = 1;
+ optional string id = 2;
+ // Last active session in ms.
+ // 0 when the port is in connected state.
+ optional int64 last_connect_duration_millis = 3;
}
/**
diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto
index ed040f4..f7dcee2 100644
--- a/core/proto/android/service/usb.proto
+++ b/core/proto/android/service/usb.proto
@@ -206,6 +206,8 @@
optional bool can_change_mode = 3;
optional bool can_change_power_role = 4;
optional bool can_change_data_role = 5;
+ optional int64 connected_at_millis = 6;
+ optional int64 last_connect_duration_millis = 7;
}
message UsbPortProto {
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index 33da403..96618f5 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -41,12 +41,14 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.service.usb.UsbPortInfoProto;
import android.service.usb.UsbPortManagerProto;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Slog;
+import android.util.StatsLog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter;
@@ -54,6 +56,7 @@
import com.android.server.FgThread;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.NoSuchElementException;
/**
@@ -117,6 +120,10 @@
private final ArrayMap<String, RawPortInfo> mSimulatedPorts =
new ArrayMap<>();
+ // Maintains the current connected status of the port.
+ // Uploads logs only when the connection status is changes.
+ private final HashMap<String, Boolean> mConnected = new HashMap<>();
+
public UsbPortManager(Context context) {
mContext = context;
try {
@@ -700,6 +707,18 @@
// Guard against possible reentrance by posting the broadcast from the handler
// instead of from within the critical section.
mHandler.post(() -> mContext.sendBroadcastAsUser(intent, UserHandle.ALL));
+
+ // Log to statsd
+ if (!mConnected.containsKey(portInfo.mUsbPort.getId())
+ || (mConnected.get(portInfo.mUsbPort.getId())
+ != portInfo.mUsbPortStatus.isConnected())) {
+ mConnected.put(portInfo.mUsbPort.getId(), portInfo.mUsbPortStatus.isConnected());
+ StatsLog.write(StatsLog.USB_CONNECTOR_STATE_CHANGED,
+ portInfo.mUsbPortStatus.isConnected()
+ ? StatsLog.USB_CONNECTOR_STATE_CHANGED__STATE__STATE_CONNECTED :
+ StatsLog.USB_CONNECTOR_STATE_CHANGED__STATE__STATE_DISCONNECTED,
+ portInfo.mUsbPort.getId(), portInfo.mLastConnectDurationMillis);
+ }
}
private static void logAndPrint(int priority, IndentingPrintWriter pw, String msg) {
@@ -746,7 +765,12 @@
public boolean mCanChangeMode;
public boolean mCanChangePowerRole;
public boolean mCanChangeDataRole;
- public int mDisposition; // default initialized to 0 which means added
+ // default initialized to 0 which means added
+ public int mDisposition;
+ // Tracks elapsedRealtime() of when the port was connected
+ public long mConnectedAtMillis;
+ // 0 when port is connected. Else reports the last connected duration
+ public long mLastConnectDurationMillis;
public PortInfo(String portId, int supportedModes) {
mUsbPort = new UsbPort(portId, supportedModes);
@@ -756,6 +780,8 @@
int currentPowerRole, boolean canChangePowerRole,
int currentDataRole, boolean canChangeDataRole,
int supportedRoleCombinations) {
+ boolean dispositionChanged = false;
+
mCanChangeMode = canChangeMode;
mCanChangePowerRole = canChangePowerRole;
mCanChangeDataRole = canChangeDataRole;
@@ -767,9 +793,18 @@
!= supportedRoleCombinations) {
mUsbPortStatus = new UsbPortStatus(currentMode, currentPowerRole, currentDataRole,
supportedRoleCombinations);
- return true;
+ dispositionChanged = true;
}
- return false;
+
+ if (mUsbPortStatus.isConnected() && mConnectedAtMillis == 0) {
+ mConnectedAtMillis = SystemClock.elapsedRealtime();
+ mLastConnectDurationMillis = 0;
+ } else if (!mUsbPortStatus.isConnected() && mConnectedAtMillis != 0) {
+ mLastConnectDurationMillis = SystemClock.elapsedRealtime() - mConnectedAtMillis;
+ mConnectedAtMillis = 0;
+ }
+
+ return dispositionChanged;
}
void dump(@NonNull DualDumpOutputStream dump, @NonNull String idName, long id) {
@@ -782,6 +817,10 @@
mCanChangePowerRole);
dump.write("can_change_data_role", UsbPortInfoProto.CAN_CHANGE_DATA_ROLE,
mCanChangeDataRole);
+ dump.write("connected_at_millis",
+ UsbPortInfoProto.CONNECTED_AT_MILLIS, mConnectedAtMillis);
+ dump.write("last_connect_duration_millis",
+ UsbPortInfoProto.LAST_CONNECT_DURATION_MILLIS, mLastConnectDurationMillis);
dump.end(token);
}
@@ -791,7 +830,9 @@
return "port=" + mUsbPort + ", status=" + mUsbPortStatus
+ ", canChangeMode=" + mCanChangeMode
+ ", canChangePowerRole=" + mCanChangePowerRole
- + ", canChangeDataRole=" + mCanChangeDataRole;
+ + ", canChangeDataRole=" + mCanChangeDataRole
+ + ", connectedAtMillis=" + mConnectedAtMillis
+ + ", lastConnectDurationMillis=" + mLastConnectDurationMillis;
}
}