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, ¤t_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, ¤t_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, ¤t_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