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