172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/existing_user_view.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/utf_string_conversions.h"
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/login/textfield_with_margin.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/user_controller.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/wizard_accessibility_helper.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/resource/resource_bundle.h"
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "views/background.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/textfield/textfield.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/focus/focus_manager.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/fill_layout.h"
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace chromeos {
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Colors for gradient background. These should be consistent with border
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// window background so textfield border is not visible to the user.
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// The background is needed for password textfield to imitate its borders
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// transparency correctly.
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst SkColor kBackgroundColorTop = SkColorSetRGB(209, 213, 216);
26513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst SkColor kBackgroundColorBottom = SkColorSetRGB(205, 210, 213);
27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Textfield with custom processing for Tab/Shift+Tab to select entries.
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass UserEntryTextfield : public TextfieldWithMargin {
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  UserEntryTextfield(UserController* controller,
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     views::Textfield::StyleFlags style)
33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      : TextfieldWithMargin(style),
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        controller_(controller) {}
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Overridden from views::View:
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual bool OnKeyPressed(const views::KeyEvent& e) {
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (e.key_code() == ui::VKEY_TAB) {
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      controller_->SelectUserRelative(e.IsShiftDown() ? -1 : 1);
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      return true;
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    } else if (e.key_code() == ui::VKEY_LEFT) {
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      controller_->SelectUserRelative(-1);
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      return true;
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    } else if (e.key_code() == ui::VKEY_RIGHT) {
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      controller_->SelectUserRelative(1);
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return true;
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    } else {
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return TextfieldWithMargin::OnKeyPressed(e);
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual bool SkipDefaultKeyEventProcessing(const views::KeyEvent& e) {
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (e.key_code() == ui::VKEY_TAB)
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return true;
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    else
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return views::Textfield::SkipDefaultKeyEventProcessing(e);
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  UserController* controller_;
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(UserEntryTextfield);
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenExistingUserView::ExistingUserView(UserController* user_controller)
6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    : user_controller_(user_controller),
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      password_field_(NULL),
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      accel_enterprise_enrollment_(
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          views::Accelerator(ui::VKEY_E, false, true, true)),
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      accel_login_off_the_record_(
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          views::Accelerator(ui::VKEY_B, false, false, true)),
7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      accel_toggle_accessibility_(
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          WizardAccessibilityHelper::GetAccelerator()) {
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AddAccelerator(accel_enterprise_enrollment_);
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddAccelerator(accel_login_off_the_record_);
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  AddAccelerator(accel_toggle_accessibility_);
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ExistingUserView::RecreateFields() {
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (password_field_ == NULL) {
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SetLayoutManager(new views::FillLayout);
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    password_field_ = new UserEntryTextfield(user_controller_,
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                             views::Textfield::STYLE_PASSWORD);
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    password_field_->set_background(
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        views::Background::CreateVerticalGradientBackground(
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            kBackgroundColorTop, kBackgroundColorBottom));
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    password_field_->SetFocusable(true);
8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    password_field_->SetController(this);
90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AddChildView(password_field_);
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const gfx::Font& base_font = ResourceBundle::GetSharedInstance().GetFont(
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ResourceBundle::BaseFont);
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetAndCorrectTextfieldFont(password_field_, base_font);
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  password_field_->set_text_to_display_when_empty(
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      l10n_util::GetStringUTF16(IDS_LOGIN_POD_EMPTY_PASSWORD_TEXT));
97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Layout();
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SchedulePaint();
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool ExistingUserView::AcceleratorPressed(
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const views::Accelerator& accelerator) {
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (accelerator == accel_enterprise_enrollment_) {
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_controller_->OnStartEnterpriseEnrollment();
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return true;
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (accelerator == accel_login_off_the_record_) {
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    user_controller_->OnLoginAsGuest();
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return true;
10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (accelerator == accel_toggle_accessibility_) {
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    WizardAccessibilityHelper::GetInstance()->ToggleAccessibility();
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return true;
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return false;
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenbool ExistingUserView::HandleKeyEvent(views::Textfield* sender,
1173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                      const views::KeyEvent& key_event) {
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (key_event.key_code() == ui::VKEY_RETURN) {
11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (!password_field_->text().empty())
12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      user_controller_->OnLogin("", UTF16ToUTF8(password_field_->text()));
12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else {
12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    user_controller_->ClearErrors();
12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return false;
12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExistingUserView::RequestFocus() {
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  password_field_->RequestFocus();
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ExistingUserView::ContentsChanged(views::Textfield* sender,
13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                       const string16& new_contents) {
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!new_contents.empty())
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    user_controller_->ClearErrors();
13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ExistingUserView::EnableInputControls(bool enabled) {
13921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  password_field_->SetEnabled(enabled);
14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ExistingUserView::ClearAndFocusControls() {
14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ClearAndFocusPassword();
14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ExistingUserView::ClearAndFocusPassword() {
14721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  password_field_->SetText(string16());
14821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  FocusPasswordField();
14921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ExistingUserView::FocusPasswordField() {
15221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  password_field_->RequestFocus();
15321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
15421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
15521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsengfx::Rect ExistingUserView::GetMainInputScreenBounds() const {
15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return password_field_->GetScreenBounds();
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ExistingUserView::OnLocaleChanged() {
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  RecreateFields();
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace chromeos
164