network_screen_handler.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <algorithm>
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind_helpers.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/logging.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/weak_ptr.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_service.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/base/locale_util.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/idle_detector.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_util.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/login/input_events_blocker.h"
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/login/login_display_host.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_display_host_impl.h"
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/login/screens/core_oobe_actor.h"
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/system/input_device_settings.h"
300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/system/timezone_util.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.h"
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/pref_names.h"
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/chromeos_switches.h"
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/ime/extension_ime_util.h"
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kJsScreenPath[] = "login.NetworkScreen";
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// JS API callbacks names.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJsApiNetworkOnExit[] = "networkOnExit";
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJsApiNetworkOnLanguageChanged[] = "networkOnLanguageChanged";
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJsApiNetworkOnInputMethodChanged[] = "networkOnInputMethodChanged";
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)const char kJsApiNetworkOnTimezoneChanged[] = "networkOnTimezoneChanged";
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kUSLayout[] = "xkb:us::eng";
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int kDerelectDetectionTimeoutSeconds = 8 * 60 * 60;  // 8 hours.
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int kDerelectIdleTimeoutSeconds = 5 * 60;  // 5 minutes.
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int kOobeTimerUpdateIntervalSeconds = 5 * 60;  // 5 minutes.
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns true if element was inserted.
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool InsertString(const std::string& str, std::set<std::string>& to) {
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::pair<std::set<std::string>::iterator, bool> result =
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      to.insert(str);
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result.second;
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AddOptgroupOtherLayouts(base::ListValue* input_methods_list) {
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* optgroup = new base::DictionaryValue;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  optgroup->SetString(
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "optionGroupName",
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OOBE_OTHER_KEYBOARD_LAYOUTS));
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_methods_list->Append(optgroup);
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// For "UI Language" drop-down menu at OOBE screen we need to decide which
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// entry to mark "selected". If user has just selected "requested_locale",
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// but "loaded_locale" was actually loaded, we mark original user choice
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// "selected" only if loaded_locale is a backup for "requested_locale".
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string CalculateSelectedLanguage(const std::string& requested_locale,
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                      const std::string& loaded_locale) {
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string resolved_locale;
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!l10n_util::CheckAndResolveLocale(requested_locale, &resolved_locale))
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return loaded_locale;
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (resolved_locale == loaded_locale)
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return requested_locale;
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return loaded_locale;
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkScreenHandler, public: -----------------------------------------------
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)NetworkScreenHandler::NetworkScreenHandler(CoreOobeActor* core_oobe_actor)
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : BaseScreenHandler(kJsScreenPath),
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      screen_(NULL),
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      core_oobe_actor_(core_oobe_actor),
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_continue_enabled_(false),
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      show_on_init_(false),
104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      should_reinitialize_language_keyboard_list_(false),
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      weak_ptr_factory_(this) {
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(core_oobe_actor_);
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetupTimeouts();
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  input_method::InputMethodManager* manager =
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      input_method::InputMethodManager::Get();
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager->GetComponentExtensionIMEManager()->AddObserver(this);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkScreenHandler::~NetworkScreenHandler() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (screen_)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    screen_->OnActorDestroyed(this);
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  input_method::InputMethodManager::Get()
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ->GetComponentExtensionIMEManager()
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ->RemoveObserver(this);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkScreenHandler, NetworkScreenActor implementation: --------------------
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::SetDelegate(NetworkScreenActor::Delegate* screen) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  screen_ = screen;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::PrepareToShow() {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::Show() {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!page_is_ready()) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_on_init_ = true;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Here we should handle default locales, for which we do not have UI
139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // resources. This would load fallback, but properly show "selected" locale
140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // in the UI.
141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (selected_language_code_.empty()) {
142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const StartupCustomizationDocument* startup_manifest =
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        StartupCustomizationDocument::GetInstance();
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    HandleOnLanguageChanged(startup_manifest->initial_locale_default());
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowScreen(OobeUI::kScreenOobeNetwork, NULL);
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableDemoMode))
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (IsDerelict())
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    StartIdleDetection();
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  else
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    StartOobeTimer();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::Hide() {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void NetworkScreenHandler::ShowError(const base::string16& message) {
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CallJS("showError", message);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::ClearErrors() {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (page_is_ready())
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    core_oobe_actor_->ClearErrors();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::ShowConnectingStatus(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool connecting,
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& network_id) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::EnableContinue(bool enabled) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_continue_enabled_ = enabled;
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (page_is_ready())
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    CallJS("enableContinueButton", enabled);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkScreenHandler, BaseScreenHandler implementation: --------------------
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkScreenHandler::DeclareLocalizedValues(
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LocalizedValuesBuilder* builder) {
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (system::InputDeviceSettings::Get()->ForceKeyboardDrivenUINavigation())
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    builder->Add("networkScreenGreeting", IDS_REMORA_CONFIRM_MESSAGE);
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  else
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    builder->Add("networkScreenGreeting", IDS_WELCOME_SCREEN_GREETING);
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("networkScreenTitle", IDS_WELCOME_SCREEN_TITLE);
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  builder->Add("networkScreenAccessibleTitle",
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               IDS_NETWORK_SCREEN_ACCESSIBLE_TITLE);
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("selectLanguage", IDS_LANGUAGE_SELECTION_SELECT);
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("selectKeyboard", IDS_KEYBOARD_SELECTION_SELECT);
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("selectNetwork", IDS_NETWORK_SELECTION_SELECT);
1960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  builder->Add("selectTimezone", IDS_OPTIONS_SETTINGS_TIMEZONE_DESCRIPTION);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("proxySettings", IDS_OPTIONS_PROXIES_CONFIGURE_BUTTON);
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON);
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkScreenHandler::GetAdditionalParameters(
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::DictionaryValue* dict) {
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dict->Set("languageList", GetLanguageList());
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dict->Set("inputMethodsList", GetInputMethods());
2050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  dict->Set("timezoneList", GetTimezoneList());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::Initialize() {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableContinue(is_continue_enabled_);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (show_on_init_) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_on_init_ = false;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Show();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
215e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (should_reinitialize_language_keyboard_list_) {
216e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    should_reinitialize_language_keyboard_list_ = false;
217e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ReloadLocalizedContent();
218e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
219e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  timezone_subscription_ = CrosSettings::Get()->AddSettingsObserver(
2210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      kSystemTimezone,
2220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      base::Bind(&NetworkScreenHandler::OnSystemTimezoneChanged,
2230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 base::Unretained(this)));
2240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  OnSystemTimezoneChanged();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkScreenHandler, WebUIMessageHandler implementation: -------------------
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkScreenHandler::RegisterMessages() {
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback(kJsApiNetworkOnExit, &NetworkScreenHandler::HandleOnExit);
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback(kJsApiNetworkOnLanguageChanged,
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &NetworkScreenHandler::HandleOnLanguageChanged);
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback(kJsApiNetworkOnInputMethodChanged,
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &NetworkScreenHandler::HandleOnInputMethodChanged);
2350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AddCallback(kJsApiNetworkOnTimezoneChanged,
2360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              &NetworkScreenHandler::HandleOnTimezoneChanged);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetworkScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) {
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  registry->RegisterInt64Pref(prefs::kTimeOnOobe, 0);
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkScreenHandler, private: ----------------------------------------------
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkScreenHandler::HandleOnExit() {
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  idle_detector_.reset();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearErrors();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (screen_)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    screen_->OnContinuePressed();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct NetworkScreenHandlerOnLanguageChangedCallbackData {
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit NetworkScreenHandlerOnLanguageChangedCallbackData(
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::WeakPtr<NetworkScreenHandler>& handler)
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : handler_(handler) {}
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtr<NetworkScreenHandler> handler_;
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Block UI while resource bundle is being reloaded.
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chromeos::InputEventsBlocker input_events_blocker;
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkScreenHandler::OnLanguageChangedCallback(
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<NetworkScreenHandlerOnLanguageChangedCallbackData> context,
268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const std::string& requested_locale,
269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const std::string& loaded_locale,
270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const bool success) {
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!context or !context->handler_)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NetworkScreenHandler* const self = context->handler_.get();
275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (success) {
277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (requested_locale == loaded_locale) {
278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      self->selected_language_code_ = requested_locale;
279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    } else {
280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      self->selected_language_code_ =
281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          CalculateSelectedLanguage(requested_locale, loaded_locale);
282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else {
284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    self->selected_language_code_ = loaded_locale;
285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
287e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  self->ReloadLocalizedContent();
288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AccessibilityManager::Get()->OnLocaleChanged();
290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NetworkScreenHandler::HandleOnLanguageChanged(const std::string& locale) {
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string app_locale = g_browser_process->GetApplicationLocale();
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (app_locale == locale)
295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtr<NetworkScreenHandler> weak_self =
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      weak_ptr_factory_.GetWeakPtr();
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<NetworkScreenHandlerOnLanguageChangedCallbackData> callback_data(
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new NetworkScreenHandlerOnLanguageChangedCallbackData(weak_self));
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<locale_util::SwitchLanguageCallback> callback(
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new locale_util::SwitchLanguageCallback(
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          base::Bind(&NetworkScreenHandler::OnLanguageChangedCallback,
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     base::Passed(callback_data.Pass()))));
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  locale_util::SwitchLanguage(locale,
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              true /* enableLocaleKeyboardLayouts */,
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              true /* login_layouts_only */,
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              callback.Pass());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkScreenHandler::HandleOnInputMethodChanged(const std::string& id) {
312a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  input_method::InputMethodManager::Get()->ChangeInputMethod(id);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void NetworkScreenHandler::HandleOnTimezoneChanged(
3160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const std::string& timezone_id) {
3170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::string current_timezone_id;
3180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  CrosSettings::Get()->GetString(kSystemTimezone, &current_timezone_id);
3190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (current_timezone_id == timezone_id)
3200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
3210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  CrosSettings::Get()->SetString(kSystemTimezone, timezone_id);
3230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
3240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void NetworkScreenHandler::OnSystemTimezoneChanged() {
3260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::string current_timezone_id;
3270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  CrosSettings::Get()->GetString(kSystemTimezone, &current_timezone_id);
3280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  CallJS("setTimezone", current_timezone_id);
3290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
3300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetworkScreenHandler::StartIdleDetection() {
332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!idle_detector_.get()) {
333effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    idle_detector_.reset(
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new IdleDetector(base::Closure(),
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         base::Bind(&NetworkScreenHandler::OnIdle,
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    weak_ptr_factory_.GetWeakPtr())));
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  idle_detector_->Start(derelict_idle_timeout_);
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NetworkScreenHandler::StartOobeTimer() {
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  oobe_timer_.Start(FROM_HERE,
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    oobe_timer_update_interval_,
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    this,
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    &NetworkScreenHandler::OnOobeTimerUpdate);
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetworkScreenHandler::OnIdle() {
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LoginDisplayHost* host = LoginDisplayHostImpl::default_host();
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  host->StartDemoAppLaunch();
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NetworkScreenHandler::OnOobeTimerUpdate() {
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  time_on_oobe_ += oobe_timer_update_interval_;
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PrefService* prefs = g_browser_process->local_state();
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  prefs->SetInt64(prefs::kTimeOnOobe, time_on_oobe_.InSeconds());
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (IsDerelict()) {
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    oobe_timer_.Stop();
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    StartIdleDetection();
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetworkScreenHandler::SetupTimeouts() {
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CommandLine* cmdline = CommandLine::ForCurrentProcess();
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(cmdline);
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrefService* prefs = g_browser_process->local_state();
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  time_on_oobe_ =
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::TimeDelta::FromSeconds(prefs->GetInt64(prefs::kTimeOnOobe));
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int derelict_detection_timeout;
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!cmdline->HasSwitch(switches::kDerelictDetectionTimeout) ||
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !base::StringToInt(
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          cmdline->GetSwitchValueASCII(switches::kDerelictDetectionTimeout),
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &derelict_detection_timeout)) {
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    derelict_detection_timeout = kDerelectDetectionTimeoutSeconds;
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  derelict_detection_timeout_ =
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::TimeDelta::FromSeconds(derelict_detection_timeout);
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int derelict_idle_timeout;
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!cmdline->HasSwitch(switches::kDerelictIdleTimeout) ||
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !base::StringToInt(
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          cmdline->GetSwitchValueASCII(switches::kDerelictIdleTimeout),
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &derelict_idle_timeout)) {
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    derelict_idle_timeout = kDerelectIdleTimeoutSeconds;
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  derelict_idle_timeout_ = base::TimeDelta::FromSeconds(derelict_idle_timeout);
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int oobe_timer_update_interval;
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!cmdline->HasSwitch(switches::kOobeTimerInterval) ||
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !base::StringToInt(
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          cmdline->GetSwitchValueASCII(switches::kOobeTimerInterval),
397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          &oobe_timer_update_interval)) {
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    oobe_timer_update_interval = kOobeTimerUpdateIntervalSeconds;
399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  oobe_timer_update_interval_ =
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::TimeDelta::FromSeconds(oobe_timer_update_interval);
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // In case we'd be derelict before our timer is set to trigger, reduce
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // the interval so we check again when we're scheduled to go derelict.
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  oobe_timer_update_interval_ =
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      std::max(std::min(oobe_timer_update_interval_,
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        derelict_detection_timeout_ - time_on_oobe_),
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               base::TimeDelta::FromSeconds(0));
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool NetworkScreenHandler::IsDerelict() {
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return time_on_oobe_ >= derelict_detection_timeout_;
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::ListValue* NetworkScreenHandler::GetLanguageList() {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string app_locale = g_browser_process->GetApplicationLocale();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_method::InputMethodManager* manager =
418a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      input_method::InputMethodManager::Get();
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ComponentExtensionIMEManager* comp_manager =
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      manager->GetComponentExtensionIMEManager();
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  input_method::InputMethodDescriptors descriptors;
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (extension_ime_util::UseWrappedExtensionKeyboardLayouts()) {
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (comp_manager->IsInitialized())
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      descriptors = comp_manager->GetXkbIMEAsInputMethodDescriptor();
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    descriptors = *(manager->GetSupportedInputMethods());
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* languages_list =
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      options::CrosLanguageOptionsHandler::GetUILanguageList(descriptors);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < languages_list->GetSize(); ++i) {
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* language_info = NULL;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!languages_list->GetDictionary(i, &language_info))
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string value;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    language_info->GetString("code", &value);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string display_name;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    language_info->GetString("displayName", &display_name);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string native_name;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    language_info->GetString("nativeDisplayName", &native_name);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // If it's option group divider, add field name.
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (value == options::kVendorOtherLanguagesListDivider) {
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      language_info->SetString(
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          "optionGroupName",
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          l10n_util::GetStringUTF16(IDS_OOBE_OTHER_LANGUAGES));
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (display_name != native_name) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_name = base::StringPrintf("%s - %s",
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        display_name.c_str(),
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        native_name.c_str());
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    language_info->SetString("value", value);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    language_info->SetString("title", display_name);
456c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (selected_language_code_.empty()) {
457c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (value == app_locale)
458c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        language_info->SetBoolean("selected", true);
459c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    } else {
460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (value == selected_language_code_)
461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        language_info->SetBoolean("selected", true);
462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return languages_list;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::DictionaryValue* CreateInputMethodsEntry(
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const input_method::InputMethodDescriptor& method,
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string current_input_method_id) {
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_method::InputMethodUtil* util =
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      input_method::InputMethodManager::Get()->GetInputMethodUtil();
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string& ime_id = method.id();
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> input_method(new base::DictionaryValue);
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_method->SetString("value", ime_id);
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_method->SetString("title", util->GetInputMethodLongName(method));
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  input_method->SetBoolean("selected", ime_id == current_input_method_id);
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return input_method.release();
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NetworkScreenHandler::OnImeComponentExtensionInitialized() {
481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Refreshes the language and keyboard list once the component extension
482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // IMEs are initialized.
483e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (page_is_ready())
484e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ReloadLocalizedContent();
485e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  else
486e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    should_reinitialize_language_keyboard_list_ = true;
487e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
488e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
489e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid NetworkScreenHandler::ReloadLocalizedContent() {
490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::DictionaryValue localized_strings;
491e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  static_cast<OobeUI*>(web_ui()->GetController())
492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ->GetLocalizedStrings(&localized_strings);
493e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  core_oobe_actor_->ReloadContent(localized_strings);
494e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
495e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Buttons are recreated, updated "Continue" button state.
496e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EnableContinue(is_continue_enabled_);
497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::ListValue* NetworkScreenHandler::GetInputMethods() {
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* input_methods_list = new base::ListValue;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_method::InputMethodManager* manager =
503a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      input_method::InputMethodManager::Get();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_method::InputMethodUtil* util = manager->GetInputMethodUtil();
505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (extension_ime_util::UseWrappedExtensionKeyboardLayouts()) {
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ComponentExtensionIMEManager* comp_manager =
507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        manager->GetComponentExtensionIMEManager();
508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (!comp_manager->IsInitialized()) {
509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      input_method::InputMethodDescriptor fallback =
510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          util->GetFallbackInputMethodDescriptor();
511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      input_methods_list->Append(
512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          CreateInputMethodsEntry(fallback, fallback.id()));
513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return input_methods_list;
514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
517c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const std::vector<std::string>& hardware_login_input_methods =
518c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      util->GetHardwareLoginInputMethodIds();
519c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  manager->EnableLoginLayouts(g_browser_process->GetApplicationLocale(),
520c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              hardware_login_input_methods);
521c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<input_method::InputMethodDescriptors> input_methods(
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager->GetActiveInputMethods());
524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const std::string& current_input_method_id =
525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      manager->GetCurrentInputMethod().id();
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::set<std::string> input_methods_added;
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (std::vector<std::string>::const_iterator i =
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           hardware_login_input_methods.begin();
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       i != hardware_login_input_methods.end();
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       ++i) {
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const input_method::InputMethodDescriptor* ime =
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        util->GetInputMethodDescriptorFromId(*i);
5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(ime != NULL);
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Do not crash in case of misconfiguration.
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (ime != NULL) {
537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      input_methods_added.insert(*i);
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      input_methods_list->Append(
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          CreateInputMethodsEntry(*ime, current_input_method_id));
5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool optgroup_added = false;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < input_methods->size(); ++i) {
545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Makes sure the id is in legacy xkb id format.
546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& ime_id = (*input_methods)[i].id();
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!InsertString(ime_id, input_methods_added))
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      continue;
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!optgroup_added) {
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      optgroup_added = true;
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddOptgroupOtherLayouts(input_methods_list);
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    input_methods_list->Append(
554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        CreateInputMethodsEntry((*input_methods)[i], current_input_method_id));
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // "xkb:us::eng" should always be in the list of available layouts.
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const std::string& us_keyboard_id =
558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      extension_ime_util::GetInputMethodIDByKeyboardLayout(kUSLayout);
559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (input_methods_added.find(us_keyboard_id) == input_methods_added.end()) {
5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const input_method::InputMethodDescriptor* us_eng_descriptor =
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        util->GetInputMethodDescriptorFromId(us_keyboard_id);
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(us_eng_descriptor != NULL);
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!optgroup_added) {
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      optgroup_added = true;
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddOptgroupOtherLayouts(input_methods_list);
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    input_methods_list->Append(
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateInputMethodsEntry(*us_eng_descriptor, current_input_method_id));
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return input_methods_list;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
5740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)base::ListValue* NetworkScreenHandler::GetTimezoneList() {
5750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::string current_timezone_id;
5760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  CrosSettings::Get()->GetString(kSystemTimezone, &current_timezone_id);
5770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<base::ListValue> timezone_list(new base::ListValue);
5790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<base::ListValue> timezones = system::GetTimezoneList().Pass();
5800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  for (size_t i = 0; i < timezones->GetSize(); ++i) {
5810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const base::ListValue* timezone = NULL;
5820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CHECK(timezones->GetList(i, &timezone));
5830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::string timezone_id;
5850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CHECK(timezone->GetString(0, &timezone_id));
5860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::string timezone_name;
5880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CHECK(timezone->GetString(1, &timezone_name));
5890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    scoped_ptr<base::DictionaryValue> timezone_option(
5910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        new base::DictionaryValue);
5920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    timezone_option->SetString("value", timezone_id);
5930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    timezone_option->SetString("title", timezone_name);
5940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    timezone_option->SetBoolean("selected", timezone_id == current_timezone_id);
5950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    timezone_list->Append(timezone_option.release());
5960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
5970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return timezone_list.release();
5990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
6000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
602