Chromium Code Reviews| Index: chrome/browser/extensions/apps_promo.cc |
| diff --git a/chrome/browser/extensions/apps_promo.cc b/chrome/browser/extensions/apps_promo.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..3501ebdc5a63997e11cf51578e41068e3a08f5bb |
| --- /dev/null |
| +++ b/chrome/browser/extensions/apps_promo.cc |
| @@ -0,0 +1,229 @@ |
| +// 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" |
| + |
| +namespace { |
| + |
| +PrefService* GetLocalState() { |
| + return g_browser_process->local_state(); |
|
Miranda Callahan
2011/04/13 14:29:29
I would remove this whole anonymous namespace and
jstritar
2011/04/13 19:52:27
Done.
|
| +} |
| + |
| +} // namespace |
| + |
| +const int AppsPromo::kDefaultAppsCounterMax = 10; |
| + |
| +// static |
| +void AppsPromo::RegisterPrefs(PrefService* local_state) { |
| + std::string str; |
| + local_state->RegisterStringPref(prefs::kNTPWebStorePromoId, str); |
| + local_state->RegisterStringPref(prefs::kNTPWebStorePromoHeader, str); |
| + local_state->RegisterStringPref(prefs::kNTPWebStorePromoButton, str); |
| + local_state->RegisterStringPref(prefs::kNTPWebStorePromoLink, str); |
| + local_state->RegisterStringPref(prefs::kNTPWebStorePromoExpire, str); |
| +} |
| + |
| +// 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 = GetLocalState(); |
| + 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 = GetLocalState(); |
| + return local_state->GetString(prefs::kNTPWebStorePromoButton); |
| +} |
| + |
| +// static |
| +std::string AppsPromo::GetPromoId() { |
| + PrefService* local_state = GetLocalState(); |
| + return local_state->GetString(prefs::kNTPWebStorePromoId); |
| +} |
| + |
| +// static |
| +std::string AppsPromo::GetPromoHeaderText() { |
| + PrefService* local_state = GetLocalState(); |
| + return local_state->GetString(prefs::kNTPWebStorePromoHeader); |
| +} |
| + |
| +// static |
| +GURL AppsPromo::GetPromoLink() { |
| + PrefService* local_state = GetLocalState(); |
| + return GURL(local_state->GetString(prefs::kNTPWebStorePromoLink)); |
| +} |
| + |
| +// static |
| +std::string AppsPromo::GetPromoExpireText() { |
| + PrefService* local_state = GetLocalState(); |
| + 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 = GetLocalState(); |
| + 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 = GetLocalState(); |
| + // 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 |
|
Miranda Callahan
2011/04/13 14:29:29
Thanks for the comment -- I am not familiar with h
jstritar
2011/04/13 19:52:27
This is actually the one place they're defined. Th
|
| + ids_.insert("mcbkbpnkkkipelfledbfocopglifcfmi"); |
| + ids_.insert("aciahcmjmecflokailenpkdchphgkefd"); |
| +} |
| + |
| +AppsPromo::~AppsPromo() {} |
| + |
| +bool AppsPromo::ShouldShowPromo(const ExtensionIdSet& installed_ids, |
| + bool* just_expired) { |
| + *just_expired = false; |
| + |
| + if (CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kForceAppsPromoVisible)) { |
|
Miranda Callahan
2011/04/13 14:29:29
indent more nicely
jstritar
2011/04/13 19:52:27
I think this is the correct indentation because th
|
| + 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 (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); |
| +} |