diff options
-rw-r--r-- | core/java/android/hardware/usb/UsbDeviceConnection.java | 19 | ||||
-rw-r--r-- | core/java/android/hardware/usb/UsbManager.java | 2 | ||||
-rw-r--r-- | media/java/android/mtp/MtpDevice.java | 14 | ||||
-rw-r--r-- | services/core/java/com/android/server/MountService.java | 17 |
4 files changed, 44 insertions, 8 deletions
diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java index c062b3a31152..893b9541ff3d 100644 --- a/core/java/android/hardware/usb/UsbDeviceConnection.java +++ b/core/java/android/hardware/usb/UsbDeviceConnection.java @@ -16,8 +16,10 @@ package android.hardware.usb; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.Context; import android.os.ParcelFileDescriptor; - import java.io.FileDescriptor; @@ -31,6 +33,8 @@ public class UsbDeviceConnection { private final UsbDevice mDevice; + private Context mContext; + // used by the JNI code private long mNativeContext; @@ -42,11 +46,22 @@ public class UsbDeviceConnection { mDevice = device; } - /* package */ boolean open(String name, ParcelFileDescriptor pfd) { + /* package */ boolean open(String name, ParcelFileDescriptor pfd, @NonNull Context context) { + mContext = context.getApplicationContext(); + return native_open(name, pfd.getFileDescriptor()); } /** + * @return The application context the connection was created for. + * + * @hide + */ + public @Nullable Context getContext() { + return mContext; + } + + /** * Releases all system resources related to the device. * Once the object is closed it cannot be used again. * The client must call {@link UsbManager#openDevice} again diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java index 629db06a30e3..cb2720ab9848 100644 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -330,7 +330,7 @@ public class UsbManager { ParcelFileDescriptor pfd = mService.openDevice(deviceName); if (pfd != null) { UsbDeviceConnection connection = new UsbDeviceConnection(device); - boolean result = connection.open(deviceName, pfd); + boolean result = connection.open(deviceName, pfd, mContext); pfd.close(); if (result) { return connection; diff --git a/media/java/android/mtp/MtpDevice.java b/media/java/android/mtp/MtpDevice.java index 4082778986c6..e7ea1a5a12cf 100644 --- a/media/java/android/mtp/MtpDevice.java +++ b/media/java/android/mtp/MtpDevice.java @@ -18,11 +18,13 @@ package android.mtp; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.Context; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbDeviceConnection; import android.os.CancellationSignal; import android.os.ParcelFileDescriptor; +import android.os.UserManager; import com.android.internal.util.Preconditions; import java.io.IOException; @@ -62,7 +64,17 @@ public final class MtpDevice { * @return true if the device was successfully opened. */ public boolean open(UsbDeviceConnection connection) { - boolean result = native_open(mDevice.getDeviceName(), connection.getFileDescriptor()); + boolean result = false; + + Context context = connection.getContext(); + if (context != null) { + UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + + if (!userManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { + result = native_open(mDevice.getDeviceName(), connection.getFileDescriptor()); + } + } + if (!result) { connection.close(); } diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 0023e4bef77c..8430a0b29906 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -1437,13 +1437,22 @@ class MountService extends IMountService.Stub * Decide if volume is mountable per device policies. */ private boolean isMountDisallowed(VolumeInfo vol) { + UserManager userManager = mContext.getSystemService(UserManager.class); + + boolean isUsbRestricted = false; + if (vol.disk != null && vol.disk.isUsb()) { + isUsbRestricted = userManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER, + Binder.getCallingUserHandle()); + } + + boolean isTypeRestricted = false; if (vol.type == VolumeInfo.TYPE_PUBLIC || vol.type == VolumeInfo.TYPE_PRIVATE) { - final UserManager userManager = mContext.getSystemService(UserManager.class); - return userManager.hasUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, + isTypeRestricted = userManager + .hasUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, Binder.getCallingUserHandle()); - } else { - return false; } + + return isUsbRestricted || isTypeRestricted; } private void enforceAdminUser() { |