signin_manager_android.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
1// Copyright 2013 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 "chrome/browser/android/signin/signin_manager_android.h"
6
7#include "base/android/jni_android.h"
8#include "base/android/jni_string.h"
9#include "base/bind.h"
10#include "base/bind_helpers.h"
11#include "chrome/browser/browser_process.h"
12#include "chrome/browser/profiles/profile_manager.h"
13#include "chrome/browser/signin/signin_manager.h"
14#include "chrome/browser/signin/signin_manager_factory.h"
15#include "chrome/common/pref_names.h"
16#include "jni/SigninManager_jni.h"
17
18#if defined(ENABLE_CONFIGURATION_POLICY)
19#include "chrome/browser/policy/browser_policy_connector.h"
20#include "chrome/browser/policy/cloud/cloud_policy_client.h"
21#include "chrome/browser/policy/cloud/user_policy_signin_service_android.h"
22#include "chrome/browser/policy/cloud/user_policy_signin_service_factory.h"
23#endif
24
25using base::android::ConvertJavaStringToUTF8;
26
27SigninManagerAndroid::SigninManagerAndroid(JNIEnv* env, jobject obj)
28    : profile_(NULL) {
29  java_signin_manager_.Reset(env, obj);
30  DCHECK(g_browser_process);
31  DCHECK(g_browser_process->profile_manager());
32  profile_ = g_browser_process->profile_manager()->GetDefaultProfile();
33  DCHECK(profile_);
34}
35
36SigninManagerAndroid::~SigninManagerAndroid() {}
37
38void SigninManagerAndroid::CheckPolicyBeforeSignIn(JNIEnv* env,
39                                                   jobject obj,
40                                                   jstring username) {
41#if defined(ENABLE_CONFIGURATION_POLICY)
42  policy::UserPolicySigninService* service =
43      policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
44  service->RegisterPolicyClient(
45      ConvertJavaStringToUTF8(env, username),
46      base::Bind(&SigninManagerAndroid::OnPolicyRegisterDone,
47                 base::Unretained(this)));
48#else
49  // This shouldn't be called when ShouldLoadPolicyForUser() is false.
50  NOTREACHED();
51  const jboolean has_policy_management = false;
52  Java_SigninManager_onPolicyCheckedBeforeSignIn(env,
53                                                 java_signin_manager_.obj(),
54                                                 has_policy_management);
55#endif
56}
57
58void SigninManagerAndroid::FetchPolicyBeforeSignIn(JNIEnv* env, jobject obj) {
59#if defined(ENABLE_CONFIGURATION_POLICY)
60  if (cloud_policy_client_) {
61    policy::UserPolicySigninService* service =
62        policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
63    service->FetchPolicyForSignedInUser(
64        cloud_policy_client_.Pass(),
65        base::Bind(&SigninManagerAndroid::OnPolicyFetchDone,
66                   base::Unretained(this)));
67    return;
68  }
69#endif
70  // This shouldn't be called when ShouldLoadPolicyForUser() is false, or when
71  // CheckPolicyBeforeSignIn() failed.
72  NOTREACHED();
73  Java_SigninManager_onPolicyFetchedBeforeSignIn(env,
74                                                 java_signin_manager_.obj());
75}
76
77void SigninManagerAndroid::OnSignInCompleted(JNIEnv* env,
78                                             jobject obj,
79                                             jstring username) {
80  SigninManagerFactory::GetForProfile(profile_)->OnExternalSigninCompleted(
81      ConvertJavaStringToUTF8(env, username));
82}
83
84void SigninManagerAndroid::SignOut(JNIEnv* env, jobject obj) {
85  SigninManagerFactory::GetForProfile(profile_)->SignOut();
86}
87
88#if defined(ENABLE_CONFIGURATION_POLICY)
89
90void SigninManagerAndroid::OnPolicyRegisterDone(
91    scoped_ptr<policy::CloudPolicyClient> client) {
92  cloud_policy_client_ = client.Pass();
93
94  JNIEnv* env = base::android::AttachCurrentThread();
95  const jboolean has_policy_management = !!cloud_policy_client_;
96  Java_SigninManager_onPolicyCheckedBeforeSignIn(env,
97                                                 java_signin_manager_.obj(),
98                                                 has_policy_management);
99}
100
101void SigninManagerAndroid::OnPolicyFetchDone(bool success) {
102  JNIEnv* env = base::android::AttachCurrentThread();
103  Java_SigninManager_onPolicyFetchedBeforeSignIn(env,
104                                                 java_signin_manager_.obj());
105}
106
107#endif
108
109static int Init(JNIEnv* env, jobject obj) {
110  SigninManagerAndroid* signin_manager_android =
111      new SigninManagerAndroid(env, obj);
112  return reinterpret_cast<jint>(signin_manager_android);
113}
114
115static jboolean ShouldLoadPolicyForUser(JNIEnv* env,
116                                        jobject obj,
117                                        jstring j_username) {
118#if defined(ENABLE_CONFIGURATION_POLICY)
119  std::string username = ConvertJavaStringToUTF8(env, j_username);
120  return !policy::BrowserPolicyConnector::IsNonEnterpriseUser(username);
121#else
122  return false;
123#endif
124}
125
126// static
127bool SigninManagerAndroid::Register(JNIEnv* env) {
128  return RegisterNativesImpl(env);
129}
130