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