Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: chrome/browser/chromeos/login/user_controller.cc

Issue 5709001: Place the spinner in the right corner of the controls window. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/chrome/browser/chromeos/login
Patch Set: nits Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/login/user_controller.h" 5 #include "chrome/browser/chromeos/login/user_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "app/l10n_util.h" 10 #include "app/l10n_util.h"
(...skipping 10 matching lines...) Expand all
21 #include "chrome/browser/chromeos/login/wizard_controller.h" 21 #include "chrome/browser/chromeos/login/wizard_controller.h"
22 #include "chrome/common/notification_service.h" 22 #include "chrome/common/notification_service.h"
23 #include "chrome/common/notification_type.h" 23 #include "chrome/common/notification_type.h"
24 #include "cros/chromeos_wm_ipc_enums.h" 24 #include "cros/chromeos_wm_ipc_enums.h"
25 #include "gfx/canvas.h" 25 #include "gfx/canvas.h"
26 #include "grit/generated_resources.h" 26 #include "grit/generated_resources.h"
27 #include "grit/theme_resources.h" 27 #include "grit/theme_resources.h"
28 #include "views/background.h" 28 #include "views/background.h"
29 #include "views/controls/button/native_button.h" 29 #include "views/controls/button/native_button.h"
30 #include "views/controls/label.h" 30 #include "views/controls/label.h"
31 #include "views/controls/throbber.h"
31 #include "views/grid_layout.h" 32 #include "views/grid_layout.h"
32 #include "views/painter.h" 33 #include "views/painter.h"
33 #include "views/screen.h" 34 #include "views/screen.h"
34 #include "views/widget/root_view.h" 35 #include "views/widget/root_view.h"
35 #include "views/widget/widget_gtk.h" 36 #include "views/widget/widget_gtk.h"
36 37
37 using views::ColumnSet; 38 using views::ColumnSet;
38 using views::GridLayout; 39 using views::GridLayout;
39 using views::WidgetGtk; 40 using views::WidgetGtk;
40 41
(...skipping 21 matching lines...) Expand all
62 public: 63 public:
63 ClickNotifyingWidget(views::WidgetGtk::Type type, 64 ClickNotifyingWidget(views::WidgetGtk::Type type,
64 UserController* controller) 65 UserController* controller)
65 : WidgetGtk(type), 66 : WidgetGtk(type),
66 controller_(controller) { 67 controller_(controller) {
67 } 68 }
68 69
69 private: 70 private:
70 gboolean OnButtonPress(GtkWidget* widget, GdkEventButton* event) { 71 gboolean OnButtonPress(GtkWidget* widget, GdkEventButton* event) {
71 if (!controller_->is_user_selected()) 72 if (!controller_->is_user_selected())
72 controller_->SelectUser(controller_->user_index()); 73 controller_->SelectUserRelative(0);
73 74
74 return views::WidgetGtk::OnButtonPress(widget, event); 75 return views::WidgetGtk::OnButtonPress(widget, event);
75 } 76 }
76 77
77 UserController* controller_; 78 UserController* controller_;
78 79
79 DISALLOW_COPY_AND_ASSIGN(ClickNotifyingWidget); 80 DISALLOW_COPY_AND_ASSIGN(ClickNotifyingWidget);
80 }; 81 };
81 82
82 void CloseWindow(views::WidgetGtk* window) { 83 void CloseWindow(views::WidgetGtk* window) {
(...skipping 24 matching lines...) Expand all
107 is_guest_(is_guest), 108 is_guest_(is_guest),
108 is_owner_(false), 109 is_owner_(false),
109 show_name_tooltip_(false), 110 show_name_tooltip_(false),
110 delegate_(delegate), 111 delegate_(delegate),
111 controls_window_(NULL), 112 controls_window_(NULL),
112 image_window_(NULL), 113 image_window_(NULL),
113 border_window_(NULL), 114 border_window_(NULL),
114 label_window_(NULL), 115 label_window_(NULL),
115 unselected_label_window_(NULL), 116 unselected_label_window_(NULL),
116 user_view_(NULL), 117 user_view_(NULL),
117 new_user_view_(NULL),
118 existing_user_view_(NULL),
119 guest_user_view_(NULL),
120 label_view_(NULL), 118 label_view_(NULL),
121 unselected_label_view_(NULL), 119 unselected_label_view_(NULL),
120 user_input_(NULL),
121 throbber_host_(NULL),
122 method_factory_(this) { 122 method_factory_(this) {
123 registrar_.Add( 123 registrar_.Add(
124 this, 124 this,
125 NotificationType::LOGIN_USER_IMAGE_CHANGED, 125 NotificationType::LOGIN_USER_IMAGE_CHANGED,
126 NotificationService::AllSources()); 126 NotificationService::AllSources());
127 } 127 }
128 128
129 UserController::UserController(Delegate* delegate, 129 UserController::UserController(Delegate* delegate,
130 const UserManager::User& user) 130 const UserManager::User& user)
131 : user_index_(-1), 131 : user_index_(-1),
132 is_user_selected_(false), 132 is_user_selected_(false),
133 is_new_user_(false), 133 is_new_user_(false),
134 is_guest_(false), 134 is_guest_(false),
135 // Empty 'cached_owner()' means that owner hasn't been cached yet, not 135 // Empty 'cached_owner()' means that owner hasn't been cached yet, not
136 // that owner has an empty email. 136 // that owner has an empty email.
137 is_owner_(user.email() == UserCrosSettingsProvider::cached_owner()), 137 is_owner_(user.email() == UserCrosSettingsProvider::cached_owner()),
138 show_name_tooltip_(false), 138 show_name_tooltip_(false),
139 user_(user), 139 user_(user),
140 delegate_(delegate), 140 delegate_(delegate),
141 controls_window_(NULL), 141 controls_window_(NULL),
142 image_window_(NULL), 142 image_window_(NULL),
143 border_window_(NULL), 143 border_window_(NULL),
144 label_window_(NULL), 144 label_window_(NULL),
145 unselected_label_window_(NULL), 145 unselected_label_window_(NULL),
146 user_view_(NULL), 146 user_view_(NULL),
147 new_user_view_(NULL),
148 existing_user_view_(NULL),
149 guest_user_view_(NULL),
150 label_view_(NULL), 147 label_view_(NULL),
151 unselected_label_view_(NULL), 148 unselected_label_view_(NULL),
149 user_input_(NULL),
150 throbber_host_(NULL),
152 method_factory_(this) { 151 method_factory_(this) {
153 DCHECK(!user.email().empty()); 152 DCHECK(!user.email().empty());
154 registrar_.Add( 153 registrar_.Add(
155 this, 154 this,
156 NotificationType::LOGIN_USER_IMAGE_CHANGED, 155 NotificationType::LOGIN_USER_IMAGE_CHANGED,
157 NotificationService::AllSources()); 156 NotificationService::AllSources());
158 } 157 }
159 158
160 UserController::~UserController() { 159 UserController::~UserController() {
161 // Reset the widget delegate of every window to NULL, so the user 160 // Reset the widget delegate of every window to NULL, so the user
(...skipping 14 matching lines...) Expand all
176 controls_window_ = 175 controls_window_ =
177 CreateControlsWindow(index, &controls_width, &controls_height, 176 CreateControlsWindow(index, &controls_width, &controls_height,
178 need_browse_without_signin); 177 need_browse_without_signin);
179 image_window_ = CreateImageWindow(index); 178 image_window_ = CreateImageWindow(index);
180 CreateBorderWindow(index, total_user_count, controls_width, controls_height); 179 CreateBorderWindow(index, total_user_count, controls_width, controls_height);
181 label_window_ = CreateLabelWindow(index, WM_IPC_WINDOW_LOGIN_LABEL); 180 label_window_ = CreateLabelWindow(index, WM_IPC_WINDOW_LOGIN_LABEL);
182 unselected_label_window_ = 181 unselected_label_window_ =
183 CreateLabelWindow(index, WM_IPC_WINDOW_LOGIN_UNSELECTED_LABEL); 182 CreateLabelWindow(index, WM_IPC_WINDOW_LOGIN_UNSELECTED_LABEL);
184 } 183 }
185 184
186 void UserController::SetPasswordEnabled(bool enable) { 185 void UserController::StartThrobber() {
187 DCHECK(!is_new_user_); 186 throbber_host_->StartThrobber();
188 existing_user_view_->password_field()->SetEnabled(enable); 187 }
189 if (enable) { 188
190 user_view_->StopThrobber(); 189 void UserController::StopThrobber() {
191 delegate_->SetStatusAreaEnabled(enable); 190 throbber_host_->StopThrobber();
192 } else {
193 delegate_->SetStatusAreaEnabled(enable);
194 user_view_->StartThrobber();
195 }
196 } 191 }
197 192
198 std::wstring UserController::GetNameTooltip() const { 193 std::wstring UserController::GetNameTooltip() const {
199 if (is_new_user_) 194 if (is_new_user_)
200 return l10n_util::GetString(IDS_ADD_USER); 195 return l10n_util::GetString(IDS_ADD_USER);
201 if (is_guest_) 196 if (is_guest_)
202 return l10n_util::GetString(IDS_GO_INCOGNITO_BUTTON); 197 return l10n_util::GetString(IDS_GO_INCOGNITO_BUTTON);
203 198
204 // Tooltip contains user's display name and his email domain to distinguish 199 // Tooltip contains user's display name and his email domain to distinguish
205 // this user from the other one with the same display name. 200 // this user from the other one with the same display name.
206 const std::string& email = user_.email(); 201 const std::string& email = user_.email();
207 size_t at_pos = email.rfind('@'); 202 size_t at_pos = email.rfind('@');
208 if (at_pos == std::string::npos) { 203 if (at_pos == std::string::npos) {
209 NOTREACHED(); 204 NOTREACHED();
210 return std::wstring(); 205 return std::wstring();
211 } 206 }
212 size_t domain_start = at_pos + 1; 207 size_t domain_start = at_pos + 1;
213 std::string domain = email.substr(domain_start, 208 std::string domain = email.substr(domain_start,
214 email.length() - domain_start); 209 email.length() - domain_start);
215 return UTF8ToWide(base::StringPrintf("%s (%s)", 210 return UTF8ToWide(base::StringPrintf("%s (%s)",
216 user_.GetDisplayName().c_str(), 211 user_.GetDisplayName().c_str(),
217 domain.c_str())); 212 domain.c_str()));
218 } 213 }
219 214
220 void UserController::ClearAndEnablePassword() { 215 void UserController::ClearAndEnableFields() {
221 if (is_new_user_) { 216 user_input_->ClearAndFocusControls();
222 // TODO(avayvod): This code seems not reachable to me. 217 user_input_->EnableInputControls(true);
223 new_user_view_->ClearAndEnablePassword(); 218 SetStatusAreaEnabled(true);
224 } else { 219 StopThrobber();
225 existing_user_view_->password_field()->SetText(string16());
226 SetPasswordEnabled(true);
227 FocusPasswordField();
228 }
229 } 220 }
230 221
231 void UserController::ClearAndEnableFields() { 222 void UserController::ClearAndEnablePassword() {
232 if (is_new_user_) { 223 user_input_->ClearAndFocusPassword();
233 new_user_view_->ClearAndEnableFields(); 224 user_input_->EnableInputControls(true);
234 } else if (is_guest_) { 225 SetStatusAreaEnabled(true);
235 guest_user_view_->FocusSignInButton(); 226 StopThrobber();
236 } else { 227 }
237 ClearAndEnablePassword(); 228
238 } 229 gfx::Rect UserController::GetMainInputScreenBounds() const {
230 return user_input_->GetMainInputScreenBounds();
239 } 231 }
240 232
241 void UserController::EnableNameTooltip(bool enable) { 233 void UserController::EnableNameTooltip(bool enable) {
242 std::wstring tooltip_text; 234 std::wstring tooltip_text;
243 if (enable) 235 if (enable)
244 tooltip_text = GetNameTooltip(); 236 tooltip_text = GetNameTooltip();
245 237
246 if (user_view_) 238 if (user_view_)
247 user_view_->SetTooltipText(tooltip_text); 239 user_view_->SetTooltipText(tooltip_text);
248 if (label_view_) 240 if (label_view_)
249 label_view_->SetTooltipText(tooltip_text); 241 label_view_->SetTooltipText(tooltip_text);
250 if (unselected_label_view_) 242 if (unselected_label_view_)
251 unselected_label_view_->SetTooltipText(tooltip_text); 243 unselected_label_view_->SetTooltipText(tooltip_text);
252 } 244 }
253 245
254 void UserController::ButtonPressed(views::Button* sender,
255 const views::Event& event) {
256 Login();
257 }
258
259 bool UserController::HandleKeystroke(
260 views::Textfield* sender,
261 const views::Textfield::Keystroke& keystroke) {
262 if (keystroke.GetKeyboardCode() == app::VKEY_RETURN) {
263 Login();
264 return true;
265 } else if (keystroke.GetKeyboardCode() == app::VKEY_LEFT) {
266 SelectUser(user_index() - 1);
267 return true;
268 } else if (keystroke.GetKeyboardCode() == app::VKEY_RIGHT) {
269 SelectUser(user_index() + 1);
270 return true;
271 }
272 delegate_->ClearErrors();
273 return false;
274 }
275
276 void UserController::ContentsChanged(views::Textfield* sender,
277 const string16& new_contents) {
278 }
279
280 void UserController::Observe( 246 void UserController::Observe(
281 NotificationType type, 247 NotificationType type,
282 const NotificationSource& source, 248 const NotificationSource& source,
283 const NotificationDetails& details) { 249 const NotificationDetails& details) {
284 if (type != NotificationType::LOGIN_USER_IMAGE_CHANGED || 250 if (type != NotificationType::LOGIN_USER_IMAGE_CHANGED ||
285 !user_view_) 251 !user_view_)
286 return; 252 return;
287 253
288 UserManager::User* user = Details<UserManager::User>(details).ptr(); 254 UserManager::User* user = Details<UserManager::User>(details).ptr();
289 if (user_.email() != user->email()) 255 if (user_.email() != user->email())
290 return; 256 return;
291 257
292 user_.set_image(user->image()); 258 user_.set_image(user->image());
293 user_view_->SetImage(user_.image(), user_.image()); 259 user_view_->SetImage(user_.image(), user_.image());
294 } 260 }
295 261
296 void UserController::Login() {
297 if (is_guest_) {
298 delegate_->LoginOffTheRecord();
299 } else {
300 // Delegate will reenable as necessary.
301 SetPasswordEnabled(false);
302
303 delegate_->Login(this, existing_user_view_->password_field()->text());
304 }
305 }
306
307 void UserController::IsActiveChanged(bool active) { 262 void UserController::IsActiveChanged(bool active) {
308 is_user_selected_ = active; 263 is_user_selected_ = active;
309 if (active) { 264 if (active) {
310 delegate_->OnUserSelected(this); 265 delegate_->OnUserSelected(this);
311 user_view_->SetRemoveButtonVisible( 266 user_view_->SetRemoveButtonVisible(
312 !is_new_user_ && !is_guest_ && !is_owner_); 267 !is_new_user_ && !is_guest_ && !is_owner_);
313 } else { 268 } else {
314 user_view_->SetRemoveButtonVisible(false); 269 user_view_->SetRemoveButtonVisible(false);
315 delegate_->ClearErrors(); 270 delegate_->ClearErrors();
316 } 271 }
(...skipping 21 matching lines...) Expand all
338 293
339 window->Show(); 294 window->Show();
340 } 295 }
341 296
342 WidgetGtk* UserController::CreateControlsWindow( 297 WidgetGtk* UserController::CreateControlsWindow(
343 int index, 298 int index,
344 int* width, int* height, 299 int* width, int* height,
345 bool need_browse_without_signin) { 300 bool need_browse_without_signin) {
346 views::View* control_view; 301 views::View* control_view;
347 if (is_new_user_) { 302 if (is_new_user_) {
348 new_user_view_ = 303 NewUserView* new_user_view =
349 new NewUserView(this, true, need_browse_without_signin); 304 new NewUserView(this, true, need_browse_without_signin);
350 new_user_view_->Init(); 305 new_user_view->Init();
351 control_view = new_user_view_; 306 control_view = new_user_view;
307 user_input_ = new_user_view;
308 throbber_host_ = new_user_view;
352 } else if (is_guest_) { 309 } else if (is_guest_) {
353 guest_user_view_ = new GuestUserView(this); 310 GuestUserView* guest_user_view = new GuestUserView(this);
354 guest_user_view_->RecreateFields(); 311 guest_user_view->RecreateFields();
355 control_view = guest_user_view_; 312 control_view = guest_user_view;
313 user_input_ = guest_user_view;
314 throbber_host_ = guest_user_view;
356 } else { 315 } else {
357 existing_user_view_ = new ExistingUserView(this); 316 ExistingUserView* existing_user_view = new ExistingUserView(this);
358 existing_user_view_->RecreateFields(); 317 existing_user_view->RecreateFields();
359 control_view = existing_user_view_; 318 control_view = existing_user_view;
319 user_input_ = existing_user_view;
320 throbber_host_ = existing_user_view;
360 } 321 }
361 322
362 *height = kControlsHeight; 323 *height = kControlsHeight;
363 *width = kUserImageSize; 324 *width = kUserImageSize;
364 if (is_new_user_) { 325 if (is_new_user_) {
365 DCHECK(new_user_view_); 326 gfx::Size size = control_view->GetPreferredSize();
366 gfx::Size size = new_user_view_->GetPreferredSize();
367 *width = size.width(); 327 *width = size.width();
368 *height = size.height(); 328 *height = size.height();
369 } 329 }
370 330
371 WidgetGtk* window = new WidgetGtk(WidgetGtk::TYPE_WINDOW); 331 WidgetGtk* window = new WidgetGtk(WidgetGtk::TYPE_WINDOW);
372 ConfigureLoginWindow(window, 332 ConfigureLoginWindow(window,
373 index, 333 index,
374 gfx::Rect(*width, *height), 334 gfx::Rect(*width, *height),
375 WM_IPC_WINDOW_LOGIN_CONTROLS, 335 WM_IPC_WINDOW_LOGIN_CONTROLS,
376 control_view); 336 control_view);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 login::kSelectedLabelHeight : login::kUnselectedLabelHeight; 455 login::kSelectedLabelHeight : login::kUnselectedLabelHeight;
496 WidgetGtk* window = new ClickNotifyingWidget(WidgetGtk::TYPE_WINDOW, this); 456 WidgetGtk* window = new ClickNotifyingWidget(WidgetGtk::TYPE_WINDOW, this);
497 ConfigureLoginWindow(window, 457 ConfigureLoginWindow(window,
498 index, 458 index,
499 gfx::Rect(0, 0, width, height), 459 gfx::Rect(0, 0, width, height),
500 type, 460 type,
501 label); 461 label);
502 return window; 462 return window;
503 } 463 }
504 464
505 gfx::Rect UserController::GetScreenBounds() const {
506 if (is_new_user_)
507 return new_user_view_->GetUsernameBounds();
508 else
509 return existing_user_view_->password_field()->GetScreenBounds();
510 }
511
512 void UserController::OnLogin(const std::string& username, 465 void UserController::OnLogin(const std::string& username,
513 const std::string& password) { 466 const std::string& password) {
514 user_.set_email(username); 467 if (is_new_user_)
468 user_.set_email(username);
469
470 user_input_->EnableInputControls(false);
471 SetStatusAreaEnabled(false);
472 StartThrobber();
473
515 delegate_->Login(this, UTF8ToUTF16(password)); 474 delegate_->Login(this, UTF8ToUTF16(password));
516 } 475 }
517 476
518 void UserController::OnCreateAccount() { 477 void UserController::OnCreateAccount() {
519 delegate_->ActivateWizard(WizardController::kAccountScreenName); 478 delegate_->ActivateWizard(WizardController::kAccountScreenName);
520 } 479 }
521 480
522 void UserController::OnLoginOffTheRecord() { 481 void UserController::OnLoginOffTheRecord() {
482 user_input_->EnableInputControls(false);
483 SetStatusAreaEnabled(false);
484 StartThrobber();
485
523 delegate_->LoginOffTheRecord(); 486 delegate_->LoginOffTheRecord();
524 } 487 }
525 488
526 void UserController::ClearErrors() { 489 void UserController::ClearErrors() {
527 delegate_->ClearErrors(); 490 delegate_->ClearErrors();
528 } 491 }
529 492
530 void UserController::NavigateAway() { 493 void UserController::NavigateAway() {
531 SelectUser(user_index() - 1); 494 SelectUserRelative(-1);
532 } 495 }
533 496
534 void UserController::OnRemoveUser() { 497 void UserController::OnRemoveUser() {
535 // Must not proceed without signature verification. 498 // Must not proceed without signature verification.
536 UserCrosSettingsProvider user_settings; 499 UserCrosSettingsProvider user_settings;
537 bool trusted_owner_available = user_settings.RequestTrustedOwner( 500 bool trusted_owner_available = user_settings.RequestTrustedOwner(
538 method_factory_.NewRunnableMethod(&UserController::OnRemoveUser)); 501 method_factory_.NewRunnableMethod(&UserController::OnRemoveUser));
539 if (!trusted_owner_available) { 502 if (!trusted_owner_available) {
540 // Value of owner email is still not verified. 503 // Value of owner email is still not verified.
541 // Another attempt will be invoked after verification completion. 504 // Another attempt will be invoked after verification completion.
542 return; 505 return;
543 } 506 }
544 if (user().email() == UserCrosSettingsProvider::cached_owner()) { 507 if (user().email() == UserCrosSettingsProvider::cached_owner()) {
545 // Owner is not allowed to be removed from the device. 508 // Owner is not allowed to be removed from the device.
546 return; 509 return;
547 } 510 }
548 delegate_->RemoveUser(this); 511 delegate_->RemoveUser(this);
549 } 512 }
550 513
551 void UserController::SelectUser(int index) { 514 void UserController::SelectUserRelative(int shift) {
552 delegate_->SelectUser(index); 515 delegate_->SelectUser(user_index() + shift);
553 }
554
555 void UserController::FocusPasswordField() {
556 existing_user_view_->FocusPasswordField();
557 } 516 }
558 517
559 } // namespace chromeos 518 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/login/user_controller.h ('k') | chrome/browser/chromeos/login/user_input.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698