ProfilePolicyConnectorFactory: Refactoring from Profile to BrowserContext.
[chromium-blink-merge.git] / chrome / browser / ui / webui / chromeos / login / supervised_user_creation_screen_handler.cc
blob8efe307fdff78db47b6bde3b1260759cbeebeaec
1 // Copyright 2014 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.
5 #include "chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h"
7 #include "ash/audio/sounds.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/values.h"
10 #include "chrome/browser/chromeos/login/screens/user_selection_screen.h"
11 #include "chrome/browser/chromeos/login/supervised/supervised_user_creation_flow.h"
12 #include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
13 #include "chrome/browser/chromeos/login/users/supervised_user_manager.h"
14 #include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
15 #include "chrome/browser/chromeos/settings/cros_settings.h"
16 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
17 #include "chrome/common/url_constants.h"
18 #include "chrome/grit/generated_resources.h"
19 #include "chromeos/audio/chromeos_sounds.h"
20 #include "components/login/localized_values_builder.h"
21 #include "components/user_manager/user_manager.h"
22 #include "components/user_manager/user_type.h"
23 #include "google_apis/gaia/gaia_auth_util.h"
24 #include "grit/browser_resources.h"
25 #include "net/base/data_url.h"
26 #include "net/base/escape.h"
27 #include "ui/base/l10n/l10n_util.h"
28 #include "ui/base/resource/resource_bundle.h"
30 const char kJsScreenPath[] = "login.SupervisedUserCreationScreen";
32 namespace chromeos {
34 SupervisedUserCreationScreenHandler::SupervisedUserCreationScreenHandler()
35 : BaseScreenHandler(kJsScreenPath),
36 delegate_(NULL) {
37 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
38 media::SoundsManager* manager = media::SoundsManager::Get();
39 manager->Initialize(SOUND_OBJECT_DELETE,
40 bundle.GetRawDataResource(IDR_SOUND_OBJECT_DELETE_WAV));
41 manager->Initialize(SOUND_CAMERA_SNAP,
42 bundle.GetRawDataResource(IDR_SOUND_CAMERA_SNAP_WAV));
45 SupervisedUserCreationScreenHandler::~SupervisedUserCreationScreenHandler() {
46 if (delegate_) {
47 delegate_->OnActorDestroyed(this);
51 void SupervisedUserCreationScreenHandler::DeclareLocalizedValues(
52 ::login::LocalizedValuesBuilder* builder) {
53 builder->Add(
54 "supervisedUserCreationFlowRetryButtonTitle",
55 IDS_CREATE_SUPERVISED_USER_CREATION_ERROR_RETRY_BUTTON_TITLE);
56 builder->Add(
57 "supervisedUserCreationFlowCancelButtonTitle",
58 IDS_CREATE_SUPERVISED_USER_CREATION_ERROR_CANCEL_BUTTON_TITLE);
59 builder->Add(
60 "supervisedUserCreationFlowGotitButtonTitle",
61 IDS_CREATE_SUPERVISED_USER_CREATION_GOT_IT_BUTTON_TITLE);
63 builder->Add("createSupervisedUserIntroTextTitle",
64 IDS_CREATE_SUPERVISED_INTRO_TEXT_TITLE);
65 builder->Add("createSupervisedUserIntroAlternateText",
66 IDS_CREATE_SUPERVISED_INTRO_ALTERNATE_TEXT);
67 builder->Add("createSupervisedUserIntroText1",
68 IDS_CREATE_SUPERVISED_INTRO_TEXT_1);
69 builder->Add("createSupervisedUserIntroManagerItem1",
70 IDS_CREATE_SUPERVISED_INTRO_MANAGER_ITEM_1);
71 builder->Add("createSupervisedUserIntroManagerItem2",
72 IDS_CREATE_SUPERVISED_INTRO_MANAGER_ITEM_2);
73 builder->Add("createSupervisedUserIntroManagerItem3",
74 IDS_CREATE_SUPERVISED_INTRO_MANAGER_ITEM_3);
75 builder->Add("createSupervisedUserIntroText2",
76 IDS_CREATE_SUPERVISED_INTRO_TEXT_2);
77 builder->AddF("createSupervisedUserIntroText3",
78 IDS_CREATE_SUPERVISED_INTRO_TEXT_3,
79 base::UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL));
81 builder->Add("createSupervisedUserPickManagerTitle",
82 IDS_CREATE_SUPERVISED_USER_CREATE_PICK_MANAGER_TITLE);
83 builder->AddF("createSupervisedUserPickManagerTitleExplanation",
84 IDS_CREATE_SUPERVISED_USER_CREATE_PICK_MANAGER_EXPLANATION,
85 base::UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL));
86 builder->Add("createSupervisedUserManagerPasswordHint",
87 IDS_CREATE_SUPERVISED_USER_CREATE_MANAGER_PASSWORD_HINT);
88 builder->Add("createSupervisedUserWrongManagerPasswordText",
89 IDS_CREATE_SUPERVISED_USER_MANAGER_PASSWORD_ERROR);
91 builder->Add("createSupervisedUserNameTitle",
92 IDS_CREATE_SUPERVISED_USER_CREATE_ACCOUNT_NAME_TITLE);
93 builder->Add("createSupervisedUserNameAccessibleTitle",
94 IDS_CREATE_SUPERVISED_USER_SETUP_ACCESSIBLE_TITLE);
95 builder->Add("createSupervisedUserNameExplanation",
96 IDS_CREATE_SUPERVISED_USER_CREATE_ACCOUNT_NAME_EXPLANATION);
97 builder->Add("createSupervisedUserNameHint",
98 IDS_CREATE_SUPERVISED_USER_CREATE_ACCOUNT_NAME_HINT);
99 builder->Add("createSupervisedUserPasswordTitle",
100 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_TITLE);
101 builder->Add("createSupervisedUserPasswordExplanation",
102 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_EXPLANATION);
103 builder->Add("createSupervisedUserPasswordHint",
104 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_HINT);
105 builder->Add("createSupervisedUserPasswordConfirmHint",
106 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_CONFIRM_HINT);
107 builder->Add("supervisedUserCreationFlowProceedButtonTitle",
108 IDS_CREATE_SUPERVISED_USER_CREATE_CONTINUE_BUTTON_TEXT);
109 builder->Add("supervisedUserCreationFlowStartButtonTitle",
110 IDS_CREATE_SUPERVISED_USER_CREATE_START_BUTTON_TEXT);
111 builder->Add("supervisedUserCreationFlowPrevButtonTitle",
112 IDS_CREATE_SUPERVISED_USER_CREATE_PREVIOUS_BUTTON_TEXT);
113 builder->Add("supervisedUserCreationFlowNextButtonTitle",
114 IDS_CREATE_SUPERVISED_USER_CREATE_NEXT_BUTTON_TEXT);
115 builder->Add("supervisedUserCreationFlowHandleErrorButtonTitle",
116 IDS_CREATE_SUPERVISED_USER_CREATE_HANDLE_ERROR_BUTTON_TEXT);
117 builder->Add("createSupervisedUserPasswordMismatchError",
118 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_MISMATCH_ERROR);
120 builder->Add("createSupervisedUserCreatedText1",
121 IDS_CREATE_SUPERVISED_USER_CREATED_1_TEXT_1);
122 builder->Add("createSupervisedUserCreatedText2",
123 IDS_CREATE_SUPERVISED_USER_CREATED_1_TEXT_2);
124 builder->Add("createSupervisedUserCreatedText3",
125 IDS_CREATE_SUPERVISED_USER_CREATED_1_TEXT_3);
127 builder->Add("importExistingSupervisedUserTitle",
128 IDS_IMPORT_EXISTING_SUPERVISED_USER_TITLE);
129 builder->Add("importExistingSupervisedUserText",
130 IDS_IMPORT_EXISTING_SUPERVISED_USER_TEXT);
131 builder->Add("supervisedUserCreationFlowImportButtonTitle",
132 IDS_IMPORT_EXISTING_SUPERVISED_USER_OK);
133 builder->Add("importSupervisedUserLink",
134 IDS_PROFILES_IMPORT_EXISTING_SUPERVISED_USER_LINK);
135 builder->Add("createSupervisedUserLink",
136 IDS_CREATE_NEW_USER_LINK);
137 builder->Add("importBubbleText", IDS_SUPERVISED_USER_IMPORT_BUBBLE_TEXT);
138 builder->Add("importUserExists", IDS_SUPERVISED_USER_IMPORT_USER_EXIST);
139 builder->Add("importUsernameExists",
140 IDS_SUPERVISED_USER_IMPORT_USERNAME_EXIST);
142 builder->Add("managementURL", chrome::kSupervisedUserManagementDisplayURL);
144 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
145 // It should be removed by issue 251179.
146 builder->Add("takePhoto", IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO);
147 builder->Add("discardPhoto", IDS_OPTIONS_CHANGE_PICTURE_DISCARD_PHOTO);
148 builder->Add("flipPhoto", IDS_OPTIONS_CHANGE_PICTURE_FLIP_PHOTO);
149 builder->Add("photoFlippedAccessibleText",
150 IDS_OPTIONS_PHOTO_FLIP_ACCESSIBLE_TEXT);
151 builder->Add("photoFlippedBackAccessibleText",
152 IDS_OPTIONS_PHOTO_FLIPBACK_ACCESSIBLE_TEXT);
153 builder->Add("photoCaptureAccessibleText",
154 IDS_OPTIONS_PHOTO_CAPTURE_ACCESSIBLE_TEXT);
155 builder->Add("photoDiscardAccessibleText",
156 IDS_OPTIONS_PHOTO_DISCARD_ACCESSIBLE_TEXT);
159 void SupervisedUserCreationScreenHandler::Initialize() {}
161 void SupervisedUserCreationScreenHandler::RegisterMessages() {
162 AddCallback("finishLocalSupervisedUserCreation",
163 &SupervisedUserCreationScreenHandler::
164 HandleFinishLocalSupervisedUserCreation);
165 AddCallback("abortLocalSupervisedUserCreation",
166 &SupervisedUserCreationScreenHandler::
167 HandleAbortLocalSupervisedUserCreation);
168 AddCallback("checkSupervisedUserName",
169 &SupervisedUserCreationScreenHandler::
170 HandleCheckSupervisedUserName);
171 AddCallback("authenticateManagerInSupervisedUserCreationFlow",
172 &SupervisedUserCreationScreenHandler::
173 HandleAuthenticateManager);
174 AddCallback("specifySupervisedUserCreationFlowUserData",
175 &SupervisedUserCreationScreenHandler::
176 HandleCreateSupervisedUser);
177 AddCallback("managerSelectedOnSupervisedUserCreationFlow",
178 &SupervisedUserCreationScreenHandler::
179 HandleManagerSelected);
180 AddCallback("userSelectedForImportInSupervisedUserCreationFlow",
181 &SupervisedUserCreationScreenHandler::
182 HandleImportUserSelected);
183 AddCallback("importSupervisedUser",
184 &SupervisedUserCreationScreenHandler::
185 HandleImportSupervisedUser);
186 AddCallback("importSupervisedUserWithPassword",
187 &SupervisedUserCreationScreenHandler::
188 HandleImportSupervisedUserWithPassword);
191 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
192 // It should be removed by issue 251179.
193 AddCallback("supervisedUserGetImages",
194 &SupervisedUserCreationScreenHandler::HandleGetImages);
196 AddCallback("supervisedUserPhotoTaken",
197 &SupervisedUserCreationScreenHandler::HandlePhotoTaken);
198 AddCallback("supervisedUserTakePhoto",
199 &SupervisedUserCreationScreenHandler::HandleTakePhoto);
200 AddCallback("supervisedUserDiscardPhoto",
201 &SupervisedUserCreationScreenHandler::HandleDiscardPhoto);
202 AddCallback("supervisedUserSelectImage",
203 &SupervisedUserCreationScreenHandler::HandleSelectImage);
204 AddCallback("currentSupervisedUserPage",
205 &SupervisedUserCreationScreenHandler::
206 HandleCurrentSupervisedUserPage);
209 void SupervisedUserCreationScreenHandler::PrepareToShow() {}
211 void SupervisedUserCreationScreenHandler::Show() {
212 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue());
213 scoped_ptr<base::ListValue> users_list(new base::ListValue());
214 const user_manager::UserList& users =
215 ChromeUserManager::Get()->GetUsersAllowedForSupervisedUsersCreation();
216 std::string owner;
217 chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
219 for (user_manager::UserList::const_iterator it = users.begin();
220 it != users.end();
221 ++it) {
222 bool is_owner = ((*it)->email() == owner);
223 base::DictionaryValue* user_dict = new base::DictionaryValue();
224 UserSelectionScreen::FillUserDictionary(
225 *it,
226 is_owner,
227 false, /* is_signin_to_add */
228 ScreenlockBridge::LockHandler::OFFLINE_PASSWORD,
229 NULL, /* public_session_recommended_locales */
230 user_dict);
231 users_list->Append(user_dict);
233 data->Set("managers", users_list.release());
234 ShowScreen(OobeUI::kScreenSupervisedUserCreationFlow, data.get());
236 if (!delegate_)
237 return;
240 void SupervisedUserCreationScreenHandler::Hide() {
243 void SupervisedUserCreationScreenHandler::ShowIntroPage() {
244 CallJS("showIntroPage");
247 void SupervisedUserCreationScreenHandler::ShowManagerPasswordError() {
248 CallJS("showManagerPasswordError");
251 void SupervisedUserCreationScreenHandler::ShowStatusMessage(
252 bool is_progress,
253 const base::string16& message) {
254 if (is_progress)
255 CallJS("showProgress", message);
256 else
257 CallJS("showStatusError", message);
260 void SupervisedUserCreationScreenHandler::ShowUsernamePage() {
261 CallJS("showUsernamePage");
264 void SupervisedUserCreationScreenHandler::ShowTutorialPage() {
265 CallJS("showTutorialPage");
268 void SupervisedUserCreationScreenHandler::ShowErrorPage(
269 const base::string16& title,
270 const base::string16& message,
271 const base::string16& button_text) {
272 CallJS("showErrorPage", title, message, button_text);
275 void SupervisedUserCreationScreenHandler::SetDelegate(Delegate* delegate) {
276 delegate_ = delegate;
279 void SupervisedUserCreationScreenHandler::
280 HandleFinishLocalSupervisedUserCreation() {
281 delegate_->FinishFlow();
284 void SupervisedUserCreationScreenHandler::
285 HandleAbortLocalSupervisedUserCreation() {
286 delegate_->AbortFlow();
289 void SupervisedUserCreationScreenHandler::HandleManagerSelected(
290 const std::string& manager_id) {
291 if (!delegate_)
292 return;
293 WallpaperManager::Get()->SetUserWallpaperNow(manager_id);
296 void SupervisedUserCreationScreenHandler::HandleImportUserSelected(
297 const std::string& user_id) {
298 if (!delegate_)
299 return;
302 void SupervisedUserCreationScreenHandler::HandleCheckSupervisedUserName(
303 const base::string16& name) {
304 std::string user_id;
305 if (NULL !=
306 ChromeUserManager::Get()->GetSupervisedUserManager()->FindByDisplayName(
307 base::CollapseWhitespace(name, true))) {
308 CallJS("supervisedUserNameError", name,
309 l10n_util::GetStringUTF16(
310 IDS_CREATE_SUPERVISED_USER_CREATE_USERNAME_ALREADY_EXISTS));
311 } else if (net::EscapeForHTML(name) != name) {
312 CallJS("supervisedUserNameError", name,
313 l10n_util::GetStringUTF16(
314 IDS_CREATE_SUPERVISED_USER_CREATE_ILLEGAL_USERNAME));
315 } else if (delegate_ && delegate_->FindUserByDisplayName(
316 base::CollapseWhitespace(name, true), &user_id)) {
317 CallJS("supervisedUserSuggestImport", name, user_id);
318 } else {
319 CallJS("supervisedUserNameOk", name);
323 void SupervisedUserCreationScreenHandler::HandleCreateSupervisedUser(
324 const base::string16& new_raw_user_name,
325 const std::string& new_user_password) {
326 if (!delegate_)
327 return;
328 const base::string16 new_user_name =
329 base::CollapseWhitespace(new_raw_user_name, true);
330 if (NULL !=
331 ChromeUserManager::Get()->GetSupervisedUserManager()->FindByDisplayName(
332 new_user_name)) {
333 CallJS("supervisedUserNameError", new_user_name,
334 l10n_util::GetStringFUTF16(
335 IDS_CREATE_SUPERVISED_USER_CREATE_USERNAME_ALREADY_EXISTS,
336 new_user_name));
337 return;
339 if (net::EscapeForHTML(new_user_name) != new_user_name) {
340 CallJS("supervisedUserNameError", new_user_name,
341 l10n_util::GetStringUTF16(
342 IDS_CREATE_SUPERVISED_USER_CREATE_ILLEGAL_USERNAME));
343 return;
346 if (new_user_password.length() == 0) {
347 CallJS("showPasswordError",
348 l10n_util::GetStringUTF16(
349 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_TOO_SHORT));
350 return;
353 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
354 IDS_CREATE_SUPERVISED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
356 delegate_->CreateSupervisedUser(new_user_name, new_user_password);
359 void SupervisedUserCreationScreenHandler::HandleImportSupervisedUser(
360 const std::string& user_id) {
361 if (!delegate_)
362 return;
364 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
365 IDS_CREATE_SUPERVISED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
367 delegate_->ImportSupervisedUser(user_id);
370 void SupervisedUserCreationScreenHandler::
371 HandleImportSupervisedUserWithPassword(
372 const std::string& user_id,
373 const std::string& password) {
374 if (!delegate_)
375 return;
377 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
378 IDS_CREATE_SUPERVISED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
380 delegate_->ImportSupervisedUserWithPassword(user_id, password);
383 void SupervisedUserCreationScreenHandler::HandleAuthenticateManager(
384 const std::string& raw_manager_username,
385 const std::string& manager_password) {
386 const std::string manager_username =
387 gaia::SanitizeEmail(raw_manager_username);
388 delegate_->AuthenticateManager(manager_username, manager_password);
391 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
392 // It should be removed by issue 251179.
393 void SupervisedUserCreationScreenHandler::HandleGetImages() {
394 base::ListValue image_urls;
395 for (int i = user_manager::kFirstDefaultImageIndex;
396 i < user_manager::kDefaultImagesCount;
397 ++i) {
398 scoped_ptr<base::DictionaryValue> image_data(new base::DictionaryValue);
399 image_data->SetString("url", user_manager::GetDefaultImageUrl(i));
400 image_data->SetString(
401 "author",
402 l10n_util::GetStringUTF16(user_manager::kDefaultImageAuthorIDs[i]));
403 image_data->SetString(
404 "website",
405 l10n_util::GetStringUTF16(user_manager::kDefaultImageWebsiteIDs[i]));
406 image_data->SetString("title", user_manager::GetDefaultImageDescription(i));
407 image_urls.Append(image_data.release());
409 CallJS("setDefaultImages", image_urls);
412 void SupervisedUserCreationScreenHandler::HandlePhotoTaken
413 (const std::string& image_url) {
414 std::string mime_type, charset, raw_data;
415 if (!net::DataURL::Parse(GURL(image_url), &mime_type, &charset, &raw_data))
416 NOTREACHED();
417 DCHECK_EQ("image/png", mime_type);
419 if (delegate_)
420 delegate_->OnPhotoTaken(raw_data);
423 void SupervisedUserCreationScreenHandler::HandleTakePhoto() {
424 ash::PlaySystemSoundIfSpokenFeedback(SOUND_CAMERA_SNAP);
427 void SupervisedUserCreationScreenHandler::HandleDiscardPhoto() {
428 ash::PlaySystemSoundIfSpokenFeedback(SOUND_OBJECT_DELETE);
431 void SupervisedUserCreationScreenHandler::HandleSelectImage(
432 const std::string& image_url,
433 const std::string& image_type) {
434 if (delegate_)
435 delegate_->OnImageSelected(image_type, image_url);
438 void SupervisedUserCreationScreenHandler::HandleCurrentSupervisedUserPage(
439 const std::string& page) {
440 if (delegate_)
441 delegate_->OnPageSelected(page);
444 void SupervisedUserCreationScreenHandler::ShowPage(
445 const std::string& page) {
446 CallJS("showPage", page);
449 void SupervisedUserCreationScreenHandler::SetCameraPresent(bool present) {
450 CallJS("setCameraPresent", present);
453 void SupervisedUserCreationScreenHandler::ShowExistingSupervisedUsers(
454 const base::ListValue* users) {
455 CallJS("setExistingSupervisedUsers", *users);
458 } // namespace chromeos