summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/usb/UsbDeviceConnection.java19
-rw-r--r--core/java/android/hardware/usb/UsbManager.java2
-rw-r--r--media/java/android/mtp/MtpDevice.java14
-rw-r--r--services/core/java/com/android/server/MountService.java17
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() {