1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian 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#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_NEW_USER_VIEW_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_LOGIN_NEW_USER_VIEW_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/task.h"
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/chromeos/login/helper.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/language_switch_menu.h"
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/chromeos/login/user_input.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/accelerator.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/button/button.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/link.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/textfield/textfield_controller.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/view.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace views {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Label;
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass MenuButton;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NativeButton;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace views
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// View that is used for new user login. It asks for username and password,
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// allows to specify language preferences or initiate new account creation.
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass NewUserView : public ThrobberHostView,
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                    public UserInput,
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    public views::TextfieldController,
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    public views::LinkController,
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    public views::ButtonListener {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delegate class to get notifications from the view.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Delegate {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  public:
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~Delegate() {}
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // User provided |username|, |password| and initiated login.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void OnLogin(const std::string& username,
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const std::string& password) = 0;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Initiates incognito login.
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    virtual void OnLoginAsGuest() = 0;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // User initiated new account creation.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void OnCreateAccount() = 0;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // User requested enterprise enrollment.
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual void OnStartEnterpriseEnrollment() = 0;
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // User started typing so clear all error messages.
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void ClearErrors() = 0;
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // User tries to navigate away from NewUserView pod.
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    virtual void NavigateAway() = 0;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If |need_border| is true, RoundedRect border and background are required.
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NewUserView(Delegate* delegate,
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              bool need_border,
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch              bool need_guest_link);
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~NewUserView();
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initialize view layout.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Init();
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Update strings from the resources. Executed on language change.
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void UpdateLocalizedStringsAndFonts();
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns bounds of password field in screen coordinates.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect GetPasswordBounds() const;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns bounds of username field in screen coordinates.
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Rect GetUsernameBounds() const;
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // views::View:
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual gfx::Size GetPreferredSize();
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Layout();
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void RequestFocus();
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Setters for textfields.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetUsername(const std::string& username);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetPassword(const std::string& password);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Attempt to login with the current field values.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Login();
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // views::TextfieldController:
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Not thread-safe, by virtue of using SetupSession().
953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual bool HandleKeyEvent(views::Textfield* sender,
963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                              const views::KeyEvent& keystroke);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ContentsChanged(views::Textfield* sender,
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                               const string16& new_contents);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // views::ButtonListener:
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ButtonPressed(views::Button* sender, const views::Event& event);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // views::LinkController:
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void LinkActivated(views::Link* source, int event_flags);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool AcceleratorPressed(const views::Accelerator& accelerator);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ThrobberHostView:
10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual gfx::Rect CalculateThrobberBounds(views::Throbber* throbber);
10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // UserInput:
11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void EnableInputControls(bool enabled);
11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void ClearAndFocusControls();
11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void ClearAndFocusPassword();
11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual gfx::Rect GetMainInputScreenBounds() const;
11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Navigates "away" to other user pods if allowed.
11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Returns true if event has been processed.
11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  bool NavigateAway();
11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // views::View:
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void ViewHierarchyChanged(bool is_add,
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                    views::View *parent,
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    views::View *child);
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void OnLocaleChanged();
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void AddChildView(View* view);
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates Link control and adds it as a child.
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InitLink(views::Link** link);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete and recreate native controls that fail to update preferred size
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // after text/locale update.
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void RecreatePeculiarControls();
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Enable or disable the |sign_in_button_| based on the contents of the
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // |username_field_| and |password_field_|. If there is text in both the
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // button is enabled, otherwise it's disabled.
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void UpdateSignInButtonState();
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Create view with specified solid background and add it as  child.
142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  views::View* CreateSplitter(SkColor color);
143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Screen controls.
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // NOTE: sign_in_button_ and languages_menubutton_ are handled with
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // special care: they are recreated on any text/locale change
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // because they are not resized properly.
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Textfield* username_field_;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Textfield* password_field_;
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Label* title_label_;
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Label* title_hint_label_;
152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  views::View* splitter_up1_;
153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  views::View* splitter_up2_;
154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  views::View* splitter_down1_;
155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  views::View* splitter_down2_;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::NativeButton* sign_in_button_;
157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  views::Link* guest_link_;
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  views::Link* create_account_link_;
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::MenuButton* languages_menubutton_;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Accelerator accel_focus_pass_;
1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Accelerator accel_focus_user_;
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  views::Accelerator accel_enterprise_enrollment_;
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Accelerator accel_login_off_the_record_;
16521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  views::Accelerator accel_toggle_accessibility_;
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notifications receiver.
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Delegate* delegate_;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedRunnableMethodFactory<NewUserView> focus_grabber_factory_;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LanguageSwitchMenu language_switch_menu_;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True when login is in process.
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool login_in_process_;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If true, this view needs RoundedRect border and background.
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool need_border_;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Whether Guest Mode link is needed.
181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool need_guest_link_;
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Whether create account link is needed. Set to false for now but we may
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // need it back in near future.
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool need_create_account_;
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Ordinal position of controls inside view layout.
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int languages_menubutton_order_;
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int sign_in_button_order_;
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(NewUserView);
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_NEW_USER_VIEW_H_
197