Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / options / wimax_config_view.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/chromeos/options/wimax_config_view.h"
6
7 #include "ash/system/chromeos/network/network_connect.h"
8 #include "base/bind.h"
9 #include "base/strings/string_util.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "chrome/browser/chromeos/enrollment_dialog_view.h"
13 #include "chrome/browser/chromeos/login/startup_utils.h"
14 #include "chrome/browser/chromeos/net/onc_utils.h"
15 #include "chrome/browser/profiles/profile_manager.h"
16 #include "chromeos/login/login_state.h"
17 #include "chromeos/network/network_configuration_handler.h"
18 #include "chromeos/network/network_event_log.h"
19 #include "chromeos/network/network_profile.h"
20 #include "chromeos/network/network_profile_handler.h"
21 #include "chromeos/network/network_state.h"
22 #include "chromeos/network/network_state_handler.h"
23 #include "components/onc/onc_constants.h"
24 #include "grit/chromium_strings.h"
25 #include "grit/generated_resources.h"
26 #include "grit/locale_settings.h"
27 #include "grit/theme_resources.h"
28 #include "third_party/cros_system_api/dbus/service_constants.h"
29 #include "ui/base/l10n/l10n_util.h"
30 #include "ui/base/resource/resource_bundle.h"
31 #include "ui/events/event.h"
32 #include "ui/views/controls/button/checkbox.h"
33 #include "ui/views/controls/button/image_button.h"
34 #include "ui/views/controls/label.h"
35 #include "ui/views/controls/textfield/textfield.h"
36 #include "ui/views/layout/grid_layout.h"
37 #include "ui/views/layout/layout_constants.h"
38 #include "ui/views/widget/widget.h"
39 #include "ui/views/window/dialog_client_view.h"
40
41 namespace chromeos {
42
43 namespace {
44
45 void ShillError(const std::string& function,
46                 const std::string& error_name,
47                 scoped_ptr<base::DictionaryValue> error_data) {
48   NET_LOG_ERROR("Shill Error from WimaxConfigView: " + error_name, function);
49 }
50
51 }  // namespace
52
53 WimaxConfigView::WimaxConfigView(NetworkConfigView* parent,
54                                  const std::string& service_path)
55     : ChildNetworkConfigView(parent, service_path),
56       identity_label_(NULL),
57       identity_textfield_(NULL),
58       save_credentials_checkbox_(NULL),
59       share_network_checkbox_(NULL),
60       shared_network_label_(NULL),
61       passphrase_label_(NULL),
62       passphrase_textfield_(NULL),
63       passphrase_visible_button_(NULL),
64       error_label_(NULL),
65       weak_ptr_factory_(this) {
66   Init();
67 }
68
69 WimaxConfigView::~WimaxConfigView() {
70   RemoveAllChildViews(true);  // Destroy children before models
71 }
72
73 base::string16 WimaxConfigView::GetTitle() const {
74   return l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_JOIN_WIMAX_NETWORKS);
75 }
76
77 views::View* WimaxConfigView::GetInitiallyFocusedView() {
78   if (identity_textfield_ && identity_textfield_->enabled())
79     return identity_textfield_;
80   if (passphrase_textfield_ && passphrase_textfield_->enabled())
81     return passphrase_textfield_;
82   return NULL;
83 }
84
85 bool WimaxConfigView::CanLogin() {
86   // In OOBE it may be valid to log in with no credentials (crbug.com/137776).
87   if (!chromeos::StartupUtils::IsOobeCompleted())
88     return true;
89
90   // TODO(benchan): Update this with the correct minimum length (don't just
91   // check if empty).
92   // If the network requires a passphrase, make sure it is the right length.
93   return passphrase_textfield_ && !passphrase_textfield_->text().empty();
94 }
95
96 void WimaxConfigView::UpdateDialogButtons() {
97   parent_->GetDialogClientView()->UpdateDialogButtons();
98 }
99
100 void WimaxConfigView::UpdateErrorLabel() {
101   base::string16 error_msg;
102   if (!service_path_.empty()) {
103     const NetworkState* wimax = NetworkHandler::Get()->network_state_handler()->
104         GetNetworkState(service_path_);
105     if (wimax && wimax->connection_state() == shill::kStateFailure)
106       error_msg = ash::network_connect::ErrorString(
107           wimax->last_error(), wimax->path());
108   }
109   if (!error_msg.empty()) {
110     error_label_->SetText(error_msg);
111     error_label_->SetVisible(true);
112   } else {
113     error_label_->SetVisible(false);
114   }
115 }
116
117 void WimaxConfigView::ContentsChanged(views::Textfield* sender,
118                                       const base::string16& new_contents) {
119   UpdateDialogButtons();
120 }
121
122 bool WimaxConfigView::HandleKeyEvent(views::Textfield* sender,
123                                      const ui::KeyEvent& key_event) {
124   if (sender == passphrase_textfield_ &&
125       key_event.key_code() == ui::VKEY_RETURN) {
126     parent_->GetDialogClientView()->AcceptWindow();
127   }
128   return false;
129 }
130
131 void WimaxConfigView::ButtonPressed(views::Button* sender,
132                                    const ui::Event& event) {
133   if (sender == passphrase_visible_button_ && passphrase_textfield_) {
134     if (passphrase_textfield_->GetTextInputType() == ui::TEXT_INPUT_TYPE_TEXT) {
135       passphrase_textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD);
136       passphrase_visible_button_->SetToggled(false);
137     } else {
138       passphrase_textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_TEXT);
139       passphrase_visible_button_->SetToggled(true);
140     }
141   } else {
142     NOTREACHED();
143   }
144 }
145
146 bool WimaxConfigView::Login() {
147   const NetworkState* wimax = NetworkHandler::Get()->network_state_handler()->
148       GetNetworkState(service_path_);
149   if (!wimax) {
150     // Shill no longer knows about this network (edge case).
151     // TODO(stevenjb): Add notification for this.
152     NET_LOG_ERROR("Network not found", service_path_);
153     return true;  // Close dialog
154   }
155   base::DictionaryValue properties;
156   properties.SetStringWithoutPathExpansion(
157       shill::kEapIdentityProperty, GetEapIdentity());
158   properties.SetStringWithoutPathExpansion(
159       shill::kEapPasswordProperty, GetEapPassphrase());
160   properties.SetBooleanWithoutPathExpansion(
161       shill::kSaveCredentialsProperty, GetSaveCredentials());
162
163   const bool share_default = true;
164   bool share_network = GetShareNetwork(share_default);
165
166   bool only_policy_autoconnect =
167       onc::PolicyAllowsOnlyPolicyNetworksToAutoconnect(!share_network);
168   if (only_policy_autoconnect) {
169     properties.SetBooleanWithoutPathExpansion(shill::kAutoConnectProperty,
170                                               false);
171   }
172
173   ash::network_connect::ConfigureNetworkAndConnect(
174       service_path_, properties, share_network);
175   return true;  // dialog will be closed
176 }
177
178 std::string WimaxConfigView::GetEapIdentity() const {
179   DCHECK(identity_textfield_);
180   return base::UTF16ToUTF8(identity_textfield_->text());
181 }
182
183 std::string WimaxConfigView::GetEapPassphrase() const {
184   return passphrase_textfield_ ? base::UTF16ToUTF8(
185                                      passphrase_textfield_->text()) :
186                                  std::string();
187 }
188
189 bool WimaxConfigView::GetSaveCredentials() const {
190   return save_credentials_checkbox_ ? save_credentials_checkbox_->checked() :
191                                       false;
192 }
193
194 bool WimaxConfigView::GetShareNetwork(bool share_default) const {
195   return share_network_checkbox_ ? share_network_checkbox_->checked() :
196                                    share_default;
197 }
198
199 void WimaxConfigView::Cancel() {
200 }
201
202 void WimaxConfigView::Init() {
203   const NetworkState* wimax = NetworkHandler::Get()->network_state_handler()->
204       GetNetworkState(service_path_);
205   DCHECK(wimax && wimax->type() == shill::kTypeWimax);
206
207   WifiConfigView::ParseEAPUIProperty(
208       &save_credentials_ui_data_, wimax, ::onc::eap::kSaveCredentials);
209   WifiConfigView::ParseEAPUIProperty(
210       &identity_ui_data_, wimax, ::onc::eap::kIdentity);
211   WifiConfigView::ParseUIProperty(
212       &passphrase_ui_data_, wimax, ::onc::wifi::kPassphrase);
213
214   views::GridLayout* layout = views::GridLayout::CreatePanel(this);
215   SetLayoutManager(layout);
216
217   const int column_view_set_id = 0;
218   views::ColumnSet* column_set = layout->AddColumnSet(column_view_set_id);
219   const int kPasswordVisibleWidth = 20;
220   // Label
221   column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, 1,
222                         views::GridLayout::USE_PREF, 0, 0);
223   column_set->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing);
224   // Textfield, combobox.
225   column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
226                         views::GridLayout::USE_PREF, 0,
227                         ChildNetworkConfigView::kInputFieldMinWidth);
228   column_set->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing);
229   // Password visible button / policy indicator.
230   column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::FILL, 1,
231                         views::GridLayout::USE_PREF, 0, kPasswordVisibleWidth);
232
233   // Network name
234   layout->StartRow(0, column_view_set_id);
235   layout->AddView(new views::Label(l10n_util::GetStringUTF16(
236       IDS_OPTIONS_SETTINGS_INTERNET_TAB_NETWORK)));
237   views::Label* label = new views::Label(base::UTF8ToUTF16(wimax->name()));
238   label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
239   layout->AddView(label);
240   layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
241
242   // Identity
243   layout->StartRow(0, column_view_set_id);
244   base::string16 identity_label_text = l10n_util::GetStringUTF16(
245       IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_IDENTITY);
246   identity_label_ = new views::Label(identity_label_text);
247   layout->AddView(identity_label_);
248   identity_textfield_ = new views::Textfield();
249   identity_textfield_->SetAccessibleName(identity_label_text);
250   identity_textfield_->set_controller(this);
251   identity_textfield_->SetEnabled(identity_ui_data_.IsEditable());
252   layout->AddView(identity_textfield_);
253   layout->AddView(new ControlledSettingIndicatorView(identity_ui_data_));
254   layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
255
256   // Passphrase input
257   layout->StartRow(0, column_view_set_id);
258   base::string16 passphrase_label_text = l10n_util::GetStringUTF16(
259       IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PASSPHRASE);
260   passphrase_label_ = new views::Label(passphrase_label_text);
261   layout->AddView(passphrase_label_);
262   passphrase_textfield_ = new views::Textfield();
263   passphrase_textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD);
264   passphrase_textfield_->set_controller(this);
265   passphrase_label_->SetEnabled(true);
266   passphrase_textfield_->SetEnabled(passphrase_ui_data_.IsEditable());
267   passphrase_textfield_->SetAccessibleName(passphrase_label_text);
268   layout->AddView(passphrase_textfield_);
269
270   if (passphrase_ui_data_.IsManaged()) {
271     layout->AddView(new ControlledSettingIndicatorView(passphrase_ui_data_));
272   } else {
273     // Password visible button.
274     passphrase_visible_button_ = new views::ToggleImageButton(this);
275     passphrase_visible_button_->SetFocusable(true);
276     passphrase_visible_button_->SetTooltipText(
277         l10n_util::GetStringUTF16(
278             IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PASSPHRASE_SHOW));
279     passphrase_visible_button_->SetToggledTooltipText(
280         l10n_util::GetStringUTF16(
281             IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PASSPHRASE_HIDE));
282     passphrase_visible_button_->SetImage(
283         views::ImageButton::STATE_NORMAL,
284         ResourceBundle::GetSharedInstance().
285         GetImageSkiaNamed(IDR_NETWORK_SHOW_PASSWORD));
286     passphrase_visible_button_->SetImage(
287         views::ImageButton::STATE_HOVERED,
288         ResourceBundle::GetSharedInstance().
289         GetImageSkiaNamed(IDR_NETWORK_SHOW_PASSWORD_HOVER));
290     passphrase_visible_button_->SetToggledImage(
291         views::ImageButton::STATE_NORMAL,
292         ResourceBundle::GetSharedInstance().
293         GetImageSkiaNamed(IDR_NETWORK_HIDE_PASSWORD));
294     passphrase_visible_button_->SetToggledImage(
295         views::ImageButton::STATE_HOVERED,
296         ResourceBundle::GetSharedInstance().
297         GetImageSkiaNamed(IDR_NETWORK_HIDE_PASSWORD_HOVER));
298     passphrase_visible_button_->SetImageAlignment(
299         views::ImageButton::ALIGN_CENTER, views::ImageButton::ALIGN_MIDDLE);
300     layout->AddView(passphrase_visible_button_);
301   }
302
303   layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
304
305   // Checkboxes.
306
307   if (LoginState::Get()->IsUserAuthenticated()) {
308     // Save credentials
309     layout->StartRow(0, column_view_set_id);
310     save_credentials_checkbox_ = new views::Checkbox(
311         l10n_util::GetStringUTF16(
312             IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SAVE_CREDENTIALS));
313     save_credentials_checkbox_->SetEnabled(
314         save_credentials_ui_data_.IsEditable());
315     layout->SkipColumns(1);
316     layout->AddView(save_credentials_checkbox_);
317     layout->AddView(
318         new ControlledSettingIndicatorView(save_credentials_ui_data_));
319   }
320
321   // Share network
322   if (wimax->profile_path().empty()) {
323     layout->StartRow(0, column_view_set_id);
324     share_network_checkbox_ = new views::Checkbox(
325         l10n_util::GetStringUTF16(
326             IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SHARE_NETWORK));
327
328     bool share_network_checkbox_value = false;
329     bool share_network_checkbox_enabled = false;
330     ChildNetworkConfigView::GetShareStateForLoginState(
331         &share_network_checkbox_value,
332         &share_network_checkbox_enabled);
333
334     share_network_checkbox_->SetChecked(share_network_checkbox_value);
335     share_network_checkbox_->SetEnabled(share_network_checkbox_enabled);
336
337     layout->SkipColumns(1);
338     layout->AddView(share_network_checkbox_);
339   }
340   layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
341
342   // Create an error label.
343   layout->StartRow(0, column_view_set_id);
344   layout->SkipColumns(1);
345   error_label_ = new views::Label();
346   error_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
347   error_label_->SetEnabledColor(SK_ColorRED);
348   layout->AddView(error_label_);
349
350   UpdateErrorLabel();
351
352   if (wimax) {
353     NetworkHandler::Get()->network_configuration_handler()->GetProperties(
354         service_path_,
355         base::Bind(&WimaxConfigView::InitFromProperties,
356                    weak_ptr_factory_.GetWeakPtr()),
357         base::Bind(&ShillError, "GetProperties"));
358   }
359 }
360
361 void WimaxConfigView::InitFromProperties(
362     const std::string& service_path,
363     const base::DictionaryValue& properties) {
364   // EapIdentity
365   std::string eap_identity;
366   properties.GetStringWithoutPathExpansion(
367       shill::kEapIdentityProperty, &eap_identity);
368   identity_textfield_->SetText(base::UTF8ToUTF16(eap_identity));
369
370   // Save credentials
371   if (save_credentials_checkbox_) {
372     bool save_credentials = false;
373     properties.GetBooleanWithoutPathExpansion(
374         shill::kSaveCredentialsProperty, &save_credentials);
375     save_credentials_checkbox_->SetChecked(save_credentials);
376   }
377 }
378
379 void WimaxConfigView::InitFocus() {
380   views::View* view_to_focus = GetInitiallyFocusedView();
381   if (view_to_focus)
382     view_to_focus->RequestFocus();
383 }
384
385 }  // namespace chromeos