File: recommended_apps.cc

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (125 lines) | stat: -rw-r--r-- 3,971 bytes parent folder | download
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
122
123
124
125
// 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/extension_ui_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/recommended_apps_observer.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), extension_registry_observer_(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)));
  extension_registry_observer_.Add(extensions::ExtensionRegistry::Get(profile));
  Update();
}

RecommendedApps::~RecommendedApps() {
}

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 (!extensions::ui_util::ShouldDisplayInAppLauncher(app->get(), profile_))
      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::OnExtensionWillBeInstalled(
    content::BrowserContext* browser_context,
    const extensions::Extension* extension,
    bool is_update,
    bool from_ephemeral,
    const std::string& old_name) {
  Update();
}

void RecommendedApps::OnExtensionLoaded(
    content::BrowserContext* browser_context,
    const extensions::Extension* extension) {
  Update();
}

void RecommendedApps::OnExtensionUnloaded(
    content::BrowserContext* browser_context,
    const extensions::Extension* extension,
    extensions::UnloadedExtensionInfo::Reason reason) {
  Update();
}

void RecommendedApps::OnExtensionUninstalled(
    content::BrowserContext* browser_context,
    const extensions::Extension* extension,
    extensions::UninstallReason reason) {
  Update();
}

}  // namespace app_list