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_UI_ASH_LAUNCHER_CHROME_LAUNCHER_CONTROLLER_H_ 6 #define CHROME_BROWSER_UI_ASH_LAUNCHER_CHROME_LAUNCHER_CONTROLLER_H_ 7 8 #include <string> 9 10 #include "ash/launcher/launcher_delegate.h" 11 #include "ash/launcher/launcher_types.h" 12 #include "ash/shelf/shelf_types.h" 13 #include "base/memory/scoped_vector.h" 14 #include "chrome/browser/extensions/app_icon_loader.h" 15 #include "chrome/browser/extensions/extension_prefs.h" 16 17 class LauncherItemControllerPerAppTest; 18 class LauncherItemController; 19 class Profile; 20 class ChromeLauncherAppMenuItem; 21 class ChromeLauncherControllerPerApp; 22 23 namespace ash { 24 class LauncherModel; 25 } 26 27 namespace aura { 28 class Window; 29 class RootWindow; 30 } 31 32 namespace content { 33 class WebContents; 34 } 35 36 namespace ui { 37 class BaseWindow; 38 } 39 40 // A list of the elements which makes up a simple menu description. 41 typedef ScopedVector<ChromeLauncherAppMenuItem> ChromeLauncherAppMenuItems; 42 43 // ChromeLauncherController manages the launcher items needed for content 44 // windows. Launcher items have a type, an optional app id, and a controller. 45 // ChromeLauncherController will furthermore create the particular 46 // implementation of interest - either sorting by application (new) or sorting 47 // by browser (old). 48 // * Tabbed browsers and browser app windows have BrowserLauncherItemController, 49 // owned by the BrowserView instance. 50 // * App shell windows have ShellWindowLauncherItemController, owned by 51 // ShellWindowLauncherController. 52 // * Shortcuts have no LauncherItemController. 53 class ChromeLauncherController 54 : public ash::LauncherDelegate, 55 public extensions::AppIconLoader::Delegate { 56 public: 57 // Indicates if a launcher item is incognito or not. 58 enum IncognitoState { 59 STATE_INCOGNITO, 60 STATE_NOT_INCOGNITO, 61 }; 62 63 // Used to update the state of non plaform apps, as web contents change. 64 enum AppState { 65 APP_STATE_ACTIVE, 66 APP_STATE_WINDOW_ACTIVE, 67 APP_STATE_INACTIVE, 68 APP_STATE_REMOVED 69 }; 70 71 // Mockable interface to get app ids from tabs. 72 class AppTabHelper { 73 public: 74 virtual ~AppTabHelper() {} 75 76 // Returns the app id of the specified tab, or an empty string if there is 77 // no app. 78 virtual std::string GetAppID(content::WebContents* tab) = 0; 79 80 // Returns true if |id| is valid. Used during restore to ignore no longer 81 // valid extensions. 82 virtual bool IsValidID(const std::string& id) = 0; 83 }; 84 85 ChromeLauncherController() {} 86 virtual ~ChromeLauncherController(); 87 88 // Initializes this ChromeLauncherController. 89 virtual void Init() = 0; 90 91 // Returns the new per application interface of the given launcher. If it is 92 // a per browser (old) controller, it will return NULL; 93 // TODO(skuhne): Remove when we rip out the old launcher. 94 virtual ChromeLauncherControllerPerApp* GetPerAppInterface() = 0; 95 96 // Creates an instance. 97 static ChromeLauncherController* CreateInstance(Profile* profile, 98 ash::LauncherModel* model); 99 100 // Returns the single ChromeLauncherController instance. 101 static ChromeLauncherController* instance() { return instance_; } 102 103 // Creates a new tabbed item on the launcher for |controller|. 104 virtual ash::LauncherID CreateTabbedLauncherItem( 105 LauncherItemController* controller, 106 IncognitoState is_incognito, 107 ash::LauncherItemStatus status) = 0; 108 109 // Creates a new app item on the launcher for |controller|. 110 virtual ash::LauncherID CreateAppLauncherItem( 111 LauncherItemController* controller, 112 const std::string& app_id, 113 ash::LauncherItemStatus status) = 0; 114 115 // Updates the running status of an item. 116 virtual void SetItemStatus(ash::LauncherID id, 117 ash::LauncherItemStatus status) = 0; 118 119 // Updates the controller associated with id (which should be a shortcut). 120 // |controller| remains owned by caller. 121 virtual void SetItemController(ash::LauncherID id, 122 LauncherItemController* controller) = 0; 123 124 // Closes or unpins the launcher item. 125 virtual void CloseLauncherItem(ash::LauncherID id) = 0; 126 127 // Pins the specified id. Currently only supports platform apps. 128 virtual void Pin(ash::LauncherID id) = 0; 129 130 // Unpins the specified id, closing if not running. 131 virtual void Unpin(ash::LauncherID id) = 0; 132 133 // Returns true if the item identified by |id| is pinned. 134 virtual bool IsPinned(ash::LauncherID id) = 0; 135 136 // Pins/unpins the specified id. 137 virtual void TogglePinned(ash::LauncherID id) = 0; 138 139 // Returns true if the specified item can be pinned or unpinned. Only apps can 140 // be pinned. 141 virtual bool IsPinnable(ash::LauncherID id) const = 0; 142 143 // If there is no launcher item in the launcher for application |app_id|, one 144 // gets created. The (existing or created) launcher items get then locked 145 // against a users un-pinning removal. 146 virtual void LockV1AppWithID(const std::string& app_id) = 0; 147 148 // A previously locked launcher item of type |app_id| gets unlocked. If the 149 // lock count reaches 0 and the item is not pinned it will go away. 150 virtual void UnlockV1AppWithID(const std::string& app_id) = 0; 151 152 // Requests that the launcher item controller specified by |id| open a new 153 // instance of the app. |event_flags| holds the flags of the event which 154 // triggered this command. 155 virtual void Launch(ash::LauncherID id, int event_flags) = 0; 156 157 // Closes the specified item. 158 virtual void Close(ash::LauncherID id) = 0; 159 160 // Returns true if the specified item is open. 161 virtual bool IsOpen(ash::LauncherID id) = 0; 162 163 // Returns true if the specified item is for a platform app. 164 virtual bool IsPlatformApp(ash::LauncherID id) = 0; 165 166 // Opens a new instance of the application identified by |app_id|. 167 // Used by the app-list, and by pinned-app launcher items. 168 virtual void LaunchApp(const std::string& app_id, int event_flags) = 0; 169 170 // If |app_id| is running, reactivates the app's most recently active window, 171 // otherwise launches and activates the app. 172 // Used by the app-list, and by pinned-app launcher items. 173 virtual void ActivateApp(const std::string& app_id, int event_flags) = 0; 174 175 // Returns the launch type of app for the specified id. 176 virtual extensions::ExtensionPrefs::LaunchType GetLaunchType( 177 ash::LauncherID id) = 0; 178 179 // Returns the id of the app for the specified tab. 180 virtual std::string GetAppID(content::WebContents* tab) = 0; 181 182 // Returns the launcherID of the first non-panel item whose app_id 183 // matches |app_id| or 0 if none match. 184 virtual ash::LauncherID GetLauncherIDForAppID(const std::string& app_id) = 0; 185 186 // Returns the id of the app for the specified id (which must exist). 187 virtual std::string GetAppIDForLauncherID(ash::LauncherID id) = 0; 188 189 // Set the image for a specific launcher item (e.g. when set by the app). 190 virtual void SetLauncherItemImage(ash::LauncherID launcher_id, 191 const gfx::ImageSkia& image) = 0; 192 193 // Returns true if a pinned launcher item with given |app_id| could be found. 194 virtual bool IsAppPinned(const std::string& app_id) = 0; 195 196 // Pins an app with |app_id| to launcher. If there is a running instance in 197 // launcher, the running instance is pinned. If there is no running instance, 198 // a new launcher item is created and pinned. 199 virtual void PinAppWithID(const std::string& app_id) = 0; 200 201 // Updates the launche type of the app for the specified id to |launch_type|. 202 virtual void SetLaunchType( 203 ash::LauncherID id, 204 extensions::ExtensionPrefs::LaunchType launch_type) = 0; 205 206 // Unpins any app items whose id is |app_id|. 207 virtual void UnpinAppsWithID(const std::string& app_id) = 0; 208 209 // Returns true if the user is currently logged in as a guest. 210 virtual bool IsLoggedInAsGuest() = 0; 211 212 // Invoked when user clicks on button in the launcher and there is no last 213 // used window (or CTRL is held with the click). 214 virtual void CreateNewWindow() = 0; 215 216 // Invoked when the user clicks on button in the launcher to create a new 217 // incognito window. 218 virtual void CreateNewIncognitoWindow() = 0; 219 220 // Checks whether the user is allowed to pin apps. Pinning may be disallowed 221 // by policy in case there is a pre-defined set of pinned apps. 222 virtual bool CanPin() const = 0; 223 224 // Updates the pinned pref state. The pinned state consists of a list pref. 225 // Each item of the list is a dictionary. The key |kAppIDPath| gives the 226 // id of the app. 227 virtual void PersistPinnedState() = 0; 228 229 virtual ash::LauncherModel* model() = 0; 230 231 virtual Profile* profile() = 0; 232 233 // Gets the shelf auto-hide behavior on |root_window|. 234 virtual ash::ShelfAutoHideBehavior GetShelfAutoHideBehavior( 235 aura::RootWindow* root_window) const = 0; 236 237 // Returns |true| if the user is allowed to modify the shelf auto-hide 238 // behavior on |root_window|. 239 virtual bool CanUserModifyShelfAutoHideBehavior( 240 aura::RootWindow* root_window) const = 0; 241 242 // Toggles the shelf auto-hide behavior on |root_window|. Does nothing if the 243 // user is not allowed to modify the auto-hide behavior. 244 virtual void ToggleShelfAutoHideBehavior(aura::RootWindow* root_window) = 0; 245 246 // The tab no longer represents its previously identified application. 247 virtual void RemoveTabFromRunningApp(content::WebContents* tab, 248 const std::string& app_id) = 0; 249 250 // Notify the controller that the state of an non platform app's tabs 251 // have changed, 252 virtual void UpdateAppState(content::WebContents* contents, 253 AppState app_state) = 0; 254 255 // Limits application refocusing to urls that match |url| for |id|. 256 virtual void SetRefocusURLPatternForTest(ash::LauncherID id, 257 const GURL& url) = 0; 258 259 // Returns the extension identified by |app_id|. 260 virtual const extensions::Extension* GetExtensionForAppID( 261 const std::string& app_id) const = 0; 262 263 // Activates a |window|. If |allow_minimize| is true and the system allows 264 // it, the the window will get minimized instead. 265 virtual void ActivateWindowOrMinimizeIfActive(ui::BaseWindow* window, 266 bool allow_minimize) = 0; 267 // ash::LauncherDelegate overrides: 268 virtual void ItemSelected(const ash::LauncherItem& item, 269 const ui::Event& event) OVERRIDE = 0; 270 virtual string16 GetTitle(const ash::LauncherItem& item) OVERRIDE = 0; 271 virtual ui::MenuModel* CreateContextMenu( 272 const ash::LauncherItem& item, aura::RootWindow* root) OVERRIDE = 0; 273 virtual ash::LauncherMenuModel* CreateApplicationMenu( 274 const ash::LauncherItem& item, 275 int event_flags) OVERRIDE = 0; 276 virtual ash::LauncherID GetIDByWindow(aura::Window* window) OVERRIDE = 0; 277 virtual bool IsDraggable(const ash::LauncherItem& item) OVERRIDE = 0; 278 virtual bool ShouldShowTooltip(const ash::LauncherItem& item) OVERRIDE = 0; 279 virtual bool IsPerAppLauncher() OVERRIDE; 280 281 // extensions::AppIconLoader overrides: 282 virtual void SetAppImage(const std::string& app_id, 283 const gfx::ImageSkia& image) OVERRIDE = 0; 284 285 protected: 286 friend class LauncherItemControllerPerAppTest; 287 friend class LauncherPlatformAppBrowserTest; 288 friend class LauncherAppBrowserTest; 289 // TODO(skuhne): Remove these when the old launcher get removed. 290 friend class LauncherPlatformPerAppAppBrowserTest; 291 friend class LauncherPerAppAppBrowserTest; 292 293 // Creates a new app shortcut item and controller on the launcher at |index|. 294 // Use kInsertItemAtEnd to add a shortcut as the last item. 295 virtual ash::LauncherID CreateAppShortcutLauncherItem( 296 const std::string& app_id, 297 int index) = 0; 298 299 // Sets the AppTabHelper/AppIconLoader, taking ownership of the helper class. 300 // These are intended for testing. 301 virtual void SetAppTabHelperForTest(AppTabHelper* helper) = 0; 302 virtual void SetAppIconLoaderForTest(extensions::AppIconLoader* loader) = 0; 303 virtual const std::string& GetAppIdFromLauncherIdForTest( 304 ash::LauncherID id) = 0; 305 306 private: 307 static ChromeLauncherController* instance_; 308 }; 309 310 #endif // CHROME_BROWSER_UI_ASH_LAUNCHER_CHROME_LAUNCHER_CONTROLLER_H_ 311