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/user_manager/user_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 | 25 |
25 namespace content { | 26 namespace content { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 public wm::TransientWindowObserver { | 63 public wm::TransientWindowObserver { |
63 public: | 64 public: |
64 // The speed which should be used to perform animations. | 65 // The speed which should be used to perform animations. |
65 enum AnimationSpeed { | 66 enum AnimationSpeed { |
66 ANIMATION_SPEED_NORMAL, // The normal animation speed. | 67 ANIMATION_SPEED_NORMAL, // The normal animation speed. |
67 ANIMATION_SPEED_FAST, // Unit test speed which test animations. | 68 ANIMATION_SPEED_FAST, // Unit test speed which test animations. |
68 ANIMATION_SPEED_DISABLED // Unit tests which do not require animations. | 69 ANIMATION_SPEED_DISABLED // Unit tests which do not require animations. |
69 }; | 70 }; |
70 | 71 |
71 // Create the manager and use |active_user_id| as the active user. | 72 // Create the manager and use |active_user_id| as the active user. |
72 explicit MultiUserWindowManagerChromeOS(const std::string& active_user_id); | 73 explicit MultiUserWindowManagerChromeOS(const user_manager::UserID& active_use
r_id); |
73 ~MultiUserWindowManagerChromeOS() override; | 74 ~MultiUserWindowManagerChromeOS() override; |
74 | 75 |
75 // Initializes the manager after its creation. Should only be called once. | 76 // Initializes the manager after its creation. Should only be called once. |
76 void Init(); | 77 void Init(); |
77 | 78 |
78 // MultiUserWindowManager overrides: | 79 // MultiUserWindowManager overrides: |
79 void SetWindowOwner( | 80 void SetWindowOwner( |
80 aura::Window* window, const std::string& user_id) override; | 81 aura::Window* window, const user_manager::UserID& user_id) override; |
81 const std::string& GetWindowOwner( | 82 const user_manager::UserID& GetWindowOwner( |
82 aura::Window* window) const override; | 83 aura::Window* window) const override; |
83 void ShowWindowForUser( | 84 void ShowWindowForUser( |
84 aura::Window* window, const std::string& user_id) override; | 85 aura::Window* window, const user_manager::UserID& user_id) override; |
85 bool AreWindowsSharedAmongUsers() const override; | 86 bool AreWindowsSharedAmongUsers() const override; |
86 void GetOwnersOfVisibleWindows( | 87 void GetOwnersOfVisibleWindows( |
87 std::set<std::string>* user_ids) const override; | 88 std::set<user_manager::UserID>* user_ids) const override; |
88 bool IsWindowOnDesktopOfUser( | 89 bool IsWindowOnDesktopOfUser( |
89 aura::Window* window, | 90 aura::Window* window, |
90 const std::string& user_id) const override; | 91 const user_manager::UserID& user_id) const override; |
91 const std::string& GetUserPresentingWindow( | 92 const user_manager::UserID& GetUserPresentingWindow( |
92 aura::Window* window) const override; | 93 aura::Window* window) const override; |
93 void AddUser(content::BrowserContext* context) override; | 94 void AddUser(content::BrowserContext* context) override; |
94 void AddObserver(Observer* observer) override; | 95 void AddObserver(Observer* observer) override; |
95 void RemoveObserver(Observer* observer) override; | 96 void RemoveObserver(Observer* observer) override; |
96 | 97 |
97 // SessionStateObserver overrides: | 98 // SessionStateObserver overrides: |
98 void ActiveUserChanged(const std::string& user_id) override; | 99 void ActiveUserChanged(const user_manager::UserID& user_id) override; |
99 | 100 |
100 // WindowObserver overrides: | 101 // WindowObserver overrides: |
101 void OnWindowDestroyed(aura::Window* window) override; | 102 void OnWindowDestroyed(aura::Window* window) override; |
102 void OnWindowVisibilityChanging(aura::Window* window, bool visible) override; | 103 void OnWindowVisibilityChanging(aura::Window* window, bool visible) override; |
103 void OnWindowVisibilityChanged(aura::Window* window, bool visible) override; | 104 void OnWindowVisibilityChanged(aura::Window* window, bool visible) override; |
104 | 105 |
105 // TransientWindowObserver overrides: | 106 // TransientWindowObserver overrides: |
106 void OnTransientChildAdded(aura::Window* window, | 107 void OnTransientChildAdded(aura::Window* window, |
107 aura::Window* transient) override; | 108 aura::Window* transient) override; |
108 void OnTransientChildRemoved(aura::Window* window, | 109 void OnTransientChildRemoved(aura::Window* window, |
109 aura::Window* transient) override; | 110 aura::Window* transient) override; |
110 | 111 |
111 // content::NotificationObserver overrides: | 112 // content::NotificationObserver overrides: |
112 void Observe(int type, | 113 void Observe(int type, |
113 const content::NotificationSource& source, | 114 const content::NotificationSource& source, |
114 const content::NotificationDetails& details) override; | 115 const content::NotificationDetails& details) override; |
115 | 116 |
116 // Disable any animations for unit tests. | 117 // Disable any animations for unit tests. |
117 void SetAnimationSpeedForTest(AnimationSpeed speed); | 118 void SetAnimationSpeedForTest(AnimationSpeed speed); |
118 | 119 |
119 // Returns true when a user switch animation is running. For unit tests. | 120 // Returns true when a user switch animation is running. For unit tests. |
120 bool IsAnimationRunningForTest(); | 121 bool IsAnimationRunningForTest(); |
121 | 122 |
122 // Returns the current user for unit tests. | 123 // Returns the current user for unit tests. |
123 const std::string& GetCurrentUserForTest() const; | 124 const user_manager::UserID& GetCurrentUserForTest() const; |
124 | 125 |
125 protected: | 126 protected: |
126 friend class UserSwitchAnimatorChromeOS; | 127 friend class UserSwitchAnimatorChromeOS; |
127 | 128 |
128 class WindowEntry { | 129 class WindowEntry { |
129 public: | 130 public: |
130 explicit WindowEntry(const std::string& user_id) | 131 explicit WindowEntry(const user_manager::UserID& user_id) |
131 : owner_(user_id), | 132 : owner_(user_id), |
132 show_for_user_(user_id), | 133 show_for_user_(user_id), |
133 show_(true) {} | 134 show_(true) {} |
134 virtual ~WindowEntry() {} | 135 virtual ~WindowEntry() {} |
135 | 136 |
136 // Returns the owner of this window. This cannot be changed. | 137 // Returns the owner of this window. This cannot be changed. |
137 const std::string& owner() const { return owner_; } | 138 const user_manager::UserID& owner() const { return owner_; } |
138 | 139 |
139 // Returns the user for which this should be shown. | 140 // Returns the user for which this should be shown. |
140 const std::string& show_for_user() const { return show_for_user_; } | 141 const user_manager::UserID& show_for_user() const { return show_for_user_; } |
141 | 142 |
142 // Returns if the window should be shown for the "show user" or not. | 143 // Returns if the window should be shown for the "show user" or not. |
143 bool show() const { return show_; } | 144 bool show() const { return show_; } |
144 | 145 |
145 // Set the user which will display the window on the owned desktop. If | 146 // Set the user which will display the window on the owned desktop. If |
146 // an empty user id gets passed the owner will be used. | 147 // an empty user id gets passed the owner will be used. |
147 void set_show_for_user(const std::string& user_id) { | 148 void set_show_for_user(const user_manager::UserID& user_id) { |
148 show_for_user_ = user_id.empty() ? owner_ : user_id; | 149 show_for_user_ = user_id.empty() ? owner_ : user_id; |
149 } | 150 } |
150 | 151 |
151 // Sets if the window gets shown for the active user or not. | 152 // Sets if the window gets shown for the active user or not. |
152 void set_show(bool show) { show_ = show; } | 153 void set_show(bool show) { show_ = show; } |
153 | 154 |
154 private: | 155 private: |
155 // The user id of the owner of this window. | 156 // The user id of the owner of this window. |
156 const std::string owner_; | 157 const user_manager::UserID owner_; |
157 | 158 |
158 // The user id of the user on which desktop the window gets shown. | 159 // The user id of the user on which desktop the window gets shown. |
159 std::string show_for_user_; | 160 user_manager::UserID show_for_user_; |
160 | 161 |
161 // True if the window should be visible for the user which shows the window. | 162 // True if the window should be visible for the user which shows the window. |
162 bool show_; | 163 bool show_; |
163 | 164 |
164 DISALLOW_COPY_AND_ASSIGN(WindowEntry); | 165 DISALLOW_COPY_AND_ASSIGN(WindowEntry); |
165 }; | 166 }; |
166 | 167 |
167 typedef std::map<aura::Window*, WindowEntry*> WindowToEntryMap; | 168 typedef std::map<aura::Window*, WindowEntry*> WindowToEntryMap; |
168 | 169 |
169 // Show a window for a user without switching the user. | 170 // Show a window for a user without switching the user. |
170 // Returns true when the window moved to a new desktop. | 171 // Returns true when the window moved to a new desktop. |
171 bool ShowWindowForUserIntern(aura::Window* window, | 172 bool ShowWindowForUserIntern(aura::Window* window, |
172 const std::string& user_id); | 173 const user_manager::UserID& user_id); |
173 | 174 |
174 // Show / hide the given window. Note: By not doing this within the functions, | 175 // Show / hide the given window. Note: By not doing this within the functions, |
175 // this allows to either switching to different ways to show/hide and / or to | 176 // this allows to either switching to different ways to show/hide and / or to |
176 // distinguish state changes performed by this class vs. state changes | 177 // distinguish state changes performed by this class vs. state changes |
177 // performed by the others. Note furthermore that system modal dialogs will | 178 // performed by the others. Note furthermore that system modal dialogs will |
178 // not get hidden. We will switch instead to the owners desktop. | 179 // not get hidden. We will switch instead to the owners desktop. |
179 // The |animation_time_in_ms| is the time the animation should take. Set to 0 | 180 // The |animation_time_in_ms| is the time the animation should take. Set to 0 |
180 // if it should get set instantly. | 181 // if it should get set instantly. |
181 void SetWindowVisibility(aura::Window* window, | 182 void SetWindowVisibility(aura::Window* window, |
182 bool visible, | 183 bool visible, |
183 int animation_time_in_ms); | 184 int animation_time_in_ms); |
184 | 185 |
185 const WindowToEntryMap& window_to_entry() { return window_to_entry_; } | 186 const WindowToEntryMap& window_to_entry() { return window_to_entry_; } |
186 MultiUserNotificationBlockerChromeOS* notification_blocker() { | 187 MultiUserNotificationBlockerChromeOS* notification_blocker() { |
187 return notification_blocker_.get(); | 188 return notification_blocker_.get(); |
188 } | 189 } |
189 | 190 |
190 private: | 191 private: |
191 friend class ::MultiUserNotificationBlockerChromeOSTest; | 192 friend class ::MultiUserNotificationBlockerChromeOSTest; |
192 friend class ash::test::MultiUserWindowManagerChromeOSTest; | 193 friend class ash::test::MultiUserWindowManagerChromeOSTest; |
193 | 194 |
194 typedef std::map<std::string, AppObserver*> UserIDToAppWindowObserver; | 195 typedef std::map<user_manager::UserID, AppObserver*> UserIDToAppWindowObserver
; |
195 typedef std::map<aura::Window*, bool> TransientWindowToVisibility; | 196 typedef std::map<aura::Window*, bool> TransientWindowToVisibility; |
196 | 197 |
197 // Add a browser window to the system so that the owner can be remembered. | 198 // Add a browser window to the system so that the owner can be remembered. |
198 void AddBrowserWindow(Browser* browser); | 199 void AddBrowserWindow(Browser* browser); |
199 | 200 |
200 // Show the window and its transient children. However - if a transient child | 201 // Show the window and its transient children. However - if a transient child |
201 // was turned invisible by some other operation, it will stay invisible. | 202 // was turned invisible by some other operation, it will stay invisible. |
202 // Use the given |animation_time_in_ms| for transitioning. | 203 // Use the given |animation_time_in_ms| for transitioning. |
203 void ShowWithTransientChildrenRecursive(aura::Window* window, | 204 void ShowWithTransientChildrenRecursive(aura::Window* window, |
204 int animation_time_in_ms); | 205 int animation_time_in_ms); |
(...skipping 30 matching lines...) Expand all Loading... |
235 | 236 |
236 // An observer list to be notified upon window owner changes. | 237 // An observer list to be notified upon window owner changes. |
237 ObserverList<Observer> observers_; | 238 ObserverList<Observer> observers_; |
238 | 239 |
239 // A map which remembers for owned transient windows their own visibility. | 240 // A map which remembers for owned transient windows their own visibility. |
240 TransientWindowToVisibility transient_window_to_visibility_; | 241 TransientWindowToVisibility transient_window_to_visibility_; |
241 | 242 |
242 // The currently selected active user. It is used to find the proper | 243 // The currently selected active user. It is used to find the proper |
243 // visibility state in various cases. The state is stored here instead of | 244 // visibility state in various cases. The state is stored here instead of |
244 // being read from the user manager to be in sync while a switch occurs. | 245 // being read from the user manager to be in sync while a switch occurs. |
245 std::string current_user_id_; | 246 user_manager::UserID current_user_id_; |
| 247 |
| 248 const user_manager::UserID null_user_id_; |
246 | 249 |
247 // The blocker which controls the desktop notification visibility based on the | 250 // The blocker which controls the desktop notification visibility based on the |
248 // current multi-user status. | 251 // current multi-user status. |
249 scoped_ptr<MultiUserNotificationBlockerChromeOS> notification_blocker_; | 252 scoped_ptr<MultiUserNotificationBlockerChromeOS> notification_blocker_; |
250 | 253 |
251 // The notification registrar to track the creation of browser windows. | 254 // The notification registrar to track the creation of browser windows. |
252 content::NotificationRegistrar registrar_; | 255 content::NotificationRegistrar registrar_; |
253 | 256 |
254 // 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. |
255 bool suppress_visibility_changes_; | 258 bool suppress_visibility_changes_; |
256 | 259 |
257 // The speed which is used to perform any animations. | 260 // The speed which is used to perform any animations. |
258 AnimationSpeed animation_speed_; | 261 AnimationSpeed animation_speed_; |
259 | 262 |
260 // The animation between users. | 263 // The animation between users. |
261 scoped_ptr<UserSwitchAnimatorChromeOS> animation_; | 264 scoped_ptr<UserSwitchAnimatorChromeOS> animation_; |
262 | 265 |
263 DISALLOW_COPY_AND_ASSIGN(MultiUserWindowManagerChromeOS); | 266 DISALLOW_COPY_AND_ASSIGN(MultiUserWindowManagerChromeOS); |
264 }; | 267 }; |
265 | 268 |
266 } // namespace chrome | 269 } // namespace chrome |
267 | 270 |
268 #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 |