123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- // Copyright 2020 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 "components/user_education/common/feature_promo_snooze_service.h"
- #include <ostream>
- #include "base/feature_list.h"
- #include "base/json/values_util.h"
- #include "base/metrics/field_trial_params.h"
- #include "base/metrics/histogram_functions.h"
- #include "base/time/time.h"
- #include "base/values.h"
- #include "components/feature_engagement/public/feature_constants.h"
- #include "third_party/abseil-cpp/absl/types/optional.h"
- namespace user_education {
- namespace {
- constexpr base::FeatureParam<FeaturePromoSnoozeService::NonClickerPolicy>::
- Option kNonClickerPolicyOptions[] = {
- {FeaturePromoSnoozeService::NonClickerPolicy::kDismiss, "dismiss"},
- {FeaturePromoSnoozeService::NonClickerPolicy::kLongSnooze,
- "long_snooze"}};
- // Used in UMA histogram to track if the user snoozes for once or more.
- enum class SnoozeType {
- // The user snoozes the IPH for the first time.
- kFirstTimeSnooze = 0,
- // The user snoozes the IPH for the second time or more.
- kRepeatingSnooze = 1,
- kMaxValue = kRepeatingSnooze
- };
- } // namespace
- constexpr int FeaturePromoSnoozeService::kUmaMaxSnoozeCount;
- constexpr base::TimeDelta FeaturePromoSnoozeService::kDefaultSnoozeDuration;
- FeaturePromoSnoozeService::FeaturePromoSnoozeService() = default;
- FeaturePromoSnoozeService::~FeaturePromoSnoozeService() = default;
- void FeaturePromoSnoozeService::OnUserSnooze(const base::Feature& iph_feature,
- base::TimeDelta snooze_duration) {
- DCHECK(snooze_duration > base::Seconds(0));
- auto snooze_data = ReadSnoozeData(iph_feature);
- if (!snooze_data)
- snooze_data = SnoozeData();
- base::UmaHistogramEnumeration(
- "InProductHelp.Promos.Snooze." + std::string(iph_feature.name),
- snooze_data->snooze_count == 0 ? SnoozeType::kFirstTimeSnooze
- : SnoozeType::kRepeatingSnooze);
- snooze_data->last_snooze_time = base::Time::Now();
- snooze_data->last_snooze_duration = snooze_duration;
- snooze_data->snooze_count++;
- SaveSnoozeData(iph_feature, *snooze_data);
- }
- void FeaturePromoSnoozeService::OnUserDismiss(
- const base::Feature& iph_feature) {
- auto snooze_data = ReadSnoozeData(iph_feature);
- if (!snooze_data)
- snooze_data = SnoozeData();
- snooze_data->is_dismissed = true;
- SaveSnoozeData(iph_feature, *snooze_data);
- // Record count of previous snoozes when the IPH gets dismissed by "Got It"
- // button.
- base::UmaHistogramExactLinear(
- "InProductHelp.Promos.SnoozeCountAtAcknowledge." +
- std::string(iph_feature.name),
- snooze_data->snooze_count, kUmaMaxSnoozeCount);
- }
- void FeaturePromoSnoozeService::OnPromoShown(const base::Feature& iph_feature) {
- auto snooze_data = ReadSnoozeData(iph_feature);
- if (!snooze_data)
- snooze_data = SnoozeData();
- snooze_data->last_show_time = base::Time::Now();
- snooze_data->show_count++;
- SaveSnoozeData(iph_feature, *snooze_data);
- }
- bool FeaturePromoSnoozeService::IsBlocked(const base::Feature& iph_feature) {
- auto snooze_data = ReadSnoozeData(iph_feature);
- if (!snooze_data)
- return false;
- // This IPH has been dismissed by user permanently.
- if (snooze_data->is_dismissed)
- return true;
- // This IPH is shown for the first time.
- if (snooze_data->show_count == 0)
- return false;
- if (snooze_data->snooze_count > 0 &&
- snooze_data->last_snooze_time >= snooze_data->last_show_time) {
- // The IPH was snoozed on last display.
- // Corruption: Snooze time is in the future.
- if (snooze_data->last_snooze_time > base::Time::Now())
- return true;
- // This IPH is snoozed. Test if snooze period has expired.
- return base::Time::Now() <
- snooze_data->last_snooze_time + snooze_data->last_snooze_duration;
- } else {
- // The IPH was neither snoozed or dismissed on last display.
- const base::FeatureParam<FeaturePromoSnoozeService::NonClickerPolicy>
- kNonClickerPolicy{
- &iph_feature, "x_iph_snooze_non_clicker_policy",
- FeaturePromoSnoozeService::NonClickerPolicy::kLongSnooze,
- &kNonClickerPolicyOptions};
- NonClickerPolicy non_clicker_policy = kNonClickerPolicy.Get();
- if (non_clicker_policy == NonClickerPolicy::kDismiss)
- return true;
- return base::Time::Now() < snooze_data->last_show_time + base::Days(14);
- }
- }
- int FeaturePromoSnoozeService::GetSnoozeCount(
- const base::Feature& iph_feature) {
- absl::optional<SnoozeData> snooze_data = ReadSnoozeData(iph_feature);
- return snooze_data ? snooze_data->snooze_count : 0;
- }
- } // namespace user_education
|