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