#include <algorithm>
#include "base/auto_reset.h"
+#include "base/callback.h"
+#include "base/command_line.h"
#include "base/prefs/pref_service.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/extensions/install_tracker.h"
#include "chrome/browser/extensions/install_tracker_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/app_list_syncable_service.h"
#include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
#include "chrome/browser/ui/app_list/extension_app_item.h"
+#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/pref_names.h"
#include "content/public/browser/notification_service.h"
#include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/browser/pref_names.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_set.h"
#include "ui/gfx/image/image_skia.h"
void ExtensionAppModelBuilder::InitializeWithService(
app_list::AppListSyncableService* service) {
+ DCHECK(!service_ && !profile_);
model_ = service->model();
model_->item_list()->AddObserver(this);
service_ = service;
profile_ = service->profile();
+ InitializePrefChangeRegistrar();
+
BuildModel();
}
void ExtensionAppModelBuilder::InitializeWithProfile(
Profile* profile,
app_list::AppListModel* model) {
+ DCHECK(!service_ && !profile_);
model_ = model;
model_->item_list()->AddObserver(this);
profile_ = profile;
+ InitializePrefChangeRegistrar();
+
BuildModel();
}
+void ExtensionAppModelBuilder::InitializePrefChangeRegistrar() {
+ if (!CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableStreamlinedHostedApps))
+ return;
+
+ const ExtensionService* extension_service =
+ extensions::ExtensionSystem::Get(profile_)->extension_service();
+ if (!extension_service)
+ return;
+
+ extension_pref_change_registrar_.Init(
+ extension_service->extension_prefs()->pref_service());
+ extension_pref_change_registrar_.Add(
+ extensions::pref_names::kExtensions,
+ base::Bind(&ExtensionAppModelBuilder::OnExtensionPreferenceChanged,
+ base::Unretained(this)));
+}
+
+void ExtensionAppModelBuilder::OnExtensionPreferenceChanged() {
+ // TODO(calamity): analyze the performance impact of doing this every
+ // extension pref change.
+ app_list::AppListItemList* item_list = model_->item_list();
+ for (size_t i = 0; i < item_list->item_count(); ++i) {
+ app_list::AppListItem* item = item_list->item_at(i);
+ if (item->GetItemType() != ExtensionAppItem::kItemType)
+ continue;
+
+ static_cast<ExtensionAppItem*>(item)->UpdateIconOverlay();
+ }
+}
+
void ExtensionAppModelBuilder::OnBeginExtensionInstall(
const ExtensionInstallParams& params) {
if (!params.is_app || params.is_ephemeral)
void ExtensionAppModelBuilder::OnInstallFailure(
const std::string& extension_id) {
- model_->item_list()->DeleteItem(extension_id);
+ model_->DeleteItem(extension_id);
}
void ExtensionAppModelBuilder::OnExtensionLoaded(const Extension* extension) {
service_->RemoveItem(extension->id());
return;
}
- model_->item_list()->DeleteItem(extension->id());
+ model_->DeleteItem(extension->id());
}
void ExtensionAppModelBuilder::OnAppsReordered() {
}
}
-ExtensionAppItem* ExtensionAppModelBuilder::CreateAppItem(
+scoped_ptr<ExtensionAppItem> ExtensionAppModelBuilder::CreateAppItem(
const std::string& extension_id,
const std::string& extension_name,
const gfx::ImageSkia& installing_icon,
bool is_platform_app) {
const app_list::AppListSyncableService::SyncItem* sync_item =
service_ ? service_->GetSyncItem(extension_id) : NULL;
- return new ExtensionAppItem(profile_,
- sync_item,
- extension_id,
- extension_name,
- installing_icon,
- is_platform_app);
-}
-
-void ExtensionAppModelBuilder::AddApps(
- const extensions::ExtensionSet* extensions,
- ExtensionAppList* apps) {
- for (extensions::ExtensionSet::const_iterator app = extensions->begin();
- app != extensions->end(); ++app) {
- if (ShouldDisplayInAppLauncher(profile_, *app)) {
- apps->push_back(CreateAppItem((*app)->id(),
- "",
- gfx::ImageSkia(),
- (*app)->is_platform_app()));
- }
- }
+ return make_scoped_ptr(new ExtensionAppItem(profile_,
+ sync_item,
+ extension_id,
+ extension_name,
+ installing_icon,
+ is_platform_app));
}
void ExtensionAppModelBuilder::BuildModel() {
- // Delete any extension apps.
- model_->item_list()->DeleteItemsByType(ExtensionAppItem::kItemType);
-
- if (tracker_)
- tracker_->RemoveObserver(this);
-
+ DCHECK(!tracker_);
tracker_ = controller_->GetInstallTrackerFor(profile_);
PopulateApps();
void ExtensionAppModelBuilder::PopulateApps() {
extensions::ExtensionSet extensions;
controller_->GetApps(profile_, &extensions);
- ExtensionAppList apps;
- AddApps(&extensions, &apps);
- if (apps.empty())
- return;
-
- for (size_t i = 0; i < apps.size(); ++i)
- InsertApp(apps[i]);
+ for (extensions::ExtensionSet::const_iterator app = extensions.begin();
+ app != extensions.end(); ++app) {
+ if (!ShouldDisplayInAppLauncher(profile_, *app))
+ continue;
+ InsertApp(CreateAppItem((*app)->id(),
+ "",
+ gfx::ImageSkia(),
+ (*app)->is_platform_app()));
+ }
}
-void ExtensionAppModelBuilder::InsertApp(ExtensionAppItem* app) {
+void ExtensionAppModelBuilder::InsertApp(scoped_ptr<ExtensionAppItem> app) {
if (service_) {
- service_->AddItem(app);
+ service_->AddItem(app.PassAs<app_list::AppListItem>());
return;
}
- model_->item_list()->AddItem(app);
+ model_->AddItem(app.PassAs<app_list::AppListItem>());
}
void ExtensionAppModelBuilder::SetHighlightedApp(