signin_manager_android.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/android/signin/signin_manager_android.h"
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/android/jni_android.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/android/jni_string.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/bind.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/bind_helpers.h"
11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/memory/ref_counted.h"
12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/message_loop/message_loop_proxy.h"
13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/prefs/pref_service.h"
14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/bookmarks/bookmark_model_factory.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/browser_process.h"
16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/browsing_data/browsing_data_helper.h"
17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/browsing_data/browsing_data_remover.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/profiles/profile_manager.h"
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/signin/android_profile_oauth2_token_service.h"
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/signin/signin_manager_factory.h"
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/pref_names.h"
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "components/bookmarks/core/browser/bookmark_model.h"
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h"
25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/profile_management_switches.h"
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "jni/SigninManager_jni.h"
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/policy/cloud/user_policy_signin_service_android.h"
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/policy/cloud/user_policy_signin_service_factory.h"
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/browser_policy_connector.h"
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_core.h"
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_store.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
379ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "google_apis/gaia/gaia_auth_util.h"
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace {
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// A BrowsingDataRemover::Observer that clears all Profile data and then
44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// invokes a callback and deletes itself.
45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass ProfileDataRemover : public BrowsingDataRemover::Observer {
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public:
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ProfileDataRemover(Profile* profile, const base::Closure& callback)
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      : callback_(callback),
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        origin_loop_(base::MessageLoopProxy::current()),
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        remover_(BrowsingDataRemover::CreateForUnboundedRange(profile)) {
51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    remover_->AddObserver(this);
52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    remover_->Remove(BrowsingDataRemover::REMOVE_ALL, BrowsingDataHelper::ALL);
53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual ~ProfileDataRemover() {}
56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual void OnBrowsingDataRemoverDone() OVERRIDE {
58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    remover_->RemoveObserver(this);
59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    origin_loop_->PostTask(FROM_HERE, callback_);
60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    origin_loop_->DeleteSoon(FROM_HERE, this);
61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch private:
64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::Closure callback_;
65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_refptr<base::MessageLoopProxy> origin_loop_;
66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  BrowsingDataRemover* remover_;
67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ProfileDataRemover);
69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch};
70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace
72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSigninManagerAndroid::SigninManagerAndroid(JNIEnv* env, jobject obj)
74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    : profile_(NULL),
75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      weak_factory_(this) {
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  java_signin_manager_.Reset(env, obj);
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  profile_ = ProfileManager::GetActiveUserProfile();
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(profile_);
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSigninManagerAndroid::~SigninManagerAndroid() {}
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::CheckPolicyBeforeSignIn(JNIEnv* env,
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                   jobject obj,
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                   jstring username) {
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
879ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  username_ = base::android::ConvertJavaStringToUTF8(env, username);
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  policy::UserPolicySigninService* service =
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service->RegisterForPolicy(
919ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, username),
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&SigninManagerAndroid::OnPolicyRegisterDone,
93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 weak_factory_.GetWeakPtr()));
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // This shouldn't be called when ShouldLoadPolicyForUser() is false.
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NOTREACHED();
97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::android::ScopedJavaLocalRef<jstring> domain;
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_SigninManager_onPolicyCheckedBeforeSignIn(env,
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 java_signin_manager_.obj(),
1009ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                                 domain.obj());
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::FetchPolicyBeforeSignIn(JNIEnv* env, jobject obj) {
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!dm_token_.empty()) {
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    policy::UserPolicySigninService* service =
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    service->FetchPolicyForSignedInUser(
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        username_,
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        dm_token_,
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        client_id_,
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        profile_->GetRequestContext(),
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::Bind(&SigninManagerAndroid::OnPolicyFetchDone,
115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                   weak_factory_.GetWeakPtr()));
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    dm_token_.clear();
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    client_id_.clear();
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // This shouldn't be called when ShouldLoadPolicyForUser() is false, or when
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // CheckPolicyBeforeSignIn() failed.
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NOTREACHED();
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_SigninManager_onPolicyFetchedBeforeSignIn(env,
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 java_signin_manager_.obj());
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::OnSignInCompleted(JNIEnv* env,
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             jobject obj,
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             jstring username) {
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SigninManagerFactory::GetForProfile(profile_)->OnExternalSigninCompleted(
1329ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, username));
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::SignOut(JNIEnv* env, jobject obj) {
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SigninManagerFactory::GetForProfile(profile_)->SignOut();
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
139558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbase::android::ScopedJavaLocalRef<jstring>
140558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochSigninManagerAndroid::GetManagementDomain(JNIEnv* env, jobject obj) {
141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::android::ScopedJavaLocalRef<jstring> domain;
142558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
144558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  policy::UserCloudPolicyManager* manager =
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      policy::UserCloudPolicyManagerFactory::GetForBrowserContext(profile_);
146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  policy::CloudPolicyStore* store = manager->core()->store();
147558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
148558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (store && store->is_managed() && store->policy()->has_username()) {
149558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    domain.Reset(
150558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        base::android::ConvertUTF8ToJavaString(
151558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch            env, gaia::ExtractDomainName(store->policy()->username())));
152558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
153558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
154558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
155558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return domain;
156558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
157558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
158558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid SigninManagerAndroid::WipeProfileData(JNIEnv* env, jobject obj) {
159558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // The ProfileDataRemover deletes itself once done.
160558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  new ProfileDataRemover(
161558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      profile_,
162558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::Bind(&SigninManagerAndroid::OnBrowsingDataRemoverDone,
163558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 weak_factory_.GetWeakPtr()));
164558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
165558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::OnPolicyRegisterDone(
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& dm_token,
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& client_id) {
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dm_token_ = dm_token;
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  client_id_ = client_id;
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  JNIEnv* env = base::android::AttachCurrentThread();
175558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::android::ScopedJavaLocalRef<jstring> domain;
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!dm_token_.empty()) {
1779ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    DCHECK(!username_.empty());
1789ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    domain.Reset(
1799ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        base::android::ConvertUTF8ToJavaString(
1809ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            env, gaia::ExtractDomainName(username_)));
1819ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  } else {
1829ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    username_.clear();
1839ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
1849ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_SigninManager_onPolicyCheckedBeforeSignIn(env,
1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 java_signin_manager_.obj(),
1879ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                                 domain.obj());
1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::OnPolicyFetchDone(bool success) {
1919ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  Java_SigninManager_onPolicyFetchedBeforeSignIn(
1929ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::AttachCurrentThread(),
1939ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      java_signin_manager_.obj());
1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
198558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid SigninManagerAndroid::OnBrowsingDataRemoverDone() {
199558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile_);
200558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  model->RemoveAll();
201558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
202558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // All the Profile data has been wiped. Clear the last signed in username as
203558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // well, so that the next signin doesn't trigger the acount change dialog.
2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ClearLastSignedInUser();
205558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
206558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  Java_SigninManager_onProfileDataWiped(base::android::AttachCurrentThread(),
207558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                        java_signin_manager_.obj());
208558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
209558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid SigninManagerAndroid::ClearLastSignedInUser(JNIEnv* env, jobject obj) {
2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ClearLastSignedInUser();
2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid SigninManagerAndroid::ClearLastSignedInUser() {
2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  profile_->GetPrefs()->ClearPref(prefs::kGoogleServicesLastUsername);
2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SigninManagerAndroid::MergeSessionCompleted(
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& account_id,
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GoogleServiceAuthError& error) {
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  merge_session_helper_->RemoveObserver(this);
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  merge_session_helper_.reset();
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SigninManagerAndroid::LogInSignedInUser(JNIEnv* env, jobject obj) {
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SigninManagerBase* signin_manager =
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SigninManagerFactory::GetForProfile(profile_);
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (switches::IsNewProfileManagement()) {
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // New Mirror code path that just fires the events and let the
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Account Reconcilor handles everything.
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    AndroidProfileOAuth2TokenService* token_service =
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ProfileOAuth2TokenServiceFactory::GetPlatformSpecificForProfile(
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            profile_);
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& primary_acct =
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        signin_manager->GetAuthenticatedAccountId();
2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    token_service->ValidateAccounts(primary_acct);
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else {
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DVLOG(1) << "SigninManagerAndroid::LogInSignedInUser "
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        " Manually calling MergeSessionHelper";
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Old code path that doesn't depend on the new Account Reconcilor.
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // We manually login.
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ProfileOAuth2TokenService* token_service =
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ProfileOAuth2TokenServiceFactory::GetForProfile(profile_);
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    merge_session_helper_.reset(new MergeSessionHelper(
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        token_service, profile_->GetRequestContext(), this));
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    merge_session_helper_->LogIn(signin_manager->GetAuthenticatedAccountId());
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static jlong Init(JNIEnv* env, jobject obj) {
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SigninManagerAndroid* signin_manager_android =
2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new SigninManagerAndroid(env, obj);
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return reinterpret_cast<intptr_t>(signin_manager_android);
2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic jboolean ShouldLoadPolicyForUser(JNIEnv* env,
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                        jobject obj,
2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                        jstring j_username) {
2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
2629ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  std::string username =
2639ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, j_username);
2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return !policy::BrowserPolicyConnector::IsNonEnterpriseUser(username);
2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else
2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return false;
2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic jboolean IsNewProfileManagementEnabled(JNIEnv* env, jclass clazz) {
271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return switches::IsNewProfileManagement();
272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static
2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool SigninManagerAndroid::Register(JNIEnv* env) {
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return RegisterNativesImpl(env);
2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
278