Add API to RuntimePermissionPresenter
Add API to reovke runtime permission in RuntimePermissionPresenter
Bug: 36921532
Test: runtest -x LocationCheckActionTest(in settings)
Change-Id: I51d43d6372fffcd260d7053cb89f2a00d3b07468
diff --git a/core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl b/core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl
index 3c3b84d..9490e27 100644
--- a/core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl
+++ b/core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl
@@ -25,4 +25,5 @@
*/
oneway interface IRuntimePermissionPresenter {
void getAppPermissions(String packageName, in RemoteCallback callback);
+ void revokeRuntimePermission(String packageName, String permissionName);
}
diff --git a/core/java/android/content/pm/permission/RuntimePermissionPresenter.java b/core/java/android/content/pm/permission/RuntimePermissionPresenter.java
index 6d55d2f..02d0a6d 100644
--- a/core/java/android/content/pm/permission/RuntimePermissionPresenter.java
+++ b/core/java/android/content/pm/permission/RuntimePermissionPresenter.java
@@ -22,7 +22,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
-import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -31,6 +30,7 @@
import android.os.RemoteException;
import android.permissionpresenterservice.RuntimePermissionPresenterService;
import android.util.Log;
+
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.SomeArgs;
@@ -118,6 +118,22 @@
mRemoteService.processMessage(message);
}
+ /**
+ * Revoke the permission {@code permissionName} for app {@code packageName}
+ *
+ * @param packageName The package for which to revoke
+ * @param permissionName The permission to revoke
+ */
+ public void revokeRuntimePermission(String packageName, String permissionName) {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = packageName;
+ args.arg2 = permissionName;
+
+ Message message = mRemoteService.obtainMessage(
+ RemoteService.MSG_REVOKE_APP_PERMISSIONS, args);
+ mRemoteService.processMessage(message);
+ }
+
private static final class RemoteService
extends Handler implements ServiceConnection {
private static final long UNBIND_TIMEOUT_MILLIS = 10000;
@@ -125,6 +141,7 @@
public static final int MSG_GET_APP_PERMISSIONS = 1;
public static final int MSG_GET_APPS_USING_PERMISSIONS = 2;
public static final int MSG_UNBIND = 3;
+ public static final int MSG_REVOKE_APP_PERMISSIONS = 4;
private final Object mLock = new Object();
@@ -231,6 +248,25 @@
mRemoteInstance = null;
}
} break;
+
+ case MSG_REVOKE_APP_PERMISSIONS: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ final String packageName = (String) args.arg1;
+ final String permissionName = (String) args.arg2;
+ args.recycle();
+ final IRuntimePermissionPresenter remoteInstance;
+ synchronized (mLock) {
+ remoteInstance = mRemoteInstance;
+ }
+ if (remoteInstance == null) {
+ return;
+ }
+ try {
+ remoteInstance.revokeRuntimePermission(packageName, permissionName);
+ } catch (RemoteException re) {
+ Log.e(TAG, "Error getting app permissions", re);
+ }
+ } break;
}
synchronized (mLock) {
diff --git a/core/java/android/permissionpresenterservice/RuntimePermissionPresenterService.java b/core/java/android/permissionpresenterservice/RuntimePermissionPresenterService.java
index 344d947..2931627f 100644
--- a/core/java/android/permissionpresenterservice/RuntimePermissionPresenterService.java
+++ b/core/java/android/permissionpresenterservice/RuntimePermissionPresenterService.java
@@ -20,7 +20,6 @@
import android.app.Service;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ApplicationInfo;
import android.content.pm.permission.IRuntimePermissionPresenter;
import android.content.pm.permission.RuntimePermissionPresentationInfo;
import android.content.pm.permission.RuntimePermissionPresenter;
@@ -30,6 +29,7 @@
import android.os.Looper;
import android.os.Message;
import android.os.RemoteCallback;
+
import com.android.internal.os.SomeArgs;
import java.util.List;
@@ -72,6 +72,16 @@
*/
public abstract List<RuntimePermissionPresentationInfo> onGetAppPermissions(String packageName);
+ /**
+ * Revoke the permission {@code permissionName} for app {@code packageName}
+ *
+ * @param packageName The package for which to revoke
+ * @param permissionName The permission to revoke
+ *
+ * @hide
+ */
+ public abstract void onRevokeRuntimePermission(String packageName, String permissionName);
+
@Override
public final IBinder onBind(Intent intent) {
return new IRuntimePermissionPresenter.Stub() {
@@ -83,12 +93,22 @@
mHandler.obtainMessage(MyHandler.MSG_GET_APP_PERMISSIONS,
args).sendToTarget();
}
+
+ @Override
+ public void revokeRuntimePermission(String packageName, String permissionName) {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = packageName;
+ args.arg2 = permissionName;
+ mHandler.obtainMessage(MyHandler.MSG_REVOKE_APP_PERMISSION,
+ args).sendToTarget();
+ }
};
}
private final class MyHandler extends Handler {
public static final int MSG_GET_APP_PERMISSIONS = 1;
public static final int MSG_GET_APPS_USING_PERMISSIONS = 2;
+ public static final int MSG_REVOKE_APP_PERMISSION = 3;
public MyHandler(Looper looper) {
super(looper, null, false);
@@ -113,6 +133,14 @@
callback.sendResult(null);
}
} break;
+ case MSG_REVOKE_APP_PERMISSION: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ String packageName = (String) args.arg1;
+ String permissionName = (String) args.arg2;
+ args.recycle();
+
+ onRevokeRuntimePermission(packageName, permissionName);
+ } break;
}
}
}