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