Add APermissionManager_checkPermission to libandroid
And allow IActivityManager#checkPermission to be used by native code.
bug: 172283477
bug: 159172726
Change-Id: I582fb918ac3ddc2289ef0040a4391db407673692
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 879d437..0769b85 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -98,6 +98,8 @@
void unregisterUidObserver(in IUidObserver observer);
boolean isUidActive(int uid, String callingPackage);
int getUidProcessState(int uid, in String callingPackage);
+ @UnsupportedAppUsage
+ int checkPermission(in String permission, int pid, int uid);
// =============== End of transactions used on native side as well ============================
// Special low-level communication with activity manager.
@@ -215,8 +217,6 @@
void setProcessLimit(int max);
@UnsupportedAppUsage
int getProcessLimit();
- @UnsupportedAppUsage
- int checkPermission(in String permission, int pid, int uid);
int checkUriPermission(in Uri uri, int pid, int uid, int mode, int userId,
in IBinder callerToken);
void grantUriPermission(in IApplicationThread caller, in String targetPkg, in Uri uri,
diff --git a/native/android/Android.bp b/native/android/Android.bp
index 02e1ebe..7793d6c 100644
--- a/native/android/Android.bp
+++ b/native/android/Android.bp
@@ -46,6 +46,7 @@
"native_window_jni.cpp",
"net.c",
"obb.cpp",
+ "permission_manager.cpp",
"sensor.cpp",
"sharedmem.cpp",
"storage_manager.cpp",
diff --git a/native/android/TEST_MAPPING b/native/android/TEST_MAPPING
new file mode 100644
index 0000000..6a5d2c0
--- /dev/null
+++ b/native/android/TEST_MAPPING
@@ -0,0 +1,17 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsPermissionManagerNativeTestCases",
+ "file_patterns": ["permission_manager.cpp"]
+ },
+ {
+ "name": "CtsPermissionTestCases",
+ "options": [
+ {
+ "include-filter": "android.permission.cts.PermissionManagerNativeJniTest"
+ }
+ ],
+ "file_patterns": ["permission_manager.cpp"]
+ }
+ ]
+}
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index 0414930..3027eac 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -176,6 +176,7 @@
AObbInfo_getPackageName;
AObbInfo_getVersion;
AObbScanner_getObbInfo;
+ APermissionManager_checkPermission; # introduced=31
ASensorEventQueue_disableSensor;
ASensorEventQueue_enableSensor;
ASensorEventQueue_getEvents;
diff --git a/native/android/permission_manager.cpp b/native/android/permission_manager.cpp
new file mode 100644
index 0000000..166e00e
--- /dev/null
+++ b/native/android/permission_manager.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android/permission_manager.h>
+#include <binder/ActivityManager.h>
+
+namespace android {
+namespace permissionmananger {
+
+// Global instance of ActivityManager, service is obtained only on first use.
+static ActivityManager gAm;
+
+} // permissionmanager
+} // android
+
+using namespace android;
+using namespace permissionmananger;
+
+int32_t APermissionManager_checkPermission(const char* permission,
+ pid_t pid,
+ uid_t uid,
+ int32_t* outResult) {
+ status_t result = gAm.checkPermission(String16(permission), pid, uid, outResult);
+ if (result == DEAD_OBJECT) {
+ return PERMISSION_MANAGER_STATUS_SERVICE_UNAVAILABLE;
+ } else if (result != NO_ERROR) {
+ return PERMISSION_MANAGER_STATUS_ERROR_UNKNOWN;
+ }
+ return PERMISSION_MANAGER_STATUS_OK;
+}