- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / webui / chromeos / login / network_screen_handler.cc
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.
4
5 #include "chrome/browser/ui/webui/chromeos/login/network_screen_handler.h"
6
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"
23
24 namespace {
25
26 const char kJsScreenPath[] = "login.NetworkScreen";
27
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";
33
34 }  // namespace
35
36 namespace chromeos {
37
38 // NetworkScreenHandler, public: -----------------------------------------------
39
40 NetworkScreenHandler::NetworkScreenHandler(CoreOobeActor* core_oobe_actor)
41     : BaseScreenHandler(kJsScreenPath),
42       screen_(NULL),
43       core_oobe_actor_(core_oobe_actor),
44       is_continue_enabled_(false),
45       show_on_init_(false) {
46   DCHECK(core_oobe_actor_);
47 }
48
49 NetworkScreenHandler::~NetworkScreenHandler() {
50   if (screen_)
51     screen_->OnActorDestroyed(this);
52 }
53
54 // NetworkScreenHandler, NetworkScreenActor implementation: --------------------
55
56 void NetworkScreenHandler::SetDelegate(NetworkScreenActor::Delegate* screen) {
57   screen_ = screen;
58 }
59
60 void NetworkScreenHandler::PrepareToShow() {
61 }
62
63 void NetworkScreenHandler::Show() {
64   if (!page_is_ready()) {
65     show_on_init_ = true;
66     return;
67   }
68
69   ShowScreen(OobeUI::kScreenOobeNetwork, NULL);
70 }
71
72 void NetworkScreenHandler::Hide() {
73 }
74
75 void NetworkScreenHandler::ShowError(const string16& message) {
76   CallJS("showError", message);
77 }
78
79 void NetworkScreenHandler::ClearErrors() {
80   if (page_is_ready())
81     core_oobe_actor_->ClearErrors();
82 }
83
84 void NetworkScreenHandler::ShowConnectingStatus(
85     bool connecting,
86     const string16& network_id) {
87   // string16 connecting_label =
88   //     l10n_util::GetStringFUTF16(IDS_NETWORK_SELECTION_CONNECTING,
89   //                                network_id);
90   // CallJS("cr.ui.Oobe.showConnectingStatus",
91   //        base::FundamentalValue(connecting),
92   //        base::StringValue(network_id),
93   //        base::StringValue(connecting_label_value));
94 }
95
96 void NetworkScreenHandler::EnableContinue(bool enabled) {
97   is_continue_enabled_ = enabled;
98   if (page_is_ready())
99     CallJS("enableContinueButton", enabled);
100 }
101
102 // NetworkScreenHandler, BaseScreenHandler implementation: --------------------
103
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);
114 }
115
116 void NetworkScreenHandler::GetAdditionalParameters(
117     base::DictionaryValue* dict) {
118   dict->Set("languageList", GetLanguageList());
119   dict->Set("inputMethodsList", GetInputMethods());
120   dict->Set("timezoneList", GetTimezoneList());
121 }
122
123 void NetworkScreenHandler::Initialize() {
124   EnableContinue(is_continue_enabled_);
125   if (show_on_init_) {
126     show_on_init_ = false;
127     Show();
128   }
129
130   timezone_subscription_ = CrosSettings::Get()->AddSettingsObserver(
131       kSystemTimezone,
132       base::Bind(&NetworkScreenHandler::OnSystemTimezoneChanged,
133                  base::Unretained(this)));
134   OnSystemTimezoneChanged();
135 }
136
137 // NetworkScreenHandler, WebUIMessageHandler implementation: -------------------
138
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);
147 }
148
149 // NetworkScreenHandler, private: ----------------------------------------------
150
151 void NetworkScreenHandler::HandleOnExit() {
152   ClearErrors();
153   if (screen_)
154     screen_->OnContinuePressed();
155 }
156
157 void NetworkScreenHandler::HandleOnLanguageChanged(const std::string& locale) {
158   const std::string app_locale = g_browser_process->GetApplicationLocale();
159   if (app_locale == locale)
160     return;
161
162   // TODO(altimofeev): make language change async.
163   LanguageSwitchMenu::SwitchLanguageAndEnableKeyboardLayouts(locale);
164
165   DictionaryValue localized_strings;
166   static_cast<OobeUI*>(web_ui()->GetController())->GetLocalizedStrings(
167       &localized_strings);
168   core_oobe_actor_->ReloadContent(localized_strings);
169
170   // Buttons are recreated, updated "Continue" button state.
171   EnableContinue(is_continue_enabled_);
172 }
173
174 void NetworkScreenHandler::HandleOnInputMethodChanged(const std::string& id) {
175   input_method::InputMethodManager::Get()->ChangeInputMethod(id);
176 }
177
178 void NetworkScreenHandler::HandleOnTimezoneChanged(
179     const std::string& timezone_id) {
180   std::string current_timezone_id;
181   CrosSettings::Get()->GetString(kSystemTimezone, &current_timezone_id);
182   if (current_timezone_id == timezone_id)
183     return;
184
185   CrosSettings::Get()->SetString(kSystemTimezone, timezone_id);
186 }
187
188 void NetworkScreenHandler::OnSystemTimezoneChanged() {
189   std::string current_timezone_id;
190   CrosSettings::Get()->GetString(kSystemTimezone, &current_timezone_id);
191   CallJS("setTimezone", current_timezone_id);
192 }
193
194 // static
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))
207       NOTREACHED();
208
209     std::string value;
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);
215
216     if (display_name != native_name)
217       display_name = base::StringPrintf("%s - %s",
218                                         display_name.c_str(),
219                                         native_name.c_str());
220
221     language_info->SetString("value", value);
222     language_info->SetString("title", display_name);
223     language_info->SetBoolean("selected", value == app_locale);
224   }
225   return languages_list;
226 }
227
228 // static
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(
242         "title",
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);
247   }
248   return input_methods_list;
249 }
250
251 // static
252 base::ListValue* NetworkScreenHandler::GetTimezoneList() {
253   std::string current_timezone_id;
254   CrosSettings::Get()->GetString(kSystemTimezone, &current_timezone_id);
255
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));
261
262     std::string timezone_id;
263     CHECK(timezone->GetString(0, &timezone_id));
264
265     std::string timezone_name;
266     CHECK(timezone->GetString(1, &timezone_name));
267
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());
274   }
275
276   return timezone_list.release();
277 }
278
279 }  // namespace chromeos