From c6f23e8521dedac7a07119031913235be3ca37c3 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Wed, 9 Mar 2011 12:05:20 -0500 Subject: [PATCH] Change UsbManager.requestPermission to only grant permission temporarily If the user approves an application to access a USB device or accessory without choosing it as the default application, then permission is granted only until the device or accessory is disconnected. Only applications chosen as the default choice have permissions assigned persistently. BUG: 4061035 Change-Id: Ic4f6271a91b2fc56bbeef82c579e26d88c63ae56 Signed-off-by: Mike Lockwood --- .../android/hardware/usb/IUsbManager.aidl | 4 +- .../android/hardware/usb/UsbAccessory.java | 8 + core/java/android/hardware/usb/UsbDevice.java | 5 + .../java/android/hardware/usb/UsbManager.java | 16 +- .../server/usb/UsbDeviceSettingsManager.java | 247 +++++------------- .../com/android/server/usb/UsbService.java | 8 +- 6 files changed, 98 insertions(+), 190 deletions(-) diff --git a/core/java/android/hardware/usb/IUsbManager.aidl b/core/java/android/hardware/usb/IUsbManager.aidl index c79a4583f8a89..495fa21a03600 100644 --- a/core/java/android/hardware/usb/IUsbManager.aidl +++ b/core/java/android/hardware/usb/IUsbManager.aidl @@ -77,8 +77,8 @@ interface IUsbManager void grantAccessoryPermission(in UsbAccessory accessory, int uid); /* Returns true if the USB manager has default preferences or permissions for the package */ - boolean hasDefaults(String packageName, int uid); + boolean hasDefaults(String packageName); /* Clears default preferences and permissions for the package */ - oneway void clearDefaults(String packageName, int uid); + oneway void clearDefaults(String packageName); } diff --git a/core/java/android/hardware/usb/UsbAccessory.java b/core/java/android/hardware/usb/UsbAccessory.java index 6cd9178ffeadb..7d66caafbd042 100644 --- a/core/java/android/hardware/usb/UsbAccessory.java +++ b/core/java/android/hardware/usb/UsbAccessory.java @@ -108,6 +108,14 @@ public class UsbAccessory implements Parcelable { return false; } + @Override + public int hashCode() { + return ((mManufacturer == null ? 0 : mManufacturer.hashCode()) ^ + (mModel == null ? 0 : mModel.hashCode()) ^ + (mType == null ? 0 : mType.hashCode()) ^ + (mVersion == null ? 0 : mVersion.hashCode())); + } + @Override public String toString() { return "UsbAccessory[mManufacturer=" + mManufacturer + diff --git a/core/java/android/hardware/usb/UsbDevice.java b/core/java/android/hardware/usb/UsbDevice.java index 37bd82b851b9b..39254b3851f4c 100644 --- a/core/java/android/hardware/usb/UsbDevice.java +++ b/core/java/android/hardware/usb/UsbDevice.java @@ -269,6 +269,11 @@ public final class UsbDevice implements Parcelable { } } + @Override + public int hashCode() { + return mName.hashCode(); + } + @Override public String toString() { return "UsbDevice[mName=" + mName + ",mVendorId=" + mVendorId + diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java index 9f1b8eaab2d7f..5df0ac7f4c0f0 100644 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -281,6 +281,9 @@ public class UsbManager { /** * Returns true if the caller has permission to access the device. + * Permission might have been granted temporarily via + * {@link #requestPermission(android.hardware.usb.UsbDevice} or + * by the user choosing the caller as the default application for the device. * * @param device to check permissions for * @return true if caller has permission @@ -296,6 +299,9 @@ public class UsbManager { /** * Returns true if the caller has permission to access the accessory. + * Permission might have been granted temporarily via + * {@link #requestPermission(android.hardware.usb.UsbAccessory} or + * by the user choosing the caller as the default application for the accessory. * * @param accessory to check permissions for * @return true if caller has permission @@ -310,10 +316,13 @@ public class UsbManager { } /** - * Requests permission for the given package to access the device. + * Requests temporary permission for the given package to access the device. * This may result in a system dialog being displayed to the user * if permission had not already been granted. * Success or failure is returned via the {@link android.app.PendingIntent} pi. + * If successful, this grants the caller permission to access the device only + * until the device is disconnected. + * * The following extras will be added to pi: *