chromium/ios/chrome/browser/promos_manager/model/constants.h

// Copyright 2022 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_PROMOS_MANAGER_MODEL_CONSTANTS_H_
#define IOS_CHROME_BROWSER_PROMOS_MANAGER_MODEL_CONSTANTS_H_

#include <optional>
#include <string_view>

#import "base/values.h"

namespace promos_manager {

// Dictionary key for `promo` identifier in stored impression (base::Value).
extern const char kImpressionPromoKey[];

// Dictionary key for `day` in stored impression (base::Value).
extern const char kImpressionDayKey[];

// Dictionary key for `feature_engagement_migration_completed` stored impression
// (base::Value).
extern const char kImpressionFeatureEngagementMigrationCompletedKey[];

// When a new promo is added, if it's a standard promo, consider adding it to
// `PromosManagerFeatureEngagementTest`.
// LINT.IfChange
enum class Promo {
  Test = 0,            // Test promo used for testing purposes (e.g. unit tests)
  DefaultBrowser = 1,  // Fullscreen Default Browser Promo
  AppStoreRating = 2,  // App Store Rating Prompt
  CredentialProviderExtension = 3,  // Credential Provider Extension
  PostRestoreSignInFullscreen =
      4,  // Post Restore Sign-In (fullscreen, FRE-like promo)
  PostRestoreSignInAlert = 5,  // Post Restore Sign-In (native iOS alert)
  WhatsNew = 6,                // What's New Promo
  // Choice = 7,               // Obsolete. Offer a choice.
  PostRestoreDefaultBrowserAlert =
      8,  // Post Restore Default Browser (native iOS alert)
  DefaultBrowserRemindMeLater = 9,  // Remind me later for default browser.
  // OmniboxPosition = 10,          // Obsolete. Choose between top and bottom
  // omnibox.
  DockingPromo = 11,               // Docking Promo.
  DockingPromoRemindMeLater = 12,  // Docking Promo (Remind Me Later version).
  AllTabsDefaultBrowser = 13,      // "All Tabs" default browser promo.
  MadeForIOSDefaultBrowser = 14,   // "Made For iOS" default browser promo.
  StaySafeDefaultBrowser = 15,     // "Stay Safe" default browser promo.
  PostDefaultAbandonment = 16,     // Post-default browser abandonment alert.
  kMaxValue = PostDefaultAbandonment,
};
// LINT.ThenChange(/ios/chrome/browser/promos_manager/model/constants.cc)
// Also update IOSPromosManagerPromo in
// (/tools/metrics/histograms/metadata/ios/enums.xml).

// Enum for IOS.PromosManager.Promo.Type histogram.
// Entries should not be renumbered and numeric values should never be reused.
enum class IOSPromosManagerPromoType {
  kStandardPromoViewProvider = 0,
  kBanneredPromoViewProvider = 1,
  kStandardPromoAlertProvider = 2,
  kStandardPromoDisplayHandler = 3,
  kMaxValue = kStandardPromoDisplayHandler,
};

struct Impression {
  Promo promo;
  // A day (int) is represented as the number of days since the Unix epoch
  // (running from UTC midnight to UTC midnight).
  int day;
  bool feature_engagement_migration_completed;

  Impression(Promo promo, int day, bool feature_engagement_migration_completed)
      : promo(promo),
        day(day),
        feature_engagement_migration_completed(
            feature_engagement_migration_completed) {}
};

// Returns string representation of promos_manager::Promo `promo`.
std::string NameForPromo(Promo promo);

// Returns a string representation of the short name for the provided `promo`.
std::string_view ShortNameForPromo(Promo promo);

// Returns promos_manager::Promo for string `promo`.
std::optional<Promo> PromoForName(std::string_view promo);

std::optional<Impression> ImpressionFromDict(const base::Value::Dict& dict);

}  // namespace promos_manager

#endif  // IOS_CHROME_BROWSER_PROMOS_MANAGER_MODEL_CONSTANTS_H_