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

Commit 7b78bbd0 authored by Evan Severson's avatar Evan Severson
Browse files

Implement persistent permissions for Usb devices

Previously a package could only get automatically granted USB
permission for a given device if it was the default app to launch
when the device is connected. This means only one package can
be granted automatically and it must be started on connection.

This change introduces a new usb permission mechanism which is meant
to separate the auto launch from usb permission so that multiple
packages can have permission without prompting the user.
The temporary usb permissions still work.

Test: edit usb_permissions.xml on device to allow, reboot,
      connect usb headphones, deny launch dialog, open test app,
      assert usb permission already granted.
Test: Check complement behavior to previous test, assert permission
      not granted by default if not in usb_device_manager.xml or
      explicitly denied in usb_device_manager.xml.
Bug: 136496922
Change-Id: I005d7470f1e6642d683c953a914f65f16ff7e1bb
parent 153d424c
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -56,6 +56,12 @@ public class AccessoryFilter {
        mVersion = accessory.getVersion();
    }

    public AccessoryFilter(@NonNull AccessoryFilter filter) {
        mManufacturer = filter.mManufacturer;
        mModel = filter.mModel;
        mVersion = filter.mVersion;
    }

    public static AccessoryFilter read(XmlPullParser parser)
            throws XmlPullParserException, IOException {
        String manufacturer = null;
+11 −0
Original line number Diff line number Diff line
@@ -80,6 +80,17 @@ public class DeviceFilter {
        mSerialNumber = device.getSerialNumber();
    }

    public DeviceFilter(@NonNull DeviceFilter filter) {
        mVendorId = filter.mVendorId;
        mProductId = filter.mProductId;
        mClass = filter.mClass;
        mSubclass = filter.mSubclass;
        mProtocol = filter.mProtocol;
        mManufacturerName = filter.mManufacturerName;
        mProductName = filter.mProductName;
        mSerialNumber = filter.mSerialNumber;
    }

    public static DeviceFilter read(XmlPullParser parser)
            throws XmlPullParserException, IOException {
        int vendorId = -1;
+9 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.hardware.usb.ParcelableUsbPort;
import android.hardware.usb.UsbPortStatus;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.UserHandle;

/** @hide */
interface IUsbManager
@@ -54,6 +55,14 @@ interface IUsbManager
     */
    void setAccessoryPackage(in UsbAccessory accessory, String packageName, int userId);

    /* Sets the persistent permission granted state for USB device
     */
    void setDevicePersistentPermission(in UsbDevice device, int uid, in UserHandle user, boolean shouldBeGranted);

    /* Sets the persistent permission granted state for USB accessory
     */
    void setAccessoryPersistentPermission(in UsbAccessory accessory, int uid, in UserHandle user, boolean shouldBeGranted);

    /* Returns true if the caller has permission to access the device. */
    boolean hasDevicePermission(in UsbDevice device, String packageName);

+4 −0
Original line number Diff line number Diff line
@@ -60,6 +60,10 @@ class UsbPermissionManager {
        }
    }

    @NonNull UsbUserPermissionManager getPermissionsForUser(@NonNull UserHandle user) {
        return getPermissionsForUser(user.getIdentifier());
    }

    void remove(@NonNull UserHandle userToRemove) {
        synchronized (mPermissionsByUser) {
            mPermissionsByUser.remove(userToRemove.getIdentifier());
+1 −1
Original line number Diff line number Diff line
@@ -319,7 +319,7 @@ class UsbProfileGroupSettingsManager {

    /**
     * Upgrade any single-user settings from {@link #sSingleUserSettingsFile}.
     * Should only by called by owner.
     * Should only be called by owner.
     */
    @GuardedBy("mLock")
    private void upgradeSingleUserLocked() {
Loading