wizard_controller.cc revision 201ade2fbba22bfb27ae029f4d23fca6ded109a0
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"
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/chromeos/cros/cryptohome_library.h"
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/cros/input_method_library.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/login_library.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/system_library.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/customization_document.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/input_method/input_method_util.h"
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/language_preferences.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/account_screen.h"
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/apply_services_customization.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/background_view.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/eula_view.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/existing_user_controller.h"
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/helper.h"
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/html_page_screen.h"
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/language_switch_menu.h"
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/login_screen.h"
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/login_utils.h"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/network_screen.h"
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/registration_screen.h"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/rounded_rect_painter.h"
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/update_screen.h"
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_image_screen.h"
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_manager.h"
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/wizard_accessibility_helper.h"
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/wm_ipc.h"
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/profile_manager.h"
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h"
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/notification_service.h"
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/common/notification_type.h"
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/pref_names.h"
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "cros/chromeos_wm_ipc_enums.h"
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "unicode/timezone.h"
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/accelerator.h"
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/painter.h"
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/view.h"
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget_gtk.h"
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// A boolean pref of the EULA accepted flag.
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst char kEulaAccepted[] = "EulaAccepted";
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A boolean pref of the OOBE complete flag.
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kOobeComplete[] = "OobeComplete";
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Path to OEM partner startup customization manifest.
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kStartupCustomizationManifestPath[] =
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "/mnt/partner_partition/etc/chromeos/startup_manifest.json";
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Path to flag file indicating that OOBE was completed successfully.
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kOobeCompleteFlagFilePath[] =
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "/home/chronos/.oobe_completed";
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Time in seconds that we wait for the device to reboot.
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// If reboot didn't happen, ask user to reboot device manually.
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kWaitForRebootTimeSec = 3;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RootView of the Widget WizardController creates. Contains the contents of the
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController.
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ContentView : public views::View {
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ContentView()
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : accel_enable_accessibility_(
84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            chromeos::WizardAccessibilityHelper::GetAccelerator()) {
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(OFFICIAL_BUILD)
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    accel_cancel_update_ =  views::Accelerator(app::VKEY_ESCAPE,
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                               true, true, true);
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#else
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    accel_cancel_update_ =  views::Accelerator(app::VKEY_ESCAPE,
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                               false, false, false);
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_account_screen_ = views::Accelerator(app::VKEY_A,
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               false, true, true);
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_login_screen_ = views::Accelerator(app::VKEY_L,
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             false, true, true);
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_network_screen_ = views::Accelerator(app::VKEY_N,
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               false, true, true);
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_update_screen_ = views::Accelerator(app::VKEY_U,
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                              false, true, true);
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_image_screen_ = views::Accelerator(app::VKEY_I,
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             false, true, true);
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_eula_screen_ = views::Accelerator(app::VKEY_E,
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                            false, true, true);
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    accel_register_screen_ = views::Accelerator(app::VKEY_R,
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                false, true, true);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_account_screen_);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_login_screen_);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_network_screen_);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_update_screen_);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_image_screen_);
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddAccelerator(accel_eula_screen_);
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    AddAccelerator(accel_register_screen_);
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AddAccelerator(accel_enable_accessibility_);
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AddAccelerator(accel_cancel_update_);
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~ContentView() {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationService::current()->Notify(
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationType::WIZARD_CONTENT_VIEW_DESTROYED,
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationService::AllSources(),
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NotificationService::NoDetails());
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool AcceleratorPressed(const views::Accelerator& accel) {
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WizardController* controller = WizardController::default_controller();
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!controller)
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (accel == accel_enable_accessibility_) {
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      chromeos::WizardAccessibilityHelper::GetInstance()->EnableAccessibility(
131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          controller->contents()); }
132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    else if (accel == accel_cancel_update_) {
133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      controller->CancelOOBEUpdate();
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OFFICIAL_BUILD)
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else if (accel == accel_account_screen_) {
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowAccountScreen();
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_login_screen_) {
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowLoginScreen();
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_network_screen_) {
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowNetworkScreen();
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_update_screen_) {
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowUpdateScreen();
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_image_screen_) {
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowUserImageScreen();
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (accel == accel_eula_screen_) {
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller->ShowEulaScreen();
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else if (accel == accel_register_screen_) {
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      controller->ShowRegistrationScreen();
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Layout() {
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int i = 0; i < GetChildViewCount(); ++i) {
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      views::View* cur = GetChildViewAt(i);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (cur->IsVisible())
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        cur->SetBounds(0, 0, width(), height());
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<views::Painter> painter_;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OFFICIAL_BUILD)
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_account_screen_;
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_login_screen_;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_network_screen_;
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_update_screen_;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_image_screen_;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_eula_screen_;
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Accelerator accel_register_screen_;
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Accelerator accel_enable_accessibility_;
178201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  views::Accelerator accel_cancel_update_;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ContentView);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DeleteWizardControllerAndLaunchBrowser(WizardController* controller) {
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete controller;
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Launch browser after controller is deleted and its windows are closed.
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chromeos::LoginUtils::Get()->EnableBrowserLaunch(true);
187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::UI,
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FROM_HERE,
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableFunction(&chromeos::LoginUtils::DoBrowserLaunch,
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          ProfileManager::GetDefaultProfile()));
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst chromeos::StartupCustomizationDocument* LoadStartupManifest() {
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Load partner customization startup manifest if it is available.
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath startup_manifest_path(kStartupCustomizationManifestPath);
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (file_util::PathExists(startup_manifest_path)) {
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_ptr<chromeos::StartupCustomizationDocument> customization(
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        new chromeos::StartupCustomizationDocument());
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool manifest_loaded = customization->LoadManifestFromFile(
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        startup_manifest_path);
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (manifest_loaded) {
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      VLOG(1) << "Startup manifest loaded successfully";
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return customization.release();
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    LOG(ERROR) << "Error loading startup manifest: "
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick               << kStartupCustomizationManifestPath;
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return NULL;
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Returns true if startup manifest defines valid registration URL.
214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool IsRegistrationScreenValid(
215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const chromeos::StartupCustomizationDocument* startup_manifest) {
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return startup_manifest != NULL &&
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick         GURL(startup_manifest->registration_url()).is_valid();
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Saves boolean "Local State" preference and forces it's persistence to disk.
221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SaveBoolPreferenceForced(const char* pref_name, bool value) {
222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  PrefService* prefs = g_browser_process->local_state();
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  prefs->SetBoolean(pref_name, value);
224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  prefs->SavePersistentPrefs();
225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kNetworkScreenName[] = "network";
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kLoginScreenName[] = "login";
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kAccountScreenName[] = "account";
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kUpdateScreenName[] = "update";
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kUserImageScreenName[] = "image";
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kEulaScreenName[] = "eula";
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kRegistrationScreenName[] = "register";
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char WizardController::kHTMLPageScreenName[] = "html";
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Passing this parameter as a "first screen" initiates full OOBE flow.
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kOutOfBoxScreenName[] = "oobe";
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Special test value that commands not to create any window yet.
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char WizardController::kTestNoScreenName[] = "test:nowindow";
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Initialize default controller.
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController* WizardController::default_controller_ = NULL;
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, public:
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController::WizardController()
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : widget_(NULL),
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      background_widget_(NULL),
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      background_view_(NULL),
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      contents_(NULL),
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      current_screen_(NULL),
2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      is_official_build_(true),
2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      is_official_build_(false),
2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_out_of_box_(false),
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_test_mode_(false),
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      observer_(NULL) {
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(default_controller_ == NULL);
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_controller_ = this;
267201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  registrar_.Add(
268201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      this,
269201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NotificationType::APP_TERMINATING,
270201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NotificationService::AllSources());
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWizardController::~WizardController() {
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close ends up deleting the widget.
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (background_widget_)
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_widget_->Close();
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (widget_)
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    widget_->Close();
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_controller_ = NULL;
282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  chromeos::WizardAccessibilityHelper::GetInstance()->
283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UnregisterNotifications();
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::Init(const std::string& first_screen_name,
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            const gfx::Rect& screen_bounds) {
288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Starting OOBE wizard with screen: " << first_screen_name;
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!contents_);
2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  first_screen_name_ = first_screen_name;
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // When device is not registered yet we need to load startup manifest as well.
2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // In case of OOBE (network-EULA-update) manifest has been loaded in
2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // ShowLoginWizard().
2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (IsOobeCompleted() && !IsDeviceRegistered())
2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SetCustomization(LoadStartupManifest());
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  screen_bounds_ = screen_bounds;
2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  contents_ = new ContentView();
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool oobe_complete = IsOobeCompleted();
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!oobe_complete || first_screen_name == kOutOfBoxScreenName) {
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    is_out_of_box_ = true;
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowFirstScreen(first_screen_name);
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::Show() {
3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // In tests we might startup without initial screen
3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // so widget_ hasn't been created yet.
3123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (first_screen_name_ != kTestNoScreenName)
3133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(widget_);
3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (widget_)
3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    widget_->Show();
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowBackground(const gfx::Rect& bounds) {
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!background_widget_);
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_widget_ =
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chromeos::BackgroundView::CreateWindowContainingView(bounds,
3223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                           GURL(),
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                           &background_view_);
3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgressBarVisible(true);
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_widget_->Show();
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OwnBackground(
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    views::Widget* background_widget,
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::BackgroundView* background_view) {
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!background_widget_);
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_widget_ = background_widget;
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_view_ = background_view;
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
336201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid WizardController::CancelOOBEUpdate() {
337201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (update_screen_.get() &&
338201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      update_screen_.get() == current_screen_) {
339201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GetUpdateScreen()->CancelUpdate();
340201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
341201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
342201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::NetworkScreen* WizardController::GetNetworkScreen() {
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!network_screen_.get())
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    network_screen_.reset(new chromeos::NetworkScreen(this));
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return network_screen_.get();
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::LoginScreen* WizardController::GetLoginScreen() {
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!login_screen_.get())
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    login_screen_.reset(new chromeos::LoginScreen(this));
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return login_screen_.get();
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::AccountScreen* WizardController::GetAccountScreen() {
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!account_screen_.get())
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    account_screen_.reset(new chromeos::AccountScreen(this));
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return account_screen_.get();
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::UpdateScreen* WizardController::GetUpdateScreen() {
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!update_screen_.get()) {
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    update_screen_.reset(new chromeos::UpdateScreen(this));
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    update_screen_->SetRebootCheckDelay(kWaitForRebootTimeSec);
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return update_screen_.get();
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::UserImageScreen* WizardController::GetUserImageScreen() {
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!user_image_screen_.get())
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    user_image_screen_.reset(new chromeos::UserImageScreen(this));
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return user_image_screen_.get();
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::EulaScreen* WizardController::GetEulaScreen() {
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!eula_screen_.get())
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    eula_screen_.reset(new chromeos::EulaScreen(this));
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return eula_screen_.get();
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::RegistrationScreen* WizardController::GetRegistrationScreen() {
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!registration_screen_.get())
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    registration_screen_.reset(new chromeos::RegistrationScreen(this));
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return registration_screen_.get();
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickchromeos::HTMLPageScreen* WizardController::GetHTMLPageScreen() {
3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!html_page_screen_.get()) {
3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    CommandLine* command_line = CommandLine::ForCurrentProcess();
3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string url;
3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // It's strange but args may contains empty strings.
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (size_t i = 0; i < command_line->args().size(); i++) {
3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (!command_line->args()[i].empty()) {
3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        DCHECK(url.empty()) << "More than one URL in command line";
3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        url = command_line->args()[i];
3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(!url.empty()) << "No URL in commane line";
3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    html_page_screen_.reset(new chromeos::HTMLPageScreen(this, url));
4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return html_page_screen_.get();
4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowNetworkScreen() {
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(false);
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetNetworkScreen());
4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::SELECT_NETWORK);
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickchromeos::ExistingUserController* WizardController::ShowLoginScreen() {
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
4123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::SIGNIN);
4133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Initiate services customization.
4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::ApplyServicesCustomization::StartIfNeeded();
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When run under automation test show plain login screen.
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!is_test_mode_ &&
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chromeos::CrosLibrary::Get()->EnsureLoaded() &&
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          switches::kEnableLoginImages)) {
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<chromeos::UserManager::User> users =
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        chromeos::UserManager::Get()->GetUsers();
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // ExistingUserController deletes itself.
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gfx::Rect screen_bounds;
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_widget_->GetBounds(&screen_bounds, true);
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::ExistingUserController* controller =
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        new chromeos::ExistingUserController(users, screen_bounds);
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    controller->OwnBackground(background_widget_, background_view_);
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    controller->Init();
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_widget_ = NULL;
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    background_view_ = NULL;
4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->DeleteSoon(FROM_HERE, this);
4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return controller;
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetLoginScreen());
4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return NULL;
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowAccountScreen() {
444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing create account screen.";
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetAccountScreen());
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowUpdateScreen() {
450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing update screen.";
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetUpdateScreen());
4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // There is no special step for update.
4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::EULA);
4563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
4573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::SELECT_NETWORK);
4583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowUserImageScreen() {
462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing user image screen.";
4633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetStatusAreaVisible(false);
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetUserImageScreen());
4653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::PICTURE);
466201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  background_view_->EnableShutdownButton(false);
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowEulaScreen() {
470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing EULA screen.";
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(false);
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetEulaScreen());
4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::EULA);
4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowRegistrationScreen() {
479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!IsRegistrationScreenValid(GetCustomization())) {
480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    VLOG(1) << "Skipping registration screen: manifest not defined or invalid "
481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick               "URL.";
4823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnRegistrationSkipped();
4833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing registration screen.";
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetStatusAreaVisible(true);
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCurrentScreen(GetRegistrationScreen());
4883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgress(chromeos::BackgroundView::REGISTRATION);
4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::ShowHTMLPageScreen() {
494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing HTML page screen.";
4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetStatusAreaVisible(true);
4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_view_->SetOobeProgressBarVisible(false);
4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetCurrentScreen(GetHTMLPageScreen());
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::SetCustomization(
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const chromeos::StartupCustomizationDocument* customization) {
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  customization_.reset(customization);
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst chromeos::StartupCustomizationDocument*
5063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    WizardController::GetCustomization() const {
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return customization_.get();
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::SkipRegistration() {
5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (current_screen_ == GetRegistrationScreen())
5123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnRegistrationSkipped();
5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  else
5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LOG(ERROR) << "Registration screen is not active.";
5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
517201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid WizardController::Observe(NotificationType type,
518201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                               const NotificationSource& source,
519201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                               const NotificationDetails& details) {
520201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CHECK(type == NotificationType::APP_TERMINATING);
521201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
522201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  MessageLoop::current()->DeleteSoon(FROM_HERE, this);
523201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  MessageLoop::current()->Quit();
524201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  registrar_.Remove(this,
525201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                    NotificationType::APP_TERMINATING,
526201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                    NotificationService::AllSources());
527201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
528201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::RegisterPrefs(PrefService* local_state) {
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  local_state->RegisterBooleanPref(kOobeComplete, false);
532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  local_state->RegisterBooleanPref(kEulaAccepted, false);
5333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Check if the pref is already registered in case
5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Preferences::RegisterUserPrefs runs before this code in the future.
5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (local_state->FindPreference(prefs::kAccessibilityEnabled) == NULL) {
5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    local_state->RegisterBooleanPref(prefs::kAccessibilityEnabled, false);
5373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, ExitHandlers:
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginSignInSelected() {
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't show user image screen in case of automated testing.
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (is_test_mode_) {
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->DeleteSoon(FROM_HERE, this);
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't launch browser until we pass image screen.
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chromeos::LoginUtils::Get()->EnableBrowserLaunch(false);
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowUserImageScreen();
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginGuestUser() {
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We're on the stack, so don't try and delete us now.
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->DeleteSoon(FROM_HERE, this);
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnLoginCreateAccount() {
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowAccountScreen();
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnNetworkConnected() {
5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (is_official_build_) {
564731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!IsEulaAccepted()) {
565731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ShowEulaScreen();
566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    } else {
567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Possible cases:
568731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // 1. EULA was accepted, forced shutdown/reboot during update.
569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // 2. EULA was accepted, planned reboot after update.
570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Make sure that device is up-to-date.
571731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      InitiateOOBEUpdate();
572731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
574731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    InitiateOOBEUpdate();
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnNetworkOffline() {
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(dpolukhin): if(is_out_of_box_) we cannot work offline and
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should report some error message here and stay on the same screen.
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowLoginScreen();
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnAccountCreateBack() {
5853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::ExistingUserController* controller = ShowLoginScreen();
5863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller)
5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    controller->SelectNewUser();
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnAccountCreated() {
5913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::ExistingUserController* controller = ShowLoginScreen();
5923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller)
5933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    controller->LoginNewUser(username_, password_);
5943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  else
5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    Login(username_, password_);
5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(dpolukhin): clear password memory for real. Now it is not
5973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // a problem because we can't extract password from the form.
5983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  password_.clear();
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnConnectionFailed() {
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(dpolukhin): show error message after login screen is displayed.
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowLoginScreen();
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateCompleted() {
6073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  OnOOBECompleted();
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnEulaAccepted() {
611731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MarkEulaAccepted();
6124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (chromeos::CrosLibrary::Get()->EnsureLoaded()) {
6134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // TPM password could be seen on EULA screen, now it's safe to clear it.
6144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    chromeos::CrosLibrary::Get()->
6154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        GetCryptohomeLibrary()->TpmClearStoredPassword();
6164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
617731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  InitiateOOBEUpdate();
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateErrorCheckingForUpdate() {
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Update should be required during OOBE.
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We do not want to block users from being able to proceed to the login
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // screen if there is any error checking for an update.
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // They could use "browse without sign-in" feature to set up the network to be
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // able to perform the update later.
6263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  OnOOBECompleted();
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUpdateErrorUpdating() {
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there was an error while getting or applying the update,
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // return to network selection screen.
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Show message to the user explaining update error.
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Update should be required during OOBE.
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Temporary fix, need to migrate to new API. http://crosbug.com/4321
6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  OnOOBECompleted();
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUserImageSelected() {
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We're on the stack, so don't try and delete us now.
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We should launch browser only after we delete the controller and close
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // its windows.
642731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
643731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::UI,
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FROM_HERE,
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableFunction(&DeleteWizardControllerAndLaunchBrowser,
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          this));
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(avayvod): Sync image with Google Sync.
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnUserImageSkipped() {
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnUserImageSelected();
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnRegistrationSuccess() {
6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MarkDeviceRegistered();
6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (chromeos::UserManager::Get()->logged_in_user().email().empty()) {
6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    chromeos::LoginUtils::Get()->CompleteOffTheRecordLogin(start_url_);
6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
6593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ShowUserImageScreen();
6603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnRegistrationSkipped() {
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(nkostylev): Track in a histogram?
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnRegistrationSuccess();
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::OnOOBECompleted() {
6693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MarkOobeCompleted();
6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ShowLoginScreen();
6713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
673731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid WizardController::InitiateOOBEUpdate() {
674731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ShowUpdateScreen();
675731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetUpdateScreen()->StartUpdate();
676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
677731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, private:
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickviews::WidgetGtk* WizardController::CreateScreenWindow(
6823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const gfx::Rect& bounds, bool initial_show) {
6833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::WidgetGtk* window =
6843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW);
6853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  widget_ = window;
6863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->MakeTransparent();
6873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Window transparency makes background flicker through controls that
6883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // are constantly updating its contents (like image view with video
6893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // stream). Hence enabling double buffer.
6903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->EnableDoubleBuffer(true);
6913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->Init(NULL, bounds);
6923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::vector<int> params;
6933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // For initial show WM would animate background window.
6943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Otherwise it stays unchaged.
6953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  params.push_back(initial_show);
6963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::WmIpc::instance()->SetWindowType(
6973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      window->GetNativeView(),
6983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      chromeos::WM_IPC_WINDOW_LOGIN_GUEST,
6993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      &params);
7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  window->SetContentsView(contents_);
7013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return window;
7023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickgfx::Rect WizardController::GetWizardScreenBounds(int screen_width,
7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                  int screen_height) const {
7063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int offset_x = (screen_bounds_.width() - screen_width) / 2;
7073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int offset_y = (screen_bounds_.height() - screen_height) / 2;
7083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int window_x = screen_bounds_.x() + offset_x;
7093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int window_y = screen_bounds_.y() + offset_y;
7103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return gfx::Rect(window_x, window_y, screen_width, screen_height);
7113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::SetCurrentScreen(WizardScreen* new_current) {
7153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (current_screen_ == new_current ||
7163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      new_current == NULL)
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
7183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool initial_show = true;
7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (current_screen_) {
7213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    initial_show = false;
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    current_screen_->Hide();
7233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
7243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  current_screen_ = new_current;
7263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool force_widget_show = false;
7273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::WidgetGtk* window = NULL;
7283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Rect current_bounds;
7303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (widget_)
7313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    widget_->GetBounds(&current_bounds, false);
7323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Size new_screen_size = current_screen_->GetScreenSize();
7333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Rect new_bounds = GetWizardScreenBounds(new_screen_size.width(),
7343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               new_screen_size.height());
7353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (new_bounds != current_bounds) {
7363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (widget_)
7373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      widget_->Close();
7383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    force_widget_show = true;
7393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    window = CreateScreenWindow(new_bounds, initial_show);
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
7413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  current_screen_->Show();
7423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  contents_->Layout();
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  contents_->SchedulePaint();
7443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (force_widget_show) {
7453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // This keeps the window from flashing at startup.
7463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    GdkWindow* gdk_window = window->GetNativeView()->window;
7473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    gdk_window_set_back_pixmap(gdk_window, NULL, false);
7483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (widget_)
7493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      widget_->Show();
7503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::SetStatusAreaVisible(bool visible) {
7543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // When ExistingUserController passes background ownership
7553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to WizardController it happens after screen is shown.
7563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (background_view_) {
7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_view_->SetStatusAreaVisible(visible);
7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::ShowFirstScreen(const std::string& first_screen_name) {
762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (first_screen_name == kNetworkScreenName) {
763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowNetworkScreen();
764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kLoginScreenName) {
765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This flag is passed if we're running under automation test.
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    is_test_mode_ = true;
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowLoginScreen();
768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kAccountScreenName) {
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowAccountScreen();
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kUpdateScreenName) {
771731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    InitiateOOBEUpdate();
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kUserImageScreenName) {
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowUserImageScreen();
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kEulaScreenName) {
775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ShowEulaScreen();
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name == kRegistrationScreenName) {
7773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (is_official_build_) {
7783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ShowRegistrationScreen();
7793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else {
7803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      // Just proceed to image screen.
7813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      OnRegistrationSuccess();
7823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
7833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (first_screen_name == kHTMLPageScreenName) {
7843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ShowHTMLPageScreen();
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (first_screen_name != kTestNoScreenName) {
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (is_out_of_box_) {
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ShowNetworkScreen();
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ShowLoginScreen();
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::Login(const std::string& username,
7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             const std::string& password) {
7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::LoginScreen* login = GetLoginScreen();
7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (username.empty())
7983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login->view()->SetUsername(username);
8003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (password.empty())
8023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
8033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login->view()->SetPassword(password);
8043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login->view()->Login();
8053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
808731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool WizardController::IsEulaAccepted() {
809731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return g_browser_process->local_state()->GetBoolean(kEulaAccepted);
810731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
811731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
812731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
8133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WizardController::IsOobeCompleted() {
8143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return g_browser_process->local_state()->GetBoolean(kOobeComplete);
8153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
818731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid WizardController::MarkEulaAccepted() {
819731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SaveBoolPreferenceForced(kEulaAccepted, true);
820731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
821731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
822731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::MarkOobeCompleted() {
824731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SaveBoolPreferenceForced(kOobeComplete, true);
825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WizardController::IsDeviceRegistered() {
8293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath oobe_complete_flag_file_path(kOobeCompleteFlagFilePath);
8303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return file_util::PathExists(oobe_complete_flag_file_path);
8313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
834731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool WizardController::IsRegisterScreenDefined() {
835731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const chromeos::StartupCustomizationDocument* manifest = NULL;
836731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This method will be called from ExistingUserController too
837731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // when Wizard instance doesn't exist.
838731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (default_controller())
839731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    manifest = default_controller()->GetCustomization();
840731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  else
841731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    manifest = LoadStartupManifest();
842731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return IsRegistrationScreenValid(manifest);
843731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
844731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
845731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
8463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::MarkDeviceRegistered() {
8473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create flag file for boot-time init scripts.
8483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath oobe_complete_path(kOobeCompleteFlagFilePath);
8493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FILE* oobe_flag_file = file_util::OpenFile(oobe_complete_path, "w+b");
8503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(oobe_flag_file != NULL) << kOobeCompleteFlagFilePath;
8513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (oobe_flag_file != NULL)
8523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    file_util::CloseFile(oobe_flag_file);
8533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, chromeos::ScreenObserver overrides:
857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WizardController::OnExit(ExitCodes exit_code) {
858201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Wizard screen exit code: " << exit_code;
859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (exit_code) {
860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case LOGIN_SIGN_IN_SELECTED:
861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnLoginSignInSelected();
862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case LOGIN_GUEST_SELECTED:
864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnLoginGuestUser();
865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case LOGIN_CREATE_ACCOUNT:
867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnLoginCreateAccount();
868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NETWORK_CONNECTED:
870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnNetworkConnected();
871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NETWORK_OFFLINE:
873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnNetworkOffline();
874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ACCOUNT_CREATE_BACK:
876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnAccountCreateBack();
877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ACCOUNT_CREATED:
879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnAccountCreated();
880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case CONNECTION_FAILED:
882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnConnectionFailed();
883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_INSTALLED:
885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_NOUPDATE:
886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUpdateCompleted();
887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_ERROR_CHECKING_FOR_UPDATE:
889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUpdateErrorCheckingForUpdate();
890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case UPDATE_ERROR_UPDATING:
892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUpdateErrorUpdating();
893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case USER_IMAGE_SELECTED:
895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUserImageSelected();
896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case USER_IMAGE_SKIPPED:
898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnUserImageSkipped();
899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case EULA_ACCEPTED:
901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnEulaAccepted();
902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
9033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case EULA_BACK:
9043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ShowNetworkScreen();
9053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case REGISTRATION_SUCCESS:
907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnRegistrationSuccess();
908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case REGISTRATION_SKIPPED:
910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OnRegistrationSkipped();
911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WizardController::OnSetUserNamePassword(const std::string& username,
9183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             const std::string& password) {
9193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  username_ = username;
9203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  password_ = password;
9213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
9223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WizardController, WizardScreen overrides:
925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::View* WizardController::GetWizardView() {
926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return contents_;
927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchromeos::ScreenObserver* WizardController::GetObserver(WizardScreen* screen) {
930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return observer_ ? observer_ : this;
931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser {
934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Declared in browser_dialogs.h so that others don't need to depend on our .h.
936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ShowLoginWizard(const std::string& first_screen_name,
937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     const gfx::Size& size) {
938731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Showing login screen: " << first_screen_name;
939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The login screen will enable alternate keyboard layouts, but we don't want
9413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to start the IME process unless one is selected.
9423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chromeos::CrosLibrary::Get()->GetInputMethodLibrary()->
9433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      SetDeferImeStartup(true);
944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tell the window manager that the user isn't logged in.
945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chromeos::WmIpc::instance()->SetLoggedInProperty(false);
946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set up keyboards. For example, when |locale| is "en-US", enable US qwerty
948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and US dvorak keyboard layouts.
949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (g_browser_process && g_browser_process->local_state()) {
950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string locale = g_browser_process->GetApplicationLocale();
951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string initial_input_method_id =
952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        g_browser_process->local_state()->GetString(
9533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            chromeos::language_prefs::kPreferredKeyboardLayout);
954c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::input_method::EnableInputMethods(
955c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        locale, chromeos::input_method::kKeyboardLayoutsOnly,
956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        initial_input_method_id);
957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
958c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(size));
960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check whether we need to execute OOBE process.
9623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool oobe_complete = WizardController::IsOobeCompleted();
963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (first_screen_name.empty() &&
965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      oobe_complete &&
966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chromeos::CrosLibrary::Get()->EnsureLoaded() &&
967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(
968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          switches::kEnableLoginImages)) {
969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<chromeos::UserManager::User> users =
970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        chromeos::UserManager::Get()->GetUsers();
9713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Fix for users who updated device and thus never passed register screen.
9733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // If we already have user we assume that it is not a second part of OOBE.
9743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // See http://crosbug.com/6289
9753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!WizardController::IsDeviceRegistered() && !users.empty()) {
976731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      VLOG(1) << "Mark device registered because there are remembered users: "
977731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick              << users.size();
9783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WizardController::MarkDeviceRegistered();
9793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
9803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // ExistingUserController deletes itself.
982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (new chromeos::ExistingUserController(users, screen_bounds))->Init();
9833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Initiate services customization.
9853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    chromeos::ApplyServicesCustomization::StartIfNeeded();
9863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create and show the wizard.
9913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WizardController* controller = new WizardController();
992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Load startup manifest.
9943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  controller->SetCustomization(LoadStartupManifest());
995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string locale;
9973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller->GetCustomization()) {
9983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Switch to initial locale if specified by customization
9993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // and has not been set yet. We cannot call
10003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // chromeos::LanguageSwitchMenu::SwitchLanguage here before
10013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // EmitLoginPromptReady.
10023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string current_locale =
10033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        g_browser_process->local_state()->GetString(
10043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            prefs::kApplicationLocale);
1005731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    VLOG(1) << "Current locale: " << current_locale;
10063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (current_locale.empty()) {
10073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      locale = controller->GetCustomization()->initial_locale();
1008731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      VLOG(1) << "Initial locale: " << locale;
10093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (!locale.empty()) {
1010201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        const std::string loaded_locale =
1011201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            ResourceBundle::ReloadSharedInstance(locale);
1012201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        CHECK(!loaded_locale.empty()) << "Locale could not be found for "
1013201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                      << locale;
1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
1016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller->ShowBackground(screen_bounds);
1019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller->Init(first_screen_name, screen_bounds);
1020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller->Show();
10213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1022513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  chromeos::LoginUtils::Get()->PrewarmAuthentication();
1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (chromeos::CrosLibrary::Get()->EnsureLoaded())
1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::CrosLibrary::Get()->GetLoginLibrary()->EmitLoginPromptReady();
10253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
10263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (controller->GetCustomization()) {
10273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!locale.empty())
10283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      chromeos::LanguageSwitchMenu::SwitchLanguage(locale);
10293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
10303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Set initial timezone if specified by customization.
10313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string timezone_name =
10323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        controller->GetCustomization()->initial_timezone();
1033731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    VLOG(1) << "Initial time zone: " << timezone_name;
10343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Apply locale customizations only once so preserve whatever locale
10353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // user has changed to during OOBE.
10363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!timezone_name.empty()) {
10373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      icu::TimeZone* timezone = icu::TimeZone::createTimeZone(
10383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          icu::UnicodeString::fromUTF8(timezone_name));
10393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      chromeos::CrosLibrary::Get()->GetSystemLibrary()->SetTimezone(timezone);
10403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
10413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1042c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace browser
1045