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