Home | History | Annotate | Download | only in login
      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