158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/webui/options/managed_user_import_handler.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <set>
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/bind.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/prefs/pref_service.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/values.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/browser_process.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/profiles/profile_avatar_icon_util.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_constants.h"
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_shared_settings_service.h"
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_shared_settings_service_factory.h"
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service.h"
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service_factory.h"
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/pref_names.h"
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/common/url_constants.h"
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h"
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_error_controller.h"
28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/web_ui.h"
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "grit/generated_resources.h"
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "grit/theme_resources.h"
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace {
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)scoped_ptr<base::ListValue> GetAvatarIcons() {
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<base::ListValue> avatar_icons(new base::ListValue);
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < profiles::GetDefaultAvatarIconCount(); ++i) {
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    std::string avatar_url = profiles::GetDefaultAvatarIconUrl(i);
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    avatar_icons->Append(new base::StringValue(avatar_url));
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return avatar_icons.Pass();
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace options {
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ManagedUserImportHandler::ManagedUserImportHandler()
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : observer_(this),
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      weak_ptr_factory_(this) {}
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ManagedUserImportHandler::~ManagedUserImportHandler() {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!profile->IsSupervised()) {
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SupervisedUserSyncService* service =
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        SupervisedUserSyncServiceFactory::GetForProfile(profile);
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (service)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      service->RemoveObserver(this);
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    subscription_.reset();
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ManagedUserImportHandler::GetLocalizedValues(
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::DictionaryValue* localized_strings) {
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(localized_strings);
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static OptionsStringResource resources[] = {
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      { "managedUserImportTitle", IDS_IMPORT_EXISTING_MANAGED_USER_TITLE },
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      { "managedUserImportText", IDS_IMPORT_EXISTING_MANAGED_USER_TEXT },
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      { "createNewUserLink", IDS_CREATE_NEW_USER_LINK },
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      { "managedUserImportOk", IDS_IMPORT_EXISTING_MANAGED_USER_OK },
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      { "managedUserImportSigninError", IDS_MANAGED_USER_IMPORT_SIGN_IN_ERROR },
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      { "managedUserAlreadyOnThisDevice",
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          IDS_MANAGED_USER_ALREADY_ON_THIS_DEVICE },
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      { "noExistingManagedUsers", IDS_MANAGED_USER_NO_EXISTING_ERROR },
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      { "managedUserSelectAvatarTitle", IDS_MANAGED_USER_SELECT_AVATAR_TITLE },
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      { "managedUserSelectAvatarText", IDS_MANAGED_USER_SELECT_AVATAR_TEXT },
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      { "managedUserSelectAvatarOk", IDS_MANAGED_USER_SELECT_AVATAR_OK },
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RegisterStrings(localized_strings, resources, arraysize(resources));
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  localized_strings->Set("avatarIcons", GetAvatarIcons().release());
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ManagedUserImportHandler::InitializeHandler() {
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!profile->IsSupervised()) {
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SupervisedUserSyncService* sync_service =
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        SupervisedUserSyncServiceFactory::GetForProfile(profile);
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (sync_service) {
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      sync_service->AddObserver(this);
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      observer_.Add(ProfileOAuth2TokenServiceFactory::GetForProfile(profile)->
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        signin_error_controller());
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      SupervisedUserSharedSettingsService* settings_service =
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          SupervisedUserSharedSettingsServiceFactory::GetForBrowserContext(
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              profile);
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      subscription_ = settings_service->Subscribe(
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&ManagedUserImportHandler::OnSharedSettingChanged,
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     weak_ptr_factory_.GetWeakPtr()));
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      DCHECK(!SupervisedUserSharedSettingsServiceFactory::GetForBrowserContext(
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 profile));
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      DCHECK(!ProfileOAuth2TokenServiceFactory::GetForProfile(profile));
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ManagedUserImportHandler::RegisterMessages() {
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  web_ui()->RegisterMessageCallback("requestManagedUserImportUpdate",
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(&ManagedUserImportHandler::RequestManagedUserImportUpdate,
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 base::Unretained(this)));
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ManagedUserImportHandler::OnSupervisedUsersChanged() {
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FetchManagedUsers();
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ManagedUserImportHandler::FetchManagedUsers() {
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_ui()->CallJavascriptFunction("options.ManagedUserListData.resetPromise");
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RequestManagedUserImportUpdate(NULL);
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ManagedUserImportHandler::RequestManagedUserImportUpdate(
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::ListValue* /* args */) {
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (Profile::FromWebUI(web_ui())->IsSupervised())
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!IsAccountConnected() || HasAuthError()) {
131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ClearManagedUsersAndShowError();
132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  } else {
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SupervisedUserSyncService* supervised_user_sync_service =
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        SupervisedUserSyncServiceFactory::GetForProfile(
135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            Profile::FromWebUI(web_ui()));
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (supervised_user_sync_service) {
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      supervised_user_sync_service->GetSupervisedUsersAsync(
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::Bind(&ManagedUserImportHandler::SendExistingManagedUsers,
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     weak_ptr_factory_.GetWeakPtr()));
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
141d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
142d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
143d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ManagedUserImportHandler::SendExistingManagedUsers(
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* dict) {
146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(dict);
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const ProfileInfoCache& cache =
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      g_browser_process->profile_manager()->GetProfileInfoCache();
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Collect the ids of local supervised user profiles.
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::set<std::string> supervised_user_ids;
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < cache.GetNumberOfProfiles(); ++i) {
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (cache.ProfileIsSupervisedAtIndex(i))
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      supervised_user_ids.insert(cache.GetSupervisedUserIdOfProfileAtIndex(i));
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::ListValue supervised_users;
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SupervisedUserSharedSettingsService* service =
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      SupervisedUserSharedSettingsServiceFactory::GetForBrowserContext(profile);
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* value = NULL;
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool success = it.value().GetAsDictionary(&value);
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(success);
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string name;
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    value->GetString(SupervisedUserSyncService::kName, &name);
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::DictionaryValue* supervised_user = new base::DictionaryValue;
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    supervised_user->SetString("id", it.key());
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    supervised_user->SetString("name", name);
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    int avatar_index = SupervisedUserSyncService::kNoAvatar;
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Value* avatar_index_value =
174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        service->GetValue(it.key(), supervised_users::kChromeAvatarIndex);
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (avatar_index_value) {
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      success = avatar_index_value->GetAsInteger(&avatar_index);
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Check if there is a legacy avatar index stored.
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::string avatar_str;
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      value->GetString(SupervisedUserSyncService::kChromeAvatar, &avatar_str);
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      success =
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          SupervisedUserSyncService::GetAvatarIndex(avatar_str, &avatar_index);
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(success);
185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    supervised_user->SetBoolean(
186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        "needAvatar",
187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        avatar_index == SupervisedUserSyncService::kNoAvatar);
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    std::string supervised_user_icon =
190d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        std::string(chrome::kChromeUIThemeURL) +
191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        "IDR_SUPERVISED_USER_PLACEHOLDER";
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string avatar_url =
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        avatar_index == SupervisedUserSyncService::kNoAvatar ?
194d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            supervised_user_icon :
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            profiles::GetDefaultAvatarIconUrl(avatar_index);
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    supervised_user->SetString("iconURL", avatar_url);
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool on_current_device =
198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        supervised_user_ids.find(it.key()) != supervised_user_ids.end();
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    supervised_user->SetBoolean("onCurrentDevice", on_current_device);
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    supervised_users.Append(supervised_user);
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "options.ManagedUserListData.receiveExistingManagedUsers",
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      supervised_users);
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
209d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ManagedUserImportHandler::ClearManagedUsersAndShowError() {
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_ui()->CallJavascriptFunction("options.ManagedUserListData.onSigninError");
211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
212d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
213d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool ManagedUserImportHandler::IsAccountConnected() const {
214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SigninManagerBase* signin_manager =
216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      SigninManagerFactory::GetForProfile(profile);
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return signin_manager && !signin_manager->GetAuthenticatedUsername().empty();
218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool ManagedUserImportHandler::HasAuthError() const {
221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ProfileOAuth2TokenService* token_service =
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!token_service)
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return true;
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SigninErrorController* error_controller =
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      token_service->signin_error_controller();
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GoogleServiceAuthError::State state = error_controller->auth_error().state();
231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return state == GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS ||
233d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      state == GoogleServiceAuthError::USER_NOT_SIGNED_UP ||
234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      state == GoogleServiceAuthError::ACCOUNT_DELETED ||
235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      state == GoogleServiceAuthError::ACCOUNT_DISABLED;
236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ManagedUserImportHandler::OnSharedSettingChanged(
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& supervised_user_id,
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& key) {
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (key == supervised_users::kChromeAvatarIndex)
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FetchManagedUsers();
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ManagedUserImportHandler::OnErrorChanged() {
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FetchManagedUsers();
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace options
250