blob: ff659188b0662c31752cf65a56c592445ff1cdd8 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_TIPS_NOTIFICATIONS_MODEL_UTILS_H_
#define IOS_CHROME_BROWSER_TIPS_NOTIFICATIONS_MODEL_UTILS_H_
#import <UserNotifications/UserNotifications.h>
#import <optional>
#import <string_view>
#import <vector>
namespace base {
class TimeDelta;
}
enum class NotificationType;
class PrefService;
// Identifier for the tips notification.
extern NSString* const kTipsNotificationId;
// Key for tips notification type in UserInfo dictionary.
extern NSString* const kNotificationTypeKey;
// Pref that stores which notifications have been sent.
extern const char kTipsNotificationsSentPref[];
// Pref that stores which notification type was sent last.
extern const char kTipsNotificationsLastSent[];
// Pref that stores which notification type was triggered last.
extern const char kTipsNotificationsLastTriggered[];
// Pref that stores the last time that a notification was requested.
extern const char kTipsNotificationsLastRequestedTime[];
// Pref that stores the user's classification.
extern const char kTipsNotificationsUserType[];
// Pref that stores how many Tips notifications have been dismissed in a row.
extern const char kTipsNotificationsDismissCount[];
// Pref that stores how many Reactivation notifications were canceled because
// the user returned to the app before it triggered.
extern const char kReactivationNotificationsCanceledCount[];
// The type of Tips Notification, for an individual notification.
// Always keep this enum in sync with
// the corresponding IOSTipsNotificationType in enums.xml.
// LINT.IfChange
enum class TipsNotificationType {
kDefaultBrowser = 0,
kWhatsNew = 1,
kSignin = 2,
kError = 3,
kSetUpListContinuation = 4,
kDocking = 5,
kOmniboxPosition = 6,
kLens = 7,
kEnhancedSafeBrowsing = 8,
kLensOverlay = 9,
kCPE = 10,
kIncognitoLock = 11,
kMaxValue = kIncognitoLock,
};
// LINT.ThenChange(/tools/metrics/histograms/metadata/ios/enums.xml)
// An enum to store a classification of Tips Notification users.
// LINT.IfChange
enum class TipsNotificationUserType {
kUnknown = 0,
kLessEngaged = 1,
kActiveSeeker = 2,
kMaxValue = kActiveSeeker,
};
// LINT.ThenChange(/tools/metrics/histograms/metadata/ios/enums.xml)
// Returns true if the given `notification` is a Tips notification.
bool IsTipsNotification(UNNotificationRequest* request);
// Returns true if the given `notification` is a Proactive Tips
// (AKA Reactivation) notification.
bool IsProactiveTipsNotification(UNNotificationRequest* request);
// Returns a userInfo dictionary pre-filled with the notification `type`.
NSDictionary* UserInfoForTipsNotificationType(TipsNotificationType type,
bool for_reactivation,
std::string_view profile_name);
// Returns the notification type found in a notification's userInfo dictionary.
std::optional<TipsNotificationType> ParseTipsNotificationType(
UNNotificationRequest* request);
// Returns the notification content for a given Tips notification type.
UNNotificationContent* ContentForTipsNotificationType(
TipsNotificationType type,
bool for_reactivation,
std::string_view profile_name);
// Returns the time delta used to trigger Tips notifications.
base::TimeDelta TipsNotificationTriggerDelta(
bool for_reactivation,
TipsNotificationUserType user_type);
// Returns a bitfield indicating which types of notifications should be
// enabled. Bits are assigned based on the enum `TipsNotificationType`.
int TipsNotificationsEnabledBitfield();
// Returns an ordered array containing the types of Tips Notifications to send.
// `for_reactivation` specifies whether to get the order for Reactivation
// notifications.
std::vector<TipsNotificationType> TipsNotificationsTypesOrder(
bool for_reactivation);
// Returns the matching NotificationType for the TipsNotificationType `type`.
NotificationType NotificationTypeForTipsNotificationType(
TipsNotificationType type);
// Returns the type of Tips Notification that is forced to be sent, via
// experimental settings.
std::optional<TipsNotificationType> ForcedTipsNotificationType();
// Returns the trigger time (in seconds) that was set in Experimental Settings.
// Returns 0 if it was not set.
int TipsNotificationTriggerExperimentalSetting();
// Returns the type indicating how the user was classified.
TipsNotificationUserType GetTipsNotificationUserType(PrefService* local_state);
// Sets the user's classification in local state prefs.
void SetTipsNotificationUserType(PrefService* local_state,
TipsNotificationUserType user_type);
#endif // IOS_CHROME_BROWSER_TIPS_NOTIFICATIONS_MODEL_UTILS_H_