1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_USER_CONTROLLER_H_ 6 #define CHROME_BROWSER_CHROMEOS_LOGIN_USER_CONTROLLER_H_ 7 #pragma once 8 9 #include <string> 10 11 #include "base/compiler_specific.h" 12 #include "base/string16.h" 13 #include "base/task.h" 14 #include "chrome/browser/chromeos/login/new_user_view.h" 15 #include "chrome/browser/chromeos/login/user_manager.h" 16 #include "chrome/browser/chromeos/login/user_view.h" 17 #include "chrome/browser/chromeos/wm_ipc.h" 18 #include "testing/gtest/include/gtest/gtest_prod.h" 19 #include "views/controls/button/button.h" 20 #include "views/controls/textfield/textfield.h" 21 #include "views/widget/widget_delegate.h" 22 23 namespace views { 24 class WidgetGtk; 25 } 26 27 namespace chromeos { 28 29 class ThrobberManager; 30 31 // UserController manages the set of windows needed to login a single existing 32 // user or first time login for a new user. ExistingUserController creates 33 // the nececessary set of UserControllers. 34 class UserController : public views::WidgetDelegate, 35 public NewUserView::Delegate, 36 public UserView::Delegate { 37 public: 38 class Delegate { 39 public: 40 virtual void CreateAccount() = 0; 41 virtual void Login(UserController* source, 42 const string16& password) = 0; 43 virtual void LoginAsGuest() = 0; 44 virtual void ClearErrors() = 0; 45 virtual void OnUserSelected(UserController* source) = 0; 46 virtual void RemoveUser(UserController* source) = 0; 47 48 // Selects user entry with specified |index|. 49 // Does nothing if current user is already selected. 50 virtual void SelectUser(int index) = 0; 51 52 // Switch to the enterprise enrollment screen (if applicable). 53 virtual void StartEnterpriseEnrollment() = 0; 54 55 protected: ~Delegate()56 virtual ~Delegate() {} 57 }; 58 59 // Creates a UserController representing new user or guest login. 60 UserController(Delegate* delegate, bool is_guest); 61 62 // Creates a UserController for the specified user. 63 UserController(Delegate* delegate, const UserManager::User& user); 64 65 ~UserController(); 66 67 // Initializes the UserController, creating the set of windows/controls. 68 // |index| is the index of this user, and |total_user_count| the total 69 // number of users. 70 void Init(int index, int total_user_count, bool need_browse_without_signin); 71 user_index()72 int user_index() const { return user_index_; } is_new_user()73 bool is_new_user() const { return is_new_user_; } is_guest()74 bool is_guest() const { return is_guest_; } is_owner()75 bool is_owner() const { return is_owner_; } 76 user()77 const UserManager::User& user() const { return user_; } 78 79 // Get widget that contains all controls. controls_window()80 views::WidgetGtk* controls_window() { 81 return controls_window_; 82 } 83 84 // Called when user view is activated (OnUserSelected). 85 void ClearAndEnableFields(); 86 87 // Called when user view is activated (OnUserSelected). 88 void ClearAndEnablePassword(); 89 90 // Enables or disables tooltip with user's email. 91 void EnableNameTooltip(bool enable); 92 93 // Called when user image has been changed. 94 void OnUserImageChanged(UserManager::User* user); 95 96 // Returns bounds of the main input field in the screen coordinates (e.g. 97 // these bounds could be used to choose positions for the error bubble). 98 gfx::Rect GetMainInputScreenBounds() const; 99 100 // Selects user relative to the current user. 101 void SelectUserRelative(int shift); 102 103 // Starts/Stops throbber. 104 void StartThrobber(); 105 void StopThrobber(); 106 107 // Update border window parameters to notify window manager about new numbers. 108 // |index| of this user and |total_user_count| of users. 109 void UpdateUserCount(int index, int total_user_count); 110 111 // Returns the label for the user which should be spoken when accessibility is 112 // enabled. 113 std::string GetAccessibleUserLabel(); 114 115 // views::WidgetDelegate implementation: 116 virtual void OnWidgetActivated(bool active) OVERRIDE; 117 118 // NewUserView::Delegate implementation: 119 virtual void OnLogin(const std::string& username, 120 const std::string& password) OVERRIDE; 121 virtual void OnLoginAsGuest() OVERRIDE; 122 virtual void OnCreateAccount() OVERRIDE; 123 virtual void OnStartEnterpriseEnrollment() OVERRIDE; 124 virtual void ClearErrors() OVERRIDE; 125 virtual void NavigateAway() OVERRIDE; 126 127 // UserView::Delegate implementation: 128 virtual void OnRemoveUser() OVERRIDE; IsUserSelected()129 virtual bool IsUserSelected() const OVERRIDE { return is_user_selected_; } 130 131 // UsernameView::Delegate implementation: 132 virtual void OnLocaleChanged() OVERRIDE; 133 134 // Padding between the user windows. 135 static const int kPadding; 136 137 // Max size needed when an entry is not selected. 138 static const int kUnselectedSize; 139 static const int kNewUserUnselectedSize; 140 141 private: 142 FRIEND_TEST(UserControllerTest, GetNameTooltip); 143 144 // Performs common setup for login windows. 145 void ConfigureLoginWindow(views::WidgetGtk* window, 146 int index, 147 const gfx::Rect& bounds, 148 chromeos::WmIpcWindowType type, 149 views::View* contents_view); 150 views::WidgetGtk* CreateControlsWindow(int index, 151 int* width, int* height, 152 bool need_guest_link); 153 views::WidgetGtk* CreateImageWindow(int index); 154 views::WidgetGtk* CreateLabelWindow(int index, WmIpcWindowType type); 155 gfx::Font GetLabelFont(); 156 gfx::Font GetUnselectedLabelFont(); 157 void CreateBorderWindow(int index, 158 int total_user_count, 159 int controls_width, int controls_height); 160 161 // Returns tooltip text for user name. 162 std::wstring GetNameTooltip() const; 163 164 // User index within all the users. 165 int user_index_; 166 167 // Is this user selected now? 168 bool is_user_selected_; 169 170 // Is this the new user pod? 171 const bool is_new_user_; 172 173 // Is this the guest pod? 174 const bool is_guest_; 175 176 // Is this user the owner? 177 const bool is_owner_; 178 179 // Should we show tooltips above user image and label to help distinguish 180 // users with the same display name. 181 bool show_name_tooltip_; 182 183 // If is_new_user_ and is_guest_ are false, this is the user being shown. 184 UserManager::User user_; 185 186 Delegate* delegate_; 187 188 // A window is used to represent the individual chunks. 189 views::WidgetGtk* controls_window_; 190 views::WidgetGtk* image_window_; 191 views::Widget* border_window_; 192 views::WidgetGtk* label_window_; 193 views::WidgetGtk* unselected_label_window_; 194 195 // View that shows user image on image window. 196 UserView* user_view_; 197 198 // Views that show display name of the user. 199 views::Label* label_view_; 200 views::Label* unselected_label_view_; 201 202 // Input controls which are used for username and password. 203 UserInput* user_input_; 204 205 // Throbber host that can show a throbber. 206 ThrobberHostView* throbber_host_; 207 208 // Whether name tooltip is enabled. 209 bool name_tooltip_enabled_; 210 211 DISALLOW_COPY_AND_ASSIGN(UserController); 212 }; 213 214 } // namespace chromeos 215 216 #endif // CHROME_BROWSER_CHROMEOS_LOGIN_USER_CONTROLLER_H_ 217