OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/default_apps.h" | 5 #include "chrome/browser/extensions/default_apps.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "chrome/browser/prefs/pref_service.h" | 9 #include "chrome/browser/prefs/pref_service.h" |
10 #include "chrome/common/chrome_switches.h" | 10 #include "chrome/common/chrome_switches.h" |
11 #include "chrome/common/pref_names.h" | 11 #include "chrome/common/pref_names.h" |
12 | 12 |
13 const int DefaultApps::kAppsPromoCounterMax = 10; | 13 const int DefaultApps::kAppsPromoCounterMax = 10; |
14 | 14 |
15 // static | 15 // static |
16 void DefaultApps::RegisterUserPrefs(PrefService* prefs) { | 16 void DefaultApps::RegisterUserPrefs(PrefService* prefs) { |
17 prefs->RegisterBooleanPref(prefs::kDefaultAppsInstalled, false); | 17 prefs->RegisterBooleanPref(prefs::kDefaultAppsInstalled, false); |
18 prefs->RegisterIntegerPref(prefs::kAppsPromoCounter, 0); | 18 prefs->RegisterIntegerPref(prefs::kAppsPromoCounter, 0); |
19 } | 19 } |
20 | 20 |
21 DefaultApps::DefaultApps(PrefService* prefs) | 21 DefaultApps::DefaultApps(PrefService* prefs, |
22 : prefs_(prefs) { | 22 const std::string& application_locale) |
23 #if !defined(OS_CHROMEOS) | 23 : prefs_(prefs), application_locale_(application_locale) { |
24 // Poppit, Entanglement | 24 // Poppit, Entanglement |
25 ids_.insert("mcbkbpnkkkipelfledbfocopglifcfmi"); | 25 ids_.insert("mcbkbpnkkkipelfledbfocopglifcfmi"); |
26 ids_.insert("aciahcmjmecflokailenpkdchphgkefd"); | 26 ids_.insert("aciahcmjmecflokailenpkdchphgkefd"); |
27 #endif // OS_CHROMEOS | |
28 } | 27 } |
29 | 28 |
30 DefaultApps::~DefaultApps() {} | 29 DefaultApps::~DefaultApps() {} |
31 | 30 |
32 const ExtensionIdSet* DefaultApps::GetAppsToInstall() const { | 31 const ExtensionIdSet& DefaultApps::default_apps() const { |
33 if (GetDefaultAppsInstalled()) | 32 return ids_; |
34 return NULL; | |
35 else | |
36 return &ids_; | |
37 } | 33 } |
38 | 34 |
39 const ExtensionIdSet* DefaultApps::GetDefaultApps() const { | 35 bool DefaultApps::DefaultAppSupported() { |
40 return &ids_; | 36 // On Chrome OS the default apps are installed via a different mechanism. |
| 37 #if defined(OS_CHROMEOS) |
| 38 return false; |
| 39 #else |
| 40 return DefaultAppsSupportedForLanguage(); |
| 41 #endif |
41 } | 42 } |
42 | 43 |
43 void DefaultApps::DidInstallApp(const ExtensionIdSet& installed_ids) { | 44 bool DefaultApps::DefaultAppsSupportedForLanguage() { |
44 // If all the default apps have been installed, stop trying to install them. | 45 return application_locale_ == "en-US"; |
45 // Note that we use std::includes here instead of == because apps might have | |
46 // been manually installed while the the default apps were installing and we | |
47 // wouldn't want to keep trying to install them in that case. | |
48 if (!GetDefaultAppsInstalled() && | |
49 std::includes(installed_ids.begin(), installed_ids.end(), | |
50 ids_.begin(), ids_.end())) { | |
51 SetDefaultAppsInstalled(true); | |
52 } | |
53 } | 46 } |
54 | 47 |
55 bool DefaultApps::CheckShouldShowPromo(const ExtensionIdSet& installed_ids) { | 48 bool DefaultApps::ShouldInstallDefaultApps( |
56 #if defined(OS_CHROMEOS) | 49 const ExtensionIdSet& installed_ids) { |
57 // Don't show the promo at all on Chrome OS. | 50 if (!DefaultAppSupported()) |
58 return false; | 51 return false; |
| 52 |
| 53 if (GetDefaultAppsInstalled()) |
| 54 return false; |
| 55 |
| 56 // If there are any non-default apps installed, we should never try to install |
| 57 // the default apps again, even if the non-default apps are later removed. |
| 58 if (NonDefaultAppIsInstalled(installed_ids)) { |
| 59 SetDefaultAppsInstalled(true); |
| 60 return false; |
| 61 } |
| 62 |
| 63 return true; |
| 64 } |
| 65 |
| 66 bool DefaultApps::ShouldShowAppLauncher(const ExtensionIdSet& installed_ids) { |
| 67 // On Chrome OS the default apps are installed via a separate mechanism that |
| 68 // is always enabled. Therefore we always show the launcher. |
| 69 #if defined(OS_CHROME) |
| 70 return true; |
| 71 #else |
| 72 // The app store only supports en-us at the moment, so we don't show the apps |
| 73 // section by default for users in other locales. But we do show it if a user |
| 74 // from a non-supported locale somehow installs an app (eg by navigating |
| 75 // directly to the store). |
| 76 if (!DefaultAppsSupportedForLanguage()) |
| 77 return !installed_ids.empty(); |
| 78 |
| 79 // For supported locales, we need to wait for all the default apps to be |
| 80 // installed before showing the apps section. We also show it if any |
| 81 // non-default app is installed (eg because the user installed the app in a |
| 82 // previous version of Chrome). |
| 83 if (GetDefaultAppsInstalled() || NonDefaultAppIsInstalled(installed_ids)) |
| 84 return true; |
| 85 else |
| 86 return false; |
59 #endif | 87 #endif |
| 88 } |
| 89 |
| 90 bool DefaultApps::ShouldShowPromo(const ExtensionIdSet& installed_ids) { |
60 if (CommandLine::ForCurrentProcess()->HasSwitch( | 91 if (CommandLine::ForCurrentProcess()->HasSwitch( |
61 switches::kForceAppsPromoVisible)) { | 92 switches::kForceAppsPromoVisible)) { |
62 return true; | 93 return true; |
63 } | 94 } |
64 | 95 |
| 96 if (!DefaultAppSupported()) |
| 97 return false; |
| 98 |
65 if (GetDefaultAppsInstalled() && GetPromoCounter() < kAppsPromoCounterMax) { | 99 if (GetDefaultAppsInstalled() && GetPromoCounter() < kAppsPromoCounterMax) { |
66 // If we have the exact set of default apps, show the promo. If we don't | 100 // If we have the exact set of default apps, show the promo. If we don't |
67 // have the exact set of default apps, this means that the user manually | 101 // have the exact set of default apps, this means that the user manually |
68 // installed one. The promo doesn't make sense if it shows apps the user | 102 // installed or uninstalled one. The promo doesn't make sense if it shows |
69 // manually installed, so expire it immediately in that situation. | 103 // apps the user manually installed, so expire it immediately in that |
| 104 // situation. |
70 if (installed_ids == ids_) | 105 if (installed_ids == ids_) |
71 return true; | 106 return true; |
72 else | 107 else |
73 SetPromoHidden(); | 108 SetPromoHidden(); |
74 } | 109 } |
75 | 110 |
76 return false; | 111 return false; |
77 } | 112 } |
78 | 113 |
| 114 void DefaultApps::DidInstallApp(const ExtensionIdSet& installed_ids) { |
| 115 // If all the default apps have been installed, stop trying to install them. |
| 116 // Note that we use std::includes here instead of == because apps might have |
| 117 // been manually installed while the the default apps were installing and we |
| 118 // wouldn't want to keep trying to install them in that case. |
| 119 if (!GetDefaultAppsInstalled() && |
| 120 std::includes(installed_ids.begin(), installed_ids.end(), |
| 121 ids_.begin(), ids_.end())) { |
| 122 SetDefaultAppsInstalled(true); |
| 123 } |
| 124 } |
| 125 |
79 void DefaultApps::DidShowPromo() { | 126 void DefaultApps::DidShowPromo() { |
80 if (!GetDefaultAppsInstalled()) { | 127 if (!GetDefaultAppsInstalled()) { |
81 NOTREACHED() << "Should not show promo until default apps are installed."; | 128 NOTREACHED() << "Should not show promo until default apps are installed."; |
82 return; | 129 return; |
83 } | 130 } |
84 | 131 |
85 int promo_counter = GetPromoCounter(); | 132 int promo_counter = GetPromoCounter(); |
86 if (promo_counter == kAppsPromoCounterMax) { | 133 if (promo_counter == kAppsPromoCounterMax) { |
87 NOTREACHED() << "Promo has already been shown the maximum number of times."; | 134 NOTREACHED() << "Promo has already been shown the maximum number of times."; |
88 return; | 135 return; |
89 } | 136 } |
90 | 137 |
91 if (promo_counter < kAppsPromoCounterMax) { | 138 if (promo_counter < kAppsPromoCounterMax) { |
92 if (promo_counter + 1 == kAppsPromoCounterMax) | 139 if (promo_counter + 1 == kAppsPromoCounterMax) |
93 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, | 140 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, |
94 extension_misc::PROMO_EXPIRE, | 141 extension_misc::PROMO_EXPIRE, |
95 extension_misc::PROMO_BUCKET_BOUNDARY); | 142 extension_misc::PROMO_BUCKET_BOUNDARY); |
96 SetPromoCounter(++promo_counter); | 143 SetPromoCounter(++promo_counter); |
97 } else { | 144 } else { |
98 SetPromoHidden(); | 145 SetPromoHidden(); |
99 } | 146 } |
100 } | 147 } |
101 | 148 |
| 149 bool DefaultApps::NonDefaultAppIsInstalled( |
| 150 const ExtensionIdSet& installed_ids) const { |
| 151 for (ExtensionIdSet::const_iterator iter = installed_ids.begin(); |
| 152 iter != installed_ids.end(); ++iter) { |
| 153 if (ids_.find(*iter) == ids_.end()) |
| 154 return true; |
| 155 } |
| 156 |
| 157 return false; |
| 158 } |
| 159 |
102 void DefaultApps::SetPromoHidden() { | 160 void DefaultApps::SetPromoHidden() { |
103 SetPromoCounter(kAppsPromoCounterMax); | 161 SetPromoCounter(kAppsPromoCounterMax); |
104 } | 162 } |
105 | 163 |
106 int DefaultApps::GetPromoCounter() const { | 164 int DefaultApps::GetPromoCounter() const { |
107 return prefs_->GetInteger(prefs::kAppsPromoCounter); | 165 return prefs_->GetInteger(prefs::kAppsPromoCounter); |
108 } | 166 } |
109 | 167 |
110 void DefaultApps::SetPromoCounter(int val) { | 168 void DefaultApps::SetPromoCounter(int val) { |
111 prefs_->SetInteger(prefs::kAppsPromoCounter, val); | 169 prefs_->SetInteger(prefs::kAppsPromoCounter, val); |
112 prefs_->ScheduleSavePersistentPrefs(); | 170 prefs_->ScheduleSavePersistentPrefs(); |
113 } | 171 } |
114 | 172 |
115 bool DefaultApps::GetDefaultAppsInstalled() const { | 173 bool DefaultApps::GetDefaultAppsInstalled() const { |
116 return prefs_->GetBoolean(prefs::kDefaultAppsInstalled); | 174 return prefs_->GetBoolean(prefs::kDefaultAppsInstalled); |
117 } | 175 } |
118 | 176 |
119 void DefaultApps::SetDefaultAppsInstalled(bool val) { | 177 void DefaultApps::SetDefaultAppsInstalled(bool val) { |
120 prefs_->SetBoolean(prefs::kDefaultAppsInstalled, val); | 178 prefs_->SetBoolean(prefs::kDefaultAppsInstalled, val); |
121 prefs_->ScheduleSavePersistentPrefs(); | 179 prefs_->ScheduleSavePersistentPrefs(); |
122 } | 180 } |
OLD | NEW |