12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <algorithm>
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <vector>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind_helpers.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/debug/trace_event.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/location.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
16a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/prefs/pref_registry_simple.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/sys_info.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
25b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/browser_process_platform_part_chromeos.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h"
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/boot_times_loader.h"
30a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chrome/browser/chromeos/input_method/input_method_util.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/hwid_checker.h"
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/lock/screen_locker.h"
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/login/screens/core_oobe_actor.h"
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host.h"
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_display.h"
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h"
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/wizard_controller.h"
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/policy/consumer_management_service.h"
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/policy/device_local_account.h"
44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/signin/easy_unlock_service.h"
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/authenticated_user_email_retriever.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h"
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/l10n_util.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h"
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/power_manager_client.h"
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chromeos/ime/ime_keyboard.h"
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/ime/input_method_descriptor.h"
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h"
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/login/auth/key.h"
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/login/auth/user_context.h"
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_state.h"
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_state_handler.h"
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/portal_detector/network_portal_detector.h"
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h"
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/user_manager/user_type.h"
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/browser/render_frame_host.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_util.h"
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/wm/lock_state_controller.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Max number of users to show.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kMaxUsers = 18;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Timeout to delay first notification about offline state for a
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current network.
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kOfflineTimeoutSec = 5;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Timeout used to prevent infinite connecting to a flaky network.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kConnectingTimeoutSec = 60;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Type of the login screen UI that is currently presented to user.
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSourceGaiaSignin[] = "gaia-signin";
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSourceAccountPicker[] = "account-picker";
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100a3f7b4e666c476898878fa745f637129375cd889Ben Murdochstatic bool Contains(const std::vector<std::string>& container,
101a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                     const std::string& value) {
102a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return std::find(container.begin(), container.end(), value) !=
103a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch         container.end();
104a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
105a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class CallOnReturn {
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit CallOnReturn(const base::Closure& callback)
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      : callback_(callback), call_scheduled_(false) {}
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ~CallOnReturn() {
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (call_scheduled_ && !callback_.is_null())
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      callback_.Run();
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void ScheduleCall() { call_scheduled_ = true; }
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::Closure callback_;
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool call_scheduled_;
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CallOnReturn);
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool IsOnline(NetworkStateInformer::State state,
132a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)              ErrorScreenActor::ErrorReason reason) {
133a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return state == NetworkStateInformer::ONLINE &&
134a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reason != ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED &&
135a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reason != ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT;
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool IsBehindCaptivePortal(NetworkStateInformer::State state,
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           ErrorScreenActor::ErrorReason reason) {
140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return state == NetworkStateInformer::CAPTIVE_PORTAL ||
141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reason == ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED;
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsProxyError(NetworkStateInformer::State state,
145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                  ErrorScreenActor::ErrorReason reason,
146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                  net::Error frame_error) {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return state == NetworkStateInformer::PROXY_AUTH_REQUIRED ||
148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reason == ErrorScreenActor::ERROR_REASON_PROXY_AUTH_CANCELLED ||
149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      reason == ErrorScreenActor::ERROR_REASON_PROXY_CONNECTION_FAILED ||
150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR &&
151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       (frame_error == net::ERR_PROXY_CONNECTION_FAILED ||
152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        frame_error == net::ERR_TUNNEL_CONNECTION_FAILED));
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsSigninScreen(const OobeUI::Screen screen) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return screen == OobeUI::SCREEN_GAIA_SIGNIN ||
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      screen == OobeUI::SCREEN_ACCOUNT_PICKER;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsSigninScreenError(ErrorScreen::ErrorState error_state) {
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return error_state == ErrorScreen::ERROR_STATE_PORTAL ||
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_state == ErrorScreen::ERROR_STATE_OFFLINE ||
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_state == ErrorScreen::ERROR_STATE_PROXY ||
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_state == ErrorScreen::ERROR_STATE_AUTH_EXT_TIMEOUT;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns network name by service path.
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string GetNetworkName(const std::string& service_path) {
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetNetworkState(service_path);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!network)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return std::string();
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return network->name();
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
176a3f7b4e666c476898878fa745f637129375cd889Ben Murdochstatic bool SetUserInputMethodImpl(
177a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    const std::string& username,
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& user_input_method,
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input_method::InputMethodManager::State* ime_state) {
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!chromeos::input_method::InputMethodManager::Get()->IsLoginKeyboard(
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          user_input_method)) {
182a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    LOG(WARNING) << "SetUserInputMethod('" << username
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 << "'): stored user LRU input method '" << user_input_method
184a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                 << "' is no longer Full Latin Keyboard Language"
185a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                 << " (entry dropped). Use hardware default instead.";
186a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefService* const local_state = g_browser_process->local_state();
188a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    DictionaryPrefUpdate updater(local_state, prefs::kUsersLRUInputMethod);
189a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
190a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    base::DictionaryValue* const users_lru_input_methods = updater.Get();
191a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    if (users_lru_input_methods != NULL) {
192a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      users_lru_input_methods->SetStringWithoutPathExpansion(username, "");
193a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    }
194a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    return false;
195a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
196a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!Contains(ime_state->GetActiveInputMethodIds(), user_input_method)) {
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!ime_state->EnableInputMethod(user_input_method)) {
199a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      DLOG(ERROR) << "SigninScreenHandler::SetUserInputMethod('" << username
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  << "'): user input method '" << user_input_method
201a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                  << "' is not enabled and enabling failed (ignored!).";
202a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    }
203a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ime_state->ChangeInputMethod(user_input_method, false /* show_message */);
205a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
206a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return true;
207a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
208a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// LoginScreenContext implementation ------------------------------------------
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)LoginScreenContext::LoginScreenContext() {
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Init();
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)LoginScreenContext::LoginScreenContext(const base::ListValue* args) {
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Init();
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!args || args->GetSize() == 0)
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string email;
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (args->GetString(0, &email))
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    email_ = email;
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LoginScreenContext::Init() {
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  oobe_ui_ = false;
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SigninScreenHandler implementation ------------------------------------------
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SigninScreenHandler::SigninScreenHandler(
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const scoped_refptr<NetworkStateInformer>& network_state_informer,
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ErrorScreenActor* error_screen_actor,
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CoreOobeActor* core_oobe_actor,
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GaiaScreenHandler* gaia_screen_handler)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : ui_state_(UI_STATE_UNKNOWN),
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate_(NULL),
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_window_delegate_(NULL),
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show_on_init_(false),
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      oobe_ui_(false),
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_account_picker_showing_first_time_(false),
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network_state_informer_(network_state_informer),
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webui_visible_(false),
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      preferences_changed_delayed_(false),
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      error_screen_actor_(error_screen_actor),
248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      core_oobe_actor_(core_oobe_actor),
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_first_update_state_call_(true),
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offline_login_active_(false),
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_network_state_(NetworkStateInformer::UNKNOWN),
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      has_pending_auth_ui_(false),
253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      caps_lock_enabled_(chromeos::input_method::InputMethodManager::Get()
254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             ->GetImeKeyboard()
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             ->CapsLockIsEnabled()),
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      gaia_screen_handler_(gaia_screen_handler),
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      oobe_ui_observer_added_(false),
25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      weak_factory_(this) {
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(network_state_informer_.get());
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(error_screen_actor_);
261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(core_oobe_actor_);
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(gaia_screen_handler_);
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gaia_screen_handler_->SetSigninScreenHandler(this);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_state_informer_->AddObserver(this);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 chrome::NOTIFICATION_AUTH_NEEDED,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 chrome::NOTIFICATION_AUTH_SUPPLIED,
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 chrome::NOTIFICATION_AUTH_CANCELLED,
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  chromeos::input_method::ImeKeyboard* keyboard =
277f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard();
278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (keyboard)
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    keyboard->AddObserver(this);
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA)
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  max_mode_delegate_.reset(new TouchViewControllerDelegate());
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  max_mode_delegate_->AddObserver(this);
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  policy::ConsumerManagementService* consumer_management =
2876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos()->
2886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          GetConsumerManagementService();
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  is_enrolling_consumer_management_ =
2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      consumer_management &&
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      consumer_management->GetEnrollmentStage() ==
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          policy::ConsumerManagementService::ENROLLMENT_STAGE_REQUESTED;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SigninScreenHandler::~SigninScreenHandler() {
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OobeUI* oobe_ui = GetOobeUI();
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (oobe_ui && oobe_ui_observer_added_)
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    oobe_ui->RemoveObserver(this);
299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  chromeos::input_method::ImeKeyboard* keyboard =
300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard();
301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (keyboard)
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    keyboard->RemoveObserver(this);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  weak_factory_.InvalidateWeakPtrs();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->SetWebUIHandler(NULL);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_state_informer_->RemoveObserver(this);
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (max_mode_delegate_) {
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    max_mode_delegate_->RemoveObserver(this);
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    max_mode_delegate_.reset(NULL);
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScreenlockBridge::Get()->SetLockHandler(NULL);
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScreenlockBridge::Get()->SetFocusedUser("");
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::DeclareLocalizedValues(
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LocalizedValuesBuilder* builder) {
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordHint", IDS_LOGIN_POD_EMPTY_PASSWORD_TEXT);
318e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  builder->Add("signingIn", IDS_LOGIN_POD_SIGNING_IN);
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("podMenuButtonAccessibleName",
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_POD_MENU_BUTTON_ACCESSIBLE_NAME);
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("podMenuRemoveItemAccessibleName",
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_POD_MENU_REMOVE_ITEM_ACCESSIBLE_NAME);
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordFieldAccessibleName",
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_POD_PASSWORD_FIELD_ACCESSIBLE_NAME);
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("signedIn", IDS_SCREEN_LOCK_ACTIVE_USER);
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("signinButton", IDS_LOGIN_BUTTON);
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder->Add("launchAppButton", IDS_LAUNCH_APP_BUTTON);
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("shutDown", IDS_SHUTDOWN_BUTTON);
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("addUser", IDS_ADD_USER_BUTTON);
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("browseAsGuest", IDS_GO_INCOGNITO_BUTTON);
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("cancel", IDS_CANCEL);
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("signOutUser", IDS_SCREEN_LOCK_SIGN_OUT);
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("offlineLogin", IDS_OFFLINE_LOGIN_HTML);
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("ownerUserPattern", IDS_LOGIN_POD_OWNER_USER);
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("removeUser", IDS_LOGIN_POD_REMOVE_USER);
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("errorTpmFailureTitle", IDS_LOGIN_ERROR_TPM_FAILURE_TITLE);
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("errorTpmFailureReboot", IDS_LOGIN_ERROR_TPM_FAILURE_REBOOT);
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("errorTpmFailureRebootButton",
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_ERROR_TPM_FAILURE_REBOOT_BUTTON);
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder->Add("disabledAddUserTooltip",
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               connector->IsEnterpriseManaged()
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   ? IDS_DISABLED_ADD_USER_TOOLTIP_ENTERPRISE
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   : IDS_DISABLED_ADD_USER_TOOLTIP);
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  builder->Add("supervisedUserExpiredTokenWarning",
3493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               IDS_SUPERVISED_USER_EXPIRED_TOKEN_WARNING);
350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  builder->Add("signinBannerText", IDS_LOGIN_USER_ADDING_BANNER);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Multi-profiles related strings.
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder->Add("multiProfilesRestrictedPolicyTitle",
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               IDS_MULTI_PROFILES_RESTRICTED_POLICY_TITLE);
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder->Add("multiProfilesNotAllowedPolicyMsg",
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               IDS_MULTI_PROFILES_NOT_ALLOWED_POLICY_MSG);
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder->Add("multiProfilesPrimaryOnlyPolicyMsg",
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               IDS_MULTI_PROFILES_PRIMARY_ONLY_POLICY_MSG);
359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  builder->Add("multiProfilesOwnerPrimaryOnlyMsg",
360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)               IDS_MULTI_PROFILES_OWNER_PRIMARY_ONLY_MSG);
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Strings used by password changed dialog.
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedTitle", IDS_LOGIN_PASSWORD_CHANGED_TITLE);
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedDesc", IDS_LOGIN_PASSWORD_CHANGED_DESC);
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->AddF("passwordChangedMoreInfo",
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                IDS_LOGIN_PASSWORD_CHANGED_MORE_INFO,
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                IDS_SHORT_PRODUCT_OS_NAME);
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oldPasswordHint", IDS_LOGIN_PASSWORD_CHANGED_OLD_PASSWORD_HINT);
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oldPasswordIncorrect",
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PASSWORD_CHANGED_INCORRECT_OLD_PASSWORD);
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedCantRemember",
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PASSWORD_CHANGED_CANT_REMEMBER);
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedBackButton",
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PASSWORD_CHANGED_BACK_BUTTON);
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedsOkButton", IDS_OK);
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedProceedAnyway",
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PASSWORD_CHANGED_PROCEED_ANYWAY);
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("proceedAnywayButton",
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PASSWORD_CHANGED_PROCEED_ANYWAY_BUTTON);
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("publicAccountInfoFormat", IDS_LOGIN_PUBLIC_ACCOUNT_INFO_FORMAT);
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("publicAccountReminder",
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PUBLIC_ACCOUNT_SIGNOUT_REMINDER);
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  builder->Add("publicSessionLanguageAndInput",
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               IDS_LOGIN_PUBLIC_SESSION_LANGUAGE_AND_INPUT);
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("publicAccountEnter", IDS_LOGIN_PUBLIC_ACCOUNT_ENTER);
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("publicAccountEnterAccessibleName",
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PUBLIC_ACCOUNT_ENTER_ACCESSIBLE_NAME);
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  builder->Add("publicSessionSelectLanguage", IDS_LANGUAGE_SELECTION_SELECT);
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  builder->Add("publicSessionSelectKeyboard", IDS_KEYBOARD_SELECTION_SELECT);
39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  builder->Add("removeUserWarningText",
39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)               base::string16());
39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  builder->AddF("removeSupervisedUserWarningText",
39446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)               IDS_LOGIN_POD_SUPERVISED_USER_REMOVE_WARNING,
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               base::UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL));
396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  builder->Add("removeUserWarningButtonTitle",
397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)               IDS_LOGIN_POD_USER_REMOVE_WARNING_BUTTON);
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder->Add("samlNotice", IDS_LOGIN_SAML_NOTICE);
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
401d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  builder->Add("confirmPasswordTitle", IDS_LOGIN_CONFIRM_PASSWORD_TITLE);
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder->Add("confirmPasswordLabel", IDS_LOGIN_CONFIRM_PASSWORD_LABEL);
403d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  builder->Add("confirmPasswordConfirmButton",
404d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)               IDS_LOGIN_CONFIRM_PASSWORD_CONFIRM_BUTTON);
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder->Add("confirmPasswordText", IDS_LOGIN_CONFIRM_PASSWORD_TEXT);
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder->Add("confirmPasswordErrorText",
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               IDS_LOGIN_CONFIRM_PASSWORD_ERROR_TEXT);
408d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  builder->Add("fatalEnrollmentError",
410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               IDS_ENTERPRISE_ENROLLMENT_AUTH_FATAL_ERROR);
411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  builder->Add("insecureURLEnrollmentError",
412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               IDS_ENTERPRISE_ENROLLMENT_AUTH_INSECURE_URL_ERROR);
413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (chromeos::KioskModeSettings::Get()->IsKioskModeEnabled())
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    builder->Add("demoLoginMessage", IDS_KIOSK_MODE_LOGIN_MESSAGE);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SigninScreenHandler::Show(const LoginScreenContext& context) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(delegate_);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Just initialize internal fields from context and call ShowImpl().
422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  oobe_ui_ = context.oobe_ui();
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string email;
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (is_enrolling_consumer_management_) {
4266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // We don't check if the value of the owner e-mail is trusted because it is
4276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // only used to pre-fill the e-mail field in Gaia sign-in page and a cached
4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // value is sufficient.
4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CrosSettings::Get()->GetString(kDeviceOwner, &email);
4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else {
4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    email = context.email();
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gaia_screen_handler_->PopulateEmail(email);
434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ShowImpl();
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::ShowRetailModeLoginSpinner() {
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("showLoginSpinner");
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::SetDelegate(SigninScreenHandlerDelegate* delegate) {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->SetWebUIHandler(this);
445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  else
446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    auto_enrollment_progress_subscription_.reset();
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::SetNativeWindowDelegate(
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeWindowDelegate* native_window_delegate) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_window_delegate_ = native_window_delegate;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::OnNetworkReady() {
455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  VLOG(1) << "OnNetworkReady() call.";
45646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(gaia_screen_handler_);
45746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gaia_screen_handler_->MaybePreloadAuthExtension();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid SigninScreenHandler::UpdateState(ErrorScreenActor::ErrorReason reason) {
461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  UpdateStateInternal(reason, false);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SigninScreenHandler::SetFocusPODCallbackForTesting(
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::Closure callback) {
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_focus_pod_callback_ = callback;
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SigninScreenHandler, private: -----------------------------------------------
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SigninScreenHandler::ShowImpl() {
472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!page_is_ready()) {
473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    show_on_init_ = true;
474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!ime_state_.get())
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ime_state_ = input_method::InputMethodManager::Get()->GetActiveIMEState();
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!oobe_ui_observer_added_) {
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    oobe_ui_observer_added_ = true;
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GetOobeUI()->AddObserver(this);
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (oobe_ui_ || is_enrolling_consumer_management_) {
486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Shows new user sign-in for OOBE.
48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    OnShowAddUser();
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Populates account picker. Animation is turned off for now until we
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // figure out how to make it fast enough.
49146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    delegate_->HandleGetUsers();
492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Reset Caps Lock state when login screen is shown.
494a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    input_method::InputMethodManager::Get()
495a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        ->GetImeKeyboard()
496a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        ->SetCapsLockEnabled(false);
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue params;
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    params.SetBoolean("disableAddUser", AllWhitelistedUsersPresent());
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    UpdateUIState(UI_STATE_ACCOUNT_PICKER, &params);
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::UpdateUIState(UIState ui_state,
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        base::DictionaryValue* params) {
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (ui_state) {
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case UI_STATE_GAIA_SIGNIN:
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui_state_ = UI_STATE_GAIA_SIGNIN;
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowScreen(OobeUI::kScreenGaiaSignin, params);
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case UI_STATE_ACCOUNT_PICKER:
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui_state_ = UI_STATE_ACCOUNT_PICKER;
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowScreen(OobeUI::kScreenAccountPicker, params);
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// TODO(ygorshenin@): split this method into small parts.
5226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// TODO(ygorshenin@): move this logic to GaiaScreenHandler.
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::UpdateStateInternal(
524a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ErrorScreenActor::ErrorReason reason,
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool force_update) {
526a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Do nothing once user has signed in or sign in is in progress.
527a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // TODO(ygorshenin): We will end up here when processing network state
528a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // notification but no ShowSigninScreen() was called so delegate_ will be
529a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // NULL. Network state processing logic does not belong here.
530a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (delegate_ &&
531a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      (delegate_->IsUserSigninCompleted() || delegate_->IsSigninInProgress())) {
532a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return;
533a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
534a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
535ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NetworkStateInformer::State state = network_state_informer_->state();
536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string network_path = network_state_informer_->network_path();
537ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string network_name = GetNetworkName(network_path);
538a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Skip "update" notification about OFFLINE state from
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NetworkStateInformer if previous notification already was
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // delayed.
542ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if ((state == NetworkStateInformer::OFFLINE || has_pending_auth_ui_) &&
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      !force_update && !update_state_closure_.IsCancelled()) {
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_state_closure_.Cancel();
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
549ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if ((state == NetworkStateInformer::OFFLINE && !force_update) ||
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      has_pending_auth_ui_) {
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    update_state_closure_.Reset(
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(&SigninScreenHandler::UpdateStateInternal,
553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   weak_factory_.GetWeakPtr(),
554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   reason,
555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   true));
55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FROM_HERE,
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        update_state_closure_.callback(),
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::TimeDelta::FromSeconds(kOfflineTimeoutSec));
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Don't show or hide error screen if we're in connecting state.
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state == NetworkStateInformer::CONNECTING && !force_update) {
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (connecting_closure_.IsCancelled()) {
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // First notification about CONNECTING state.
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      connecting_closure_.Reset(
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(&SigninScreenHandler::UpdateStateInternal,
569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     weak_factory_.GetWeakPtr(),
570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     reason,
571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     true));
57290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostDelayedTask(
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          FROM_HERE,
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          connecting_closure_.callback(),
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::TimeDelta::FromSeconds(kConnectingTimeoutSec));
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connecting_closure_.Cancel();
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
581a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_online = IsOnline(state, reason);
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const bool is_behind_captive_portal = IsBehindCaptivePortal(state, reason);
583a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_gaia_loading_timeout =
584a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      (reason == ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT);
585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const bool is_gaia_error =
586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FrameError() != net::OK && FrameError() != net::ERR_NETWORK_CHANGED;
587a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_gaia_signin = IsGaiaVisible() || IsGaiaHiddenByError();
588a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool error_screen_should_overlay =
589a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      !offline_login_active_ && IsGaiaVisible();
590a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool from_not_online_to_online_transition =
591a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      is_online && last_network_state_ != NetworkStateInformer::ONLINE;
592a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  last_network_state_ = state;
593a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CallOnReturn reload_gaia(base::Bind(
5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      &SigninScreenHandler::ReloadGaia, weak_factory_.GetWeakPtr(), true));
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (is_online || !is_behind_captive_portal)
598a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    error_screen_actor_->HideCaptivePortal();
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
600a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Hide offline message (if needed) and return if current screen is
601a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // not a Gaia frame.
602a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!is_gaia_signin) {
603a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!IsSigninScreenHiddenByError())
604a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      HideOfflineMessage(state, reason);
605a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return;
606a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
607a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
608a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Reload frame if network state is changed from {!ONLINE} -> ONLINE state.
609a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (reason == ErrorScreenActor::ERROR_REASON_NETWORK_STATE_CHANGED &&
610a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      from_not_online_to_online_transition) {
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Schedules a immediate retry.
6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    LOG(WARNING) << "Retry frame load since network has been changed.";
6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    reload_gaia.ScheduleCall();
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
616a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (reason == ErrorScreenActor::ERROR_REASON_PROXY_CONFIG_CHANGED &&
617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      error_screen_should_overlay) {
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Schedules a immediate retry.
6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    LOG(WARNING) << "Retry frameload since proxy settings has been changed.";
6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    reload_gaia.ScheduleCall();
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
623ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR &&
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      !IsProxyError(state, reason, FrameError())) {
6255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    LOG(WARNING) << "Retry frame load due to reason: "
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 << ErrorScreenActor::ErrorReasonString(reason);
6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    reload_gaia.ScheduleCall();
6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (is_gaia_loading_timeout) {
6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    LOG(WARNING) << "Retry frame load due to loading timeout.";
6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    reload_gaia.ScheduleCall();
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
635a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if ((!is_online || is_gaia_loading_timeout || is_gaia_error) &&
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !offline_login_active_) {
637a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    SetupAndShowOfflineMessage(state, reason);
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
639a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    HideOfflineMessage(state, reason);
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::SetupAndShowOfflineMessage(
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkStateInformer:: State state,
645a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ErrorScreenActor::ErrorReason reason) {
646ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string network_path = network_state_informer_->network_path();
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const bool is_behind_captive_portal = IsBehindCaptivePortal(state, reason);
648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const bool is_proxy_error = IsProxyError(state, reason, FrameError());
649a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_gaia_loading_timeout =
650a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      (reason == ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT);
651a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_proxy_error) {
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PROXY,
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string());
6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (is_behind_captive_portal) {
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Do not bother a user with obsessive captive portal showing. This
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // check makes captive portal being shown only once: either when error
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // screen is shown for the first time or when switching from another
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // error screen (offline, proxy).
660a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (IsGaiaVisible() ||
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        (error_screen_actor_->error_state() !=
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         ErrorScreen::ERROR_STATE_PORTAL)) {
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      error_screen_actor_->FixCaptivePortal();
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
665ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const std::string network_name = GetNetworkName(network_path);
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PORTAL,
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       network_name);
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (is_gaia_loading_timeout) {
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_actor_->SetErrorState(
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ErrorScreen::ERROR_STATE_AUTH_EXT_TIMEOUT, std::string());
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_OFFLINE,
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string());
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
676a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool guest_signin_allowed = IsGuestSigninAllowed() &&
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IsSigninScreenError(error_screen_actor_->error_state());
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error_screen_actor_->AllowGuestSignin(guest_signin_allowed);
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
680a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool offline_login_allowed = IsOfflineLoginAllowed() &&
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IsSigninScreenError(error_screen_actor_->error_state()) &&
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_screen_actor_->error_state() !=
683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ErrorScreen::ERROR_STATE_AUTH_EXT_TIMEOUT;
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error_screen_actor_->AllowOfflineLogin(offline_login_allowed);
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetCurrentScreen() != OobeUI::SCREEN_ERROR_MESSAGE) {
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue params;
688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const std::string network_type = network_state_informer_->network_type();
689ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    params.SetString("lastNetworkType", network_type);
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_actor_->SetUIState(ErrorScreen::UI_STATE_SIGNIN);
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    error_screen_actor_->Show(OobeUI::SCREEN_GAIA_SIGNIN, &params);
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
695a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void SigninScreenHandler::HideOfflineMessage(
696a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    NetworkStateInformer::State state,
697a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ErrorScreenActor::ErrorReason reason) {
698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsSigninScreenHiddenByError())
699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
700a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  error_screen_actor_->Hide();
702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Forces a reload for Gaia screen on hiding error message.
704a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (IsGaiaVisible() || IsGaiaHiddenByError())
7055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ReloadGaia(false);
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninScreenHandler::ReloadGaia(bool force_reload) {
7095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gaia_screen_handler_->ReloadGaia(force_reload);
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::Initialize() {
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If delegate_ is NULL here (e.g. WebUIScreenLocker has been destroyed),
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't do anything, just return.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (show_on_init_) {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_on_init_ = false;
720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ShowImpl();
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow SigninScreenHandler::GetNativeWindow() {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_window_delegate_)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return native_window_delegate_->GetNativeWindow();
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::RegisterMessages() {
731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("authenticateUser", &SigninScreenHandler::HandleAuthenticateUser);
732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddCallback("attemptUnlock", &SigninScreenHandler::HandleAttemptUnlock);
733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("getUsers", &SigninScreenHandler::HandleGetUsers);
734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("launchDemoUser", &SigninScreenHandler::HandleLaunchDemoUser);
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("launchIncognito", &SigninScreenHandler::HandleLaunchIncognito);
7365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AddCallback("showSupervisedUserCreationScreen",
7375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              &SigninScreenHandler::HandleShowSupervisedUserCreationScreen);
7385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AddCallback("launchPublicSession",
7395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              &SigninScreenHandler::HandleLaunchPublicSession);
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddRawCallback("offlineLogin", &SigninScreenHandler::HandleOfflineLogin);
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("rebootSystem", &SigninScreenHandler::HandleRebootSystem);
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddRawCallback("showAddUser", &SigninScreenHandler::HandleShowAddUser);
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("shutdownSystem", &SigninScreenHandler::HandleShutdownSystem);
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("loadWallpaper", &SigninScreenHandler::HandleLoadWallpaper);
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("removeUser", &SigninScreenHandler::HandleRemoveUser);
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("toggleEnrollmentScreen",
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleToggleEnrollmentScreen);
7487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddCallback("toggleKioskEnableScreen",
7497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              &SigninScreenHandler::HandleToggleKioskEnableScreen);
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("createAccount", &SigninScreenHandler::HandleCreateAccount);
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("accountPickerReady",
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleAccountPickerReady);
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("wallpaperReady", &SigninScreenHandler::HandleWallpaperReady);
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("signOutUser", &SigninScreenHandler::HandleSignOutUser);
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("openProxySettings",
756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleOpenProxySettings);
757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("loginVisible", &SigninScreenHandler::HandleLoginVisible);
758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("cancelPasswordChangedFlow",
759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleCancelPasswordChangedFlow);
760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddCallback("cancelUserAdding",
761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              &SigninScreenHandler::HandleCancelUserAdding);
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("migrateUserData", &SigninScreenHandler::HandleMigrateUserData);
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("resyncUserData", &SigninScreenHandler::HandleResyncUserData);
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("loginUIStateChanged",
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleLoginUIStateChanged);
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("unlockOnLoginSuccess",
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleUnlockOnLoginSuccess);
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("showLoadingTimeoutError",
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleShowLoadingTimeoutError);
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("updateOfflineLogin",
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleUpdateOfflineLogin);
7723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AddCallback("focusPod", &SigninScreenHandler::HandleFocusPod);
77303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  AddCallback("hardlockPod", &SigninScreenHandler::HandleHardlockPod);
7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddCallback("retrieveAuthenticatedUserEmail",
7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              &SigninScreenHandler::HandleRetrieveAuthenticatedUserEmail);
7765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AddCallback("getPublicSessionKeyboardLayouts",
7775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              &SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts);
7785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AddCallback("cancelConsumerManagementEnrollment",
7795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              &SigninScreenHandler::HandleCancelConsumerManagementEnrollment);
7801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddCallback("getTouchViewState",
7811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              &SigninScreenHandler::HandleGetTouchViewState);
7825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // This message is sent by the kiosk app menu, but is handled here
7853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // so we can tell the delegate to launch the app.
7863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AddCallback("launchKioskApp", &SigninScreenHandler::HandleLaunchKioskApp);
787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
789a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid SigninScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) {
790a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  registry->RegisterDictionaryPref(prefs::kUsersLRUInputMethod);
791a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
792a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
7931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SigninScreenHandler::OnCurrentScreenChanged(OobeUI::Screen current_screen,
7941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 OobeUI::Screen new_screen) {
7951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (new_screen == OobeUI::SCREEN_ACCOUNT_PICKER) {
7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Restore active IME state if returning to user pod row screen.
7971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input_method::InputMethodManager::Get()->SetState(ime_state_);
7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string SigninScreenHandler::GetUserLRUInputMethod(
8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& username) const {
8031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefService* const local_state = g_browser_process->local_state();
8041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::DictionaryValue* users_lru_input_methods =
8051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      local_state->GetDictionary(prefs::kUsersLRUInputMethod);
8061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (users_lru_input_methods == NULL) {
8081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DLOG(WARNING) << "GetUserLRUInputMethod('" << username
8091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  << "'): no kUsersLRUInputMethod";
8101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return std::string();
8111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string input_method;
8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!users_lru_input_methods->GetStringWithoutPathExpansion(username,
8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                              &input_method)) {
8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DVLOG(0) << "GetUserLRUInputMethod('" << username
8181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             << "'): no input method for this user";
8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return std::string();
8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return input_method;
8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleGetUsers() {
82646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (delegate_)
82746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    delegate_->HandleGetUsers();
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::ClearAndEnablePassword() {
831a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  core_oobe_actor_->ResetSignInUI(false);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ClearUserPodPassword() {
835a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  core_oobe_actor_->ClearUserPodPassword();
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void SigninScreenHandler::RefocusCurrentPod() {
839a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  core_oobe_actor_->RefocusCurrentPod();
84090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
84190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::OnUserRemoved(const std::string& username) {
843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CallJS("login.AccountPickerScreen.removeUser", username);
84423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (delegate_->GetUsers().empty())
84546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    OnShowAddUser();
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninScreenHandler::OnUserImageChanged(const user_manager::User& user) {
849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (page_is_ready())
850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CallJS("login.AccountPickerScreen.updateUserImage", user.email());
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::OnPreferencesChanged() {
85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Make sure that one of the login UI is fully functional now, otherwise
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preferences update would be picked up next time it will be shown.
85690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!webui_visible_) {
85790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LOG(WARNING) << "Login UI is not active - postponed prefs change.";
85890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    preferences_changed_delayed_ = true;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && !delegate_->IsShowUsers()) {
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HandleShowAddUser(NULL);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
86546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (delegate_)
86646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      delegate_->HandleGetUsers();
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateUIState(UI_STATE_ACCOUNT_PICKER, NULL);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
86990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  preferences_changed_delayed_ = false;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ResetSigninScreenHandlerDelegate() {
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDelegate(NULL);
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::ShowError(int login_attempts,
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const std::string& error_text,
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const std::string& help_link_text,
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    HelpAppLauncher::HelpTopic help_topic_id) {
880a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  core_oobe_actor_->ShowSignInError(login_attempts, error_text, help_link_text,
881a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    help_topic_id);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ShowErrorScreen(LoginDisplay::SigninError error_id) {
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (error_id) {
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LoginDisplay::TPM_ERROR:
887a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      core_oobe_actor_->ShowTpmError();
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED() << "Unknown sign in error";
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ShowSigninUI(const std::string& email) {
896424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  core_oobe_actor_->ShowSignInUI(email);
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::ShowGaiaPasswordChanged(const std::string& username) {
90046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gaia_screen_handler_->PasswordChangedFor(username);
90146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gaia_screen_handler_->PopulateEmail(username);
90246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  core_oobe_actor_->ShowSignInUI(username);
903a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CallJS("login.setAuthType",
904a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         username,
905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         static_cast<int>(ONLINE_SIGN_IN),
906a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         base::StringValue(""));
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ShowPasswordChangedDialog(bool show_password_error) {
910a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  core_oobe_actor_->ShowPasswordChangedScreen(show_password_error);
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ShowSigninScreenForCreds(
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& username,
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& password) {
91646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(gaia_screen_handler_);
91746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gaia_screen_handler_->ShowSigninScreenForCreds(username, password);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninScreenHandler::SetPublicSessionDisplayName(
9215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const std::string& user_id,
9225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const std::string& display_name) {
9235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CallJS("login.AccountPickerScreen.setPublicSessionDisplayName",
9245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         user_id,
9255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         display_name);
9265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
9275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
9285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninScreenHandler::SetPublicSessionLocales(
9295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& user_id,
9305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    scoped_ptr<base::ListValue> locales,
9315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& default_locale,
9325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bool multipleRecommendedLocales) {
9335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CallJS("login.AccountPickerScreen.setPublicSessionLocales",
9345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         user_id,
9355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         *locales,
9365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         default_locale,
9375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         multipleRecommendedLocales);
9385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
9395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::Observe(int type,
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const content::NotificationSource& source,
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const content::NotificationDetails& details) {
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_AUTH_NEEDED: {
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      has_pending_auth_ui_ = true;
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_AUTH_SUPPLIED:
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      has_pending_auth_ui_ = false;
950010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      // Reload auth extension as proxy credentials are supplied.
951010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (!IsSigninScreenHiddenByError() && ui_state_ == UI_STATE_GAIA_SIGNIN)
9525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ReloadGaia(true);
953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      update_state_closure_.Cancel();
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_AUTH_CANCELLED: {
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Don't reload auth extension if proxy auth dialog was cancelled.
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      has_pending_auth_ui_ = false;
958010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      update_state_closure_.Cancel();
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED() << "Unexpected notification " << type;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void SigninScreenHandler::ShowBannerMessage(const base::string16& message) {
967cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CallJS("login.AccountPickerScreen.showBannerMessage", message);
968cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
969cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
970cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SigninScreenHandler::ShowUserPodCustomIcon(
971cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& username,
9726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const ScreenlockBridge::UserPodCustomIconOptions& icon_options) {
9736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> icon = icon_options.ToDictionaryValue();
9746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!icon || icon->empty())
9756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
9766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CallJS("login.AccountPickerScreen.showUserPodCustomIcon", username, *icon);
977cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
978cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
979cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SigninScreenHandler::HideUserPodCustomIcon(const std::string& username) {
980cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CallJS("login.AccountPickerScreen.hideUserPodCustomIcon", username);
981cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
982cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
983cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SigninScreenHandler::EnableInput() {
984cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Only for lock screen at the moment.
985cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScreenLocker::default_screen_locker()->EnableInput();
986cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
987cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
988cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SigninScreenHandler::SetAuthType(
989cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& username,
990cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ScreenlockBridge::LockHandler::AuthType auth_type,
9916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::string16& initial_value) {
99203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (delegate_->GetAuthType(username) ==
99303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          ScreenlockBridge::LockHandler::FORCE_OFFLINE_PASSWORD)
99403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
99503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
99646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  delegate_->SetAuthType(username, auth_type);
99746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
998cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CallJS("login.AccountPickerScreen.setAuthType",
999cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         username,
1000cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         static_cast<int>(auth_type),
1001cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         base::StringValue(initial_value));
1002cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ScreenlockBridge::LockHandler::AuthType SigninScreenHandler::GetAuthType(
1005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& username) const {
100646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return delegate_->GetAuthType(username);
1007cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1008cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1009cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SigninScreenHandler::Unlock(const std::string& user_email) {
1010cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(ScreenLocker::default_screen_locker());
1011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScreenLocker::Hide();
1012cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SigninScreenHandler::AttemptEasySignin(const std::string& user_email,
10151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            const std::string& secret,
10161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            const std::string& key_label) {
10171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!ScreenLocker::default_screen_locker());
10181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!delegate_)
10191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
10201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UserContext user_context(user_email);
10221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_context.SetAuthFlow(UserContext::AUTH_FLOW_EASY_UNLOCK);
10231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_context.SetKey(Key(secret));
10241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_context.GetKey()->SetLabel(key_label);
10251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(tbarzic): Handle empty secret. The delegate will end up ignoring login
10271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // attempt if the key is not set, and the UI will remain disabled.
10281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!secret.empty());
10291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->Login(user_context, SigninSpecifics());
10311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
10321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SigninScreenHandler::OnMaximizeModeStarted() {
10341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CallJS("login.AccountPickerScreen.setTouchViewState", true);
10351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
10361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SigninScreenHandler::OnMaximizeModeEnded() {
10381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CallJS("login.AccountPickerScreen.setTouchViewState", false);
10391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
10401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
104146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool SigninScreenHandler::ShouldLoadGaia() const {
104246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Fetching of the extension is not started before account picker page is
104346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // loaded because it can affect the loading speed.
104446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Do not load the extension for the screen locker, see crosbug.com/25018.
104546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return !ScreenLocker::default_screen_locker() &&
104646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         is_account_picker_showing_first_time_;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1049a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Update keyboard layout to least recently used by the user.
10501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SigninScreenHandler::SetUserInputMethod(
10511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& username,
10521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input_method::InputMethodManager::State* ime_state) {
10531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool succeed = false;
1054d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
10551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string input_method = GetUserLRUInputMethod(username);
1056a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
10571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!input_method.empty())
10581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    succeed = SetUserInputMethodImpl(username, input_method, ime_state);
1059a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
1060a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // This is also a case when LRU layout is set only for a few local users,
1061a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // thus others need to be switched to default locale.
1062a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Otherwise they will end up using another user's locale to log in.
1063a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (!succeed) {
1064f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DVLOG(0) << "SetUserInputMethod('" << username
1065424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)               << "'): failed to set user layout. Switching to default.";
1066a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
10671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ime_state->SetInputMethodLoginDefault();
1068a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
1069a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
1070a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void SigninScreenHandler::UserSettingsChanged() {
1073f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(gaia_screen_handler_);
1074f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GaiaContext context;
1075f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (delegate_)
107623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    context.has_users = !delegate_->GetUsers().empty();
1077f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gaia_screen_handler_->UpdateGaia(context);
107868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  UpdateAddButtonStatus();
107968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
108068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::UpdateAddButtonStatus() {
1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("cr.ui.login.DisplayManager.updateAddUserButtonStatus",
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         AllWhitelistedUsersPresent());
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleAuthenticateUser(const std::string& username,
1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                 const std::string& password) {
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UserContext user_context(username);
1091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  user_context.SetKey(Key(password));
1092116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  delegate_->Login(user_context, SigninSpecifics());
1093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SigninScreenHandler::HandleAttemptUnlock(const std::string& username) {
109634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EasyUnlockService* service = GetEasyUnlockServiceForUser(username);
109734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!service)
1098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
109934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  service->AttemptAuth(username);
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLaunchDemoUser() {
1103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UserContext context(user_manager::USER_TYPE_RETAIL_MODE, std::string());
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delegate_->Login(context, SigninSpecifics());
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLaunchIncognito() {
1109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UserContext context(user_manager::USER_TYPE_GUEST, std::string());
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delegate_->Login(context, SigninSpecifics());
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninScreenHandler::HandleShowSupervisedUserCreationScreen() {
11156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!user_manager::UserManager::Get()->AreSupervisedUsersAllowed()) {
1116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LOG(ERROR) << "Managed users not allowed.";
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> params(new base::DictionaryValue());
1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoginDisplayHostImpl::default_host()->
11215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      StartWizard(WizardController::kSupervisedUserCreationScreenName,
1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      params.Pass());
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninScreenHandler::HandleLaunchPublicSession(
11265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& user_id,
11275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& locale,
11285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& input_method) {
11295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!delegate_)
11305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
11315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
11325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  UserContext context(user_manager::USER_TYPE_PUBLIC_ACCOUNT, user_id);
11335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  context.SetPublicSessionLocale(locale),
11345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  context.SetPublicSessionInputMethod(input_method);
11355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  delegate_->Login(context, SigninSpecifics());
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::HandleOfflineLogin(const base::ListValue* args) {
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_ || delegate_->IsShowUsers()) {
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
114346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string email;
114446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  args->GetString(0, &email);
114546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
114646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gaia_screen_handler_->PopulateEmail(email);
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load auth extension. Parameters are: force reload, do not load extension in
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // background, use offline version.
114946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gaia_screen_handler_->LoadAuthExtension(true, false, true);
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL);
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleShutdownSystem() {
1154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ash::Shell::GetInstance()->lock_state_controller()->RequestShutdown();
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLoadWallpaper(const std::string& email) {
1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    delegate_->LoadWallpaper(email);
1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleRebootSystem() {
1163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart();
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleRemoveUser(const std::string& email) {
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RemoveUser(email);
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAddButtonStatus();
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::HandleShowAddUser(const base::ListValue* args) {
1174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TRACE_EVENT_ASYNC_STEP_INTO0("ui",
1175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               "ShowLoginWebUI",
1176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               LoginDisplayHostImpl::kShowLoginWebUIid,
1177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               "ShowAddUser");
1178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string email;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |args| can be null if it's OOBE.
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args)
1181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    args->GetString(0, &email);
118246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gaia_screen_handler_->PopulateEmail(email);
118346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  OnShowAddUser();
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleToggleEnrollmentScreen() {
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ShowEnterpriseEnrollmentScreen();
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SigninScreenHandler::HandleToggleKioskEnableScreen() {
11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
11947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (delegate_ &&
1195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !auto_enrollment_progress_subscription_ &&
119623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      !connector->IsEnterpriseManaged() &&
119723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      LoginDisplayHostImpl::default_host()) {
1198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    AutoEnrollmentController* auto_enrollment_controller =
1199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        LoginDisplayHostImpl::default_host()->GetAutoEnrollmentController();
1200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    auto_enrollment_progress_subscription_ =
1201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        auto_enrollment_controller->RegisterProgressCallback(
1202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            base::Bind(&SigninScreenHandler::ContinueKioskEnableFlow,
1203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       weak_factory_.GetWeakPtr()));
1204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ContinueKioskEnableFlow(auto_enrollment_controller->state());
12057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
12067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
12077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SigninScreenHandler::HandleToggleKioskAutolaunchScreen() {
12095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
12105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
12115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (delegate_ && !connector->IsEnterpriseManaged())
1212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delegate_->ShowKioskAutolaunchScreen();
1213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
121546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void SigninScreenHandler::LoadUsers(const base::ListValue& users_list,
121646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    bool showGuest) {
121746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CallJS("login.AccountPickerScreen.loadUsers",
121846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         users_list,
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         delegate_->IsShowGuest());
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleAccountPickerReady() {
1223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  VLOG(0) << "Login WebUI >> AccountPickerReady";
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_ && !ScreenLocker::default_screen_locker() &&
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !chromeos::IsMachineHWIDCorrect() &&
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !oobe_ui_) {
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->ShowWrongHWIDScreen();
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = g_browser_process->local_state();
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs->GetBoolean(prefs::kFactoryResetRequested)) {
1234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (core_oobe_actor_) {
12350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      core_oobe_actor_->ShowDeviceResetScreen();
1236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return;
1237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_account_picker_showing_first_time_ = true;
124146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gaia_screen_handler_->MaybePreloadAuthExtension();
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124329b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  ScreenlockBridge::Get()->SetLockHandler(this);
1244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (ScreenLocker::default_screen_locker()) {
12453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ScreenLocker::default_screen_locker()->delegate()->OnLockWebUIReady();
1246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_)
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->OnSigninScreenReady();
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleWallpaperReady() {
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ScreenLocker::default_screen_locker()) {
12543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ScreenLocker::default_screen_locker()->delegate()->
12553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        OnLockBackgroundDisplayed();
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleSignOutUser() {
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->Signout();
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleCreateAccount() {
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->CreateAccount();
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleOpenProxySettings() {
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoginDisplayHostImpl::default_host()->OpenProxySettings();
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLoginVisible(const std::string& source) {
1274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  VLOG(1) << "Login WebUI >> loginVisible, src: " << source << ", "
1275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          << "webui_visible_: " << webui_visible_;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!webui_visible_) {
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There might be multiple messages from OOBE UI so send notifications after
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the first one only.
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::NotificationService::current()->Notify(
1280a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources(),
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::NoDetails());
1283ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    TRACE_EVENT_ASYNC_END0(
1284ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "ui", "ShowLoginWebUI", LoginDisplayHostImpl::kShowLoginWebUIid);
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webui_visible_ = true;
128790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (preferences_changed_delayed_)
128890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    OnPreferencesChanged();
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleCancelPasswordChangedFlow() {
129246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gaia_screen_handler_->StartClearingCookies(
129346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(&SigninScreenHandler::CancelPasswordChangedFlowInternal,
129446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 weak_factory_.GetWeakPtr()));
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SigninScreenHandler::HandleCancelUserAdding() {
1298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_)
1299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delegate_->CancelUserAdding();
1300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleMigrateUserData(
1303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& old_password) {
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_)
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->MigrateUserData(old_password);
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleResyncUserData() {
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_)
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->ResyncUserData();
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLoginUIStateChanged(const std::string& source,
1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    bool new_value) {
1315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  VLOG(0) << "Login WebUI >> active: " << new_value << ", "
131690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            << "source: " << source;
131790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!KioskAppManager::Get()->GetAutoLaunchApp().empty() &&
1319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      KioskAppManager::Get()->IsAutoLaunchRequested()) {
1320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    VLOG(0) << "Showing auto-launch warning";
13214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // On slow devices, the wallpaper animation is not shown initially, so we
13224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // must explicitly load the wallpaper. This is also the case for the
13234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // account-picker and gaia-signin UI states.
13244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate_->LoadSigninWallpaper();
1325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    HandleToggleKioskAutolaunchScreen();
1326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
1327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (source == kSourceGaiaSignin) {
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_state_ = UI_STATE_GAIA_SIGNIN;
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (source == kSourceAccountPicker) {
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_state_ = UI_STATE_ACCOUNT_PICKER;
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleUnlockOnLoginSuccess() {
13406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(user_manager::UserManager::Get()->IsUserLoggedIn());
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ScreenLocker::default_screen_locker())
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScreenLocker::default_screen_locker()->UnlockOnLoginSuccess();
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleShowLoadingTimeoutError() {
1346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  UpdateState(ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT);
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleUpdateOfflineLogin(bool offline_login_active) {
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  offline_login_active_ = offline_login_active;
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SigninScreenHandler::HandleFocusPod(const std::string& user_id) {
13541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetUserInputMethod(user_id, ime_state_.get());
13551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA)
13561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(dpolukhin):  crbug.com/408734.
13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WallpaperManager::Get()->SetUserWallpaperDelayed(user_id);
13581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
13591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScreenlockBridge::Get()->SetFocusedUser(user_id);
13601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!test_focus_pod_callback_.is_null())
13611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_focus_pod_callback_.Run();
13623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
13633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
136403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SigninScreenHandler::HandleHardlockPod(const std::string& user_id) {
136503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SetAuthType(user_id,
136634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)              ScreenlockBridge::LockHandler::OFFLINE_PASSWORD,
136703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              base::string16());
136834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EasyUnlockService* service = GetEasyUnlockServiceForUser(user_id);
136934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!service)
137034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return;
137134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  service->SetHardlockState(EasyUnlockScreenlockStateHandler::USER_HARDLOCK);
137203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
137303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SigninScreenHandler::HandleRetrieveAuthenticatedUserEmail(
13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    double attempt_token) {
1376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(antrim) : move GaiaSigninScreen dependency to GaiaSigninScreen.
13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  email_retriever_.reset(new AuthenticatedUserEmailRetriever(
13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&SigninScreenHandler::CallJS<double, std::string>,
13795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(this),
13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 "login.GaiaSigninScreen.setAuthenticatedUserEmail",
13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 attempt_token),
13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Profile::FromWebUI(web_ui())->GetRequestContext()));
13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts(
13865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& user_id,
13875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& locale) {
13885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetKeyboardLayoutsForLocale(
13895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&SigninScreenHandler::SendPublicSessionKeyboardLayouts,
13905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
13915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 user_id,
13925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 locale),
13935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      locale);
13945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
13955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
13965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninScreenHandler::SendPublicSessionKeyboardLayouts(
13975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& user_id,
13985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& locale,
13995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    scoped_ptr<base::ListValue> keyboard_layouts) {
14005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CallJS("login.AccountPickerScreen.setPublicSessionKeyboardLayouts",
14015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         user_id,
14025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         locale,
14035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         *keyboard_layouts);
14045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
14055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SigninScreenHandler::HandleLaunchKioskApp(const std::string& app_id,
14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               bool diagnostic_mode) {
1408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UserContext context(user_manager::USER_TYPE_KIOSK_APP, app_id);
1409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SigninSpecifics specifics;
1410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  specifics.kiosk_diagnostic_mode = diagnostic_mode;
1411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (delegate_)
1412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delegate_->Login(context, specifics);
14133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
14143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
14155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninScreenHandler::HandleCancelConsumerManagementEnrollment() {
14166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  policy::ConsumerManagementService* consumer_management =
14176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos()->
14186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          GetConsumerManagementService();
14196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CHECK(consumer_management);
14201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  consumer_management->SetEnrollmentStage(
14211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy::ConsumerManagementService::ENROLLMENT_STAGE_CANCELED);
14225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  is_enrolling_consumer_management_ = false;
14235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ShowImpl();
14245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
14255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SigninScreenHandler::HandleGetTouchViewState() {
14271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (max_mode_delegate_) {
14281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CallJS("login.AccountPickerScreen.setTouchViewState",
14291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           max_mode_delegate_->IsMaximizeModeEnabled());
14301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
14311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SigninScreenHandler::AllWhitelistedUsersPresent() {
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosSettings* cros_settings = CrosSettings::Get();
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_new_user = false;
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user);
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (allow_new_user)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
14396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
14405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const user_manager::UserList& users = user_manager->GetUsers();
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_ || users.size() > kMaxUsers) {
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::ListValue* whitelist = NULL;
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cros_settings->GetList(kAccountsPrefUsers, &whitelist) || !whitelist)
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < whitelist->GetSize(); ++i) {
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string whitelisted_user;
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NB: Wildcards in the whitelist are also detected as not present here.
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!whitelist->GetString(i, &whitelisted_user) ||
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !user_manager->IsKnownUser(whitelisted_user)) {
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::CancelPasswordChangedFlowInternal() {
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_) {
1460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ShowImpl();
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->CancelPasswordChangedFlow();
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOobeUI* SigninScreenHandler::GetOobeUI() const {
14661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return static_cast<OobeUI*>(web_ui()->GetController());
14671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
146934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)EasyUnlockService* SigninScreenHandler::GetEasyUnlockServiceForUser(
147034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      const std::string& username) const {
147134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!ScreenLocker::default_screen_locker() &&
147234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      GetOobeUI()->display_type() != OobeUI::kLoginDisplay)
147334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return NULL;
147434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
147534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  const user_manager::User* unlock_user = NULL;
147634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  const user_manager::UserList& users = delegate_->GetUsers();
147734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  for (user_manager::UserList::const_iterator it = users.begin();
147834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)       it != users.end();
147934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)       ++it) {
148034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    if ((*it)->email() == username) {
148134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      unlock_user = *it;
148234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      break;
148334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    }
148434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  }
148534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!unlock_user)
148634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return NULL;
148734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
148834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  ProfileHelper* profile_helper = ProfileHelper::Get();
148934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  Profile* profile = profile_helper->GetProfileByUser(unlock_user);
149034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
149134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // The user profile should exists if and only if this is lock screen.
149234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  DCHECK_NE(!profile, !ScreenLocker::default_screen_locker());
149334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
149434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!profile)
149534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    profile = profile_helper->GetSigninProfile();
149634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
149734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  return EasyUnlockService::Get(profile);
149834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)}
149934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OobeUI::Screen SigninScreenHandler::GetCurrentScreen() const {
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OobeUI::Screen screen = OobeUI::SCREEN_UNKNOWN;
15021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OobeUI* oobe_ui = GetOobeUI();
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (oobe_ui)
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    screen = oobe_ui->current_screen();
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return screen;
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1508a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool SigninScreenHandler::IsGaiaVisible() const {
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsSigninScreen(GetCurrentScreen()) &&
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui_state_ == UI_STATE_GAIA_SIGNIN;
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1513a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool SigninScreenHandler::IsGaiaHiddenByError() const {
1514a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return IsSigninScreenHiddenByError() &&
1515a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ui_state_ == UI_STATE_GAIA_SIGNIN;
1516a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
1517a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SigninScreenHandler::IsSigninScreenHiddenByError() const {
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (GetCurrentScreen() == OobeUI::SCREEN_ERROR_MESSAGE) &&
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (IsSigninScreen(error_screen_actor_->parent_screen()));
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SigninScreenHandler::IsGuestSigninAllowed() const {
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrosSettings* cros_settings = CrosSettings::Get();
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!cros_settings)
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool allow_guest;
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cros_settings->GetBoolean(kAccountsPrefAllowGuest, &allow_guest);
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return allow_guest;
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SigninScreenHandler::IsOfflineLoginAllowed() const {
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrosSettings* cros_settings = CrosSettings::Get();
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!cros_settings)
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Offline login is allowed only when user pods are hidden.
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool show_pods;
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cros_settings->GetBoolean(kAccountsPrefShowUserNamesOnSignIn, &show_pods);
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !show_pods;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SigninScreenHandler::ContinueKioskEnableFlow(
1544effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    policy::AutoEnrollmentState state) {
15451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Do not proceed with kiosk enable when auto enroll will be enforced.
15461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // TODO(xiyuan): Add an error UI feedkback so user knows what happens.
1547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (state) {
1548effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case policy::AUTO_ENROLLMENT_STATE_IDLE:
1549effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case policy::AUTO_ENROLLMENT_STATE_PENDING:
1550effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case policy::AUTO_ENROLLMENT_STATE_CONNECTION_ERROR:
1551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // Wait for the next callback.
1552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
1553effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case policy::AUTO_ENROLLMENT_STATE_TRIGGER_ENROLLMENT:
1554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // Auto-enrollment is on.
1555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      LOG(WARNING) << "Kiosk enable flow aborted because auto enrollment is "
1556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      "going to be enforced.";
1557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (!kiosk_enable_flow_aborted_callback_for_test_.is_null())
1558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kiosk_enable_flow_aborted_callback_for_test_.Run();
1559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
1560effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case policy::AUTO_ENROLLMENT_STATE_SERVER_ERROR:
1561effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case policy::AUTO_ENROLLMENT_STATE_NO_ENROLLMENT:
1562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // Auto-enrollment not applicable.
1563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (delegate_)
1564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        delegate_->ShowKioskEnableScreen();
1565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
15661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  auto_enrollment_progress_subscription_.reset();
15681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
15691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
157046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void SigninScreenHandler::OnShowAddUser() {
1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  is_account_picker_showing_first_time_ = false;
157246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(gaia_screen_handler_);
15735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gaia_screen_handler_->ShowGaia(is_enrolling_consumer_management_);
15745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
15755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GaiaScreenHandler::FrameState SigninScreenHandler::FrameState() const {
1577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(gaia_screen_handler_);
1578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return gaia_screen_handler_->frame_state();
1579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)net::Error SigninScreenHandler::FrameError() const {
1582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(gaia_screen_handler_);
1583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return gaia_screen_handler_->frame_error();
1584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SigninScreenHandler::OnCapsLockChanged(bool enabled) {
1587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  caps_lock_enabled_ = enabled;
1588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (page_is_ready())
1589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CallJS("login.AccountPickerScreen.setCapsLockState", caps_lock_enabled_);
1590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1593