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/ui/webui/chromeos/login/oobe_ui.h" 15 #include "chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.h" 16 #include "chromeos/ime/input_method_manager.h" 17 #include "grit/chromium_strings.h" 18 #include "grit/generated_resources.h" 19 #include "ui/gfx/rect.h" 20 #include "ui/views/layout/fill_layout.h" 21 #include "ui/views/widget/widget.h" 22 23 namespace { 24 25 const char kJsScreenPath[] = "login.NetworkScreen"; 26 27 // JS API callbacks names. 28 const char kJsApiNetworkOnExit[] = "networkOnExit"; 29 const char kJsApiNetworkOnLanguageChanged[] = "networkOnLanguageChanged"; 30 const char kJsApiNetworkOnInputMethodChanged[] = "networkOnInputMethodChanged"; 31 32 } // namespace 33 34 namespace chromeos { 35 36 // NetworkScreenHandler, public: ----------------------------------------------- 37 38 NetworkScreenHandler::NetworkScreenHandler(CoreOobeActor* core_oobe_actor) 39 : BaseScreenHandler(kJsScreenPath), 40 screen_(NULL), 41 core_oobe_actor_(core_oobe_actor), 42 is_continue_enabled_(false), 43 show_on_init_(false) { 44 DCHECK(core_oobe_actor_); 45 } 46 47 NetworkScreenHandler::~NetworkScreenHandler() { 48 if (screen_) 49 screen_->OnActorDestroyed(this); 50 } 51 52 // NetworkScreenHandler, NetworkScreenActor implementation: -------------------- 53 54 void NetworkScreenHandler::SetDelegate(NetworkScreenActor::Delegate* screen) { 55 screen_ = screen; 56 } 57 58 void NetworkScreenHandler::PrepareToShow() { 59 } 60 61 void NetworkScreenHandler::Show() { 62 if (!page_is_ready()) { 63 show_on_init_ = true; 64 return; 65 } 66 67 ShowScreen(OobeUI::kScreenOobeNetwork, NULL); 68 } 69 70 void NetworkScreenHandler::Hide() { 71 } 72 73 void NetworkScreenHandler::ShowError(const string16& message) { 74 CallJS("showError", message); 75 } 76 77 void NetworkScreenHandler::ClearErrors() { 78 if (page_is_ready()) 79 core_oobe_actor_->ClearErrors(); 80 } 81 82 void NetworkScreenHandler::ShowConnectingStatus( 83 bool connecting, 84 const string16& network_id) { 85 // string16 connecting_label = 86 // l10n_util::GetStringFUTF16(IDS_NETWORK_SELECTION_CONNECTING, 87 // network_id); 88 // CallJS("cr.ui.Oobe.showConnectingStatus", 89 // base::FundamentalValue(connecting), 90 // base::StringValue(network_id), 91 // base::StringValue(connecting_label_value)); 92 } 93 94 void NetworkScreenHandler::EnableContinue(bool enabled) { 95 is_continue_enabled_ = enabled; 96 if (page_is_ready()) 97 CallJS("enableContinueButton", enabled); 98 } 99 100 // NetworkScreenHandler, BaseScreenHandler implementation: -------------------- 101 102 void NetworkScreenHandler::DeclareLocalizedValues( 103 LocalizedValuesBuilder* builder) { 104 builder->Add("networkScreenGreeting", IDS_WELCOME_SCREEN_GREETING); 105 builder->Add("networkScreenTitle", IDS_WELCOME_SCREEN_TITLE); 106 builder->Add("selectLanguage", IDS_LANGUAGE_SELECTION_SELECT); 107 builder->Add("selectKeyboard", IDS_KEYBOARD_SELECTION_SELECT); 108 builder->Add("selectNetwork", IDS_NETWORK_SELECTION_SELECT); 109 builder->Add("proxySettings", IDS_OPTIONS_PROXIES_CONFIGURE_BUTTON); 110 builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON); 111 } 112 113 void NetworkScreenHandler::GetAdditionalParameters( 114 base::DictionaryValue* dict) { 115 dict->Set("languageList", GetLanguageList()); 116 dict->Set("inputMethodsList", GetInputMethods()); 117 } 118 119 void NetworkScreenHandler::Initialize() { 120 EnableContinue(is_continue_enabled_); 121 if (show_on_init_) { 122 show_on_init_ = false; 123 Show(); 124 } 125 } 126 127 // NetworkScreenHandler, WebUIMessageHandler implementation: ------------------- 128 129 void NetworkScreenHandler::RegisterMessages() { 130 AddCallback(kJsApiNetworkOnExit, &NetworkScreenHandler::HandleOnExit); 131 AddCallback(kJsApiNetworkOnLanguageChanged, 132 &NetworkScreenHandler::HandleOnLanguageChanged); 133 AddCallback(kJsApiNetworkOnInputMethodChanged, 134 &NetworkScreenHandler::HandleOnInputMethodChanged); 135 } 136 137 // NetworkScreenHandler, private: ---------------------------------------------- 138 139 void NetworkScreenHandler::HandleOnExit() { 140 ClearErrors(); 141 if (screen_) 142 screen_->OnContinuePressed(); 143 } 144 145 void NetworkScreenHandler::HandleOnLanguageChanged(const std::string& locale) { 146 const std::string app_locale = g_browser_process->GetApplicationLocale(); 147 if (app_locale == locale) 148 return; 149 150 // TODO(altimofeev): make language change async. 151 LanguageSwitchMenu::SwitchLanguageAndEnableKeyboardLayouts(locale); 152 153 DictionaryValue localized_strings; 154 static_cast<OobeUI*>(web_ui()->GetController())->GetLocalizedStrings( 155 &localized_strings); 156 core_oobe_actor_->ReloadContent(localized_strings); 157 158 // Buttons are recreated, updated "Continue" button state. 159 EnableContinue(is_continue_enabled_); 160 } 161 162 void NetworkScreenHandler::HandleOnInputMethodChanged(const std::string& id) { 163 input_method::InputMethodManager::Get()->ChangeInputMethod(id); 164 } 165 166 ListValue* NetworkScreenHandler::GetLanguageList() { 167 const std::string app_locale = g_browser_process->GetApplicationLocale(); 168 input_method::InputMethodManager* manager = 169 input_method::InputMethodManager::Get(); 170 // GetSupportedInputMethods() never returns NULL. 171 scoped_ptr<input_method::InputMethodDescriptors> descriptors( 172 manager->GetSupportedInputMethods()); 173 ListValue* languages_list = 174 options::CrosLanguageOptionsHandler::GetUILanguageList(*descriptors); 175 for (size_t i = 0; i < languages_list->GetSize(); ++i) { 176 DictionaryValue* language_info = NULL; 177 if (!languages_list->GetDictionary(i, &language_info)) 178 NOTREACHED(); 179 180 std::string value; 181 language_info->GetString("code", &value); 182 std::string display_name; 183 language_info->GetString("displayName", &display_name); 184 std::string native_name; 185 language_info->GetString("nativeDisplayName", &native_name); 186 187 if (display_name != native_name) 188 display_name = base::StringPrintf("%s - %s", 189 display_name.c_str(), 190 native_name.c_str()); 191 192 language_info->SetString("value", value); 193 language_info->SetString("title", display_name); 194 language_info->SetBoolean("selected", value == app_locale); 195 } 196 return languages_list; 197 } 198 199 ListValue* NetworkScreenHandler::GetInputMethods() { 200 ListValue* input_methods_list = new ListValue; 201 input_method::InputMethodManager* manager = 202 input_method::InputMethodManager::Get(); 203 input_method::InputMethodUtil* util = manager->GetInputMethodUtil(); 204 scoped_ptr<input_method::InputMethodDescriptors> input_methods( 205 manager->GetActiveInputMethods()); 206 std::string current_input_method_id = manager->GetCurrentInputMethod().id(); 207 for (size_t i = 0; i < input_methods->size(); ++i) { 208 const std::string ime_id = input_methods->at(i).id(); 209 DictionaryValue* input_method = new DictionaryValue; 210 input_method->SetString("value", ime_id); 211 input_method->SetString( 212 "title", 213 util->GetInputMethodLongName(input_methods->at(i))); 214 input_method->SetBoolean("selected", 215 ime_id == current_input_method_id); 216 input_methods_list->Append(input_method); 217 } 218 return input_methods_list; 219 } 220 221 } // namespace chromeos 222