1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/policy/core/common/android/policy_map_android.h"
6
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/json/json_writer.h"
10 #include "base/values.h"
11 #include "components/policy/android/jni_headers/PolicyMap_jni.h"
12
13 namespace policy {
14 namespace android {
15
PolicyMapAndroid(const PolicyMap & policy_map)16 PolicyMapAndroid::PolicyMapAndroid(const PolicyMap& policy_map)
17 : policy_map_(policy_map) {}
18
19 PolicyMapAndroid::~PolicyMapAndroid() = default;
20
HasValue(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller,const base::android::JavaRef<jstring> & policy) const21 jboolean PolicyMapAndroid::HasValue(
22 JNIEnv* env,
23 const base::android::JavaParamRef<jobject>& caller,
24 const base::android::JavaRef<jstring>& policy) const {
25 return GetValue(env, policy) != nullptr;
26 }
27
GetIntValue(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller,const base::android::JavaRef<jstring> & policy) const28 jint PolicyMapAndroid::GetIntValue(
29 JNIEnv* env,
30 const base::android::JavaParamRef<jobject>& caller,
31 const base::android::JavaRef<jstring>& policy) const {
32 const base::Value* value = GetValue(env, policy);
33 DCHECK(value && value->is_int())
34 << "The policy must be exist and stored as integer.";
35 return value->GetInt();
36 }
37
GetBooleanValue(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller,const base::android::JavaRef<jstring> & policy) const38 jboolean PolicyMapAndroid::GetBooleanValue(
39 JNIEnv* env,
40 const base::android::JavaParamRef<jobject>& caller,
41 const base::android::JavaRef<jstring>& policy) const {
42 const base::Value* value = GetValue(env, policy);
43 DCHECK(value && value->is_bool())
44 << "The policy must be exist and stored as boolean.";
45 return value->GetBool();
46 }
47
GetStringValue(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller,const base::android::JavaRef<jstring> & policy) const48 base::android::ScopedJavaLocalRef<jstring> PolicyMapAndroid::GetStringValue(
49 JNIEnv* env,
50 const base::android::JavaParamRef<jobject>& caller,
51 const base::android::JavaRef<jstring>& policy) const {
52 const base::Value* value = GetValue(env, policy);
53 if (!value)
54 return nullptr;
55 DCHECK(value->is_string()) << "The policy must be stored as string.";
56 return base::android::ConvertUTF8ToJavaString(env, value->GetString());
57 }
58
GetListValue(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller,const base::android::JavaRef<jstring> & policy) const59 base::android::ScopedJavaLocalRef<jstring> PolicyMapAndroid::GetListValue(
60 JNIEnv* env,
61 const base::android::JavaParamRef<jobject>& caller,
62 const base::android::JavaRef<jstring>& policy) const {
63 return GetListOrDictValue(env, policy, /* is_dict */ false);
64 }
65
GetDictValue(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller,const base::android::JavaRef<jstring> & policy) const66 base::android::ScopedJavaLocalRef<jstring> PolicyMapAndroid::GetDictValue(
67 JNIEnv* env,
68 const base::android::JavaParamRef<jobject>& caller,
69 const base::android::JavaRef<jstring>& policy) const {
70 return GetListOrDictValue(env, policy, /* is_dict */ true);
71 }
72
Equals(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller,jlong other) const73 jboolean PolicyMapAndroid::Equals(
74 JNIEnv* env,
75 const base::android::JavaParamRef<jobject>& caller,
76 jlong other) const {
77 return policy_map_.Equals(
78 reinterpret_cast<PolicyMapAndroid*>(other)->policy_map_);
79 }
80
GetJavaObject()81 base::android::ScopedJavaLocalRef<jobject> PolicyMapAndroid::GetJavaObject() {
82 JNIEnv* env = base::android::AttachCurrentThread();
83 if (!java_ref_) {
84 java_ref_.Reset(
85 Java_PolicyMap_Constructor(env, reinterpret_cast<intptr_t>(this)));
86 }
87 return base::android::ScopedJavaLocalRef<jobject>(java_ref_);
88 }
89
GetListOrDictValue(JNIEnv * env,const base::android::JavaRef<jstring> & policy,bool is_dict) const90 base::android::ScopedJavaLocalRef<jstring> PolicyMapAndroid::GetListOrDictValue(
91 JNIEnv* env,
92 const base::android::JavaRef<jstring>& policy,
93 bool is_dict) const {
94 const base::Value* value = GetValue(env, policy);
95 if (!value)
96 return nullptr;
97 #if DCHECK_IS_ON()
98 if (is_dict)
99 DCHECK(value->is_dict()) << "The policy must be stored as dictionary.";
100 else
101 DCHECK(value->is_list()) << "The policy must be stored as list.";
102 #endif // DCHECK_IS_ON()
103 std::string json_string;
104 base::JSONWriter::Write(*value, &json_string);
105 return base::android::ConvertUTF8ToJavaString(env, json_string);
106 }
107
GetValue(JNIEnv * env,const base::android::JavaRef<jstring> & policy) const108 const base::Value* PolicyMapAndroid::GetValue(
109 JNIEnv* env,
110 const base::android::JavaRef<jstring>& policy) const {
111 return policy_map_.GetValue(
112 base::android::ConvertJavaStringToUTF8(env, policy));
113 }
114
115 } // namespace android
116 } // namespace policy
117