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_service_android.h"
6 
7 #include "base/android/jni_android.h"
8 #include "components/policy/android/jni_headers/PolicyService_jni.h"
9 
10 namespace policy {
11 namespace android {
12 
PolicyServiceAndroid(PolicyService * policy_service)13 PolicyServiceAndroid::PolicyServiceAndroid(PolicyService* policy_service)
14     : policy_service_(policy_service),
15       policy_map_(policy_service->GetPolicies(
16           PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))) {}
17 PolicyServiceAndroid::~PolicyServiceAndroid() = default;
18 
AddObserver(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller)19 void PolicyServiceAndroid::AddObserver(
20     JNIEnv* env,
21     const base::android::JavaParamRef<jobject>& caller) {
22   policy_service_->AddObserver(POLICY_DOMAIN_CHROME, this);
23 }
24 
RemoveObserver(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller)25 void PolicyServiceAndroid::RemoveObserver(
26     JNIEnv* env,
27     const base::android::JavaParamRef<jobject>& caller) {
28   policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, this);
29 }
30 
OnPolicyServiceInitialized(PolicyDomain domain)31 void PolicyServiceAndroid::OnPolicyServiceInitialized(PolicyDomain domain) {
32   DCHECK_EQ(POLICY_DOMAIN_CHROME, domain);
33   DCHECK(java_ref_);
34   Java_PolicyService_onPolicyServiceInitialized(
35       base::android::AttachCurrentThread(),
36       base::android::ScopedJavaLocalRef<jobject>(java_ref_));
37 }
38 
OnPolicyUpdated(const PolicyNamespace & ns,const PolicyMap & previous,const PolicyMap & current)39 void PolicyServiceAndroid::OnPolicyUpdated(const PolicyNamespace& ns,
40                                            const PolicyMap& previous,
41                                            const PolicyMap& current) {
42   DCHECK_EQ(POLICY_DOMAIN_CHROME, ns.domain);
43   DCHECK(java_ref_);
44   PolicyMapAndroid previous_android(previous);
45   PolicyMapAndroid current_android(current);
46   Java_PolicyService_onPolicyUpdated(
47       base::android::AttachCurrentThread(),
48       base::android::ScopedJavaLocalRef<jobject>(java_ref_),
49       previous_android.GetJavaObject(), current_android.GetJavaObject());
50 }
51 
IsInitializationComplete(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller) const52 bool PolicyServiceAndroid::IsInitializationComplete(
53     JNIEnv* env,
54     const base::android::JavaParamRef<jobject>& caller) const {
55   return policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME);
56 }
57 
GetPolicies(JNIEnv * env,const base::android::JavaParamRef<jobject> & caller)58 base::android::ScopedJavaLocalRef<jobject> PolicyServiceAndroid::GetPolicies(
59     JNIEnv* env,
60     const base::android::JavaParamRef<jobject>& caller) {
61   return policy_map_.GetJavaObject();
62 }
63 
64 base::android::ScopedJavaLocalRef<jobject>
GetJavaObject()65 PolicyServiceAndroid::GetJavaObject() {
66   JNIEnv* env = base::android::AttachCurrentThread();
67   if (!java_ref_) {
68     java_ref_.Reset(
69         Java_PolicyService_Constructor(env, reinterpret_cast<intptr_t>(this)));
70   }
71   return base::android::ScopedJavaLocalRef<jobject>(java_ref_);
72 }
73 
74 }  // namespace android
75 }  // namespace policy
76