1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/webui/chromeos/login/network_screen_handler.h"
7 #include "base/strings/stringprintf.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/values.h"
10 #include "chrome/browser/browser_process.h"
11 #include "chrome/browser/chromeos/input_method/input_method_util.h"
12 #include "chrome/browser/chromeos/login/language_switch_menu.h"
13 #include "chrome/browser/chromeos/login/screens/core_oobe_actor.h"
14 #include "chrome/browser/chromeos/system/timezone_util.h"
15 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
16 #include "chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.h"
17 #include "chromeos/ime/input_method_manager.h"
18 #include "grit/chromium_strings.h"
19 #include "grit/generated_resources.h"
20 #include "ui/gfx/rect.h"
21 #include "ui/views/layout/fill_layout.h"
22 #include "ui/views/widget/widget.h"
26 const char kJsScreenPath[] = "login.NetworkScreen";
28 // JS API callbacks names.
29 const char kJsApiNetworkOnExit[] = "networkOnExit";
30 const char kJsApiNetworkOnLanguageChanged[] = "networkOnLanguageChanged";
31 const char kJsApiNetworkOnInputMethodChanged[] = "networkOnInputMethodChanged";
32 const char kJsApiNetworkOnTimezoneChanged[] = "networkOnTimezoneChanged";
38 // NetworkScreenHandler, public: -----------------------------------------------
40 NetworkScreenHandler::NetworkScreenHandler(CoreOobeActor* core_oobe_actor)
41 : BaseScreenHandler(kJsScreenPath),
43 core_oobe_actor_(core_oobe_actor),
44 is_continue_enabled_(false),
45 show_on_init_(false) {
46 DCHECK(core_oobe_actor_);
49 NetworkScreenHandler::~NetworkScreenHandler() {
51 screen_->OnActorDestroyed(this);
54 // NetworkScreenHandler, NetworkScreenActor implementation: --------------------
56 void NetworkScreenHandler::SetDelegate(NetworkScreenActor::Delegate* screen) {
60 void NetworkScreenHandler::PrepareToShow() {
63 void NetworkScreenHandler::Show() {
64 if (!page_is_ready()) {
69 ShowScreen(OobeUI::kScreenOobeNetwork, NULL);
72 void NetworkScreenHandler::Hide() {
75 void NetworkScreenHandler::ShowError(const string16& message) {
76 CallJS("showError", message);
79 void NetworkScreenHandler::ClearErrors() {
81 core_oobe_actor_->ClearErrors();
84 void NetworkScreenHandler::ShowConnectingStatus(
86 const string16& network_id) {
87 // string16 connecting_label =
88 // l10n_util::GetStringFUTF16(IDS_NETWORK_SELECTION_CONNECTING,
90 // CallJS("cr.ui.Oobe.showConnectingStatus",
91 // base::FundamentalValue(connecting),
92 // base::StringValue(network_id),
93 // base::StringValue(connecting_label_value));
96 void NetworkScreenHandler::EnableContinue(bool enabled) {
97 is_continue_enabled_ = enabled;
99 CallJS("enableContinueButton", enabled);
102 // NetworkScreenHandler, BaseScreenHandler implementation: --------------------
104 void NetworkScreenHandler::DeclareLocalizedValues(
105 LocalizedValuesBuilder* builder) {
106 builder->Add("networkScreenGreeting", IDS_WELCOME_SCREEN_GREETING);
107 builder->Add("networkScreenTitle", IDS_WELCOME_SCREEN_TITLE);
108 builder->Add("selectLanguage", IDS_LANGUAGE_SELECTION_SELECT);
109 builder->Add("selectKeyboard", IDS_KEYBOARD_SELECTION_SELECT);
110 builder->Add("selectNetwork", IDS_NETWORK_SELECTION_SELECT);
111 builder->Add("selectTimezone", IDS_OPTIONS_SETTINGS_TIMEZONE_DESCRIPTION);
112 builder->Add("proxySettings", IDS_OPTIONS_PROXIES_CONFIGURE_BUTTON);
113 builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON);
116 void NetworkScreenHandler::GetAdditionalParameters(
117 base::DictionaryValue* dict) {
118 dict->Set("languageList", GetLanguageList());
119 dict->Set("inputMethodsList", GetInputMethods());
120 dict->Set("timezoneList", GetTimezoneList());
123 void NetworkScreenHandler::Initialize() {
124 EnableContinue(is_continue_enabled_);
126 show_on_init_ = false;
130 timezone_subscription_ = CrosSettings::Get()->AddSettingsObserver(
132 base::Bind(&NetworkScreenHandler::OnSystemTimezoneChanged,
133 base::Unretained(this)));
134 OnSystemTimezoneChanged();
137 // NetworkScreenHandler, WebUIMessageHandler implementation: -------------------
139 void NetworkScreenHandler::RegisterMessages() {
140 AddCallback(kJsApiNetworkOnExit, &NetworkScreenHandler::HandleOnExit);
141 AddCallback(kJsApiNetworkOnLanguageChanged,
142 &NetworkScreenHandler::HandleOnLanguageChanged);
143 AddCallback(kJsApiNetworkOnInputMethodChanged,
144 &NetworkScreenHandler::HandleOnInputMethodChanged);
145 AddCallback(kJsApiNetworkOnTimezoneChanged,
146 &NetworkScreenHandler::HandleOnTimezoneChanged);
149 // NetworkScreenHandler, private: ----------------------------------------------
151 void NetworkScreenHandler::HandleOnExit() {
154 screen_->OnContinuePressed();
157 void NetworkScreenHandler::HandleOnLanguageChanged(const std::string& locale) {
158 const std::string app_locale = g_browser_process->GetApplicationLocale();
159 if (app_locale == locale)
162 // TODO(altimofeev): make language change async.
163 LanguageSwitchMenu::SwitchLanguageAndEnableKeyboardLayouts(locale);
165 DictionaryValue localized_strings;
166 static_cast<OobeUI*>(web_ui()->GetController())->GetLocalizedStrings(
168 core_oobe_actor_->ReloadContent(localized_strings);
170 // Buttons are recreated, updated "Continue" button state.
171 EnableContinue(is_continue_enabled_);
174 void NetworkScreenHandler::HandleOnInputMethodChanged(const std::string& id) {
175 input_method::InputMethodManager::Get()->ChangeInputMethod(id);
178 void NetworkScreenHandler::HandleOnTimezoneChanged(
179 const std::string& timezone_id) {
180 std::string current_timezone_id;
181 CrosSettings::Get()->GetString(kSystemTimezone, ¤t_timezone_id);
182 if (current_timezone_id == timezone_id)
185 CrosSettings::Get()->SetString(kSystemTimezone, timezone_id);
188 void NetworkScreenHandler::OnSystemTimezoneChanged() {
189 std::string current_timezone_id;
190 CrosSettings::Get()->GetString(kSystemTimezone, ¤t_timezone_id);
191 CallJS("setTimezone", current_timezone_id);
195 ListValue* NetworkScreenHandler::GetLanguageList() {
196 const std::string app_locale = g_browser_process->GetApplicationLocale();
197 input_method::InputMethodManager* manager =
198 input_method::InputMethodManager::Get();
199 // GetSupportedInputMethods() never returns NULL.
200 scoped_ptr<input_method::InputMethodDescriptors> descriptors(
201 manager->GetSupportedInputMethods());
202 ListValue* languages_list =
203 options::CrosLanguageOptionsHandler::GetUILanguageList(*descriptors);
204 for (size_t i = 0; i < languages_list->GetSize(); ++i) {
205 DictionaryValue* language_info = NULL;
206 if (!languages_list->GetDictionary(i, &language_info))
210 language_info->GetString("code", &value);
211 std::string display_name;
212 language_info->GetString("displayName", &display_name);
213 std::string native_name;
214 language_info->GetString("nativeDisplayName", &native_name);
216 if (display_name != native_name)
217 display_name = base::StringPrintf("%s - %s",
218 display_name.c_str(),
219 native_name.c_str());
221 language_info->SetString("value", value);
222 language_info->SetString("title", display_name);
223 language_info->SetBoolean("selected", value == app_locale);
225 return languages_list;
229 ListValue* NetworkScreenHandler::GetInputMethods() {
230 ListValue* input_methods_list = new ListValue;
231 input_method::InputMethodManager* manager =
232 input_method::InputMethodManager::Get();
233 input_method::InputMethodUtil* util = manager->GetInputMethodUtil();
234 scoped_ptr<input_method::InputMethodDescriptors> input_methods(
235 manager->GetActiveInputMethods());
236 std::string current_input_method_id = manager->GetCurrentInputMethod().id();
237 for (size_t i = 0; i < input_methods->size(); ++i) {
238 const std::string ime_id = input_methods->at(i).id();
239 DictionaryValue* input_method = new DictionaryValue;
240 input_method->SetString("value", ime_id);
241 input_method->SetString(
243 util->GetInputMethodLongName(input_methods->at(i)));
244 input_method->SetBoolean("selected",
245 ime_id == current_input_method_id);
246 input_methods_list->Append(input_method);
248 return input_methods_list;
252 base::ListValue* NetworkScreenHandler::GetTimezoneList() {
253 std::string current_timezone_id;
254 CrosSettings::Get()->GetString(kSystemTimezone, ¤t_timezone_id);
256 scoped_ptr<base::ListValue> timezone_list(new base::ListValue);
257 scoped_ptr<base::ListValue> timezones = system::GetTimezoneList().Pass();
258 for (size_t i = 0; i < timezones->GetSize(); ++i) {
259 const base::ListValue* timezone = NULL;
260 CHECK(timezones->GetList(i, &timezone));
262 std::string timezone_id;
263 CHECK(timezone->GetString(0, &timezone_id));
265 std::string timezone_name;
266 CHECK(timezone->GetString(1, &timezone_name));
268 scoped_ptr<base::DictionaryValue> timezone_option(
269 new base::DictionaryValue);
270 timezone_option->SetString("value", timezone_id);
271 timezone_option->SetString("title", timezone_name);
272 timezone_option->SetBoolean("selected", timezone_id == current_timezone_id);
273 timezone_list->Append(timezone_option.release());
276 return timezone_list.release();
279 } // namespace chromeos