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