wizard_controller.cc revision 513209b27ff55e2841eac0e4120199c23acce758
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/wizard_controller.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gdk/gdk.h>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <signal.h>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <sys/types.h>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "app/resource_bundle.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h"
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_util.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/cros_library.h"
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/cros/input_method_library.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/login_library.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/system_library.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/customization_document.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/input_method/input_method_util.h"
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/language_preferences.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/account_screen.h"
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/apply_services_customization.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/background_view.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/eula_view.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/existing_user_controller.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/helper.h"
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/html_page_screen.h"
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/language_switch_menu.h"
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/login_screen.h"
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/login_utils.h"
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/network_screen.h"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/registration_screen.h"
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/rounded_rect_painter.h"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/update_screen.h"
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_image_screen.h"
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_manager.h"
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/wizard_accessibility_helper.h"
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/wm_ipc.h"
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/profile_manager.h"
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h"
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_service.h"
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/pref_names.h"
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "cros/chromeos_wm_ipc_enums.h"
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "unicode/timezone.h"
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/accelerator.h"
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/painter.h"
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/view.h"
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget_gtk.h"
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// A boolean pref of the EULA accepted flag.
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst char kEulaAccepted[] = "EulaAccepted";
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A boolean pref of the OOBE complete flag.
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kOobeComplete[] = "OobeComplete";
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Path to OEM partner startup customization manifest.
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kStartupCustomizationManifestPath[] =
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "/mnt/partner_partition/etc/chromeos/startup_manifest.json";
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Path to flag file indicating that OOBE was completed successfully.
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kOobeCompleteFlagFilePath[] =
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "/home/chronos/.oobe_completed";
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Upadate window will be behind the curtain at most |kMaximalCurtainTimeSec|.
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kMaximalCurtainTimeSec = 15;
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Time in seconds that we wait for the device to reboot.
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// If reboot didn't happen, ask user to reboot device manually.
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kWaitForRebootTimeSec = 3;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RootView of the Widget WizardController creates. Contains the contents of the
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ContentView : public views::View {
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ContentView()
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : accel_enable_accessibility_(
85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            chromeos::WizardAccessibilityHelper::GetAccelerator()) {
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    AddAccelerator(accel_enable_accessibility_);
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OFFICIAL_BUILD)
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_account_screen_ = views::Accelerator(app::VKEY_A,
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               false, true, true);
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_login_screen_ = views::Accelerator(app::VKEY_L,
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             false, true, true);
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_network_screen_ = views::Accelerator(app::VKEY_N,
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               false, true, true);
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_update_screen_ = views::Accelerator(app::VKEY_U,
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                              false, true, true);
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_image_screen_ = views::Accelerator(app::VKEY_I,
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             false, true, true);
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_eula_screen_ = views::Accelerator(app::VKEY_E,
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                            false, true, true);
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_register_screen_ = views::Accelerator(app::VKEY_R,
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                false, true, true);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_account_screen_);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_login_screen_);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_network_screen_);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_update_screen_);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_image_screen_);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_eula_screen_);
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    AddAccelerator(accel_register_screen_);
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~ContentView() {
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationService::current()->Notify(
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationType::WIZARD_CONTENT_VIEW_DESTROYED,
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationService::AllSources(),
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationService::NoDetails());
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool AcceleratorPressed(const views::Accelerator& accel) {
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WizardController* controller = WizardController::default_controller();
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!controller)
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (accel == accel_enable_accessibility_) {
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      chromeos::WizardAccessibilityHelper::GetInstance()->EnableAccessibility(
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          controller->contents());
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OFFICIAL_BUILD)
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else if (accel == accel_account_screen_) {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowAccountScreen();
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_login_screen_) {
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowLoginScreen();
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_network_screen_) {
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowNetworkScreen();
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_update_screen_) {
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowUpdateScreen();
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_image_screen_) {
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowUserImageScreen();
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_eula_screen_) {
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowEulaScreen();
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else if (accel == accel_register_screen_) {
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      controller->ShowRegistrationScreen();
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Layout() {
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int i = 0; i < GetChildViewCount(); ++i) {
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      views::View* cur = GetChildViewAt(i);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (cur->IsVisible())
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        cur->SetBounds(0, 0, width(), height());
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<views::Painter> painter_;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OFFICIAL_BUILD)
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_account_screen_;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_login_screen_;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_network_screen_;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_update_screen_;
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_image_screen_;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_eula_screen_;
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Accelerator accel_register_screen_;
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Accelerator accel_enable_accessibility_;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ContentView);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DeleteWizardControllerAndLaunchBrowser(WizardController* controller) {
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete controller;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Launch browser after controller is deleted and its windows are closed.
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chromeos::LoginUtils::Get()->EnableBrowserLaunch(true);
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::UI,
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FROM_HERE,
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableFunction(&chromeos::LoginUtils::DoBrowserLaunch,
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          ProfileManager::GetDefaultProfile()));
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst chromeos::StartupCustomizationDocument* LoadStartupManifest() {
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Load partner customization startup manifest if it is available.
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath startup_manifest_path(kStartupCustomizationManifestPath);
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (file_util::PathExists(startup_manifest_path)) {
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_ptr<chromeos::StartupCustomizationDocument> customization(
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        new chromeos::StartupCustomizationDocument());
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool manifest_loaded = customization->LoadManifestFromFile(
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        startup_manifest_path);
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (manifest_loaded) {
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      VLOG(1) << "Startup manifest loaded successfully";
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return customization.release();
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    LOG(ERROR) << "Error loading startup manifest: "
199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick               << kStartupCustomizationManifestPath;
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return NULL;
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Returns true if startup manifest defines valid registration URL.
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool IsRegistrationScreenValid(
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const chromeos::StartupCustomizationDocument* startup_manifest) {
208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return startup_manifest != NULL &&
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick         GURL(startup_manifest->registration_url()).is_valid();
210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Saves boolean "Local State" preference and forces it's persistence to disk.
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SaveBoolPreferenceForced(const char* pref_name, bool value) {
214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  PrefService* prefs = g_browser_process->local_state();
215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  prefs->SetBoolean(pref_name, value);
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  prefs->SavePersistentPrefs();
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kNetworkScreenName[] = "network";
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kLoginScreenName[] = "login";
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kAccountScreenName[] = "account";
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kUpdateScreenName[] = "update";
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kUserImageScreenName[] = "image";
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kEulaScreenName[] = "eula";
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kRegistrationScreenName[] = "register";
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char WizardController::kHTMLPageScreenName[] = "html";
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Passing this parameter as a "first screen" initiates full OOBE flow.
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kOutOfBoxScreenName[] = "oobe";
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Special test value that commands not to create any window yet.
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kTestNoScreenName[] = "test:nowindow";
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Initialize default controller.
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController* WizardController::default_controller_ = NULL;
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, public:
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController::WizardController()
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : widget_(NULL),
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      background_widget_(NULL),
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      background_view_(NULL),
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      contents_(NULL),
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      current_screen_(NULL),
2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      is_official_build_(true),
2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      is_official_build_(false),
2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_out_of_box_(false),
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_test_mode_(false),
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      observer_(NULL) {
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(default_controller_ == NULL);
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_controller_ = this;
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController::~WizardController() {
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close ends up deleting the widget.
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (background_widget_)
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_widget_->Close();
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (widget_)
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    widget_->Close();
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_controller_ = NULL;
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  chromeos::WizardAccessibilityHelper::GetInstance()->
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UnregisterNotifications();
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::Init(const std::string& first_screen_name,
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const gfx::Rect& screen_bounds) {
276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Starting OOBE wizard with screen: " << first_screen_name;
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!contents_);
2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  first_screen_name_ = first_screen_name;
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // When device is not registered yet we need to load startup manifest as well.
2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // In case of OOBE (network-EULA-update) manifest has been loaded in
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // ShowLoginWizard().
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (IsOobeCompleted() && !IsDeviceRegistered())
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SetCustomization(LoadStartupManifest());
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  screen_bounds_ = screen_bounds;
2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  contents_ = new ContentView();
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool oobe_complete = IsOobeCompleted();
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!oobe_complete || first_screen_name == kOutOfBoxScreenName) {
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    is_out_of_box_ = true;
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowFirstScreen(first_screen_name);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::Show() {
2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // In tests we might startup without initial screen
2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // so widget_ hasn't been created yet.
3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (first_screen_name_ != kTestNoScreenName)
3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(widget_);
3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (widget_)
3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    widget_->Show();
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowBackground(const gfx::Rect& bounds) {
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!background_widget_);
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_widget_ =
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chromeos::BackgroundView::CreateWindowContainingView(bounds,
3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                           GURL(),
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                           &background_view_);
3123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgressBarVisible(true);
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_widget_->Show();
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OwnBackground(
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    views::Widget* background_widget,
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::BackgroundView* background_view) {
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!background_widget_);
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_widget_ = background_widget;
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_view_ = background_view;
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::NetworkScreen* WizardController::GetNetworkScreen() {
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!network_screen_.get())
3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    network_screen_.reset(new chromeos::NetworkScreen(this));
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return network_screen_.get();
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::LoginScreen* WizardController::GetLoginScreen() {
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!login_screen_.get())
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    login_screen_.reset(new chromeos::LoginScreen(this));
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return login_screen_.get();
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::AccountScreen* WizardController::GetAccountScreen() {
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!account_screen_.get())
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    account_screen_.reset(new chromeos::AccountScreen(this));
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return account_screen_.get();
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::UpdateScreen* WizardController::GetUpdateScreen() {
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!update_screen_.get()) {
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    update_screen_.reset(new chromeos::UpdateScreen(this));
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    update_screen_->SetMaximalCurtainTime(kMaximalCurtainTimeSec);
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    update_screen_->SetRebootCheckDelay(kWaitForRebootTimeSec);
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return update_screen_.get();
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::UserImageScreen* WizardController::GetUserImageScreen() {
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!user_image_screen_.get())
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    user_image_screen_.reset(new chromeos::UserImageScreen(this));
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return user_image_screen_.get();
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::EulaScreen* WizardController::GetEulaScreen() {
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!eula_screen_.get())
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    eula_screen_.reset(new chromeos::EulaScreen(this));
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return eula_screen_.get();
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::RegistrationScreen* WizardController::GetRegistrationScreen() {
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!registration_screen_.get())
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    registration_screen_.reset(new chromeos::RegistrationScreen(this));
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return registration_screen_.get();
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickchromeos::HTMLPageScreen* WizardController::GetHTMLPageScreen() {
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!html_page_screen_.get()) {
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    CommandLine* command_line = CommandLine::ForCurrentProcess();
3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string url;
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // It's strange but args may contains empty strings.
3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (size_t i = 0; i < command_line->args().size(); i++) {
3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (!command_line->args()[i].empty()) {
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        DCHECK(url.empty()) << "More than one URL in command line";
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        url = command_line->args()[i];
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(!url.empty()) << "No URL in commane line";
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    html_page_screen_.reset(new chromeos::HTMLPageScreen(this, url));
3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return html_page_screen_.get();
3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowNetworkScreen() {
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(false);
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetNetworkScreen());
3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::SELECT_NETWORK);
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickchromeos::ExistingUserController* WizardController::ShowLoginScreen() {
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::SIGNIN);
3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Initiate services customization.
3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::ApplyServicesCustomization::StartIfNeeded();
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When run under automation test show plain login screen.
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!is_test_mode_ &&
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chromeos::CrosLibrary::Get()->EnsureLoaded() &&
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          switches::kEnableLoginImages)) {
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<chromeos::UserManager::User> users =
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        chromeos::UserManager::Get()->GetUsers();
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // ExistingUserController deletes itself.
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gfx::Rect screen_bounds;
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_widget_->GetBounds(&screen_bounds, true);
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::ExistingUserController* controller =
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        new chromeos::ExistingUserController(users, screen_bounds);
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    controller->OwnBackground(background_widget_, background_view_);
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    controller->Init();
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_widget_ = NULL;
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_view_ = NULL;
4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->DeleteSoon(FROM_HERE, this);
4173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return controller;
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetLoginScreen());
4223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return NULL;
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowAccountScreen() {
426731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing create account screen.";
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetAccountScreen());
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowUpdateScreen() {
432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing update screen.";
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetUpdateScreen());
4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // There is no special step for update.
4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::EULA);
4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::SELECT_NETWORK);
4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowUserImageScreen() {
444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing user image screen.";
4453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetStatusAreaVisible(false);
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetUserImageScreen());
4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::PICTURE);
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowEulaScreen() {
451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing EULA screen.";
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(false);
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetEulaScreen());
4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::EULA);
4563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowRegistrationScreen() {
460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!IsRegistrationScreenValid(GetCustomization())) {
461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    VLOG(1) << "Skipping registration screen: manifest not defined or invalid "
462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick               "URL.";
4633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnRegistrationSkipped();
4643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
4653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing registration screen.";
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetRegistrationScreen());
4693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
4703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::REGISTRATION);
4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::ShowHTMLPageScreen() {
475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing HTML page screen.";
4763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetStatusAreaVisible(true);
4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgressBarVisible(false);
4783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCurrentScreen(GetHTMLPageScreen());
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::SetCustomization(
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const chromeos::StartupCustomizationDocument* customization) {
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  customization_.reset(customization);
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst chromeos::StartupCustomizationDocument*
4873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    WizardController::GetCustomization() const {
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return customization_.get();
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::SkipRegistration() {
4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (current_screen_ == GetRegistrationScreen())
4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnRegistrationSkipped();
4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  else
4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LOG(ERROR) << "Registration screen is not active.";
4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::RegisterPrefs(PrefService* local_state) {
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  local_state->RegisterBooleanPref(kOobeComplete, false);
501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  local_state->RegisterBooleanPref(kEulaAccepted, false);
5023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Check if the pref is already registered in case
5033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Preferences::RegisterUserPrefs runs before this code in the future.
5043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (local_state->FindPreference(prefs::kAccessibilityEnabled) == NULL) {
5053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    local_state->RegisterBooleanPref(prefs::kAccessibilityEnabled, false);
5063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, ExitHandlers:
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginSignInSelected() {
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't show user image screen in case of automated testing.
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (is_test_mode_) {
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->DeleteSoon(FROM_HERE, this);
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't launch browser until we pass image screen.
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chromeos::LoginUtils::Get()->EnableBrowserLaunch(false);
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowUserImageScreen();
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginGuestUser() {
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We're on the stack, so don't try and delete us now.
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->DeleteSoon(FROM_HERE, this);
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginCreateAccount() {
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowAccountScreen();
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnNetworkConnected() {
5323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (is_official_build_) {
533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!IsEulaAccepted()) {
534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ShowEulaScreen();
535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    } else {
536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Possible cases:
537731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // 1. EULA was accepted, forced shutdown/reboot during update.
538731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // 2. EULA was accepted, planned reboot after update.
539731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Make sure that device is up-to-date.
540731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      InitiateOOBEUpdate();
541731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
543731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    InitiateOOBEUpdate();
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnNetworkOffline() {
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(dpolukhin): if(is_out_of_box_) we cannot work offline and
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should report some error message here and stay on the same screen.
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowLoginScreen();
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnAccountCreateBack() {
5543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::ExistingUserController* controller = ShowLoginScreen();
5553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller)
5563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    controller->SelectNewUser();
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnAccountCreated() {
5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::ExistingUserController* controller = ShowLoginScreen();
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller)
5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    controller->LoginNewUser(username_, password_);
5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  else
5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    Login(username_, password_);
5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(dpolukhin): clear password memory for real. Now it is not
5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // a problem because we can't extract password from the form.
5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  password_.clear();
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnConnectionFailed() {
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(dpolukhin): show error message after login screen is displayed.
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowLoginScreen();
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateCompleted() {
5763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  OnOOBECompleted();
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnEulaAccepted() {
580731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MarkEulaAccepted();
581731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  InitiateOOBEUpdate();
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateErrorCheckingForUpdate() {
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Update should be required during OOBE.
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We do not want to block users from being able to proceed to the login
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // screen if there is any error checking for an update.
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // They could use "browse without sign-in" feature to set up the network to be
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // able to perform the update later.
5903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  OnOOBECompleted();
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateErrorUpdating() {
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there was an error while getting or applying the update,
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // return to network selection screen.
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Show message to the user explaining update error.
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Update should be required during OOBE.
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Temporary fix, need to migrate to new API. http://crosbug.com/4321
5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  OnOOBECompleted();
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUserImageSelected() {
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We're on the stack, so don't try and delete us now.
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We should launch browser only after we delete the controller and close
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // its windows.
606731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
607731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::UI,
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FROM_HERE,
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableFunction(&DeleteWizardControllerAndLaunchBrowser,
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          this));
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(avayvod): Sync image with Google Sync.
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUserImageSkipped() {
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnUserImageSelected();
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnRegistrationSuccess() {
6193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MarkDeviceRegistered();
6203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (chromeos::UserManager::Get()->logged_in_user().email().empty()) {
6213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    chromeos::LoginUtils::Get()->CompleteOffTheRecordLogin(start_url_);
6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
6233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ShowUserImageScreen();
6243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnRegistrationSkipped() {
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Track in a histogram?
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnRegistrationSuccess();
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::OnOOBECompleted() {
6333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MarkOobeCompleted();
6343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ShowLoginScreen();
6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
637731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid WizardController::InitiateOOBEUpdate() {
638731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ShowUpdateScreen();
639731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetUpdateScreen()->StartUpdate();
640731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
641731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, private:
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickviews::WidgetGtk* WizardController::CreateScreenWindow(
6463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const gfx::Rect& bounds, bool initial_show) {
6473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::WidgetGtk* window =
6483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW);
6493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  widget_ = window;
6503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->MakeTransparent();
6513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Window transparency makes background flicker through controls that
6523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // are constantly updating its contents (like image view with video
6533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // stream). Hence enabling double buffer.
6543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->EnableDoubleBuffer(true);
6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->Init(NULL, bounds);
6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::vector<int> params;
6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // For initial show WM would animate background window.
6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Otherwise it stays unchaged.
6593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  params.push_back(initial_show);
6603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::WmIpc::instance()->SetWindowType(
6613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      window->GetNativeView(),
6623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      chromeos::WM_IPC_WINDOW_LOGIN_GUEST,
6633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      &params);
6643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->SetContentsView(contents_);
6653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return window;
6663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickgfx::Rect WizardController::GetWizardScreenBounds(int screen_width,
6693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                  int screen_height) const {
6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int offset_x = (screen_bounds_.width() - screen_width) / 2;
6713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int offset_y = (screen_bounds_.height() - screen_height) / 2;
6723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int window_x = screen_bounds_.x() + offset_x;
6733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int window_y = screen_bounds_.y() + offset_y;
6743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return gfx::Rect(window_x, window_y, screen_width, screen_height);
6753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::SetCurrentScreen(WizardScreen* new_current) {
6793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (current_screen_ == new_current ||
6803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      new_current == NULL)
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
6823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool initial_show = true;
6843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (current_screen_) {
6853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    initial_show = false;
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    current_screen_->Hide();
6873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  current_screen_ = new_current;
6903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool force_widget_show = false;
6913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::WidgetGtk* window = NULL;
6923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Rect current_bounds;
6943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (widget_)
6953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    widget_->GetBounds(&current_bounds, false);
6963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Size new_screen_size = current_screen_->GetScreenSize();
6973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Rect new_bounds = GetWizardScreenBounds(new_screen_size.width(),
6983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               new_screen_size.height());
6993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (new_bounds != current_bounds) {
7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (widget_)
7013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      widget_->Close();
7023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    force_widget_show = true;
7033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    window = CreateScreenWindow(new_bounds, initial_show);
704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  current_screen_->Show();
7063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  contents_->Layout();
707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  contents_->SchedulePaint();
7083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (force_widget_show) {
7093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // This keeps the window from flashing at startup.
7103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    GdkWindow* gdk_window = window->GetNativeView()->window;
7113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    gdk_window_set_back_pixmap(gdk_window, NULL, false);
7123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (widget_)
7133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      widget_->Show();
7143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::SetStatusAreaVisible(bool visible) {
7183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // When ExistingUserController passes background ownership
7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to WizardController it happens after screen is shown.
7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (background_view_) {
7213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_view_->SetStatusAreaVisible(visible);
7223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowFirstScreen(const std::string& first_screen_name) {
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (first_screen_name == kNetworkScreenName) {
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowNetworkScreen();
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kLoginScreenName) {
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This flag is passed if we're running under automation test.
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    is_test_mode_ = true;
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowLoginScreen();
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kAccountScreenName) {
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowAccountScreen();
734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kUpdateScreenName) {
735731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    InitiateOOBEUpdate();
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kUserImageScreenName) {
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowUserImageScreen();
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kEulaScreenName) {
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowEulaScreen();
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kRegistrationScreenName) {
7413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (is_official_build_) {
7423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ShowRegistrationScreen();
7433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else {
7443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      // Just proceed to image screen.
7453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      OnRegistrationSuccess();
7463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
7473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (first_screen_name == kHTMLPageScreenName) {
7483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ShowHTMLPageScreen();
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name != kTestNoScreenName) {
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (is_out_of_box_) {
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ShowNetworkScreen();
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ShowLoginScreen();
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::Login(const std::string& username,
7593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             const std::string& password) {
7603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::LoginScreen* login = GetLoginScreen();
7613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (username.empty())
7623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
7633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login->view()->SetUsername(username);
7643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (password.empty())
7663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
7673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login->view()->SetPassword(password);
7683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login->view()->Login();
7693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
772731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool WizardController::IsEulaAccepted() {
773731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return g_browser_process->local_state()->GetBoolean(kEulaAccepted);
774731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
775731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
776731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
7773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WizardController::IsOobeCompleted() {
7783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return g_browser_process->local_state()->GetBoolean(kOobeComplete);
7793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
782731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid WizardController::MarkEulaAccepted() {
783731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SaveBoolPreferenceForced(kEulaAccepted, true);
784731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
785731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
786731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::MarkOobeCompleted() {
788731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SaveBoolPreferenceForced(kOobeComplete, true);
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WizardController::IsDeviceRegistered() {
7933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath oobe_complete_flag_file_path(kOobeCompleteFlagFilePath);
7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return file_util::PathExists(oobe_complete_flag_file_path);
7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
798731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool WizardController::IsRegisterScreenDefined() {
799731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const chromeos::StartupCustomizationDocument* manifest = NULL;
800731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This method will be called from ExistingUserController too
801731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // when Wizard instance doesn't exist.
802731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (default_controller())
803731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    manifest = default_controller()->GetCustomization();
804731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  else
805731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    manifest = LoadStartupManifest();
806731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return IsRegistrationScreenValid(manifest);
807731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
808731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
809731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
8103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::MarkDeviceRegistered() {
8113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create flag file for boot-time init scripts.
8123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath oobe_complete_path(kOobeCompleteFlagFilePath);
8133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FILE* oobe_flag_file = file_util::OpenFile(oobe_complete_path, "w+b");
8143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(oobe_flag_file != NULL) << kOobeCompleteFlagFilePath;
8153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (oobe_flag_file != NULL)
8163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    file_util::CloseFile(oobe_flag_file);
8173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, chromeos::ScreenObserver overrides:
821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnExit(ExitCodes exit_code) {
822731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Wizard screen exit code: " << exit_code;
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (exit_code) {
824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case LOGIN_SIGN_IN_SELECTED:
825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnLoginSignInSelected();
826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case LOGIN_GUEST_SELECTED:
828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnLoginGuestUser();
829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case LOGIN_CREATE_ACCOUNT:
831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnLoginCreateAccount();
832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NETWORK_CONNECTED:
834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnNetworkConnected();
835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NETWORK_OFFLINE:
837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnNetworkOffline();
838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ACCOUNT_CREATE_BACK:
840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnAccountCreateBack();
841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ACCOUNT_CREATED:
843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnAccountCreated();
844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case CONNECTION_FAILED:
846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnConnectionFailed();
847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_INSTALLED:
849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_NOUPDATE:
850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUpdateCompleted();
851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_ERROR_CHECKING_FOR_UPDATE:
853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUpdateErrorCheckingForUpdate();
854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_ERROR_UPDATING:
856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUpdateErrorUpdating();
857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case USER_IMAGE_SELECTED:
859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUserImageSelected();
860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case USER_IMAGE_SKIPPED:
862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUserImageSkipped();
863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case EULA_ACCEPTED:
865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnEulaAccepted();
866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
8673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case EULA_BACK:
8683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ShowNetworkScreen();
8693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case REGISTRATION_SUCCESS:
871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnRegistrationSuccess();
872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case REGISTRATION_SKIPPED:
874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnRegistrationSkipped();
875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::OnSetUserNamePassword(const std::string& username,
8823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             const std::string& password) {
8833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  username_ = username;
8843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  password_ = password;
8853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, WizardScreen overrides:
889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::View* WizardController::GetWizardView() {
890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return contents_;
891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::ScreenObserver* WizardController::GetObserver(WizardScreen* screen) {
894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return observer_ ? observer_ : this;
895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser {
898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Declared in browser_dialogs.h so that others don't need to depend on our .h.
900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ShowLoginWizard(const std::string& first_screen_name,
901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     const gfx::Size& size) {
902731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing login screen: " << first_screen_name;
903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The login screen will enable alternate keyboard layouts, but we don't want
9053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to start the IME process unless one is selected.
9063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::CrosLibrary::Get()->GetInputMethodLibrary()->
9073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      SetDeferImeStartup(true);
908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tell the window manager that the user isn't logged in.
909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chromeos::WmIpc::instance()->SetLoggedInProperty(false);
910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set up keyboards. For example, when |locale| is "en-US", enable US qwerty
912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and US dvorak keyboard layouts.
913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (g_browser_process && g_browser_process->local_state()) {
914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string locale = g_browser_process->GetApplicationLocale();
915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string initial_input_method_id =
916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        g_browser_process->local_state()->GetString(
9173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            chromeos::language_prefs::kPreferredKeyboardLayout);
918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::input_method::EnableInputMethods(
919c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        locale, chromeos::input_method::kKeyboardLayoutsOnly,
920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        initial_input_method_id);
921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(size));
924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check whether we need to execute OOBE process.
9263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool oobe_complete = WizardController::IsOobeCompleted();
927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (first_screen_name.empty() &&
929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      oobe_complete &&
930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chromeos::CrosLibrary::Get()->EnsureLoaded() &&
931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(
932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          switches::kEnableLoginImages)) {
933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<chromeos::UserManager::User> users =
934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        chromeos::UserManager::Get()->GetUsers();
9353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Fix for users who updated device and thus never passed register screen.
9373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // If we already have user we assume that it is not a second part of OOBE.
9383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // See http://crosbug.com/6289
9393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!WizardController::IsDeviceRegistered() && !users.empty()) {
940731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      VLOG(1) << "Mark device registered because there are remembered users: "
941731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick              << users.size();
9423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WizardController::MarkDeviceRegistered();
9433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
9443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // ExistingUserController deletes itself.
946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (new chromeos::ExistingUserController(users, screen_bounds))->Init();
9473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Initiate services customization.
9493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    chromeos::ApplyServicesCustomization::StartIfNeeded();
9503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
953c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create and show the wizard.
9553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WizardController* controller = new WizardController();
956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Load startup manifest.
9583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  controller->SetCustomization(LoadStartupManifest());
959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string locale;
9613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller->GetCustomization()) {
9623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Switch to initial locale if specified by customization
9633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // and has not been set yet. We cannot call
9643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // chromeos::LanguageSwitchMenu::SwitchLanguage here before
9653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // EmitLoginPromptReady.
9663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string current_locale =
9673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        g_browser_process->local_state()->GetString(
9683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            prefs::kApplicationLocale);
969731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    VLOG(1) << "Current locale: " << current_locale;
9703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (current_locale.empty()) {
9713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      locale = controller->GetCustomization()->initial_locale();
972731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      VLOG(1) << "Initial locale: " << locale;
9733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (!locale.empty()) {
9743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        ResourceBundle::ReloadSharedInstance(locale);
975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller->ShowBackground(screen_bounds);
980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller->Init(first_screen_name, screen_bounds);
981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller->Show();
9823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
983513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  chromeos::LoginUtils::Get()->PrewarmAuthentication();
984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (chromeos::CrosLibrary::Get()->EnsureLoaded())
985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::CrosLibrary::Get()->GetLoginLibrary()->EmitLoginPromptReady();
9863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller->GetCustomization()) {
9883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!locale.empty())
9893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      chromeos::LanguageSwitchMenu::SwitchLanguage(locale);
9903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Set initial timezone if specified by customization.
9923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string timezone_name =
9933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        controller->GetCustomization()->initial_timezone();
994731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    VLOG(1) << "Initial time zone: " << timezone_name;
9953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Apply locale customizations only once so preserve whatever locale
9963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // user has changed to during OOBE.
9973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!timezone_name.empty()) {
9983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      icu::TimeZone* timezone = icu::TimeZone::createTimeZone(
9993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          icu::UnicodeString::fromUTF8(timezone_name));
10003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      chromeos::CrosLibrary::Get()->GetSystemLibrary()->SetTimezone(timezone);
10013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
10023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace browser
1006