summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/apps_promo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/apps_promo.cc')
-rw-r--r--chrome/browser/extensions/apps_promo.cc221
1 files changed, 221 insertions, 0 deletions
diff --git a/chrome/browser/extensions/apps_promo.cc b/chrome/browser/extensions/apps_promo.cc
new file mode 100644
index 0000000..ec0d9dd
--- /dev/null
+++ b/chrome/browser/extensions/apps_promo.cc
@@ -0,0 +1,221 @@
+// Copyright (c) 2011 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/extensions/apps_promo.h"
+
+#include "base/command_line.h"
+#include "base/metrics/histogram.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/ui/webui/shown_sections_handler.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/pref_names.h"
+
+const int AppsPromo::kDefaultAppsCounterMax = 10;
+
+// static
+void AppsPromo::RegisterPrefs(PrefService* local_state) {
+ std::string empty;
+ local_state->RegisterStringPref(prefs::kNTPWebStorePromoId, empty);
+ local_state->RegisterStringPref(prefs::kNTPWebStorePromoHeader, empty);
+ local_state->RegisterStringPref(prefs::kNTPWebStorePromoButton, empty);
+ local_state->RegisterStringPref(prefs::kNTPWebStorePromoLink, empty);
+ local_state->RegisterStringPref(prefs::kNTPWebStorePromoExpire, empty);
+}
+
+// static
+void AppsPromo::RegisterUserPrefs(PrefService* prefs) {
+ // Set the default value for the counter to max+1 since we don't install
+ // default apps for new users.
+ prefs->RegisterIntegerPref(
+ prefs::kAppsPromoCounter, kDefaultAppsCounterMax + 1);
+ prefs->RegisterBooleanPref(prefs::kDefaultAppsInstalled, false);
+ prefs->RegisterStringPref(prefs::kNTPWebStorePromoLastId, std::string());
+}
+
+// static
+void AppsPromo::ClearPromo() {
+ PrefService* local_state = g_browser_process->local_state();
+ local_state->ClearPref(prefs::kNTPWebStorePromoId);
+ local_state->ClearPref(prefs::kNTPWebStorePromoHeader);
+ local_state->ClearPref(prefs::kNTPWebStorePromoButton);
+ local_state->ClearPref(prefs::kNTPWebStorePromoLink);
+ local_state->ClearPref(prefs::kNTPWebStorePromoExpire);
+}
+
+// static
+std::string AppsPromo::GetPromoButtonText() {
+ PrefService* local_state = g_browser_process->local_state();
+ return local_state->GetString(prefs::kNTPWebStorePromoButton);
+}
+
+// static
+std::string AppsPromo::GetPromoId() {
+ PrefService* local_state = g_browser_process->local_state();
+ return local_state->GetString(prefs::kNTPWebStorePromoId);
+}
+
+// static
+std::string AppsPromo::GetPromoHeaderText() {
+ PrefService* local_state = g_browser_process->local_state();
+ return local_state->GetString(prefs::kNTPWebStorePromoHeader);
+}
+
+// static
+GURL AppsPromo::GetPromoLink() {
+ PrefService* local_state = g_browser_process->local_state();
+ return GURL(local_state->GetString(prefs::kNTPWebStorePromoLink));
+}
+
+// static
+std::string AppsPromo::GetPromoExpireText() {
+ PrefService* local_state = g_browser_process->local_state();
+ return local_state->GetString(prefs::kNTPWebStorePromoExpire);
+}
+
+// static
+void AppsPromo::SetPromo(const std::string& id,
+ const std::string& header_text,
+ const std::string& button_text,
+ const GURL& link,
+ const std::string& expire_text) {
+ PrefService* local_state = g_browser_process->local_state();
+ local_state->SetString(prefs::kNTPWebStorePromoId, id);
+ local_state->SetString(prefs::kNTPWebStorePromoButton, button_text);
+ local_state->SetString(prefs::kNTPWebStorePromoHeader, header_text);
+ local_state->SetString(prefs::kNTPWebStorePromoLink, link.spec());
+ local_state->SetString(prefs::kNTPWebStorePromoExpire, expire_text);
+}
+
+// static
+bool AppsPromo::IsPromoSupportedForLocale() {
+ PrefService* local_state = g_browser_process->local_state();
+ // PromoResourceService will clear the promo data if the current locale is
+ // not supported.
+ return local_state->HasPrefPath(prefs::kNTPWebStorePromoId) &&
+ local_state->HasPrefPath(prefs::kNTPWebStorePromoHeader) &&
+ local_state->HasPrefPath(prefs::kNTPWebStorePromoButton) &&
+ local_state->HasPrefPath(prefs::kNTPWebStorePromoLink) &&
+ local_state->HasPrefPath(prefs::kNTPWebStorePromoExpire);
+}
+
+AppsPromo::AppsPromo(PrefService* prefs)
+ : prefs_(prefs) {
+ // Poppit, Entanglement
+ old_default_app_ids_.insert("mcbkbpnkkkipelfledbfocopglifcfmi");
+ old_default_app_ids_.insert("aciahcmjmecflokailenpkdchphgkefd");
+}
+
+AppsPromo::~AppsPromo() {}
+
+bool AppsPromo::ShouldShowPromo(const ExtensionIdSet& installed_ids,
+ bool* just_expired) {
+ *just_expired = false;
+
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kForceAppsPromoVisible)) {
+ return true;
+ }
+
+ // Don't show the promo if one wasn't served to this locale.
+ if (!IsPromoSupportedForLocale())
+ return false;
+
+ int promo_counter = GetPromoCounter();
+ if (GetDefaultAppsInstalled() && promo_counter <= kDefaultAppsCounterMax) {
+ // If the default apps were installed from a previous Chrome version, we
+ // should still show the promo. If we don't have the exact set of default
+ // apps, this means that the user manually installed or uninstalled one.
+ // We no longer keep track of the default apps once others have been
+ // installed, so expire them immediately.
+ if (old_default_app_ids_ != installed_ids) {
+ ExpireDefaultApps();
+ return false;
+ }
+
+ if (promo_counter == kDefaultAppsCounterMax) {
+ *just_expired = true;
+
+ // The default apps have expired due to inaction, so ping PROMO_EXPIRE.
+ UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram,
+ extension_misc::PROMO_EXPIRE,
+ extension_misc::PROMO_BUCKET_BOUNDARY);
+
+ ExpireDefaultApps();
+ return true;
+ } else {
+ SetPromoCounter(++promo_counter);
+ return true;
+ }
+ } else if (installed_ids.empty()) {
+ return true;
+ }
+
+ return false;
+}
+
+bool AppsPromo::ShouldShowAppLauncher(const ExtensionIdSet& installed_ids) {
+ // On Chrome OS the default apps are installed via a separate mechanism that
+ // is always enabled. Therefore we always show the launcher.
+#if defined(OS_CHROME)
+ return true;
+#else
+
+ // Always show the app launcher if an app is installed.
+ if (!installed_ids.empty())
+ return true;
+
+ // Otherwise, only show the app launcher if there's a promo for this locale.
+ return IsPromoSupportedForLocale();
+#endif
+}
+
+void AppsPromo::ExpireDefaultApps() {
+ SetPromoCounter(kDefaultAppsCounterMax + 1);
+}
+
+void AppsPromo::MaximizeAppsIfFirstView() {
+ std::string promo_id = GetPromoId();
+
+ // Maximize the apps section of the NTP if this is the first time viewing the
+ // specific promo.
+ if (GetLastPromoId() != promo_id) {
+ prefs_->SetString(prefs::kNTPWebStorePromoLastId, promo_id);
+ ShownSectionsHandler::SetShownSection(prefs_, APPS);
+ }
+}
+
+void AppsPromo::HidePromo() {
+ UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram,
+ extension_misc::PROMO_CLOSE,
+ extension_misc::PROMO_BUCKET_BOUNDARY);
+
+ // Put the apps section into menu mode, and maximize the recent section.
+ ShownSectionsHandler::SetShownSection(prefs_, MENU_APPS);
+ ShownSectionsHandler::SetShownSection(prefs_, THUMB);
+
+ ExpireDefaultApps();
+}
+
+std::string AppsPromo::GetLastPromoId() {
+ return prefs_->GetString(prefs::kNTPWebStorePromoLastId);
+}
+
+void AppsPromo::SetLastPromoId(const std::string& id) {
+ prefs_->SetString(prefs::kNTPWebStorePromoLastId, id);
+}
+
+int AppsPromo::GetPromoCounter() const {
+ return prefs_->GetInteger(prefs::kAppsPromoCounter);
+}
+
+void AppsPromo::SetPromoCounter(int val) {
+ prefs_->SetInteger(prefs::kAppsPromoCounter, val);
+ prefs_->ScheduleSavePersistentPrefs();
+}
+
+bool AppsPromo::GetDefaultAppsInstalled() const {
+ return prefs_->GetBoolean(prefs::kDefaultAppsInstalled);
+}