summaryrefslogtreecommitdiff
path: root/core/jni/permission_utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/jni/permission_utils.cpp')
-rw-r--r--core/jni/permission_utils.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/core/jni/permission_utils.cpp b/core/jni/permission_utils.cpp
new file mode 100644
index 000000000000..2b7ef9999491
--- /dev/null
+++ b/core/jni/permission_utils.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2021 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 "permission_utils.h"
+#include "core_jni_helpers.h"
+
+static struct {
+ jfieldID fieldUid; // Identity.uid
+ jfieldID fieldPid; // Identity.pid
+ jfieldID fieldPackageName; // Identity.packageName
+ jfieldID fieldAttributionTag; // Identity.attributionTag
+} javaIdentityFields;
+
+static const JNINativeMethod method_table[] = {
+ // no static methods, currently
+};
+
+int register_android_media_permission_Identity(JNIEnv* env) {
+ jclass identityClass = android::FindClassOrDie(env, "android/media/permission/Identity");
+ javaIdentityFields.fieldUid = android::GetFieldIDOrDie(env, identityClass, "uid", "I");
+ javaIdentityFields.fieldPid = android::GetFieldIDOrDie(env, identityClass, "pid", "I");
+ javaIdentityFields.fieldPackageName =
+ android::GetFieldIDOrDie(env, identityClass, "packageName", "Ljava/lang/String;");
+ javaIdentityFields.fieldAttributionTag =
+ android::GetFieldIDOrDie(env, identityClass, "attributionTag", "Ljava/lang/String;");
+
+ return android::RegisterMethodsOrDie(env, "android/media/permission/Identity", method_table,
+ NELEM(method_table));
+}
+
+namespace android::media::permission {
+
+Identity convertIdentity(JNIEnv* env, const jobject& jIdentity) {
+ Identity identity;
+
+ identity.uid = env->GetIntField(jIdentity, javaIdentityFields.fieldUid);
+ identity.pid = env->GetIntField(jIdentity, javaIdentityFields.fieldPid);
+
+ jstring packageNameStr = static_cast<jstring>(
+ env->GetObjectField(jIdentity, javaIdentityFields.fieldPackageName));
+ if (packageNameStr == nullptr) {
+ identity.packageName = std::nullopt;
+ } else {
+ identity.packageName = std::string(ScopedUtfChars(env, packageNameStr).c_str());
+ }
+
+ jstring attributionTagStr = static_cast<jstring>(
+ env->GetObjectField(jIdentity, javaIdentityFields.fieldAttributionTag));
+ if (attributionTagStr == nullptr) {
+ identity.attributionTag = std::nullopt;
+ } else {
+ identity.attributionTag = std::string(ScopedUtfChars(env, attributionTagStr).c_str());
+ }
+
+ return identity;
+}
+
+} // namespace android::media::permission