extension_app_item.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file.
4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#ifndef CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_
6e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#define CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <string>
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/extensions/extension_icon_image.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/app_list/app_context_menu_delegate.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_syncable_service.h"
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/app_list_item.h"
16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "ui/gfx/image/image_skia.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class AppListControllerDelegate;
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class ExtensionEnableFlow;
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class Profile;
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace app_list {
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class AppContextMenu;
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace extensions {
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ContextMenuMatcher;
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class Extension;
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// ExtensionAppItem represents an extension app in app list.
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ExtensionAppItem : public app_list::AppListItem,
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         public extensions::IconImage::Observer,
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         public ExtensionEnableFlowDelegate,
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         public app_list::AppContextMenuDelegate {
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const char kItemType[];
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExtensionAppItem(Profile* profile,
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   const app_list::AppListSyncableService::SyncItem* sync_item,
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   const std::string& extension_id,
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   const std::string& extension_name,
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   const gfx::ImageSkia& installing_icon,
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   bool is_platform_app);
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~ExtensionAppItem();
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Reload the title and icon from the underlying extension.
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Reload();
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Updates the app item's icon, if necessary adding an overlay and/or making
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // it gray.
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void UpdateIcon();
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Only updates the icon if the overlay needs to be added/removed.
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void UpdateIconOverlay();
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Update page and app launcher ordinals to put the app in between |prev| and
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |next|. Note that |prev| and |next| could be NULL when the app is put at
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // the beginning or at the end.
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void Move(const ExtensionAppItem* prev, const ExtensionAppItem* next);
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string& extension_id() const { return extension_id_; }
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string& extension_name() const { return extension_name_; }
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Gets extension associated with this model. Returns NULL if extension
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // no longer exists.
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const extensions::Extension* GetExtension() const;
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Loads extension icon.
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void LoadImage(const extensions::Extension* extension);
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Checks if extension is disabled and if enable flow should be started.
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Returns true if extension enable flow is started or there is already one
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // running.
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool RunExtensionEnableFlow();
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Private equivalent to Activate(), without refocus for already-running apps.
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Launch(int event_flags);
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Whether or not the app item needs an overlay.
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool NeedsOverlay() const;
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Overridden from extensions::IconImage::Observer:
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnExtensionIconImageChanged(
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      extensions::IconImage* image) OVERRIDE;
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Overridden from ExtensionEnableFlowDelegate:
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void ExtensionEnableFlowFinished() OVERRIDE;
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void ExtensionEnableFlowAborted(bool user_initiated) OVERRIDE;
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from AppListItem:
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void Activate(int event_flags) OVERRIDE;
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ui::MenuModel* GetContextMenuModel() OVERRIDE;
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual const char* GetItemType() const OVERRIDE;
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Overridden from app_list::AppContextMenuDelegate:
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void ExecuteLaunchCommand(int event_flags) OVERRIDE;
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set the position from the extension ordering.
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void UpdatePositionFromExtensionOrdering();
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Return the controller for the active desktop type.
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListControllerDelegate* GetController();
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Profile* profile_;
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const std::string extension_id_;
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<extensions::IconImage> icon_;
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<app_list::AppContextMenu> context_menu_;
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<ExtensionEnableFlow> extension_enable_flow_;
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListControllerDelegate* extension_enable_flow_controller_;
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Name to use for the extension if we can't access it.
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string extension_name_;
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Icon for the extension if we can't access the installed extension.
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::ImageSkia installing_icon_;
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Whether or not this app is a platform app.
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_platform_app_;
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Whether this app item has an overlay.
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool has_overlay_;
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(ExtensionAppItem);
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)