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"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/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"
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/signin/core/browser/signin_metrics.h"
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/profile_management_switches.h"
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "jni/SigninManager_jni.h"
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/policy/cloud/user_policy_signin_service_factory.h"
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_policy_signin_service_mobile.h"
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/browser_policy_connector.h"
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_core.h"
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_store.h"
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
389ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "google_apis/gaia/gaia_auth_util.h"
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace {
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// A BrowsingDataRemover::Observer that clears all Profile data and then
45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// invokes a callback and deletes itself.
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass ProfileDataRemover : public BrowsingDataRemover::Observer {
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public:
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ProfileDataRemover(Profile* profile, const base::Closure& callback)
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      : callback_(callback),
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        origin_loop_(base::MessageLoopProxy::current()),
51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        remover_(BrowsingDataRemover::CreateForUnboundedRange(profile)) {
52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    remover_->AddObserver(this);
53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    remover_->Remove(BrowsingDataRemover::REMOVE_ALL, BrowsingDataHelper::ALL);
54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual ~ProfileDataRemover() {}
57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual void OnBrowsingDataRemoverDone() OVERRIDE {
59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    remover_->RemoveObserver(this);
60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    origin_loop_->PostTask(FROM_HERE, callback_);
61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    origin_loop_->DeleteSoon(FROM_HERE, this);
62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch private:
65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::Closure callback_;
66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_refptr<base::MessageLoopProxy> origin_loop_;
67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  BrowsingDataRemover* remover_;
68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ProfileDataRemover);
70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch};
71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace
73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSigninManagerAndroid::SigninManagerAndroid(JNIEnv* env, jobject obj)
75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    : profile_(NULL),
76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      weak_factory_(this) {
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  java_signin_manager_.Reset(env, obj);
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  profile_ = ProfileManager::GetActiveUserProfile();
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(profile_);
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  pref_change_registrar_.Init(profile_->GetPrefs());
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  pref_change_registrar_.Add(
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      prefs::kSigninAllowed,
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&SigninManagerAndroid::OnSigninAllowedPrefChanged,
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Unretained(this)));
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSigninManagerAndroid::~SigninManagerAndroid() {}
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::CheckPolicyBeforeSignIn(JNIEnv* env,
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                   jobject obj,
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                   jstring username) {
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
939ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  username_ = base::android::ConvertJavaStringToUTF8(env, username);
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  policy::UserPolicySigninService* service =
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service->RegisterForPolicy(
979ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, username),
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&SigninManagerAndroid::OnPolicyRegisterDone,
99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 weak_factory_.GetWeakPtr()));
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // This shouldn't be called when ShouldLoadPolicyForUser() is false.
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NOTREACHED();
103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::android::ScopedJavaLocalRef<jstring> domain;
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_SigninManager_onPolicyCheckedBeforeSignIn(env,
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 java_signin_manager_.obj(),
1069ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                                 domain.obj());
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::FetchPolicyBeforeSignIn(JNIEnv* env, jobject obj) {
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!dm_token_.empty()) {
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    policy::UserPolicySigninService* service =
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    service->FetchPolicyForSignedInUser(
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        username_,
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        dm_token_,
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        client_id_,
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        profile_->GetRequestContext(),
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::Bind(&SigninManagerAndroid::OnPolicyFetchDone,
121558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                   weak_factory_.GetWeakPtr()));
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    dm_token_.clear();
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    client_id_.clear();
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // This shouldn't be called when ShouldLoadPolicyForUser() is false, or when
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // CheckPolicyBeforeSignIn() failed.
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NOTREACHED();
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_SigninManager_onPolicyFetchedBeforeSignIn(env,
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 java_signin_manager_.obj());
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::OnSignInCompleted(JNIEnv* env,
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             jobject obj,
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             jstring username) {
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SigninManagerFactory::GetForProfile(profile_)->OnExternalSigninCompleted(
1389ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, username));
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::SignOut(JNIEnv* env, jobject obj) {
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SigninManagerFactory::GetForProfile(profile_)->SignOut(
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS);
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbase::android::ScopedJavaLocalRef<jstring>
147558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochSigninManagerAndroid::GetManagementDomain(JNIEnv* env, jobject obj) {
148558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::android::ScopedJavaLocalRef<jstring> domain;
149558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
150558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
151558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  policy::UserCloudPolicyManager* manager =
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      policy::UserCloudPolicyManagerFactory::GetForBrowserContext(profile_);
153558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  policy::CloudPolicyStore* store = manager->core()->store();
154558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
155558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (store && store->is_managed() && store->policy()->has_username()) {
156558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    domain.Reset(
157558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        base::android::ConvertUTF8ToJavaString(
158558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch            env, gaia::ExtractDomainName(store->policy()->username())));
159558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
160558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
161558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
162558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return domain;
163558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
164558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
165558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid SigninManagerAndroid::WipeProfileData(JNIEnv* env, jobject obj) {
166558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // The ProfileDataRemover deletes itself once done.
167558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  new ProfileDataRemover(
168558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      profile_,
169558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::Bind(&SigninManagerAndroid::OnBrowsingDataRemoverDone,
170558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 weak_factory_.GetWeakPtr()));
171558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
172558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::OnPolicyRegisterDone(
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& dm_token,
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& client_id) {
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dm_token_ = dm_token;
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  client_id_ = client_id;
1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  JNIEnv* env = base::android::AttachCurrentThread();
182558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::android::ScopedJavaLocalRef<jstring> domain;
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!dm_token_.empty()) {
1849ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    DCHECK(!username_.empty());
1859ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    domain.Reset(
1869ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        base::android::ConvertUTF8ToJavaString(
1879ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            env, gaia::ExtractDomainName(username_)));
1889ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  } else {
1899ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    username_.clear();
1909ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
1919ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_SigninManager_onPolicyCheckedBeforeSignIn(env,
1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 java_signin_manager_.obj(),
1949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                                 domain.obj());
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::OnPolicyFetchDone(bool success) {
1989ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  Java_SigninManager_onPolicyFetchedBeforeSignIn(
1999ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::AttachCurrentThread(),
2009ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      java_signin_manager_.obj());
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
205558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid SigninManagerAndroid::OnBrowsingDataRemoverDone() {
206558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile_);
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  model->RemoveAllUserBookmarks();
208558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
209558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // All the Profile data has been wiped. Clear the last signed in username as
210558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // well, so that the next signin doesn't trigger the acount change dialog.
2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ClearLastSignedInUser();
212558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
213558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  Java_SigninManager_onProfileDataWiped(base::android::AttachCurrentThread(),
214558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                        java_signin_manager_.obj());
215558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
216558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid SigninManagerAndroid::ClearLastSignedInUser(JNIEnv* env, jobject obj) {
2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ClearLastSignedInUser();
2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid SigninManagerAndroid::ClearLastSignedInUser() {
2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  profile_->GetPrefs()->ClearPref(prefs::kGoogleServicesLastUsername);
2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SigninManagerAndroid::MergeSessionCompleted(
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& account_id,
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GoogleServiceAuthError& error) {
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  merge_session_helper_->RemoveObserver(this);
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  merge_session_helper_.reset();
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SigninManagerAndroid::LogInSignedInUser(JNIEnv* env, jobject obj) {
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SigninManagerBase* signin_manager =
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SigninManagerFactory::GetForProfile(profile_);
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (switches::IsNewProfileManagement()) {
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // New Mirror code path that just fires the events and let the
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Account Reconcilor handles everything.
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    AndroidProfileOAuth2TokenService* token_service =
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ProfileOAuth2TokenServiceFactory::GetPlatformSpecificForProfile(
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            profile_);
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& primary_acct =
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        signin_manager->GetAuthenticatedAccountId();
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    token_service->ValidateAccounts(primary_acct, true);
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else {
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DVLOG(1) << "SigninManagerAndroid::LogInSignedInUser "
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        " Manually calling MergeSessionHelper";
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Old code path that doesn't depend on the new Account Reconcilor.
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // We manually login.
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ProfileOAuth2TokenService* token_service =
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ProfileOAuth2TokenServiceFactory::GetForProfile(profile_);
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    merge_session_helper_.reset(new MergeSessionHelper(
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        token_service, profile_->GetRequestContext(), this));
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    merge_session_helper_->LogIn(signin_manager->GetAuthenticatedAccountId());
256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)jboolean SigninManagerAndroid::IsSigninAllowedByPolicy(JNIEnv* env,
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                       jobject obj) {
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return SigninManagerFactory::GetForProfile(profile_)->IsSigninAllowed();
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninManagerAndroid::OnSigninAllowedPrefChanged() {
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Java_SigninManager_onSigninAllowedByPolicyChanged(
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::android::AttachCurrentThread(), java_signin_manager_.obj(),
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      SigninManagerFactory::GetForProfile(profile_)->IsSigninAllowed());
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static jlong Init(JNIEnv* env, jobject obj) {
2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SigninManagerAndroid* signin_manager_android =
2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new SigninManagerAndroid(env, obj);
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return reinterpret_cast<intptr_t>(signin_manager_android);
2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic jboolean ShouldLoadPolicyForUser(JNIEnv* env,
2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                        jobject obj,
2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                        jstring j_username) {
2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
2809ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  std::string username =
2819ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, j_username);
2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return !policy::BrowserPolicyConnector::IsNonEnterpriseUser(username);
2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return false;
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic jboolean IsNewProfileManagementEnabled(JNIEnv* env, jclass clazz) {
289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return switches::IsNewProfileManagement();
290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
291effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool SigninManagerAndroid::Register(JNIEnv* env) {
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return RegisterNativesImpl(env);
2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
296