12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h" 8f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)#include "ash/shell.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/values.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/chromeos/camera_detector.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/existing_user_controller.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_controller.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/error_screen.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/screen_observer.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/chromeos/login/user_image.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/chromeos/login/user_image_manager.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/wizard_controller.h" 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_state.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/browser_thread.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/skia/include/core/SkBitmap.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/image/image_skia.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ConfigureErrorScreen(ErrorScreen* screen, 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const NetworkState* network, 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NetworkPortalDetector::CaptivePortalStatus status) { 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (status) { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN: 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE: 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE: 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen->SetErrorState(ErrorScreen::ERROR_STATE_OFFLINE, 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string()); 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL: 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen->SetErrorState(ErrorScreen::ERROR_STATE_PORTAL, 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network->name()); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen->FixCaptivePortal(); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED: 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen->SetErrorState(ErrorScreen::ERROR_STATE_PROXY, 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string()); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LocallyManagedUserCreationScreen::LocallyManagedUserCreationScreen( 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenObserver* observer, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LocallyManagedUserCreationScreenHandler* actor) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : WizardScreen(observer), 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch weak_factory_(this), 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) actor_(actor), 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) on_error_screen_(false), 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch on_image_screen_(false), 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_decoder_(NULL), 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch apply_photo_after_decoding_(false), 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch selected_image_(0) { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(actor_); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->SetDelegate(this); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LocallyManagedUserCreationScreen::~LocallyManagedUserCreationScreen() { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->SetDelegate(NULL); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (image_decoder_.get()) 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_decoder_->set_delegate(NULL); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::PrepareToShow() { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->PrepareToShow(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::Show() { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->Show(); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(antrim) : temorary hack (until upcoming hackaton). Should be 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // removed once we have screens reworked. 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (on_image_screen_) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) actor_->ShowTutorialPage(); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) actor_->ShowIntroPage(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkPortalDetector* detector = NetworkPortalDetector::GetInstance(); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (detector && !on_error_screen_) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) detector->AddAndFireObserver(this); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) on_error_screen_ = false; 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LocallyManagedUserCreationScreen::OnPortalDetectionCompleted( 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const NetworkState* network, 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NetworkPortalDetector::CaptivePortalState& state) { 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (state.status == NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE) { 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) get_screen_observer()->HideErrorScreen(this); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) on_error_screen_ = true; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ErrorScreen* screen = get_screen_observer()->GetErrorScreen(); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ConfigureErrorScreen(screen, network, state.status); 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen->SetUIState(ErrorScreen::UI_STATE_LOCALLY_MANAGED); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) get_screen_observer()->ShowErrorScreen(); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen:: 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShowManagerInconsistentStateErrorScreen() { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!actor_) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) actor_->ShowErrorPage( 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16( 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_CREATE_LOCALLY_MANAGED_USER_MANAGER_INCONSISTENT_STATE_TITLE), 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) l10n_util::GetStringUTF16( 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_CREATE_LOCALLY_MANAGED_USER_MANAGER_INCONSISTENT_STATE), 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) l10n_util::GetStringUTF16( 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_CREATE_LOCALLY_MANAGED_USER_MANAGER_INCONSISTENT_STATE_BUTTON)); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::ShowInitialScreen() { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) actor_->ShowIntroPage(); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::Hide() { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->Hide(); 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkPortalDetector* detector = NetworkPortalDetector::GetInstance(); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (detector && !on_error_screen_) 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) detector->RemoveObserver(this); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string LocallyManagedUserCreationScreen::GetName() const { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return WizardController::kLocallyManagedUserCreationScreenName; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::AbortFlow() { 148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) controller_->CancelCreation(); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::FinishFlow() { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->FinishCreation(); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LocallyManagedUserCreationScreen::AuthenticateManager( 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& manager_id, 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& manager_password) { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure no two controllers exist at the same time. 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_.reset(); 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) controller_.reset(new LocallyManagedUserCreationController(this, manager_id)); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExistingUserController::current_controller()-> 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Login(UserContext(manager_id, 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager_password, 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string() /* auth_code */)); 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LocallyManagedUserCreationScreen::CreateManagedUser( 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const string16& display_name, 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& managed_user_password) { 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(controller_.get()); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_->SetUpCreation(display_name, managed_user_password); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_->StartCreation(); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::OnManagerLoginFailure() { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_->ShowManagerPasswordError(); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void LocallyManagedUserCreationScreen::OnManagerFullyAuthenticated( 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Profile* manager_profile) { 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(controller_.get()); 184f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles) // For manager user, move desktop to locked container so that windows created 185f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles) // during the user image picker step are below it. 186f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles) ash::Shell::GetInstance()-> 187f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles) desktop_background_controller()->MoveDesktopToLockedContainer(); 188f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles) 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) controller_->SetManagerProfile(manager_profile); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) actor_->ShowUsernamePage(); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LocallyManagedUserCreationScreen::OnManagerCryptohomeAuthenticated() { 19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (actor_) { 196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) actor_->ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16( 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_AUTH_PROGRESS_MESSAGE)); 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::OnExit() {} 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::OnActorDestroyed( 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LocallyManagedUserCreationScreenHandler* actor) { 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_ == actor) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actor_ = NULL; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::OnCreationError( 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LocallyManagedUserCreationController::ErrorCode code) { 2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) string16 title; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 message; 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) string16 button; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(antrim) : find out which errors do we really have. 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We might reuse some error messages from ordinary user flow. 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (code) { 21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case LocallyManagedUserCreationController::CRYPTOHOME_NO_MOUNT: 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case LocallyManagedUserCreationController::CRYPTOHOME_FAILED_MOUNT: 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case LocallyManagedUserCreationController::CRYPTOHOME_FAILED_TPM: 2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) title = l10n_util::GetStringUTF16( 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_CREATE_LOCALLY_MANAGED_USER_TPM_ERROR_TITLE); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message = l10n_util::GetStringUTF16( 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_CREATE_LOCALLY_MANAGED_USER_TPM_ERROR); 2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) button = l10n_util::GetStringUTF16( 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_CREATE_LOCALLY_MANAGED_USER_TPM_ERROR_BUTTON); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case LocallyManagedUserCreationController::CLOUD_SERVER_ERROR: 22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case LocallyManagedUserCreationController::TOKEN_WRITE_FAILED: 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) title = l10n_util::GetStringUTF16( 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_CREATE_LOCALLY_MANAGED_USER_GENERIC_ERROR_TITLE); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message = l10n_util::GetStringUTF16( 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_CREATE_LOCALLY_MANAGED_USER_GENERIC_ERROR); 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) button = l10n_util::GetStringUTF16( 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_CREATE_LOCALLY_MANAGED_USER_GENERIC_ERROR_BUTTON); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case LocallyManagedUserCreationController::NO_ERROR: 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (actor_) 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) actor_->ShowErrorPage(title, message, button); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LocallyManagedUserCreationScreen::OnCreationTimeout() { 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (actor_) { 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch actor_->ShowStatusMessage(false /* error */, l10n_util::GetStringUTF16( 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_TIMEOUT_MESSAGE)); 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// TODO(antrim) : this is an explicit code duplications with UserImageScreen. 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// It should be removed by issue 251179. 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LocallyManagedUserCreationScreen::ApplyPicture() { 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UserManager* user_manager = UserManager::Get(); 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UserImageManager* image_manager = user_manager->GetUserImageManager(); 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string user_id = controller_->GetManagedUserId(); 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (selected_image_) { 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case User::kExternalImageIndex: 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Photo decoding may not have been finished yet. 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (user_photo_.isNull()) { 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch apply_photo_after_decoding_ = true; 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_manager-> 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SaveUserImage(user_id, UserImage::CreateAndEncode(user_photo_)); 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case User::kProfileImageIndex: 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED() << "Supervised users have no profile pictures"; 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch default: 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(selected_image_ >= 0 && selected_image_ < kDefaultImagesCount); 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_manager->SaveUserDefaultImageIndex(user_id, selected_image_); 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Proceed to tutorial. 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch actor_->ShowTutorialPage(); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LocallyManagedUserCreationScreen::OnCreationSuccess() { 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ApplyPicture(); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LocallyManagedUserCreationScreen::CheckCameraPresence() { 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CameraDetector::StartPresenceCheck( 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&LocallyManagedUserCreationScreen::OnCameraPresenceCheckDone, 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch weak_factory_.GetWeakPtr())); 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LocallyManagedUserCreationScreen::OnCameraPresenceCheckDone() { 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (actor_) { 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch actor_->SetCameraPresent( 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CameraDetector::camera_presence() == CameraDetector::kCameraPresent); 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LocallyManagedUserCreationScreen::OnPhotoTaken( 297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& raw_data) { 298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch user_photo_ = gfx::ImageSkia(); 300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (image_decoder_.get()) 301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_decoder_->set_delegate(NULL); 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_decoder_ = new ImageDecoder(this, raw_data, 303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageDecoder::DEFAULT_CODEC); 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::MessageLoopProxy> task_runner = 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::GetMessageLoopProxyForThread( 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::UI); 307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_decoder_->Start(task_runner); 308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LocallyManagedUserCreationScreen::OnImageDecoded( 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ImageDecoder* decoder, 312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SkBitmap& decoded_image) { 313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK_EQ(image_decoder_.get(), decoder); 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch user_photo_ = gfx::ImageSkia::CreateFrom1xBitmap(decoded_image); 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (apply_photo_after_decoding_) 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ApplyPicture(); 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LocallyManagedUserCreationScreen::OnDecodeImageFailed( 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ImageDecoder* decoder) { 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED() << "Failed to decode PNG image from WebUI"; 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LocallyManagedUserCreationScreen::OnImageSelected( 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& image_type, 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& image_url) { 327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (image_url.empty()) 328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int user_image_index = User::kInvalidImageIndex; 330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (image_type == "default" && 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IsDefaultImageUrl(image_url, &user_image_index)) { 332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch selected_image_ = user_image_index; 333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (image_type == "camera") { 334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch selected_image_ = User::kExternalImageIndex; 335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED() << "Unexpected image type: " << image_type; 337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid LocallyManagedUserCreationScreen::OnImageAccepted() { 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 344