• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_UI_ASH_MULTI_USER_MULTI_USER_WINDOW_MANAGER_H_
6 #define CHROME_BROWSER_UI_ASH_MULTI_USER_MULTI_USER_WINDOW_MANAGER_H_
7 
8 #include <map>
9 #include <set>
10 #include <string>
11 
12 class Browser;
13 
14 namespace content {
15 class BrowserContext;
16 }
17 
18 namespace aura {
19 class Window;
20 }
21 
22 namespace chrome {
23 
24 class MultiUserWindowManagerChromeOS;
25 
26 // The MultiUserWindowManager manages windows from multiple users by presenting
27 // only user relevant windows to the current user. The manager is automatically
28 // determining the window ownership from browser and application windows and
29 // puts them onto the correct "desktop".
30 // Un-owned windows will be visible on all users desktop's and owned windows can
31 // only be presented on one desktop. If a window should get moved to another
32 // user's desktop |ShowWindowForUser| can be called.
33 // Windows which are neither a browser nor an app can be associated with a user
34 // through |SetWindowOwner|.
35 // This class will also switch the desktop upon user change.
36 // Note:
37 // - There is no need to "unregister" a window from an owner. The class will
38 //   clean automatically all references of that window upon destruction.
39 // - User changes will be tracked via observer. No need to call.
40 // - All child windows will be owned by the same owner as its parent.
41 class MultiUserWindowManager {
42  public:
43   // Observer to notify of any window owner changes.
44   class Observer {
45    public:
46     // Invoked when the new window is created and the manager start to track its
47     // owner.
OnOwnerEntryAdded(aura::Window * window)48     virtual void OnOwnerEntryAdded(aura::Window* window) {}
49     // Invoked when the owner of the window tracked by the manager is changed.
OnOwnerEntryChanged(aura::Window * window)50     virtual void OnOwnerEntryChanged(aura::Window* window) {}
51     // Invoked when the window is destroyed and the manager stop to track its
52     // owner.
OnOwnerEntryRemoved(aura::Window * window)53     virtual void OnOwnerEntryRemoved(aura::Window* window) {}
54 
55    protected:
~Observer()56     virtual ~Observer() {}
57   };
58 
59   // The multi profile mode in use.
60   enum MultiProfileMode {
61     MULTI_PROFILE_MODE_UNINITIALIZED,  // Not initialized yet.
62     MULTI_PROFILE_MODE_OFF,            // Single user mode.
63     MULTI_PROFILE_MODE_SEPARATED,      // Each user has his own desktop.
64     MULTI_PROFILE_MODE_MIXED           // All users mix windows freely.
65   };
66 
67   // Creates an instance of the MultiUserWindowManager.
68   // Note: This function might fail if due to the desired mode the
69   // MultiUserWindowManager is not required.
70   static MultiUserWindowManager* CreateInstance();
71 
72   // Gets the instance of the object. If the multi profile mode is not enabled
73   // this will return NULL.
74   static MultiUserWindowManager* GetInstance();
75 
76   // Return the current multi profile mode operation. If CreateInstance was not
77   // yet called (or was already destroyed), MULTI_PROFILE_MODE_UNINITIALIZED
78   // will get returned.
79   static MultiProfileMode GetMultiProfileMode();
80 
81   // Whether or not the window's title should show the avatar. On chromeos,
82   // this is true when the owner of the window is different from the owner of
83   // the desktop.
84   static bool ShouldShowAvatar(aura::Window* window);
85 
86   // Removes the instance.
87   static void DeleteInstance();
88 
89   // A function to set an |instance| of a created MultiUserWinwdowManager object
90   // with a given |mode| for test purposes.
91   static void SetInstanceForTest(MultiUserWindowManager* instance,
92                                  MultiProfileMode mode);
93 
94   // Assigns an owner to a passed window. Note that this window's parent should
95   // be a direct child of the root window.
96   // A user switch will automatically change the visibility - and - if the
97   // current user is not the owner it will immediately hidden. If the window
98   // had already be registered this function will run into a DCHECK violation.
99   virtual void SetWindowOwner(
100       aura::Window* window, const std::string& user_id) = 0;
101 
102   // See who owns this window. The return value is the user id or an empty
103   // string if not assigned yet.
104   virtual const std::string& GetWindowOwner(aura::Window* window) const = 0;
105 
106   // Allows to show an owned window for another users. If the window is not
107   // owned, this call will return immediately. (The FileManager for example
108   // might be available for every user and not belong explicitly to one).
109   // Note that a window can only be shown on one desktop at a time. Note that
110   // when the window gets minimized, it will automatically fall back to the
111   // owner's desktop.
112   virtual void ShowWindowForUser(
113       aura::Window* window, const std::string& user_id) = 0;
114 
115   // Returns true when windows are shared among users.
116   virtual bool AreWindowsSharedAmongUsers() const = 0;
117 
118   // Get the owners for the visible windows and set them to |user_ids|.
119   virtual void GetOwnersOfVisibleWindows(
120       std::set<std::string>* user_ids) const = 0;
121 
122   // A query call for a given window to see if it is on the given user's
123   // desktop.
124   virtual bool IsWindowOnDesktopOfUser(aura::Window* window,
125                                        const std::string& user_id) const = 0;
126 
127   // Get the user on which the window is currently shown. If an empty string is
128   // passed back the window will be presented for every user.
129   virtual const std::string& GetUserPresentingWindow(
130       aura::Window* window) const = 0;
131 
132   // Adds user to monitor starting and running V1/V2 application windows.
133   // Returns immediately if the user (identified by a |profile|) is already
134   // known to the manager. Note: This function is not implemented as a
135   // SessionStateObserver to coordinate the timing of the addition with other
136   // modules.
137   virtual void AddUser(content::BrowserContext* profile) = 0;
138 
139   // Manages observers.
140   virtual void AddObserver(Observer* observer) = 0;
141   virtual void RemoveObserver(Observer* observer) = 0;
142 
143  protected:
~MultiUserWindowManager()144   virtual ~MultiUserWindowManager() {}
145 
146  private:
147   // Caching the current multi profile mode since the detection is expensive.
148   static MultiProfileMode multi_user_mode_;
149 };
150 
151 }  // namespace chrome
152 
153 #endif  // CHROME_BROWSER_UI_ASH_MULTI_USER_MULTI_USER_WINDOW_MANAGER_H_
154