blob: 4740ae6c0c995c3fde8ed113411017840c9a07a2 [file] [log] [blame]
// 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.
#include "ios/chrome/browser/promos_manager/constants.h"
#include "base/notreached.h"
#include "base/strings/strcat.h"
#import "third_party/abseil-cpp/absl/types/optional.h"
namespace promos_manager {
const char kImpressionPromoKey[] = "promo";
const char kImpressionDayKey[] = "day";
const char kImpressionFeatureEngagementMigrationCompletedKey[] =
"feature_engagement_migration_completed";
const int kNumDaysImpressionHistoryStored = 365;
// WARNING - PLEASE READ: Sadly, we cannot switch over strings in C++, so be
// very careful when updating this method to ensure all enums are accounted for.
absl::optional<Promo> PromoForName(base::StringPiece promo) {
if (promo == "promos_manager::Promo::Test")
return promos_manager::Promo::Test;
if (promo == "promos_manager::Promo::DefaultBrowser")
return promos_manager::Promo::DefaultBrowser;
if (promo == "promos_manager::Promo::AppStoreRating")
return promos_manager::Promo::AppStoreRating;
if (promo == "promos_manager::Promo::CredentialProviderExtension")
return promos_manager::Promo::CredentialProviderExtension;
if (promo == "promos_manager::Promo::PostRestoreSignInFullscreen")
return promos_manager::Promo::PostRestoreSignInFullscreen;
if (promo == "promos_manager::Promo::PostRestoreSignInAlert")
return promos_manager::Promo::PostRestoreSignInAlert;
if (promo == "promos_manager::Promo::WhatsNew")
return promos_manager::Promo::WhatsNew;
if (promo == "promos_manager::Promo::Choice") {
return promos_manager::Promo::Choice;
}
return absl::nullopt;
}
std::string NameForPromo(Promo promo) {
return base::StrCat({"promos_manager::Promo::", ShortNameForPromo(promo)});
}
base::StringPiece ShortNameForPromo(Promo promo) {
switch (promo) {
case promos_manager::Promo::Test:
return "Test";
case promos_manager::Promo::DefaultBrowser:
return "DefaultBrowser";
case promos_manager::Promo::AppStoreRating:
return "AppStoreRating";
case promos_manager::Promo::CredentialProviderExtension:
return "CredentialProviderExtension";
case promos_manager::Promo::PostRestoreSignInFullscreen:
return "PostRestoreSignInFullscreen";
case promos_manager::Promo::PostRestoreSignInAlert:
return "PostRestoreSignInAlert";
case promos_manager::Promo::WhatsNew:
return "WhatsNew";
case promos_manager::Promo::Choice:
return "Choice";
}
}
absl::optional<promos_manager::Impression> ImpressionFromDict(
const base::Value::Dict& dict) {
const std::string* stored_promo =
dict.FindString(promos_manager::kImpressionPromoKey);
absl::optional<int> stored_day =
dict.FindInt(promos_manager::kImpressionDayKey);
absl::optional<bool> stored_migration_complete = dict.FindBool(
promos_manager::kImpressionFeatureEngagementMigrationCompletedKey);
// Skip malformed impression history. (This should almost never happen.)
if (!stored_promo || !stored_day.has_value()) {
return absl::nullopt;
}
absl::optional<promos_manager::Promo> promo =
promos_manager::PromoForName(*stored_promo);
// Skip malformed impression history. (This should almost never happen.)
if (!promo.has_value()) {
return absl::nullopt;
}
return promos_manager::Impression(promo.value(), stored_day.value(),
stored_migration_complete.value_or(false));
}
} // namespace promos_manager