| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_UI_ASH_MULTI_USER_MULTI_USER_WINDOW_MANAGER_CHROMEOS_H_ | 5 #ifndef CHROME_BROWSER_UI_ASH_MULTI_USER_MULTI_USER_WINDOW_MANAGER_CHROMEOS_H_ |
| 6 #define CHROME_BROWSER_UI_ASH_MULTI_USER_MULTI_USER_WINDOW_MANAGER_CHROMEOS_H_ | 6 #define CHROME_BROWSER_UI_ASH_MULTI_USER_MULTI_USER_WINDOW_MANAGER_CHROMEOS_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include "ash/session/session_state_observer.h" | 11 #include "ash/session/session_state_observer.h" |
| 12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
| 13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/observer_list.h" | 14 #include "base/observer_list.h" |
| 15 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" | 15 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" |
| 16 #include "components/signin/core/account_id/account_id.h" |
| 16 #include "content/public/browser/notification_observer.h" | 17 #include "content/public/browser/notification_observer.h" |
| 17 #include "content/public/browser/notification_registrar.h" | 18 #include "content/public/browser/notification_registrar.h" |
| 18 #include "ui/aura/window_observer.h" | 19 #include "ui/aura/window_observer.h" |
| 19 #include "ui/wm/core/transient_window_observer.h" | 20 #include "ui/wm/core/transient_window_observer.h" |
| 20 | 21 |
| 21 class Browser; | 22 class Browser; |
| 22 class MultiUserNotificationBlockerChromeOS; | 23 class MultiUserNotificationBlockerChromeOS; |
| 23 class MultiUserNotificationBlockerChromeOSTest; | 24 class MultiUserNotificationBlockerChromeOSTest; |
| 24 class Profile; | 25 class Profile; |
| 25 | 26 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 public content::NotificationObserver, | 63 public content::NotificationObserver, |
| 63 public wm::TransientWindowObserver { | 64 public wm::TransientWindowObserver { |
| 64 public: | 65 public: |
| 65 // The speed which should be used to perform animations. | 66 // The speed which should be used to perform animations. |
| 66 enum AnimationSpeed { | 67 enum AnimationSpeed { |
| 67 ANIMATION_SPEED_NORMAL, // The normal animation speed. | 68 ANIMATION_SPEED_NORMAL, // The normal animation speed. |
| 68 ANIMATION_SPEED_FAST, // Unit test speed which test animations. | 69 ANIMATION_SPEED_FAST, // Unit test speed which test animations. |
| 69 ANIMATION_SPEED_DISABLED // Unit tests which do not require animations. | 70 ANIMATION_SPEED_DISABLED // Unit tests which do not require animations. |
| 70 }; | 71 }; |
| 71 | 72 |
| 72 // Create the manager and use |active_user_id| as the active user. | 73 // Create the manager and use |active_account_id| as the active user. |
| 73 explicit MultiUserWindowManagerChromeOS(const std::string& active_user_id); | 74 explicit MultiUserWindowManagerChromeOS(const AccountId& active_account_id); |
| 74 ~MultiUserWindowManagerChromeOS() override; | 75 ~MultiUserWindowManagerChromeOS() override; |
| 75 | 76 |
| 76 // Initializes the manager after its creation. Should only be called once. | 77 // Initializes the manager after its creation. Should only be called once. |
| 77 void Init(); | 78 void Init(); |
| 78 | 79 |
| 79 // MultiUserWindowManager overrides: | 80 // MultiUserWindowManager overrides: |
| 80 void SetWindowOwner( | 81 void SetWindowOwner(aura::Window* window, |
| 81 aura::Window* window, const std::string& user_id) override; | 82 const AccountId& account_id) override; |
| 82 const std::string& GetWindowOwner( | 83 const AccountId& GetWindowOwner(aura::Window* window) const override; |
| 83 aura::Window* window) const override; | 84 void ShowWindowForUser(aura::Window* window, |
| 84 void ShowWindowForUser( | 85 const AccountId& account_id) override; |
| 85 aura::Window* window, const std::string& user_id) override; | |
| 86 bool AreWindowsSharedAmongUsers() const override; | 86 bool AreWindowsSharedAmongUsers() const override; |
| 87 void GetOwnersOfVisibleWindows( | 87 void GetOwnersOfVisibleWindows( |
| 88 std::set<std::string>* user_ids) const override; | 88 std::set<AccountId>* account_ids) const override; |
| 89 bool IsWindowOnDesktopOfUser( | 89 bool IsWindowOnDesktopOfUser(aura::Window* window, |
| 90 aura::Window* window, | 90 const AccountId& account_id) const override; |
| 91 const std::string& user_id) const override; | 91 const AccountId& GetUserPresentingWindow(aura::Window* window) const override; |
| 92 const std::string& GetUserPresentingWindow( | |
| 93 aura::Window* window) const override; | |
| 94 void AddUser(content::BrowserContext* context) override; | 92 void AddUser(content::BrowserContext* context) override; |
| 95 void AddObserver(Observer* observer) override; | 93 void AddObserver(Observer* observer) override; |
| 96 void RemoveObserver(Observer* observer) override; | 94 void RemoveObserver(Observer* observer) override; |
| 97 | 95 |
| 98 // SessionStateObserver overrides: | 96 // SessionStateObserver overrides: |
| 99 void ActiveUserChanged(const std::string& user_id) override; | 97 void ActiveUserChanged(const AccountId& account_id) override; |
| 100 | 98 |
| 101 // WindowObserver overrides: | 99 // WindowObserver overrides: |
| 102 void OnWindowDestroyed(aura::Window* window) override; | 100 void OnWindowDestroyed(aura::Window* window) override; |
| 103 void OnWindowVisibilityChanging(aura::Window* window, bool visible) override; | 101 void OnWindowVisibilityChanging(aura::Window* window, bool visible) override; |
| 104 void OnWindowVisibilityChanged(aura::Window* window, bool visible) override; | 102 void OnWindowVisibilityChanged(aura::Window* window, bool visible) override; |
| 105 | 103 |
| 106 // TransientWindowObserver overrides: | 104 // TransientWindowObserver overrides: |
| 107 void OnTransientChildAdded(aura::Window* window, | 105 void OnTransientChildAdded(aura::Window* window, |
| 108 aura::Window* transient) override; | 106 aura::Window* transient) override; |
| 109 void OnTransientChildRemoved(aura::Window* window, | 107 void OnTransientChildRemoved(aura::Window* window, |
| 110 aura::Window* transient) override; | 108 aura::Window* transient) override; |
| 111 | 109 |
| 112 // content::NotificationObserver overrides: | 110 // content::NotificationObserver overrides: |
| 113 void Observe(int type, | 111 void Observe(int type, |
| 114 const content::NotificationSource& source, | 112 const content::NotificationSource& source, |
| 115 const content::NotificationDetails& details) override; | 113 const content::NotificationDetails& details) override; |
| 116 | 114 |
| 117 // Disable any animations for unit tests. | 115 // Disable any animations for unit tests. |
| 118 void SetAnimationSpeedForTest(AnimationSpeed speed); | 116 void SetAnimationSpeedForTest(AnimationSpeed speed); |
| 119 | 117 |
| 120 // Returns true when a user switch animation is running. For unit tests. | 118 // Returns true when a user switch animation is running. For unit tests. |
| 121 bool IsAnimationRunningForTest(); | 119 bool IsAnimationRunningForTest(); |
| 122 | 120 |
| 123 // Returns the current user for unit tests. | 121 // Returns the current user for unit tests. |
| 124 const std::string& GetCurrentUserForTest() const; | 122 const AccountId& GetCurrentUserForTest() const; |
| 125 | 123 |
| 126 protected: | 124 protected: |
| 127 friend class UserSwitchAnimatorChromeOS; | 125 friend class UserSwitchAnimatorChromeOS; |
| 128 | 126 |
| 129 class WindowEntry { | 127 class WindowEntry { |
| 130 public: | 128 public: |
| 131 explicit WindowEntry(const std::string& user_id) | 129 explicit WindowEntry(const AccountId& account_id) |
| 132 : owner_(user_id), | 130 : owner_(account_id), show_for_user_(account_id), show_(true) {} |
| 133 show_for_user_(user_id), | |
| 134 show_(true) {} | |
| 135 virtual ~WindowEntry() {} | 131 virtual ~WindowEntry() {} |
| 136 | 132 |
| 137 // Returns the owner of this window. This cannot be changed. | 133 // Returns the owner of this window. This cannot be changed. |
| 138 const std::string& owner() const { return owner_; } | 134 const AccountId& owner() const { return owner_; } |
| 139 | 135 |
| 140 // Returns the user for which this should be shown. | 136 // Returns the user for which this should be shown. |
| 141 const std::string& show_for_user() const { return show_for_user_; } | 137 const AccountId& show_for_user() const { return show_for_user_; } |
| 142 | 138 |
| 143 // Returns if the window should be shown for the "show user" or not. | 139 // Returns if the window should be shown for the "show user" or not. |
| 144 bool show() const { return show_; } | 140 bool show() const { return show_; } |
| 145 | 141 |
| 146 // Set the user which will display the window on the owned desktop. If | 142 // Set the user which will display the window on the owned desktop. If |
| 147 // an empty user id gets passed the owner will be used. | 143 // an empty user id gets passed the owner will be used. |
| 148 void set_show_for_user(const std::string& user_id) { | 144 void set_show_for_user(const AccountId& account_id) { |
| 149 show_for_user_ = user_id.empty() ? owner_ : user_id; | 145 show_for_user_ = account_id.is_valid() ? account_id : owner_; |
| 150 } | 146 } |
| 151 | 147 |
| 152 // Sets if the window gets shown for the active user or not. | 148 // Sets if the window gets shown for the active user or not. |
| 153 void set_show(bool show) { show_ = show; } | 149 void set_show(bool show) { show_ = show; } |
| 154 | 150 |
| 155 private: | 151 private: |
| 156 // The user id of the owner of this window. | 152 // The user id of the owner of this window. |
| 157 const std::string owner_; | 153 const AccountId owner_; |
| 158 | 154 |
| 159 // The user id of the user on which desktop the window gets shown. | 155 // The user id of the user on which desktop the window gets shown. |
| 160 std::string show_for_user_; | 156 AccountId show_for_user_; |
| 161 | 157 |
| 162 // True if the window should be visible for the user which shows the window. | 158 // True if the window should be visible for the user which shows the window. |
| 163 bool show_; | 159 bool show_; |
| 164 | 160 |
| 165 DISALLOW_COPY_AND_ASSIGN(WindowEntry); | 161 DISALLOW_COPY_AND_ASSIGN(WindowEntry); |
| 166 }; | 162 }; |
| 167 | 163 |
| 168 typedef std::map<aura::Window*, WindowEntry*> WindowToEntryMap; | 164 typedef std::map<aura::Window*, WindowEntry*> WindowToEntryMap; |
| 169 | 165 |
| 170 // Show a window for a user without switching the user. | 166 // Show a window for a user without switching the user. |
| 171 // Returns true when the window moved to a new desktop. | 167 // Returns true when the window moved to a new desktop. |
| 172 bool ShowWindowForUserIntern(aura::Window* window, | 168 bool ShowWindowForUserIntern(aura::Window* window, |
| 173 const std::string& user_id); | 169 const AccountId& account_id); |
| 174 | 170 |
| 175 // Show / hide the given window. Note: By not doing this within the functions, | 171 // Show / hide the given window. Note: By not doing this within the functions, |
| 176 // this allows to either switching to different ways to show/hide and / or to | 172 // this allows to either switching to different ways to show/hide and / or to |
| 177 // distinguish state changes performed by this class vs. state changes | 173 // distinguish state changes performed by this class vs. state changes |
| 178 // performed by the others. Note furthermore that system modal dialogs will | 174 // performed by the others. Note furthermore that system modal dialogs will |
| 179 // not get hidden. We will switch instead to the owners desktop. | 175 // not get hidden. We will switch instead to the owners desktop. |
| 180 // The |animation_time_in_ms| is the time the animation should take. Set to 0 | 176 // The |animation_time_in_ms| is the time the animation should take. Set to 0 |
| 181 // if it should get set instantly. | 177 // if it should get set instantly. |
| 182 void SetWindowVisibility(aura::Window* window, | 178 void SetWindowVisibility(aura::Window* window, |
| 183 bool visible, | 179 bool visible, |
| 184 int animation_time_in_ms); | 180 int animation_time_in_ms); |
| 185 | 181 |
| 186 const WindowToEntryMap& window_to_entry() { return window_to_entry_; } | 182 const WindowToEntryMap& window_to_entry() { return window_to_entry_; } |
| 187 MultiUserNotificationBlockerChromeOS* notification_blocker() { | 183 MultiUserNotificationBlockerChromeOS* notification_blocker() { |
| 188 return notification_blocker_.get(); | 184 return notification_blocker_.get(); |
| 189 } | 185 } |
| 190 | 186 |
| 191 private: | 187 private: |
| 192 friend class ::MultiUserNotificationBlockerChromeOSTest; | 188 friend class ::MultiUserNotificationBlockerChromeOSTest; |
| 193 friend class ash::test::MultiUserWindowManagerChromeOSTest; | 189 friend class ash::test::MultiUserWindowManagerChromeOSTest; |
| 194 | 190 |
| 195 typedef std::map<std::string, AppObserver*> UserIDToAppWindowObserver; | 191 typedef std::map<AccountId, AppObserver*> AccountIdToAppWindowObserver; |
| 196 typedef std::map<aura::Window*, bool> TransientWindowToVisibility; | 192 typedef std::map<aura::Window*, bool> TransientWindowToVisibility; |
| 197 | 193 |
| 198 // Add a browser window to the system so that the owner can be remembered. | 194 // Add a browser window to the system so that the owner can be remembered. |
| 199 void AddBrowserWindow(Browser* browser); | 195 void AddBrowserWindow(Browser* browser); |
| 200 | 196 |
| 201 // Show the window and its transient children. However - if a transient child | 197 // Show the window and its transient children. However - if a transient child |
| 202 // was turned invisible by some other operation, it will stay invisible. | 198 // was turned invisible by some other operation, it will stay invisible. |
| 203 // Use the given |animation_time_in_ms| for transitioning. | 199 // Use the given |animation_time_in_ms| for transitioning. |
| 204 void ShowWithTransientChildrenRecursive(aura::Window* window, | 200 void ShowWithTransientChildrenRecursive(aura::Window* window, |
| 205 int animation_time_in_ms); | 201 int animation_time_in_ms); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 220 | 216 |
| 221 // Animate a |window| to be |visible| in |animation_time_in_ms|. | 217 // Animate a |window| to be |visible| in |animation_time_in_ms|. |
| 222 void SetWindowVisible(aura::Window* window, | 218 void SetWindowVisible(aura::Window* window, |
| 223 bool visible, | 219 bool visible, |
| 224 int aimation_time_in_ms); | 220 int aimation_time_in_ms); |
| 225 | 221 |
| 226 // Get the animation time in milliseconds dependent on the |AnimationSpeed| | 222 // Get the animation time in milliseconds dependent on the |AnimationSpeed| |
| 227 // from the passed |default_time_in_ms|. | 223 // from the passed |default_time_in_ms|. |
| 228 int GetAdjustedAnimationTimeInMS(int default_time_in_ms) const; | 224 int GetAdjustedAnimationTimeInMS(int default_time_in_ms) const; |
| 229 | 225 |
| 230 // This is called when KeyedService (for |iser_id| and |profile|) is | 226 // This is called when KeyedService (for |account_id| and |profile|) is |
| 231 // destroyed, or when MultiUserWindowManagerChromeOS is destroyed. | 227 // destroyed, or when MultiUserWindowManagerChromeOS is destroyed. |
| 232 // This happens on shutdown, before profile prefs are stored to | 228 // This happens on shutdown, before profile prefs are stored to |
| 233 // disk. | 229 // disk. |
| 234 void RemoveUser(const std::string& user_id, Profile* profile); | 230 void RemoveUser(const AccountId& account_id, Profile* profile); |
| 235 | 231 |
| 236 // A lookup to see to which user the given window belongs to, where and if it | 232 // A lookup to see to which user the given window belongs to, where and if it |
| 237 // should get shown. | 233 // should get shown. |
| 238 WindowToEntryMap window_to_entry_; | 234 WindowToEntryMap window_to_entry_; |
| 239 | 235 |
| 240 // A list of all known users and their app window observers. | 236 // A list of all known users and their app window observers. |
| 241 UserIDToAppWindowObserver user_id_to_app_observer_; | 237 AccountIdToAppWindowObserver account_id_to_app_observer_; |
| 242 | 238 |
| 243 // An observer list to be notified upon window owner changes. | 239 // An observer list to be notified upon window owner changes. |
| 244 base::ObserverList<Observer> observers_; | 240 base::ObserverList<Observer> observers_; |
| 245 | 241 |
| 246 // A map which remembers for owned transient windows their own visibility. | 242 // A map which remembers for owned transient windows their own visibility. |
| 247 TransientWindowToVisibility transient_window_to_visibility_; | 243 TransientWindowToVisibility transient_window_to_visibility_; |
| 248 | 244 |
| 249 // The currently selected active user. It is used to find the proper | 245 // The currently selected active user. It is used to find the proper |
| 250 // visibility state in various cases. The state is stored here instead of | 246 // visibility state in various cases. The state is stored here instead of |
| 251 // being read from the user manager to be in sync while a switch occurs. | 247 // being read from the user manager to be in sync while a switch occurs. |
| 252 std::string current_user_id_; | 248 AccountId current_account_id_; |
| 253 | 249 |
| 254 // The blocker which controls the desktop notification visibility based on the | 250 // The blocker which controls the desktop notification visibility based on the |
| 255 // current multi-user status. | 251 // current multi-user status. |
| 256 scoped_ptr<MultiUserNotificationBlockerChromeOS> notification_blocker_; | 252 scoped_ptr<MultiUserNotificationBlockerChromeOS> notification_blocker_; |
| 257 | 253 |
| 258 // The notification registrar to track the creation of browser windows. | 254 // The notification registrar to track the creation of browser windows. |
| 259 content::NotificationRegistrar registrar_; | 255 content::NotificationRegistrar registrar_; |
| 260 | 256 |
| 261 // Suppress changes to the visibility flag while we are changing it ourselves. | 257 // Suppress changes to the visibility flag while we are changing it ourselves. |
| 262 bool suppress_visibility_changes_; | 258 bool suppress_visibility_changes_; |
| 263 | 259 |
| 264 // The speed which is used to perform any animations. | 260 // The speed which is used to perform any animations. |
| 265 AnimationSpeed animation_speed_; | 261 AnimationSpeed animation_speed_; |
| 266 | 262 |
| 267 // The animation between users. | 263 // The animation between users. |
| 268 scoped_ptr<UserSwitchAnimatorChromeOS> animation_; | 264 scoped_ptr<UserSwitchAnimatorChromeOS> animation_; |
| 269 | 265 |
| 270 DISALLOW_COPY_AND_ASSIGN(MultiUserWindowManagerChromeOS); | 266 DISALLOW_COPY_AND_ASSIGN(MultiUserWindowManagerChromeOS); |
| 271 }; | 267 }; |
| 272 | 268 |
| 273 } // namespace chrome | 269 } // namespace chrome |
| 274 | 270 |
| 275 #endif // CHROME_BROWSER_UI_ASH_MULTI_USER_MULTI_USER_WINDOW_MANAGER_CHROMEOS_H
_ | 271 #endif // CHROME_BROWSER_UI_ASH_MULTI_USER_MULTI_USER_WINDOW_MANAGER_CHROMEOS_H
_ |
| OLD | NEW |