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