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

Commit 4751880a authored by Daichi Hirono's avatar Daichi Hirono
Browse files

Grant USB device permission by using system permission.

Previously it skips the device permission check by referring package
name. The CL removes the special case and use general MANAGE_USB
system-only permission to skip USB device permission dialog.

BUG=26048722

Change-Id: I3702393a50696209499d1e5f6549dab9fb2cefe4
parent 7ed26b10
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.app.PendingIntent;
import android.content.Context;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
import android.util.Log;

@@ -454,6 +455,21 @@ public class UsbManager {
        }
    }

    /**
     * Grants permission for USB device without showing system dialog.
     * Only system components can call this function.
     * @param device to request permissions for
     *
     * {@hide}
     */
    public void grantPermission(UsbDevice device) {
        try {
            mService.grantDevicePermission(device, Process.myUid());
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in grantPermission", e);
        }
    }

    /**
     * Returns true if the specified USB function is currently enabled when in device mode.
     * <p>
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := MtpDocumentsProvider
LOCAL_CERTIFICATE := media
LOCAL_PRIVILEGED_MODULE := true

include $(BUILD_PACKAGE)
include $(LOCAL_PATH)/tests/Android.mk
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
          package="com.android.mtp"
          android:sharedUserId="android.media">
    <uses-feature android:name="android.hardware.usb.host" />
    <uses-permission android:name="android.permission.MANAGE_USB" />
    <application android:label="@string/app_label">
        <provider
            android:name=".MtpDocumentsProvider"
+4 −4
Original line number Diff line number Diff line
@@ -26,14 +26,12 @@ import android.mtp.MtpEvent;
import android.mtp.MtpObjectInfo;
import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.util.SparseArray;

import com.android.internal.annotations.VisibleForTesting;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

/**
 * The model wrapping android.mtp API.
@@ -63,8 +61,10 @@ class MtpManager {
        }

        if (!mManager.hasPermission(rawDevice)) {
            // Permission should be obtained via app selection dialog for intent.
            throw new IOException("No permission to operate USB device.");
            mManager.grantPermission(rawDevice);
            if (!mManager.hasPermission(rawDevice)) {
                throw new IOException("Failed to grant a device permission.");
            }
        }

        final MtpDevice device = new MtpDevice(rawDevice);
+1 −10
Original line number Diff line number Diff line
@@ -52,12 +52,10 @@ import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
@@ -984,14 +982,7 @@ class UsbSettingsManager {
    public boolean hasPermission(UsbDevice device) {
        synchronized (mLock) {
            int uid = Binder.getCallingUid();
            int androidMediaUid;
            try {
                androidMediaUid = mPackageManager.getApplicationInfo("com.android.mtp", 0).uid;
            } catch (NameNotFoundException e) {
                androidMediaUid = -1;
            }
            if (uid == Process.SYSTEM_UID || UserHandle.getAppId(uid) == androidMediaUid ||
                    mDisablePermissionDialogs) {
            if (uid == Process.SYSTEM_UID || mDisablePermissionDialogs) {
                return true;
            }
            SparseBooleanArray uidList = mDevicePermissionMap.get(device.getDeviceName());