extension_app_model_builder.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Use of this source code is governed by a BSD-style license that can be
3b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// found in the LICENSE file.
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_MODEL_BUILDER_H_
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_MODEL_BUILDER_H_
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string>
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <vector>
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "base/gtest_prod_util.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "base/prefs/pref_change_registrar.h"
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "base/scoped_observer.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "chrome/browser/extensions/install_observer.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "extensions/browser/extension_registry_observer.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ui/app_list/app_list_model.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ui/base/models/list_model_observer.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruclass AppListControllerDelegate;
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ExtensionAppItem;
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass Profile;
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace app_list {
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass AppListSyncableService;
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace extensions {
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass Extension;
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ExtensionRegistry;
30c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruclass ExtensionSet;
31b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruclass InstallTracker;
32b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace gfx {
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ImageSkia;
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This class populates and maintains the given |model| with information from
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// |profile|.
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ExtensionAppModelBuilder : public extensions::InstallObserver,
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 public extensions::ExtensionRegistryObserver,
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 public app_list::AppListItemListObserver {
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru public:
44c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  explicit ExtensionAppModelBuilder(AppListControllerDelegate* controller);
45b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual ~ExtensionAppModelBuilder();
46b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Initialize to use app-list sync and sets |service_| to |service|.
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void InitializeWithService(app_list::AppListSyncableService* service);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Initialize to use extension sync and sets |service_| to NULL. Used in
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // tests and when AppList sync is not enabled.
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void InitializeWithProfile(Profile* profile, app_list::AppListModel* model);
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru private:
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  typedef std::vector<ExtensionAppItem*> ExtensionAppList;
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Builds the model with the current profile.
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void BuildModel();
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // extensions::InstallObserver.
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnBeginExtensionInstall(
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const ExtensionInstallParams& params) OVERRIDE;
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnDownloadProgress(const std::string& extension_id,
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  int percent_downloaded) OVERRIDE;
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnInstallFailure(const std::string& extension_id) OVERRIDE;
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnDisabledExtensionUpdated(
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const extensions::Extension* extension) OVERRIDE;
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnAppInstalledToAppList(
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const std::string& extension_id) OVERRIDE;
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnShutdown() OVERRIDE;
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // extensions::ExtensionRegistryObserver.
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnExtensionLoaded(
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      content::BrowserContext* browser_context,
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const extensions::Extension* extension) OVERRIDE;
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnExtensionUnloaded(
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      content::BrowserContext* browser_context,
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const extensions::Extension* extension,
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE;
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnExtensionUninstalled(
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      content::BrowserContext* browser_context,
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const extensions::Extension* extension) OVERRIDE;
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnShutdown(extensions::ExtensionRegistry* registry) OVERRIDE;
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // AppListItemListObserver.
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnListItemMoved(size_t from_index,
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               size_t to_index,
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               app_list::AppListItem* item) OVERRIDE;
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  scoped_ptr<ExtensionAppItem> CreateAppItem(
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const std::string& extension_id,
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const std::string& extension_name,
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const gfx::ImageSkia& installing_icon,
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      bool is_platform_app);
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Populates the model with apps.
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void PopulateApps();
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Re-sort apps in case app ordinal prefs are changed.
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void ResortApps();
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Inserts an app based on app ordinal prefs.
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void InsertApp(scoped_ptr<ExtensionAppItem> app);
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Sets which app is intended to be highlighted. Will remove the highlight
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // from a currently highlighted app.
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void SetHighlightedApp(const std::string& extension_id);
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Sets the application app with |highlight_app_id_| in |model_| as
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // highlighted if |highlighted_app_pending_| is true. If such an app is found,
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // reset |highlighted_app_pending_| so that won't be highlighted again until
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // another call to SetHighlightedApp() is made.
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void UpdateHighlight();
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Returns app instance matching |extension_id| or NULL.
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ExtensionAppItem* GetExtensionAppItem(const std::string& extension_id);
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Initializes the |extension_pref_change_registrar| to listen for extension
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // prefs changes. OnExtensionPreferenceChanged() is called when extension
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // prefs change.
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void InitializePrefChangeRegistrar();
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Handles extension prefs changes.
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void OnExtensionPreferenceChanged();
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Unowned pointers to the service that owns this and associated profile.
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  app_list::AppListSyncableService* service_;
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  Profile* profile_;
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Registrar used to monitor the extension prefs.
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  PrefChangeRegistrar extension_pref_change_registrar_;
132c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
133c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  // Unowned pointer to the app list controller.
134c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  AppListControllerDelegate* controller_;
135c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
136c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  // Unowned pointer to the app list model.
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  app_list::AppListModel* model_;
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  std::string highlight_app_id_;
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // True if we haven't set |highlight_app_id_| to be highlighted. This happens
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // if we try to highlight an app that doesn't exist in the list yet.
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  bool highlighted_app_pending_;
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // We listen to this to show app installing progress.
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  extensions::InstallTracker* tracker_;
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Listen extension's load, unload, uninstalled.
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  extensions::ExtensionRegistry* extension_registry_;
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  DISALLOW_COPY_AND_ASSIGN(ExtensionAppModelBuilder);
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif  // CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_MODEL_BUILDER_H_
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru