1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/app_list/recommended_apps.h"
#include <algorithm>
#include <vector>
#include "base/bind.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/recommended_apps_observer.h"
#include "chrome/common/pref_names.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/pref_names.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_set.h"
namespace app_list {
namespace {
struct AppSortInfo {
AppSortInfo() : app(NULL) {}
AppSortInfo(const extensions::Extension* app,
const base::Time& last_launch_time)
: app(app), last_launch_time(last_launch_time) {}
const extensions::Extension* app;
base::Time last_launch_time;
};
bool AppLaunchedMoreRecent(const AppSortInfo& app1, const AppSortInfo& app2) {
return app1.last_launch_time > app2.last_launch_time;
}
} // namespace
RecommendedApps::RecommendedApps(Profile* profile) : profile_(profile) {
extensions::InstallTrackerFactory::GetForProfile(profile_)->AddObserver(this);
extensions::ExtensionPrefs* prefs = extensions::ExtensionPrefs::Get(profile_);
pref_change_registrar_.Init(prefs->pref_service());
pref_change_registrar_.Add(extensions::pref_names::kExtensions,
base::Bind(&RecommendedApps::Update,
base::Unretained(this)));
Update();
}
RecommendedApps::~RecommendedApps() {
extensions::InstallTrackerFactory::GetForProfile(profile_)
->RemoveObserver(this);
}
void RecommendedApps::AddObserver(RecommendedAppsObserver* observer) {
observers_.AddObserver(observer);
}
void RecommendedApps::RemoveObserver(RecommendedAppsObserver* observer) {
observers_.RemoveObserver(observer);
}
void RecommendedApps::Update() {
extensions::ExtensionPrefs* prefs = extensions::ExtensionPrefs::Get(profile_);
std::vector<AppSortInfo> sorted_apps;
const extensions::ExtensionSet& extensions =
extensions::ExtensionRegistry::Get(profile_)->enabled_extensions();
for (extensions::ExtensionSet::const_iterator app = extensions.begin();
app != extensions.end();
++app) {
if (!(*app)->ShouldDisplayInAppLauncher())
continue;
sorted_apps.push_back(
AppSortInfo(app->get(), prefs->GetLastLaunchTime((*app)->id())));
}
std::sort(sorted_apps.begin(), sorted_apps.end(), &AppLaunchedMoreRecent);
const size_t kMaxRecommendedApps = 4;
sorted_apps.resize(std::min(kMaxRecommendedApps, sorted_apps.size()));
Apps new_recommends;
for (size_t i = 0; i < sorted_apps.size(); ++i)
new_recommends.push_back(sorted_apps[i].app);
const bool changed = apps_.size() != new_recommends.size() ||
!std::equal(apps_.begin(), apps_.end(), new_recommends.begin());
if (changed) {
apps_.swap(new_recommends);
FOR_EACH_OBSERVER(
RecommendedAppsObserver, observers_, OnRecommendedAppsChanged());
}
}
void RecommendedApps::OnExtensionInstalled(
const extensions::Extension* extension) {
Update();
}
void RecommendedApps::OnExtensionLoaded(
const extensions::Extension* extension) {
Update();
}
void RecommendedApps::OnExtensionUnloaded(
const extensions::Extension* extension) {
Update();
}
void RecommendedApps::OnExtensionUninstalled(
const extensions::Extension* extension) {
Update();
}
} // namespace app_list
|