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