wizard_controller.cc revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
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
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A boolean pref of the OOBE complete flag.
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kOobeComplete[] = "OobeComplete";
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Path to OEM partner startup customization manifest.
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kStartupCustomizationManifestPath[] =
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "/mnt/partner_partition/etc/chromeos/startup_manifest.json";
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Path to flag file indicating that OOBE was completed successfully.
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kOobeCompleteFlagFilePath[] =
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "/home/chronos/.oobe_completed";
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Upadate window will be behind the curtain at most |kMaximalCurtainTimeSec|.
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kMaximalCurtainTimeSec = 15;
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Time in seconds that we wait for the device to reboot.
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// If reboot didn't happen, ask user to reboot device manually.
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kWaitForRebootTimeSec = 3;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RootView of the Widget WizardController creates. Contains the contents of the
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController.
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ContentView : public views::View {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ContentView()
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : accel_enable_accessibility_(
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            WizardAccessibilityHelper::GetAccelerator()) {
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    AddAccelerator(accel_enable_accessibility_);
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OFFICIAL_BUILD)
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_account_screen_ = views::Accelerator(app::VKEY_A,
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               false, true, true);
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_login_screen_ = views::Accelerator(app::VKEY_L,
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             false, true, true);
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_network_screen_ = views::Accelerator(app::VKEY_N,
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               false, true, true);
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_update_screen_ = views::Accelerator(app::VKEY_U,
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                              false, true, true);
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_image_screen_ = views::Accelerator(app::VKEY_I,
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             false, true, true);
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_eula_screen_ = views::Accelerator(app::VKEY_E,
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                            false, true, true);
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_register_screen_ = views::Accelerator(app::VKEY_R,
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                false, true, true);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_account_screen_);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_login_screen_);
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_network_screen_);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_update_screen_);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_image_screen_);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_eula_screen_);
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    AddAccelerator(accel_register_screen_);
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~ContentView() {
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationService::current()->Notify(
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationType::WIZARD_CONTENT_VIEW_DESTROYED,
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationService::AllSources(),
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationService::NoDetails());
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool AcceleratorPressed(const views::Accelerator& accel) {
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WizardController* controller = WizardController::default_controller();
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!controller)
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (accel == accel_enable_accessibility_) {
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WizardAccessibilityHelper::GetInstance()->EnableAccessibility(
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          controller->contents());
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OFFICIAL_BUILD)
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else if (accel == accel_account_screen_) {
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowAccountScreen();
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_login_screen_) {
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowLoginScreen();
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_network_screen_) {
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowNetworkScreen();
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_update_screen_) {
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowUpdateScreen();
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_image_screen_) {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowUserImageScreen();
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_eula_screen_) {
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowEulaScreen();
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else if (accel == accel_register_screen_) {
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      controller->ShowRegistrationScreen();
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Layout() {
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int i = 0; i < GetChildViewCount(); ++i) {
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      views::View* cur = GetChildViewAt(i);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (cur->IsVisible())
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        cur->SetBounds(0, 0, width(), height());
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<views::Painter> painter_;
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OFFICIAL_BUILD)
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_account_screen_;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_login_screen_;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_network_screen_;
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_update_screen_;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_image_screen_;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_eula_screen_;
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Accelerator accel_register_screen_;
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Accelerator accel_enable_accessibility_;
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ContentView);
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DeleteWizardControllerAndLaunchBrowser(WizardController* controller) {
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete controller;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Launch browser after controller is deleted and its windows are closed.
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chromeos::LoginUtils::Get()->EnableBrowserLaunch(true);
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ChromeThread::PostTask(
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ChromeThread::UI,
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FROM_HERE,
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableFunction(&chromeos::LoginUtils::DoBrowserLaunch,
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          ProfileManager::GetDefaultProfile()));
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst chromeos::StartupCustomizationDocument* LoadStartupManifest() {
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Load partner customization startup manifest if it is available.
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath startup_manifest_path(kStartupCustomizationManifestPath);
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (file_util::PathExists(startup_manifest_path)) {
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_ptr<chromeos::StartupCustomizationDocument> customization(
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        new chromeos::StartupCustomizationDocument());
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool manifest_loaded = customization->LoadManifestFromFile(
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        startup_manifest_path);
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (manifest_loaded) {
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      LOG(INFO) << "Startup manifest loaded successfully";
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return customization.release();
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else {
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      LOG(ERROR) << "Error loading startup manifest. " <<
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          kStartupCustomizationManifestPath;
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return NULL;
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kNetworkScreenName[] = "network";
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kLoginScreenName[] = "login";
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kAccountScreenName[] = "account";
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kUpdateScreenName[] = "update";
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kUserImageScreenName[] = "image";
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kEulaScreenName[] = "eula";
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kRegistrationScreenName[] = "register";
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char WizardController::kHTMLPageScreenName[] = "html";
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Passing this parameter as a "first screen" initiates full OOBE flow.
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kOutOfBoxScreenName[] = "oobe";
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Special test value that commands not to create any window yet.
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kTestNoScreenName[] = "test:nowindow";
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Initialize default controller.
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController* WizardController::default_controller_ = NULL;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, public:
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController::WizardController()
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : widget_(NULL),
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      background_widget_(NULL),
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      background_view_(NULL),
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      contents_(NULL),
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      current_screen_(NULL),
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      is_official_build_(true),
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      is_official_build_(false),
2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_out_of_box_(false),
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_test_mode_(false),
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      observer_(NULL) {
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(default_controller_ == NULL);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_controller_ = this;
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController::~WizardController() {
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close ends up deleting the widget.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (background_widget_)
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_widget_->Close();
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (widget_)
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    widget_->Close();
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_controller_ = NULL;
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::Init(const std::string& first_screen_name,
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const gfx::Rect& screen_bounds) {
2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LOG(INFO) << "Starting OOBE wizard with screen: " << first_screen_name;
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!contents_);
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  first_screen_name_ = first_screen_name;
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // When device is not registered yet we need to load startup manifest as well.
2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // In case of OOBE (network-EULA-update) manifest has been loaded in
2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // ShowLoginWizard().
2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (IsOobeCompleted() && !IsDeviceRegistered())
2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SetCustomization(LoadStartupManifest());
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  screen_bounds_ = screen_bounds;
2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  contents_ = new ContentView();
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool oobe_complete = IsOobeCompleted();
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!oobe_complete || first_screen_name == kOutOfBoxScreenName) {
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    is_out_of_box_ = true;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowFirstScreen(first_screen_name);
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::Show() {
2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // In tests we might startup without initial screen
2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // so widget_ hasn't been created yet.
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (first_screen_name_ != kTestNoScreenName)
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(widget_);
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (widget_)
2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    widget_->Show();
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowBackground(const gfx::Rect& bounds) {
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!background_widget_);
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_widget_ =
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chromeos::BackgroundView::CreateWindowContainingView(bounds,
2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                           GURL(),
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                           &background_view_);
2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgressBarVisible(true);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_widget_->Show();
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OwnBackground(
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    views::Widget* background_widget,
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::BackgroundView* background_view) {
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!background_widget_);
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_widget_ = background_widget;
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_view_ = background_view;
3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->OnOwnerChanged();
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::NetworkScreen* WizardController::GetNetworkScreen() {
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!network_screen_.get())
3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    network_screen_.reset(new chromeos::NetworkScreen(this));
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return network_screen_.get();
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::LoginScreen* WizardController::GetLoginScreen() {
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!login_screen_.get())
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    login_screen_.reset(new chromeos::LoginScreen(this));
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return login_screen_.get();
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::AccountScreen* WizardController::GetAccountScreen() {
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!account_screen_.get())
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    account_screen_.reset(new chromeos::AccountScreen(this));
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return account_screen_.get();
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::UpdateScreen* WizardController::GetUpdateScreen() {
3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!update_screen_.get()) {
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    update_screen_.reset(new chromeos::UpdateScreen(this));
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    update_screen_->SetMaximalCurtainTime(kMaximalCurtainTimeSec);
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    update_screen_->SetRebootCheckDelay(kWaitForRebootTimeSec);
3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return update_screen_.get();
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::UserImageScreen* WizardController::GetUserImageScreen() {
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!user_image_screen_.get())
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    user_image_screen_.reset(new chromeos::UserImageScreen(this));
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return user_image_screen_.get();
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::EulaScreen* WizardController::GetEulaScreen() {
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!eula_screen_.get())
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    eula_screen_.reset(new chromeos::EulaScreen(this));
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return eula_screen_.get();
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::RegistrationScreen* WizardController::GetRegistrationScreen() {
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!registration_screen_.get())
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    registration_screen_.reset(new chromeos::RegistrationScreen(this));
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return registration_screen_.get();
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickchromeos::HTMLPageScreen* WizardController::GetHTMLPageScreen() {
3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!html_page_screen_.get()) {
3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    CommandLine* command_line = CommandLine::ForCurrentProcess();
3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string url;
3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // It's strange but args may contains empty strings.
3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (size_t i = 0; i < command_line->args().size(); i++) {
3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (!command_line->args()[i].empty()) {
3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        DCHECK(url.empty()) << "More than one URL in command line";
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        url = command_line->args()[i];
3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(!url.empty()) << "No URL in commane line";
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    html_page_screen_.reset(new chromeos::HTMLPageScreen(this, url));
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return html_page_screen_.get();
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowNetworkScreen() {
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(false);
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetNetworkScreen());
3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::SELECT_NETWORK);
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickchromeos::ExistingUserController* WizardController::ShowLoginScreen() {
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::SIGNIN);
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Initiate services customization.
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::ApplyServicesCustomization::StartIfNeeded();
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When run under automation test show plain login screen.
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!is_test_mode_ &&
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chromeos::CrosLibrary::Get()->EnsureLoaded() &&
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          switches::kEnableLoginImages)) {
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<chromeos::UserManager::User> users =
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        chromeos::UserManager::Get()->GetUsers();
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // ExistingUserController deletes itself.
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gfx::Rect screen_bounds;
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_widget_->GetBounds(&screen_bounds, true);
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::ExistingUserController* controller =
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        new chromeos::ExistingUserController(users, screen_bounds);
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    controller->OwnBackground(background_widget_, background_view_);
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    controller->Init();
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_widget_ = NULL;
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_view_ = NULL;
3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->DeleteSoon(FROM_HERE, this);
4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return controller;
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetLoginScreen());
4053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return NULL;
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowAccountScreen() {
4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LOG(INFO) << "Showing create account screen.";
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetAccountScreen());
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowUpdateScreen() {
4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LOG(INFO) << "Showing update screen.";
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetUpdateScreen());
4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // There is no special step for update.
4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
4203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::EULA);
4213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
4223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::SELECT_NETWORK);
4233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowUserImageScreen() {
4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LOG(INFO) << "Showing user image screen.";
4283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetStatusAreaVisible(false);
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetUserImageScreen());
4303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::PICTURE);
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowEulaScreen() {
4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LOG(INFO) << "Showing EULA screen.";
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(false);
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetEulaScreen());
4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::EULA);
4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowRegistrationScreen() {
4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!GetCustomization() ||
4443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      !GURL(GetCustomization()->registration_url()).is_valid()) {
4453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LOG(INFO) <<
4463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "Skipping registration screen: manifest not defined or invalid URL.";
4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnRegistrationSkipped();
4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LOG(INFO) << "Showing registration screen.";
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetRegistrationScreen());
4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::REGISTRATION);
4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::ShowHTMLPageScreen() {
4593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LOG(INFO) << "Showing HTML page screen.";
4603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetStatusAreaVisible(true);
4613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgressBarVisible(false);
4623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCurrentScreen(GetHTMLPageScreen());
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::SetCustomization(
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const chromeos::StartupCustomizationDocument* customization) {
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  customization_.reset(customization);
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst chromeos::StartupCustomizationDocument*
4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    WizardController::GetCustomization() const {
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return customization_.get();
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::SkipRegistration() {
4763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (current_screen_ == GetRegistrationScreen())
4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnRegistrationSkipped();
4783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  else
4793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LOG(ERROR) << "Registration screen is not active.";
4803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
4813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::RegisterPrefs(PrefService* local_state) {
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  local_state->RegisterBooleanPref(kOobeComplete, false);
4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Check if the pref is already registered in case
4863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Preferences::RegisterUserPrefs runs before this code in the future.
4873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (local_state->FindPreference(prefs::kAccessibilityEnabled) == NULL) {
4883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    local_state->RegisterBooleanPref(prefs::kAccessibilityEnabled, false);
4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, ExitHandlers:
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginSignInSelected() {
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't show user image screen in case of automated testing.
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (is_test_mode_) {
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->DeleteSoon(FROM_HERE, this);
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't launch browser until we pass image screen.
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chromeos::LoginUtils::Get()->EnableBrowserLaunch(false);
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowUserImageScreen();
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginGuestUser() {
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We're on the stack, so don't try and delete us now.
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->DeleteSoon(FROM_HERE, this);
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginCreateAccount() {
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowAccountScreen();
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnNetworkConnected() {
5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (is_official_build_) {
5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ShowEulaScreen();
5173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowUpdateScreen();
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GetUpdateScreen()->StartUpdate();
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnNetworkOffline() {
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(dpolukhin): if(is_out_of_box_) we cannot work offline and
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should report some error message here and stay on the same screen.
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowLoginScreen();
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnAccountCreateBack() {
5303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::ExistingUserController* controller = ShowLoginScreen();
5313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller)
5323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    controller->SelectNewUser();
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnAccountCreated() {
5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::ExistingUserController* controller = ShowLoginScreen();
5373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller)
5383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    controller->LoginNewUser(username_, password_);
5393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  else
5403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    Login(username_, password_);
5413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(dpolukhin): clear password memory for real. Now it is not
5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // a problem because we can't extract password from the form.
5433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  password_.clear();
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnConnectionFailed() {
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(dpolukhin): show error message after login screen is displayed.
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowLoginScreen();
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateCompleted() {
5523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  OnOOBECompleted();
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnEulaAccepted() {
5563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ShowUpdateScreen();
5573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GetUpdateScreen()->StartUpdate();
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateErrorCheckingForUpdate() {
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Update should be required during OOBE.
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We do not want to block users from being able to proceed to the login
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // screen if there is any error checking for an update.
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // They could use "browse without sign-in" feature to set up the network to be
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // able to perform the update later.
5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  OnOOBECompleted();
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateErrorUpdating() {
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there was an error while getting or applying the update,
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // return to network selection screen.
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Show message to the user explaining update error.
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Update should be required during OOBE.
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Temporary fix, need to migrate to new API. http://crosbug.com/4321
5753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  OnOOBECompleted();
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUserImageSelected() {
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We're on the stack, so don't try and delete us now.
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We should launch browser only after we delete the controller and close
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // its windows.
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ChromeThread::PostTask(
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ChromeThread::UI,
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FROM_HERE,
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableFunction(&DeleteWizardControllerAndLaunchBrowser,
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          this));
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(avayvod): Sync image with Google Sync.
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUserImageSkipped() {
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnUserImageSelected();
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnRegistrationSuccess() {
5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MarkDeviceRegistered();
5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (chromeos::UserManager::Get()->logged_in_user().email().empty()) {
5973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    chromeos::LoginUtils::Get()->CompleteOffTheRecordLogin(start_url_);
5983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ShowUserImageScreen();
6003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnRegistrationSkipped() {
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Track in a histogram?
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnRegistrationSuccess();
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::OnOOBECompleted() {
6093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MarkOobeCompleted();
6103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ShowLoginScreen();
6113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, private:
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickviews::WidgetGtk* WizardController::CreateScreenWindow(
6173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const gfx::Rect& bounds, bool initial_show) {
6183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::WidgetGtk* window =
6193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW);
6203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  widget_ = window;
6213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->MakeTransparent();
6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Window transparency makes background flicker through controls that
6233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // are constantly updating its contents (like image view with video
6243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // stream). Hence enabling double buffer.
6253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->EnableDoubleBuffer(true);
6263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->Init(NULL, bounds);
6273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::vector<int> params;
6283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // For initial show WM would animate background window.
6293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Otherwise it stays unchaged.
6303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  params.push_back(initial_show);
6313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::WmIpc::instance()->SetWindowType(
6323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      window->GetNativeView(),
6333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      chromeos::WM_IPC_WINDOW_LOGIN_GUEST,
6343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      &params);
6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->SetContentsView(contents_);
6363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return window;
6373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickgfx::Rect WizardController::GetWizardScreenBounds(int screen_width,
6403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                  int screen_height) const {
6413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int offset_x = (screen_bounds_.width() - screen_width) / 2;
6423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int offset_y = (screen_bounds_.height() - screen_height) / 2;
6433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int window_x = screen_bounds_.x() + offset_x;
6443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int window_y = screen_bounds_.y() + offset_y;
6453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return gfx::Rect(window_x, window_y, screen_width, screen_height);
6463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::SetCurrentScreen(WizardScreen* new_current) {
6503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (current_screen_ == new_current ||
6513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      new_current == NULL)
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
6533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool initial_show = true;
6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (current_screen_) {
6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    initial_show = false;
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    current_screen_->Hide();
6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  current_screen_ = new_current;
6613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool force_widget_show = false;
6623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::WidgetGtk* window = NULL;
6633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Rect current_bounds;
6653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (widget_)
6663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    widget_->GetBounds(&current_bounds, false);
6673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Size new_screen_size = current_screen_->GetScreenSize();
6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Rect new_bounds = GetWizardScreenBounds(new_screen_size.width(),
6693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               new_screen_size.height());
6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (new_bounds != current_bounds) {
6713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (widget_)
6723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      widget_->Close();
6733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    force_widget_show = true;
6743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    window = CreateScreenWindow(new_bounds, initial_show);
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
6763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  current_screen_->Show();
6773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  contents_->Layout();
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  contents_->SchedulePaint();
6793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (force_widget_show) {
6803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // This keeps the window from flashing at startup.
6813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    GdkWindow* gdk_window = window->GetNativeView()->window;
6823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    gdk_window_set_back_pixmap(gdk_window, NULL, false);
6833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (widget_)
6843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      widget_->Show();
6853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::SetStatusAreaVisible(bool visible) {
6893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // When ExistingUserController passes background ownership
6903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to WizardController it happens after screen is shown.
6913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (background_view_) {
6923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_view_->SetStatusAreaVisible(visible);
6933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowFirstScreen(const std::string& first_screen_name) {
697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (first_screen_name == kNetworkScreenName) {
698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowNetworkScreen();
699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kLoginScreenName) {
700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This flag is passed if we're running under automation test.
701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    is_test_mode_ = true;
702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowLoginScreen();
703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kAccountScreenName) {
704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowAccountScreen();
705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kUpdateScreenName) {
706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowUpdateScreen();
707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GetUpdateScreen()->StartUpdate();
708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kUserImageScreenName) {
709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowUserImageScreen();
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kEulaScreenName) {
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowEulaScreen();
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kRegistrationScreenName) {
7133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (is_official_build_) {
7143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ShowRegistrationScreen();
7153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else {
7163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      // Just proceed to image screen.
7173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      OnRegistrationSuccess();
7183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (first_screen_name == kHTMLPageScreenName) {
7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ShowHTMLPageScreen();
721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name != kTestNoScreenName) {
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (is_out_of_box_) {
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ShowNetworkScreen();
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ShowLoginScreen();
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::Login(const std::string& username,
7313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             const std::string& password) {
7323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::LoginScreen* login = GetLoginScreen();
7333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (username.empty())
7343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
7353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login->view()->SetUsername(username);
7363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (password.empty())
7383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
7393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login->view()->SetPassword(password);
7403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login->view()->Login();
7413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WizardController::IsOobeCompleted() {
7453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return g_browser_process->local_state()->GetBoolean(kOobeComplete);
7463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::MarkOobeCompleted() {
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* prefs = g_browser_process->local_state();
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  prefs->SetBoolean(kOobeComplete, true);
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure that changes are reflected immediately.
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  prefs->SavePersistentPrefs();
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WizardController::IsDeviceRegistered() {
7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath oobe_complete_flag_file_path(kOobeCompleteFlagFilePath);
7593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return file_util::PathExists(oobe_complete_flag_file_path);
7603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::MarkDeviceRegistered() {
7643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create flag file for boot-time init scripts.
7653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath oobe_complete_path(kOobeCompleteFlagFilePath);
7663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FILE* oobe_flag_file = file_util::OpenFile(oobe_complete_path, "w+b");
7673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(oobe_flag_file != NULL) << kOobeCompleteFlagFilePath;
7683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (oobe_flag_file != NULL)
7693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    file_util::CloseFile(oobe_flag_file);
7703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, chromeos::ScreenObserver overrides:
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnExit(ExitCodes exit_code) {
7753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LOG(INFO) << "Wizard screen exit code: " << exit_code;
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (exit_code) {
777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case LOGIN_SIGN_IN_SELECTED:
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnLoginSignInSelected();
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case LOGIN_GUEST_SELECTED:
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnLoginGuestUser();
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case LOGIN_CREATE_ACCOUNT:
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnLoginCreateAccount();
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NETWORK_CONNECTED:
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnNetworkConnected();
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NETWORK_OFFLINE:
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnNetworkOffline();
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ACCOUNT_CREATE_BACK:
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnAccountCreateBack();
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ACCOUNT_CREATED:
796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnAccountCreated();
797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case CONNECTION_FAILED:
799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnConnectionFailed();
800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_INSTALLED:
802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_NOUPDATE:
803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUpdateCompleted();
804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_ERROR_CHECKING_FOR_UPDATE:
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUpdateErrorCheckingForUpdate();
807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_ERROR_UPDATING:
809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUpdateErrorUpdating();
810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case USER_IMAGE_SELECTED:
812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUserImageSelected();
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case USER_IMAGE_SKIPPED:
815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUserImageSkipped();
816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case EULA_ACCEPTED:
818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnEulaAccepted();
819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
8203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case EULA_BACK:
8213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ShowNetworkScreen();
8223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case REGISTRATION_SUCCESS:
824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnRegistrationSuccess();
825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case REGISTRATION_SKIPPED:
827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnRegistrationSkipped();
828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::OnSetUserNamePassword(const std::string& username,
8353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             const std::string& password) {
8363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  username_ = username;
8373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  password_ = password;
8383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, WizardScreen overrides:
842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::View* WizardController::GetWizardView() {
843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return contents_;
844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::ScreenObserver* WizardController::GetObserver(WizardScreen* screen) {
847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return observer_ ? observer_ : this;
848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser {
851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Declared in browser_dialogs.h so that others don't need to depend on our .h.
853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ShowLoginWizard(const std::string& first_screen_name,
854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     const gfx::Size& size) {
855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LOG(INFO) << "showing login screen: " << first_screen_name;
856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The login screen will enable alternate keyboard layouts, but we don't want
8583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to start the IME process unless one is selected.
8593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::CrosLibrary::Get()->GetInputMethodLibrary()->
8603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      SetDeferImeStartup(true);
861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tell the window manager that the user isn't logged in.
862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chromeos::WmIpc::instance()->SetLoggedInProperty(false);
863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set up keyboards. For example, when |locale| is "en-US", enable US qwerty
865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and US dvorak keyboard layouts.
866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (g_browser_process && g_browser_process->local_state()) {
867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string locale = g_browser_process->GetApplicationLocale();
868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string initial_input_method_id =
869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        g_browser_process->local_state()->GetString(
8703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            chromeos::language_prefs::kPreferredKeyboardLayout);
871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::input_method::EnableInputMethods(
872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        locale, chromeos::input_method::kKeyboardLayoutsOnly,
873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        initial_input_method_id);
874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(size));
877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check whether we need to execute OOBE process.
8793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool oobe_complete = WizardController::IsOobeCompleted();
880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (first_screen_name.empty() &&
882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      oobe_complete &&
883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chromeos::CrosLibrary::Get()->EnsureLoaded() &&
884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(
885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          switches::kEnableLoginImages)) {
886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<chromeos::UserManager::User> users =
887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        chromeos::UserManager::Get()->GetUsers();
8883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Fix for users who updated device and thus never passed register screen.
8903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // If we already have user we assume that it is not a second part of OOBE.
8913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // See http://crosbug.com/6289
8923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!WizardController::IsDeviceRegistered() && !users.empty()) {
8933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      LOG(INFO) << "Mark device registered because there are remembered users: "
8943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                << users.size();
8953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WizardController::MarkDeviceRegistered();
8963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
8973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // ExistingUserController deletes itself.
899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (new chromeos::ExistingUserController(users, screen_bounds))->Init();
9003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Initiate services customization.
9023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    chromeos::ApplyServicesCustomization::StartIfNeeded();
9033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create and show the wizard.
9083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WizardController* controller = new WizardController();
909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Load startup manifest.
9113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  controller->SetCustomization(LoadStartupManifest());
912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string locale;
9143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller->GetCustomization()) {
9153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Switch to initial locale if specified by customization
9163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // and has not been set yet. We cannot call
9173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // chromeos::LanguageSwitchMenu::SwitchLanguage here before
9183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // EmitLoginPromptReady.
9193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string current_locale =
9203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        g_browser_process->local_state()->GetString(
9213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            prefs::kApplicationLocale);
9223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LOG(INFO) << "current locale: " << current_locale;
9233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (current_locale.empty()) {
9243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      locale = controller->GetCustomization()->initial_locale();
9253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      LOG(INFO) << "initial locale: " << locale;
9263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (!locale.empty()) {
9273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        ResourceBundle::ReloadSharedInstance(locale);
928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller->ShowBackground(screen_bounds);
933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller->Init(first_screen_name, screen_bounds);
934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller->Show();
9353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (chromeos::CrosLibrary::Get()->EnsureLoaded())
937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::CrosLibrary::Get()->GetLoginLibrary()->EmitLoginPromptReady();
9383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller->GetCustomization()) {
9403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!locale.empty())
9413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      chromeos::LanguageSwitchMenu::SwitchLanguage(locale);
9423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Set initial timezone if specified by customization.
9443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string timezone_name =
9453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        controller->GetCustomization()->initial_timezone();
9463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LOG(INFO) << "initial time zone: " << timezone_name;
9473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Apply locale customizations only once so preserve whatever locale
9483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // user has changed to during OOBE.
9493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!timezone_name.empty()) {
9503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      icu::TimeZone* timezone = icu::TimeZone::createTimeZone(
9513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          icu::UnicodeString::fromUTF8(timezone_name));
9523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      chromeos::CrosLibrary::Get()->GetSystemLibrary()->SetTimezone(timezone);
9533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
9543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
955c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace browser
958