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