summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/IActivityManager.aidl4
-rw-r--r--native/android/Android.bp1
-rw-r--r--native/android/TEST_MAPPING17
-rw-r--r--native/android/libandroid.map.txt1
-rw-r--r--native/android/permission_manager.cpp43
5 files changed, 64 insertions, 2 deletions
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 560b5be264d6..86625d340a14 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -98,6 +98,8 @@ interface IActivityManager {
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 @@ interface IActivityManager {
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 02e1ebe05b02..7793d6c45d5e 100644
--- a/native/android/Android.bp
+++ b/native/android/Android.bp
@@ -46,6 +46,7 @@ cc_library_shared {
"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 000000000000..6a5d2c008b1d
--- /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 0414930b4078..3027eac3a224 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -176,6 +176,7 @@ LIBANDROID {
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 000000000000..166e00e8dbe2
--- /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;
+}