avatar_menu.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1// Copyright (c) 2012 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_PROFILES_AVATAR_MENU_H_ 6#define CHROME_BROWSER_PROFILES_AVATAR_MENU_H_ 7 8#include <string> 9#include <vector> 10 11#include "base/basictypes.h" 12#include "base/compiler_specific.h" 13#include "base/strings/string16.h" 14#include "chrome/browser/profiles/profile_metrics.h" 15#include "chrome/browser/ui/host_desktop.h" 16#include "content/public/browser/notification_observer.h" 17#include "content/public/browser/notification_registrar.h" 18#include "content/public/browser/web_contents.h" 19#include "content/public/browser/web_contents_observer.h" 20#include "ui/gfx/image/image.h" 21 22class AvatarMenuObserver; 23class Browser; 24class Profile; 25class ProfileInfoInterface; 26class ProfileList; 27class AvatarMenuActions; 28 29// This class represents the menu-like interface used to select profiles, 30// such as the bubble that appears when the avatar icon is clicked in the 31// browser window frame. This class will notify its observer when the backend 32// data changes, and the view for this model should forward actions 33// back to it in response to user events. 34class AvatarMenu : public content::NotificationObserver { 35 public: 36 // Represents an item in the menu. 37 struct Item { 38 Item(size_t menu_index, size_t profile_index, const gfx::Image& icon); 39 ~Item(); 40 41 // The icon to be displayed next to the item. 42 gfx::Image icon; 43 44 // Whether or not the current browser is using this profile. 45 bool active; 46 47 // The name of this profile. 48 string16 name; 49 50 // A string representing the sync state of the profile. 51 string16 sync_state; 52 53 // Whether or not the current profile is signed in. If true, |sync_state| is 54 // expected to be the email of the signed in user. 55 bool signed_in; 56 57 // Whether or not the current profile requires sign-in before use. 58 bool signin_required; 59 60 // Whether or not the current profile is a managed user 61 // (see ManagedUserService). 62 bool managed; 63 64 // The index in the menu of this profile, used by views to refer to 65 // profiles. 66 size_t menu_index; 67 68 // The index in the |profile_cache| for this profile. 69 size_t profile_index; 70 }; 71 72 // Constructor. |observer| can be NULL. |browser| can be NULL and a new one 73 // will be created if an action requires it. 74 AvatarMenu(ProfileInfoInterface* profile_cache, 75 AvatarMenuObserver* observer, 76 Browser* browser); 77 virtual ~AvatarMenu(); 78 79 // True if avatar menu should be displayed. 80 static bool ShouldShowAvatarMenu(); 81 82 // Sets |image| to the image corresponding to the given profile, and 83 // sets |is_rectangle| to true unless |image| is a built-in profile avatar. 84 static void GetImageForMenuButton(Profile* profile, 85 gfx::Image* image, 86 bool* is_rectangle); 87 88 // Compare items by name. 89 static bool CompareItems(const Item* item1, const Item* item2); 90 91 // Creates a new guest user window. 92 static void SwitchToGuestProfileWindow(chrome::HostDesktopType desktop_type); 93 94 // Opens a Browser with the specified profile in response to the user 95 // selecting an item. If |always_create| is true then a new window is created 96 // even if a window for that profile already exists. 97 void SwitchToProfile(size_t index, bool always_create); 98 99 // Creates a new profile. 100 void AddNewProfile(ProfileMetrics::ProfileAdd type); 101 102 // Opens the profile settings in response to clicking the edit button next to 103 // an item. 104 void EditProfile(size_t index); 105 106 // Rebuilds the menu from the cache. 107 void RebuildMenu(); 108 109 // Gets the number of profiles. 110 size_t GetNumberOfItems() const; 111 112 // Gets the Item at the specified index. 113 const Item& GetItemAt(size_t index) const; 114 115 // Returns the index of the active profile. 116 size_t GetActiveProfileIndex(); 117 118 // Returns information about a managed user which will be displayed in the 119 // avatar menu. If the profile does not belong to a managed user, an empty 120 // string will be returned. 121 base::string16 GetManagedUserInformation() const; 122 123 // Returns the icon for the managed user which will be displayed in the 124 // avatar menu. 125 const gfx::Image& GetManagedUserIcon() const; 126 127 // This menu is also used for the always-present Mac system menubar. If the 128 // last active browser changes, the menu will need to reference that browser. 129 void ActiveBrowserChanged(Browser* browser); 130 131 // Start the sign-out process for this profile. 132 content::WebContents* BeginSignOut(); 133 134 // Use a different URL for logout (for testing only). 135 void SetLogoutURL(const std::string& logout_url); 136 137 // Returns true if the add profile link should be shown. 138 bool ShouldShowAddNewProfileLink() const; 139 140 // Returns true if the edit profile link should be shown. 141 bool ShouldShowEditProfileLink() const; 142 143 // content::NotificationObserver: 144 virtual void Observe(int type, 145 const content::NotificationSource& source, 146 const content::NotificationDetails& details) OVERRIDE; 147 148 private: 149 // The model that provides the list of menu items. 150 scoped_ptr<ProfileList> profile_list_; 151 152 // The controller for avatar menu actions. 153 scoped_ptr<AvatarMenuActions> menu_actions_; 154 155 // The cache that provides the profile information. Weak. 156 ProfileInfoInterface* profile_info_; 157 158 // The observer of this model, which is notified of changes. Weak. 159 AvatarMenuObserver* observer_; 160 161 // Browser in which this avatar menu resides. Weak. 162 Browser* browser_; 163 164 // Listens for notifications from the ProfileInfoCache. 165 content::NotificationRegistrar registrar_; 166 167 DISALLOW_COPY_AND_ASSIGN(AvatarMenu); 168}; 169 170#endif // CHROME_BROWSER_PROFILES_AVATAR_MENU_H_ 171