15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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/network_screen_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind_helpers.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/weak_ptr.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_service.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/base/locale_util.h"
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chromeos/customization_document.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/idle_detector.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/login/screens/core_oobe_actor.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/input_events_blocker.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/system/input_device_settings.h"
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/system/timezone_util.h"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/l10n_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/pref_names.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/ime/extension_ime_util.h"
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chromeos/network/network_handler.h"
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chromeos/network/network_state_handler.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kJsScreenPath[] = "login.NetworkScreen";
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// JS API callbacks names.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJsApiNetworkOnExit[] = "networkOnExit";
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJsApiNetworkOnLanguageChanged[] = "networkOnLanguageChanged";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJsApiNetworkOnInputMethodChanged[] = "networkOnInputMethodChanged";
420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)const char kJsApiNetworkOnTimezoneChanged[] = "networkOnTimezoneChanged";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// For "UI Language" drop-down menu at OOBE screen we need to decide which
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// entry to mark "selected". If user has just selected "requested_locale",
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// but "loaded_locale" was actually loaded, we mark original user choice
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// "selected" only if loaded_locale is a backup for "requested_locale".
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string CalculateSelectedLanguage(const std::string& requested_locale,
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                      const std::string& loaded_locale) {
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string resolved_locale;
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!l10n_util::CheckAndResolveLocale(requested_locale, &resolved_locale))
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return loaded_locale;
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (resolved_locale == loaded_locale)
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return requested_locale;
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return loaded_locale;
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkScreenHandler, public: -----------------------------------------------
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)NetworkScreenHandler::NetworkScreenHandler(CoreOobeActor* core_oobe_actor)
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : BaseScreenHandler(kJsScreenPath),
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      screen_(NULL),
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      core_oobe_actor_(core_oobe_actor),
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_continue_enabled_(false),
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      show_on_init_(false),
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      weak_ptr_factory_(this) {
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(core_oobe_actor_);
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  input_method::InputMethodManager* manager =
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      input_method::InputMethodManager::Get();
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  manager->AddObserver(this);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkScreenHandler::~NetworkScreenHandler() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (screen_)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    screen_->OnActorDestroyed(this);
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  input_method::InputMethodManager* manager =
850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      input_method::InputMethodManager::Get();
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  manager->RemoveObserver(this);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkScreenHandler, NetworkScreenActor implementation: --------------------
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::SetDelegate(NetworkScreenActor::Delegate* screen) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  screen_ = screen;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::PrepareToShow() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::Show() {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!page_is_ready()) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_on_init_ = true;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Here we should handle default locales, for which we do not have UI
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // resources. This would load fallback, but properly show "selected" locale
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // in the UI.
107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (selected_language_code_.empty()) {
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const StartupCustomizationDocument* startup_manifest =
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        StartupCustomizationDocument::GetInstance();
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    HandleOnLanguageChanged(startup_manifest->initial_locale_default());
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PrefService* prefs = g_browser_process->local_state();
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (prefs->GetBoolean(prefs::kFactoryResetRequested)) {
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (core_oobe_actor_)
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      core_oobe_actor_->ShowDeviceResetScreen();
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Make sure all our network technologies are turned on. On OOBE, the user
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // should be able to select any of the available networks on the device.
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  handler->SetTechnologyEnabled(NetworkTypePattern::NonVirtual(),
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                true,
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                chromeos::network_handler::ErrorCallback());
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowScreen(OobeUI::kScreenOobeNetwork, NULL);
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  core_oobe_actor_->InitDemoModeDetection();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::Hide() {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void NetworkScreenHandler::ShowError(const base::string16& message) {
134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CallJS("showError", message);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::ClearErrors() {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (page_is_ready())
139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    core_oobe_actor_->ClearErrors();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::ShowConnectingStatus(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool connecting,
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& network_id) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::EnableContinue(bool enabled) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_continue_enabled_ = enabled;
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (page_is_ready())
150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    CallJS("enableContinueButton", enabled);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkScreenHandler, BaseScreenHandler implementation: --------------------
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkScreenHandler::DeclareLocalizedValues(
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LocalizedValuesBuilder* builder) {
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (system::InputDeviceSettings::Get()->ForceKeyboardDrivenUINavigation())
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    builder->Add("networkScreenGreeting", IDS_REMORA_CONFIRM_MESSAGE);
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  else
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    builder->Add("networkScreenGreeting", IDS_WELCOME_SCREEN_GREETING);
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("networkScreenTitle", IDS_WELCOME_SCREEN_TITLE);
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  builder->Add("networkScreenAccessibleTitle",
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               IDS_NETWORK_SCREEN_ACCESSIBLE_TITLE);
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("selectLanguage", IDS_LANGUAGE_SELECTION_SELECT);
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("selectKeyboard", IDS_KEYBOARD_SELECTION_SELECT);
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("selectNetwork", IDS_NETWORK_SELECTION_SELECT);
1680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  builder->Add("selectTimezone", IDS_OPTIONS_SETTINGS_TIMEZONE_DESCRIPTION);
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("proxySettings", IDS_OPTIONS_PROXIES_CONFIGURE_BUTTON);
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON);
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkScreenHandler::GetAdditionalParameters(
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::DictionaryValue* dict) {
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const std::string application_locale =
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      g_browser_process->GetApplicationLocale();
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const std::string selected_language = selected_language_code_.empty() ?
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      application_locale : selected_language_code_;
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const std::string selected_input_method =
18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      input_method::InputMethodManager::Get()
18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          ->GetActiveIMEState()
18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          ->GetCurrentInputMethod()
18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          .id();
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  dict->Set("languageList",
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            GetUILanguageList(NULL, selected_language).release());
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  dict->Set("inputMethodsList",
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            GetAndActivateLoginKeyboardLayouts(
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                application_locale, selected_input_method).release());
1900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  dict->Set("timezoneList", GetTimezoneList());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::Initialize() {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableContinue(is_continue_enabled_);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (show_on_init_) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_on_init_ = false;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Show();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  timezone_subscription_ = CrosSettings::Get()->AddSettingsObserver(
2010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      kSystemTimezone,
2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      base::Bind(&NetworkScreenHandler::OnSystemTimezoneChanged,
2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 base::Unretained(this)));
2040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  OnSystemTimezoneChanged();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkScreenHandler, WebUIMessageHandler implementation: -------------------
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::RegisterMessages() {
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback(kJsApiNetworkOnExit, &NetworkScreenHandler::HandleOnExit);
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback(kJsApiNetworkOnLanguageChanged,
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &NetworkScreenHandler::HandleOnLanguageChanged);
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback(kJsApiNetworkOnInputMethodChanged,
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &NetworkScreenHandler::HandleOnInputMethodChanged);
2150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AddCallback(kJsApiNetworkOnTimezoneChanged,
2160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              &NetworkScreenHandler::HandleOnTimezoneChanged);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkScreenHandler, private: ----------------------------------------------
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkScreenHandler::HandleOnExit() {
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  core_oobe_actor_->StopDemoModeDetection();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearErrors();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (screen_)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    screen_->OnContinuePressed();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct NetworkScreenHandlerOnLanguageChangedCallbackData {
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit NetworkScreenHandlerOnLanguageChangedCallbackData(
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const base::WeakPtr<NetworkScreenHandler>& handler)
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : handler(handler) {}
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtr<NetworkScreenHandler> handler;
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Block UI while resource bundle is being reloaded.
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chromeos::InputEventsBlocker input_events_blocker;
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkScreenHandler::OnLanguageChangedCallback(
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<NetworkScreenHandlerOnLanguageChangedCallbackData> context,
243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const std::string& requested_locale,
244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const std::string& loaded_locale,
245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const bool success) {
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!context || !context->handler)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NetworkScreenHandler* const self = context->handler.get();
250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (success) {
252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (requested_locale == loaded_locale) {
253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      self->selected_language_code_ = requested_locale;
254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    } else {
255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      self->selected_language_code_ =
256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          CalculateSelectedLanguage(requested_locale, loaded_locale);
257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else {
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    self->selected_language_code_ = loaded_locale;
260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
262e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  self->ReloadLocalizedContent();
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // We still do not have device owner, so owner settings are not applied.
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // But Guest session can be started before owner is created, so we need to
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // save locale settings directly here.
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  g_browser_process->local_state()->SetString(prefs::kApplicationLocale,
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                              self->selected_language_code_);
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AccessibilityManager::Get()->OnLocaleChanged();
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkScreenHandler::HandleOnLanguageChanged(const std::string& locale) {
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string app_locale = g_browser_process->GetApplicationLocale();
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (app_locale == locale)
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtr<NetworkScreenHandler> weak_self =
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      weak_ptr_factory_.GetWeakPtr();
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<NetworkScreenHandlerOnLanguageChangedCallbackData> callback_data(
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new NetworkScreenHandlerOnLanguageChangedCallbackData(weak_self));
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<locale_util::SwitchLanguageCallback> callback(
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new locale_util::SwitchLanguageCallback(
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          base::Bind(&NetworkScreenHandler::OnLanguageChangedCallback,
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     base::Passed(callback_data.Pass()))));
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  locale_util::SwitchLanguage(locale,
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              true /* enableLocaleKeyboardLayouts */,
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              true /* login_layouts_only */,
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              callback.Pass());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkScreenHandler::HandleOnInputMethodChanged(const std::string& id) {
29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  input_method::InputMethodManager::Get()
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ->GetActiveIMEState()
29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ->ChangeInputMethod(id, false /* show_message */);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void NetworkScreenHandler::HandleOnTimezoneChanged(
2990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const std::string& timezone_id) {
3000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::string current_timezone_id;
3010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  CrosSettings::Get()->GetString(kSystemTimezone, &current_timezone_id);
3020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (current_timezone_id == timezone_id)
3030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
3040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  CrosSettings::Get()->SetString(kSystemTimezone, timezone_id);
3060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
3070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void NetworkScreenHandler::OnSystemTimezoneChanged() {
3090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::string current_timezone_id;
3100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  CrosSettings::Get()->GetString(kSystemTimezone, &current_timezone_id);
3110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  CallJS("setTimezone", current_timezone_id);
3120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid NetworkScreenHandler::InputMethodChanged(
3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    input_method::InputMethodManager* manager, bool show_message) {
31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CallJS("setInputMethod",
31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         manager->GetActiveIMEState()->GetCurrentInputMethod().id());
3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
320e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid NetworkScreenHandler::ReloadLocalizedContent() {
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::DictionaryValue localized_strings;
322e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  static_cast<OobeUI*>(web_ui()->GetController())
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ->GetLocalizedStrings(&localized_strings);
324e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  core_oobe_actor_->ReloadContent(localized_strings);
325e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
326e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Buttons are recreated, updated "Continue" button state.
327e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EnableContinue(is_continue_enabled_);
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
3310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)base::ListValue* NetworkScreenHandler::GetTimezoneList() {
3320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::string current_timezone_id;
3330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  CrosSettings::Get()->GetString(kSystemTimezone, &current_timezone_id);
3340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<base::ListValue> timezone_list(new base::ListValue);
3360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<base::ListValue> timezones = system::GetTimezoneList().Pass();
3370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  for (size_t i = 0; i < timezones->GetSize(); ++i) {
3380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const base::ListValue* timezone = NULL;
3390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CHECK(timezones->GetList(i, &timezone));
3400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::string timezone_id;
3420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CHECK(timezone->GetString(0, &timezone_id));
3430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::string timezone_name;
3450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CHECK(timezone->GetString(1, &timezone_name));
3460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    scoped_ptr<base::DictionaryValue> timezone_option(
3480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        new base::DictionaryValue);
3490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    timezone_option->SetString("value", timezone_id);
3500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    timezone_option->SetString("title", timezone_name);
3510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    timezone_option->SetBoolean("selected", timezone_id == current_timezone_id);
3520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    timezone_list->Append(timezone_option.release());
3530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
3540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return timezone_list.release();
3560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
3570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
359