• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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/login/password_changed_view.h"
6 
7 #include "base/utf_string_conversions.h"
8 #include "chrome/browser/chromeos/login/rounded_rect_painter.h"
9 #include "chrome/browser/chromeos/login/textfield_with_margin.h"
10 #include "chrome/browser/chromeos/login/wizard_accessibility_helper.h"
11 #include "grit/generated_resources.h"
12 #include "grit/locale_settings.h"
13 #include "ui/base/keycodes/keyboard_codes.h"
14 #include "ui/base/l10n/l10n_util.h"
15 #include "ui/base/resource/resource_bundle.h"
16 #include "views/controls/button/radio_button.h"
17 #include "views/controls/label.h"
18 #include "views/controls/textfield/textfield.h"
19 #include "views/layout/grid_layout.h"
20 #include "views/layout/layout_constants.h"
21 #include "views/window/window.h"
22 
23 using views::Button;
24 using views::GridLayout;
25 using views::Label;
26 using views::RadioButton;
27 using views::Textfield;
28 
29 namespace chromeos {
30 
31 namespace {
32 const int kPasswordFieldWidthChars = 20;
33 }  // namespace
34 
PasswordChangedView(Delegate * delegate,bool full_sync_disabled)35 PasswordChangedView::PasswordChangedView(Delegate* delegate,
36                                          bool full_sync_disabled)
37     : title_label_(NULL),
38       description_label_(NULL),
39       full_sync_radio_(NULL),
40       delta_sync_radio_(NULL),
41       old_password_field_(NULL),
42       delegate_(delegate),
43       full_sync_disabled_(full_sync_disabled) {
44 }
45 
Accept()46 bool PasswordChangedView::Accept() {
47   return ExitDialog();
48 }
49 
GetDialogButtons() const50 int PasswordChangedView::GetDialogButtons() const {
51  return MessageBoxFlags::DIALOGBUTTON_OK;
52 }
53 
GetInitiallyFocusedView()54 views::View* PasswordChangedView::GetInitiallyFocusedView() {
55   if (!full_sync_disabled_) {
56     return views::DialogDelegate::GetInitiallyFocusedView();
57   } else {
58     DCHECK(old_password_field_);
59     return old_password_field_;
60   }
61 }
62 
GetWindowTitle() const63 std::wstring PasswordChangedView::GetWindowTitle() const {
64   return UTF16ToWide(
65       l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_DIALOG_BOX_TITLE));
66 }
67 
GetPreferredSize()68 gfx::Size PasswordChangedView::GetPreferredSize() {
69   // TODO(nkostylev): Once UI is finalized, create locale settings.
70   return gfx::Size(views::Window::GetLocalizedContentsSize(
71       IDS_PASSWORD_CHANGED_DIALOG_WIDTH_CHARS,
72       IDS_PASSWORD_CHANGED_DIALOG_HEIGHT_LINES));
73 }
74 
ViewHierarchyChanged(bool is_add,views::View * parent,views::View * child)75 void PasswordChangedView::ViewHierarchyChanged(bool is_add,
76                                                views::View* parent,
77                                                views::View* child) {
78   if (is_add && child == this) {
79     Init();
80   }
81 }
82 
Init()83 void PasswordChangedView::Init() {
84   // Set up fonts.
85   ResourceBundle& rb = ResourceBundle::GetSharedInstance();
86   gfx::Font title_font = rb.GetFont(ResourceBundle::MediumBoldFont);
87 
88   // Create controls
89   title_label_ = new Label();
90   title_label_->SetFont(title_font);
91   title_label_->SetText(
92       UTF16ToWide(l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_TITLE)));
93   title_label_->SetHorizontalAlignment(Label::ALIGN_LEFT);
94 
95   description_label_ = new Label();
96   description_label_->SetText(
97       UTF16ToWide(l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_DESC)));
98   description_label_->SetMultiLine(true);
99   description_label_->SetHorizontalAlignment(Label::ALIGN_LEFT);
100 
101   full_sync_radio_ = new RadioButton(
102       UTF16ToWide(l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_RESET)),
103       0);
104   full_sync_radio_->set_listener(this);
105   full_sync_radio_->SetMultiLine(true);
106 
107   delta_sync_radio_ = new RadioButton(
108       UTF16ToWide(
109           l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD_CHANGED_MIGRATE)),
110       0);
111   delta_sync_radio_->set_listener(this);
112   delta_sync_radio_->SetMultiLine(true);
113 
114   old_password_field_ = new TextfieldWithMargin(Textfield::STYLE_PASSWORD);
115   old_password_field_->set_text_to_display_when_empty(
116       l10n_util::GetStringUTF16(IDS_LOGIN_PREVIOUS_PASSWORD));
117   old_password_field_->set_default_width_in_chars(kPasswordFieldWidthChars);
118   old_password_field_->SetController(this);
119 
120   // Define controls layout.
121   GridLayout* layout = GridLayout::CreatePanel(this);
122   SetLayoutManager(layout);
123 
124   views::ColumnSet* column_set = layout->AddColumnSet(0);
125   column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1,
126                         GridLayout::USE_PREF, 0, 0);
127   column_set = layout->AddColumnSet(1);
128   column_set->AddPaddingColumn(
129       0, views::kUnrelatedControlLargeHorizontalSpacing);
130   column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1,
131                         GridLayout::USE_PREF, 0, 0);
132 
133   layout->StartRow(0, 0);
134   layout->AddView(title_label_);
135   layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
136 
137   layout->StartRow(0, 0);
138   layout->AddView(description_label_);
139   layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
140 
141   layout->StartRow(0, 0);
142   layout->AddView(full_sync_radio_);
143   layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
144 
145   layout->StartRow(0, 0);
146   layout->AddView(delta_sync_radio_);
147   layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
148 
149   layout->StartRow(0, 1);
150   layout->AddView(
151       old_password_field_, 1, 1, GridLayout::LEADING, GridLayout::CENTER);
152   layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
153 
154   layout->StartRow(0, 0);
155   layout->AddView(old_password_field_);
156 
157   // Disable options if needed.
158   if (!full_sync_disabled_) {
159     full_sync_radio_->SetChecked(true);
160     old_password_field_->SetEnabled(false);
161   } else {
162     full_sync_radio_->SetEnabled(false);
163     delta_sync_radio_->SetChecked(true);
164     old_password_field_->SetEnabled(true);
165   }
166 
167 }
168 
ExitDialog()169 bool PasswordChangedView::ExitDialog() {
170   if (delta_sync_radio_->checked() && old_password_field_->text().empty())
171     return false;
172 
173   // TODO(nkostylev): Need to sanitize memory used to store password.
174   if (full_sync_radio_->checked())
175     delegate_->ResyncEncryptedData();
176   else
177     delegate_->RecoverEncryptedData(UTF16ToUTF8(old_password_field_->text()));
178 
179   return true;
180 }
181 
ButtonPressed(Button * sender,const views::Event & event)182 void PasswordChangedView::ButtonPressed(Button* sender,
183                                         const views::Event& event) {
184   if (sender == full_sync_radio_) {
185     old_password_field_->SetEnabled(false);
186     old_password_field_->SetText(string16());
187   } else if (sender == delta_sync_radio_) {
188     old_password_field_->SetEnabled(true);
189     old_password_field_->RequestFocus();
190   }
191 }
192 
193 }  // namespace chromeos
194