1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/screen_lock_view.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/rounded_rect_painter.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/screen_locker.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/chromeos/login/textfield_with_margin.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_manager.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_view.h"
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/username_view.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/wizard_accessibility_helper.h"
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/chromeos/views/copy_background.h"
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_service.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/background.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/border.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/image_view.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/label.h"
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/textfield/native_textfield_wrapper.h"
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/textfield/textfield.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/grid_layout.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kCornerRadius = 5;
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A Textfield for password, which also sets focus to itself
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// when a mouse is clicked on it. This is necessary in screen locker
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// as mouse events are grabbed in the screen locker.
394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass PasswordField : public TextfieldWithMargin {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PasswordField()
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      : TextfieldWithMargin(views::Textfield::STYLE_PASSWORD),
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        context_menu_disabled_(false) {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    set_text_to_display_when_empty(
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        l10n_util::GetStringUTF16(IDS_LOGIN_POD_EMPTY_PASSWORD_TEXT));
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // views::View overrides.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool OnMousePressed(const views::MouseEvent& e) {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RequestFocus();
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ViewHierarchyChanged(bool is_add,
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    views::View* parent,
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    views::View* child) OVERRIDE {
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Textfield::ViewHierarchyChanged(is_add, parent, child);
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Wiat until native widget is created.
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!context_menu_disabled_ && native_wrapper_) {
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      gfx::NativeView widget = native_wrapper_->GetTestingHandle();
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (widget) {
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        context_menu_disabled_ = true;
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        g_signal_connect(widget, "button-press-event",
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         G_CALLBACK(OnButtonPressEventThunk), this);
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CHROMEGTK_CALLBACK_1(PasswordField, gboolean, OnButtonPressEvent,
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       GdkEventButton*);
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool context_menu_disabled_;
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(PasswordField);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsengboolean PasswordField::OnButtonPressEvent(GtkWidget* widget,
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                           GdkEventButton* event) {
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Eat button 2/3 and alt + any button to disable context menu.
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return event->state & GDK_MOD1_MASK ||
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      event->button == 2 ||
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      event->button == 3;
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing views::GridLayout;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing login::kBorderSize;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochScreenLockView::ScreenLockView(ScreenLocker* screen_locker)
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : user_view_(NULL),
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      password_field_(NULL),
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      screen_locker_(screen_locker),
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      main_(NULL),
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      username_(NULL) {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(screen_locker_);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenScreenLockView::~ScreenLockView() {
10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::Size ScreenLockView::GetPreferredSize() {
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return main_->GetPreferredSize();
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ScreenLockView::Layout() {
1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int username_height = login::kSelectedLabelHeight;
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  main_->SetBounds(0, 0, width(), height());
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  username_->SetBounds(
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      kBorderSize,
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      login::kUserImageSize - username_height + kBorderSize,
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      login::kUserImageSize,
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      username_height);
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ScreenLockView::Init() {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this,
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NotificationType::LOGIN_USER_IMAGE_CHANGED,
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NotificationService::AllSources());
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  user_view_ = new UserView(this,
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                            false,  // is_login
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                            true);  // need_background
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  main_ = new views::View();
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Use rounded rect background.
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Painter* painter =
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      CreateWizardPainter(&BorderDefinition::kUserBorder);
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  main_->set_background(
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      views::Background::CreateBackgroundPainter(true, painter));
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  main_->set_border(CreateWizardBorder(&BorderDefinition::kUserBorder));
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Password field.
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  password_field_ = new PasswordField();
13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  password_field_->SetController(this);
1384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  password_field_->set_background(new CopyBackground(main_));
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Setup ThrobberView's host view.
14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  set_host_view(password_field_);
14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // User icon.
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UserManager::User user = screen_locker_->user();
145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  user_view_->SetImage(user.image(), user.image());
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // User name.
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring text = UTF8ToWide(user.GetDisplayName());
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const gfx::Font& font = rb.GetFont(ResourceBundle::MediumBoldFont).DeriveFont(
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      kSelectedUsernameFontDelta);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Layouts image, textfield and button components.
155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GridLayout* layout = new GridLayout(main_);
156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  main_->SetLayoutManager(layout);
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::ColumnSet* column_set = layout->AddColumnSet(0);
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  column_set->AddPaddingColumn(0, kBorderSize);
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        GridLayout::USE_PREF, 0, 0);
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  column_set->AddPaddingColumn(0, kBorderSize);
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  column_set = layout->AddColumnSet(1);
16421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  column_set->AddPaddingColumn(0, kBorderSize);
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        GridLayout::USE_PREF, 0, 0);
16721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  column_set->AddPaddingColumn(0, kBorderSize);
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  layout->AddPaddingRow(0, kBorderSize);
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  layout->StartRow(0, 0);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  layout->AddView(user_view_);
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  layout->AddPaddingRow(0, kBorderSize);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  layout->StartRow(0, 1);
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  layout->AddView(password_field_);
175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  layout->AddPaddingRow(0, kBorderSize);
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AddChildView(main_);
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  UsernameView* username = UsernameView::CreateShapedUsernameView(text, false);
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  username_ = username;
1814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  username->SetColor(login::kTextColor);
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  username->SetFont(font);
183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AddChildView(username);
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ScreenLockView::ClearAndSetFocusToPassword() {
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  password_field_->RequestFocus();
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  password_field_->SetText(string16());
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ScreenLockView::SetSignoutEnabled(bool enabled) {
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  user_view_->SetSignoutEnabled(enabled);
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgfx::Rect ScreenLockView::GetPasswordBoundsRelativeTo(const views::View* view) {
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point p;
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::View::ConvertPointToView(password_field_, view, &p);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return gfx::Rect(p, size());
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ScreenLockView::SetEnabled(bool enabled) {
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::View::SetEnabled(enabled);
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!enabled) {
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // TODO(oshima): Re-enabling does not move the focus to the view
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // that had a focus (issue http://crbug.com/43131).
208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Clear focus on the textfield so that re-enabling can set focus
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // back to the text field.
210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // FocusManager may be null if the view does not have
211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // associated Widget yet.
212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (password_field_->GetFocusManager())
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      password_field_->GetFocusManager()->ClearFocus();
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  password_field_->SetEnabled(enabled);
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ScreenLockView::OnSignout() {
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  screen_locker_->Signout();
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ScreenLockView::ContentsChanged(views::Textfield* sender,
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     const string16& new_contents) {
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!new_contents.empty())
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    screen_locker_->ClearErrors();
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenbool ScreenLockView::HandleKeyEvent(
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    views::Textfield* sender,
2303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    const views::KeyEvent& key_event) {
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  screen_locker_->ClearErrors();
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (key_event.key_code() == ui::VKEY_RETURN) {
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    screen_locker_->Authenticate(password_field_->text());
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ScreenLockView::Observe(
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationType type,
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const NotificationSource& source,
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const NotificationDetails& details) {
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (type != NotificationType::LOGIN_USER_IMAGE_CHANGED || !user_view_)
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UserManager::User* user = Details<UserManager::User>(details).ptr();
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (screen_locker_->user().email() != user->email())
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  user_view_->SetImage(user->image(), user->image());
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
253