1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/base_login_display_host.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/file_util.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/logging.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/threading/thread_restrictions.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/browser_process.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/input_method_library.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/login_library.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/customization_document.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/input_method/input_method_util.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/language_preferences.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/existing_user_controller.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/helper.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/language_switch_menu.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/login_utils.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/user_manager.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/views_login_display_host.h" 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/wizard_controller.h" 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/system_access.h" 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/wm_ipc.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prefs/pref_service.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h" 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/pref_names.h" 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "googleurl/src/gurl.h" 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "third_party/cros/chromeos_wm_ipc_enums.h" 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/resource/resource_bundle.h" 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "unicode/timezone.h" 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(TOUCH_UI) 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/command_line.h" 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/dom_login_display_host.h" 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace { 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Determines the hardware keyboard from the given locale code 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// and the OEM layout information, and saves it to "Locale State". 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The information will be used in input_method::GetHardwareInputMethodId(). 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid DetermineAndSaveHardwareKeyboard(const std::string& locale, 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& oem_layout) { 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string layout; 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!oem_layout.empty()) { 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If the OEM layout information is provided, use it. 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen layout = oem_layout; 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Otherwise, determine the hardware keyboard from the locale. 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<std::string> input_method_ids; 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (chromeos::input_method::GetInputMethodIdsFromLanguageCode( 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen locale, 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::input_method::kKeyboardLayoutsOnly, 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &input_method_ids)) { 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The output list |input_method_ids| is sorted by popularity, hence 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // input_method_ids[0] now contains the most popular keyboard layout 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // for the given locale. 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen layout = input_method_ids[0]; 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!layout.empty()) { 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrefService* prefs = g_browser_process->local_state(); 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen prefs->SetString(prefs::kHardwareKeyboardLayout, layout); 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This asks the file thread to save the prefs (i.e. doesn't block). 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The latest values of Local State reside in memory so we can safely 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // get the value of kHardwareKeyboardLayout even if the data is not 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // yet saved to disk. 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen prefs->SavePersistentPrefs(); 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace chromeos { 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenLoginDisplayHost* BaseLoginDisplayHost::default_host_ = NULL; 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// BaseLoginDisplayHost -------------------------------------------------------- 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBaseLoginDisplayHost::BaseLoginDisplayHost(const gfx::Rect& background_bounds) 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : background_bounds_(background_bounds) { 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registrar_.Add( 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this, 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType::APP_TERMINATING, 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::AllSources()); 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(default_host_ == NULL); 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen default_host_ = this; 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBaseLoginDisplayHost::~BaseLoginDisplayHost() { 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen default_host_ = NULL; 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// LoginDisplayHost implementation --------------------------------------------- 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BaseLoginDisplayHost::OnSessionStart() { 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop::current()->DeleteSoon(FROM_HERE, this); 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BaseLoginDisplayHost::StartWizard( 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& first_screen_name, 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& start_url) { 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DVLOG(1) << "Starting wizard, first_screen_name: " << first_screen_name; 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Create and show the wizard. 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wizard_controller_.reset(); // Only one controller in a time. 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wizard_controller_.reset(new WizardController(this, background_bounds_)); 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wizard_controller_->set_start_url(start_url); 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ShowBackground(); 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!WizardController::IsDeviceRegistered()) 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetOobeProgressBarVisible(true); 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wizard_controller_->Init(first_screen_name); 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BaseLoginDisplayHost::StartSignInScreen() { 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DVLOG(1) << "Starting sign in screen"; 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<chromeos::UserManager::User> users = 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::UserManager::Get()->GetUsers(); 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Fix for users who updated device and thus never passed register screen. 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If we already have users, we assume that it is not a second part of 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // OOBE. See http://crosbug.com/6289 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!WizardController::IsDeviceRegistered() && !users.empty()) { 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "Mark device registered because there are remembered users: " 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << users.size(); 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WizardController::MarkDeviceRegistered(); 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sign_in_controller_.reset(); // Only one controller in a time. 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sign_in_controller_.reset(new chromeos::ExistingUserController(this)); 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ShowBackground(); 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetShutdownButtonEnabled(true); 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sign_in_controller_->Init(users); 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Initiate services customization manifest fetching. 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ServicesCustomizationDocument::GetInstance()->StartFetching(); 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// BaseLoginDisplayHost -------------------------------------------------------- 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BaseLoginDisplayHost::Observe(NotificationType type, 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const NotificationSource& source, 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const NotificationDetails& details) { 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CHECK(type == NotificationType::APP_TERMINATING); 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop::current()->DeleteSoon(FROM_HERE, this); 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop::current()->Quit(); 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registrar_.Remove(this, 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType::APP_TERMINATING, 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::AllSources()); 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace chromeos 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// browser::ShowLoginWizard implementation ------------------------------------- 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace browser { 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Declared in browser_dialogs.h so that others don't need to depend on our .h. 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TODO(nkostylev): Split this into a smaller functions. 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ShowLoginWizard(const std::string& first_screen_name, 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const gfx::Size& size) { 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "Showing login screen: " << first_screen_name; 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The login screen will enable alternate keyboard layouts, but we don't want 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // to start the IME process unless one is selected. 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::CrosLibrary::Get()->GetInputMethodLibrary()-> 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetDeferImeStartup(true); 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Tell the window manager that the user isn't logged in. 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::WmIpc::instance()->SetLoggedInProperty(false); 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Set up keyboards. For example, when |locale| is "en-US", enable US qwerty 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // and US dvorak keyboard layouts. 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (g_browser_process && g_browser_process->local_state()) { 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string locale = g_browser_process->GetApplicationLocale(); 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If the preferred keyboard for the login screen has been saved, use it. 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string initial_input_method_id = 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen g_browser_process->local_state()->GetString( 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::language_prefs::kPreferredKeyboardLayout); 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (initial_input_method_id.empty()) { 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If kPreferredKeyboardLayout is not specified, use the hardware layout. 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen initial_input_method_id = 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::input_method::GetHardwareInputMethodId(); 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::input_method::EnableInputMethods( 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen locale, chromeos::input_method::kKeyboardLayoutsOnly, 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen initial_input_method_id); 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(size)); 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Check whether we need to execute OOBE process. 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool oobe_complete = WizardController::IsOobeCompleted(); 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool show_login_screen = 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (first_screen_name.empty() && oobe_complete) || 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen first_screen_name == WizardController::kLoginScreenName; 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(nkostylev) Create LoginDisplayHost instance based on flag. 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(TOUCH_UI) 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::LoginDisplayHost* display_host; 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDOMLogin)) { 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen display_host = new chromeos::DOMLoginDisplayHost(screen_bounds); 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen display_host = new chromeos::ViewsLoginDisplayHost(screen_bounds); 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#else 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::LoginDisplayHost* display_host = 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new chromeos::ViewsLoginDisplayHost(screen_bounds); 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (show_login_screen && chromeos::CrosLibrary::Get()->EnsureLoaded()) { 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen display_host->StartSignInScreen(); 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Load startup manifest. 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const chromeos::StartupCustomizationDocument* startup_manifest = 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::StartupCustomizationDocument::GetInstance(); 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string locale; 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (startup_manifest->IsReady()) { 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Switch to initial locale if specified by customization 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // and has not been set yet. We cannot call 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // chromeos::LanguageSwitchMenu::SwitchLanguage here before 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // EmitLoginPromptReady. 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrefService* prefs = g_browser_process->local_state(); 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string current_locale = 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen prefs->GetString(prefs::kApplicationLocale); 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "Current locale: " << current_locale; 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (current_locale.empty()) { 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen locale = startup_manifest->initial_locale(); 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string layout = startup_manifest->keyboard_layout(); 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "Initial locale: " << locale 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << "keyboard layout " << layout; 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!locale.empty()) { 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Save initial locale from VPD/customization manifest as current 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Chrome locale. Otherwise it will be lost if Chrome restarts. 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Don't need to schedule pref save because setting initial local 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // will enforce preference saving. 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen prefs->SetString(prefs::kApplicationLocale, locale); 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WizardController::SetInitialLocale(locale); 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Determine keyboard layout from OEM customization (if provided) or 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // initial locale and save it in preferences. 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DetermineAndSaveHardwareKeyboard(locale, layout); 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Then, enable the hardware keyboard. 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::input_method::EnableInputMethods( 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen locale, 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::input_method::kKeyboardLayoutsOnly, 252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::input_method::GetHardwareInputMethodId()); 253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Reloading resource bundle causes us to do blocking IO on UI thread. 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Temporarily allow it until we fix http://crosbug.com/11102 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::ThreadRestrictions::ScopedAllowIO allow_io; 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string loaded_locale = 257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ResourceBundle::ReloadSharedInstance(locale); 258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CHECK(!loaded_locale.empty()) << "Locale could not be found for " 259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << locale; 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Set the application locale here so that the language switch 261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // menu works properly with the newly loaded locale. 262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen g_browser_process->SetApplicationLocale(loaded_locale); 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen display_host->StartWizard(first_screen_name, GURL()); 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::LoginUtils::Get()->PrewarmAuthentication(); 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (chromeos::CrosLibrary::Get()->EnsureLoaded()) 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::CrosLibrary::Get()->GetLoginLibrary()->EmitLoginPromptReady(); 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (startup_manifest->IsReady()) { 274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Set initial timezone if specified by customization. 275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string timezone_name = startup_manifest->initial_timezone(); 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "Initial time zone: " << timezone_name; 277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Apply locale customizations only once so preserve whatever locale 278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // user has changed to during OOBE. 279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!timezone_name.empty()) { 280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icu::TimeZone* timezone = icu::TimeZone::createTimeZone( 281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icu::UnicodeString::fromUTF8(timezone_name)); 282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CHECK(timezone) << "Timezone could not be set for " << timezone_name; 283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::SystemAccess::GetInstance()->SetTimezone(*timezone); 284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace browser 289