1 // Copyright 2013 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.
5 #include "chrome/browser/ui/app_list/recommended_apps.h"
10 #include "base/bind.h"
11 #include "chrome/browser/extensions/extension_prefs.h"
12 #include "chrome/browser/extensions/extension_service.h"
13 #include "chrome/browser/extensions/extension_system_factory.h"
14 #include "chrome/browser/extensions/install_tracker.h"
15 #include "chrome/browser/extensions/install_tracker_factory.h"
16 #include "chrome/browser/ui/app_list/recommended_apps_observer.h"
17 #include "chrome/common/extensions/extension.h"
18 #include "chrome/common/pref_names.h"
25 AppSortInfo() : app(NULL) {}
26 AppSortInfo(const extensions::Extension* app,
27 const base::Time& last_launch_time)
28 : app(app), last_launch_time(last_launch_time) {}
30 const extensions::Extension* app;
31 base::Time last_launch_time;
34 bool AppLaunchedMoreRecent(const AppSortInfo& app1, const AppSortInfo& app2) {
35 return app1.last_launch_time > app2.last_launch_time;
40 RecommendedApps::RecommendedApps(Profile* profile) : profile_(profile) {
41 extensions::InstallTrackerFactory::GetForProfile(profile_)->AddObserver(this);
43 ExtensionService* service =
44 extensions::ExtensionSystem::Get(profile_)->extension_service();
45 extensions::ExtensionPrefs* prefs = service->extension_prefs();
46 pref_change_registrar_.Init(prefs->pref_service());
47 pref_change_registrar_.Add(prefs::kExtensionsPref,
48 base::Bind(&RecommendedApps::Update,
49 base::Unretained(this)));
54 RecommendedApps::~RecommendedApps() {
55 extensions::InstallTrackerFactory::GetForProfile(profile_)
56 ->RemoveObserver(this);
59 void RecommendedApps::AddObserver(RecommendedAppsObserver* observer) {
60 observers_.AddObserver(observer);
63 void RecommendedApps::RemoveObserver(RecommendedAppsObserver* observer) {
64 observers_.RemoveObserver(observer);
67 void RecommendedApps::Update() {
68 ExtensionService* service =
69 extensions::ExtensionSystem::Get(profile_)->extension_service();
70 extensions::ExtensionPrefs* prefs = service->extension_prefs();
72 std::vector<AppSortInfo> sorted_apps;
73 const ExtensionSet* extensions = service->extensions();
74 for (ExtensionSet::const_iterator app = extensions->begin();
75 app != extensions->end(); ++app) {
76 if (!(*app)->ShouldDisplayInAppLauncher())
79 sorted_apps.push_back(
80 AppSortInfo(app->get(), prefs->GetLastLaunchTime((*app)->id())));
83 std::sort(sorted_apps.begin(), sorted_apps.end(), &AppLaunchedMoreRecent);
85 const size_t kMaxRecommendedApps = 4;
86 sorted_apps.resize(std::min(kMaxRecommendedApps, sorted_apps.size()));
89 for (size_t i = 0; i < sorted_apps.size(); ++i)
90 new_recommends.push_back(sorted_apps[i].app);
92 const bool changed = apps_.size() != new_recommends.size() ||
93 !std::equal(apps_.begin(), apps_.end(), new_recommends.begin());
95 apps_.swap(new_recommends);
97 RecommendedAppsObserver, observers_, OnRecommendedAppsChanged());
101 void RecommendedApps::OnBeginExtensionInstall(const std::string& extension_id,
102 const std::string& extension_name,
103 const gfx::ImageSkia& installing_icon,
105 bool is_platform_app) {}
107 void RecommendedApps::OnDownloadProgress(const std::string& extension_id,
108 int percent_downloaded) {}
110 void RecommendedApps::OnInstallFailure(const std::string& extension_id) {}
112 void RecommendedApps::OnExtensionInstalled(
113 const extensions::Extension* extension) {
117 void RecommendedApps::OnExtensionLoaded(
118 const extensions::Extension* extension) {
122 void RecommendedApps::OnExtensionUnloaded(
123 const extensions::Extension* extension) {
127 void RecommendedApps::OnExtensionUninstalled(
128 const extensions::Extension* extension) {
132 void RecommendedApps::OnAppsReordered() {}
134 void RecommendedApps::OnAppInstalledToAppList(
135 const std::string& extension_id) {}
137 void RecommendedApps::OnShutdown() {}
139 } // namespace app_list