blob: fe8d9709326d09400e5e95c45b4063af7b49b217 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_USER_EDUCATION_COMMON_USER_EDUCATION_STORAGE_SERVICE_H_
#define COMPONENTS_USER_EDUCATION_COMMON_USER_EDUCATION_STORAGE_SERVICE_H_
#include <map>
#include <optional>
#include "base/feature_list.h"
#include "base/memory/raw_ptr.h"
#include "base/time/clock.h"
#include "base/time/time.h"
#include "components/user_education/common/ntp_promo/ntp_promo_identifier.h"
#include "components/user_education/common/user_education_data.h"
// Declare in the global namespace for test purposes.
class FeaturePromoStorageInteractiveTest;
class UserEducationInternalsPageHandlerImpl;
namespace user_education {
// For downstream consumers of user education data that only need to get the
// common time, pass this interface.
class UserEducationTimeProvider {
public:
UserEducationTimeProvider();
UserEducationTimeProvider(const UserEducationTimeProvider&) = delete;
void operator=(const UserEducationTimeProvider&) = delete;
virtual ~UserEducationTimeProvider();
// Returns the current time, as per `clock_`, which defaults to
// `base::DefaultClock`.
virtual base::Time GetCurrentTime() const;
// Sets the clock used across user education for session logic.
void set_clock_for_testing(const base::Clock* clock) { clock_ = clock; }
private:
raw_ptr<const base::Clock> clock_;
};
// This service manages snooze and other display data for in-product help
// promos.
//
// It is an abstract base class in order to support multiple frameworks/
// platforms, and different data stores.
//
// Before showing an IPH, the IPH controller should ask if the IPH is blocked.
// The controller should also notify after the IPH is shown and after the user
// clicks the snooze/dismiss button.
class UserEducationStorageService : public UserEducationTimeProvider {
public:
UserEducationStorageService();
~UserEducationStorageService() override;
virtual std::optional<FeaturePromoData> ReadPromoData(
const base::Feature& iph_feature) const = 0;
virtual void SavePromoData(const base::Feature& iph_feature,
const FeaturePromoData& promo_data) = 0;
// Reset the state of |iph_feature|.
virtual void Reset(const base::Feature& iph_feature) = 0;
virtual UserEducationSessionData ReadSessionData() const = 0;
virtual void SaveSessionData(
const UserEducationSessionData& session_data) = 0;
virtual void ResetSession() = 0;
virtual FeaturePromoPolicyData ReadPolicyData() const = 0;
virtual void SavePolicyData(const FeaturePromoPolicyData& policy_data) = 0;
// Reset the policy data.
virtual void ResetPolicy() = 0;
virtual NewBadgeData ReadNewBadgeData(
const base::Feature& new_badge_feature) const = 0;
virtual void SaveNewBadgeData(const base::Feature& new_badge_feature,
const NewBadgeData& new_badge_data) = 0;
// Resets the state of `new_badge_feature`.
virtual void ResetNewBadge(const base::Feature& new_badge_feature) = 0;
virtual ProductMessagingData ReadProductMessagingData() const = 0;
virtual void SaveProductMessagingData(
const ProductMessagingData& product_messaging_data) = 0;
virtual void ResetProductMessagingData() = 0;
// Returns the set of apps that `iph_feature` has been shown for.
KeyedFeaturePromoDataMap GetKeyedPromoData(
const base::Feature& iph_feature) const;
// Returns the count of previous snoozes for `iph_feature`.
int GetSnoozeCount(const base::Feature& iph_feature) const;
// Returns the current session number.
int GetSessionNumber() const;
// Gets the time when the current profile was created.
base::Time profile_creation_time() const { return profile_creation_time_; }
void set_profile_creation_time_for_testing(base::Time profile_creation_time) {
set_profile_creation_time(profile_creation_time);
}
// Gets or sets individual NTP promo data.
virtual std::optional<NtpPromoData> ReadNtpPromoData(
const NtpPromoIdentifier& id) const = 0;
virtual void SaveNtpPromoData(const NtpPromoIdentifier& id,
const NtpPromoData& data) = 0;
virtual void ResetNtpPromoData(const NtpPromoIdentifier& id) = 0;
// Gets or sets global NTP promo preferences.
virtual NtpPromoPreferences ReadNtpPromoPreferences() = 0;
virtual void SaveNtpPromoPreferences(const NtpPromoPreferences& data) = 0;
virtual void ResetNtpPromoPreferences() = 0;
protected:
friend UserEducationInternalsPageHandlerImpl;
// Sets the profile creation time; used by derived classes.
void set_profile_creation_time(base::Time profile_creation_time) {
profile_creation_time_ = profile_creation_time;
}
private:
// Time the current user's profile was created on this device; used to
// determine if low-priority promos should show (there is a grace period after
// new profile creation).
base::Time profile_creation_time_;
};
} // namespace user_education
#endif // COMPONENTS_USER_EDUCATION_COMMON_USER_EDUCATION_STORAGE_SERVICE_H_