Skip to content
Snippets Groups Projects
Commit 865517d8 authored by Xiaozhen Lin's avatar Xiaozhen Lin
Browse files

UsbService: Refactor enableUsbData() for multiple disable requesters

Track parties requesting USB data signal disabling. Add UIDs to mUsbDisableRequesters on disable requests, remove on enable requests. Preserve existing USB data update behavior.

Bug: 287498482
Test: manual testing
Change-Id: I7629e60978f3e4acbad98602f31239f134cb4ed4
parent 104d8fb1
No related branches found
No related tags found
No related merge requests found
......@@ -20,3 +20,10 @@ flag {
description: "Enable reporting USB data compliance warnings from HAL when set"
bug: "296119135"
}
flag {
name: "enable_usb_data_signal_staking"
namespace: "preload_safety"
description: "Enables signal API with staking"
bug: "296119135"
}
\ No newline at end of file
......@@ -53,6 +53,7 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.service.usb.UsbServiceDumpProto;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
......@@ -156,6 +157,10 @@ public class UsbService extends IUsbManager.Stub {
private final Object mLock = new Object();
// Key: USB port id
// Value: A set of UIDs of requesters who request disabling usb data
private final ArrayMap<String, ArraySet<Integer>> mUsbDisableRequesters = new ArrayMap<>();
/**
* @return the {@link UsbUserSettingsManager} for the given userId
*/
......@@ -859,6 +864,11 @@ public class UsbService extends IUsbManager.Stub {
Objects.requireNonNull(callback, "enableUsbData: callback must not be null. opId:"
+ operationId);
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
if (android.hardware.usb.flags.Flags.enableUsbDataSignalStaking()) {
if (!shouldUpdateUsbSignaling(portId, enable, Binder.getCallingUid())) return false;
}
final long ident = Binder.clearCallingIdentity();
boolean wait;
try {
......@@ -878,6 +888,31 @@ public class UsbService extends IUsbManager.Stub {
return wait;
}
/**
* If enable = true, exclude UID from update list.
* If enable = false, include UID in update list.
* Return false if enable = true and the list is empty (no updates).
* Return true otherwise (let downstream decide on updates).
*/
private boolean shouldUpdateUsbSignaling(String portId, boolean enable, int uid) {
synchronized (mUsbDisableRequesters) {
if (!mUsbDisableRequesters.containsKey(portId)) {
mUsbDisableRequesters.put(portId, new ArraySet<>());
}
ArraySet<Integer> uidsOfDisableRequesters = mUsbDisableRequesters.get(portId);
if (enable) {
uidsOfDisableRequesters.remove(uid);
// re-enable USB port (return true) if there are no other disable requesters
return uidsOfDisableRequesters.isEmpty();
} else {
uidsOfDisableRequesters.add(uid);
}
}
return true;
}
@Override
public void enableUsbDataWhileDocked(String portId, int operationId,
IUsbOperationInternal callback) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment