#include "chrome/browser/segmentation_platform/segmentation_platform_config.h"
#include <memory>
#include <string_view>
#include <vector>
#include "base/check_is_test.h"
#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"
#include "build/build_config.h"
#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
#include "components/compose/buildflags.h"
#include "components/search/ntp_features.h"
#include "components/segmentation_platform/embedder/default_model/cross_device_user_segment.h"
#include "components/segmentation_platform/embedder/default_model/database_api_clients.h"
#include "components/segmentation_platform/embedder/default_model/device_switcher_model.h"
#include "components/segmentation_platform/embedder/default_model/feed_user_segment.h"
#include "components/segmentation_platform/embedder/default_model/frequent_feature_user_model.h"
#include "components/segmentation_platform/embedder/default_model/low_user_engagement_model.h"
#include "components/segmentation_platform/embedder/default_model/metrics_clustering.h"
#include "components/segmentation_platform/embedder/default_model/optimization_target_segmentation_dummy.h"
#include "components/segmentation_platform/embedder/default_model/password_manager_user_segment.h"
#include "components/segmentation_platform/embedder/default_model/resume_heavy_user_model.h"
#include "components/segmentation_platform/embedder/default_model/search_user_model.h"
#include "components/segmentation_platform/embedder/default_model/shopping_user_model.h"
#include "components/segmentation_platform/embedder/default_model/tab_resumption_ranker.h"
#include "components/segmentation_platform/embedder/default_model/url_visit_resumption_ranker.h"
#include "components/segmentation_platform/embedder/home_modules/ephemeral_home_module_backend.h"
#include "components/segmentation_platform/internal/config_parser.h"
#include "components/segmentation_platform/public/config.h"
#include "components/segmentation_platform/public/constants.h"
#include "components/segmentation_platform/public/features.h"
#include "components/segmentation_platform/public/proto/segmentation_platform.pb.h"
#include "components/webapps/browser/features.h"
#include "content/public/browser/browser_context.h"
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/commerce/shopping_service_factory.h"
#include "chrome/browser/flags/android/chrome_feature_list.h"
#include "components/commerce/core/commerce_feature_list.h"
#include "components/commerce/core/shopping_service.h"
#include "components/segmentation_platform/embedder/default_model/android_home_module_ranker.h"
#include "components/segmentation_platform/embedder/default_model/contextual_page_actions_model.h"
#include "components/segmentation_platform/embedder/default_model/device_tier_segment.h"
#include "components/segmentation_platform/embedder/default_model/intentional_user_model.h"
#include "components/segmentation_platform/embedder/default_model/most_visited_tiles_user.h"
#include "components/segmentation_platform/embedder/default_model/power_user_segment.h"
#include "components/segmentation_platform/embedder/default_model/tablet_productivity_user_model.h"
#endif
#if BUILDFLAG(ENABLE_COMPOSE)
#include "components/segmentation_platform/embedder/default_model/compose_promotion.h"
#endif
namespace segmentation_platform {
SegmentId;
namespace {
#if BUILDFLAG(IS_ANDROID)
constexpr int kAdaptiveToolbarDefaultSelectionTTLDays = 56;
#endif
#if BUILDFLAG(IS_ANDROID)
std::unique_ptr<Config> GetConfigForAdaptiveToolbar() {
if (!base::FeatureList::IsEnabled(
chrome::android::kAdaptiveButtonInTopToolbarCustomizationV2)) {
return nullptr;
}
auto config = std::make_unique<Config>();
config->segmentation_key = kAdaptiveToolbarSegmentationKey;
config->segmentation_uma_name = kAdaptiveToolbarUmaName;
config->auto_execute_and_cache = true;
if (base::FeatureList::IsEnabled(
segmentation_platform::features::
kSegmentationPlatformAdaptiveToolbarV2Feature)) {
config->AddSegmentId(
SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_ADAPTIVE_TOOLBAR);
} else {
int segment_selection_ttl_days = base::GetFieldTrialParamByFeatureAsInt(
chrome::android::kAdaptiveButtonInTopToolbarCustomizationV2,
kVariationsParamNameSegmentSelectionTTLDays,
kAdaptiveToolbarDefaultSelectionTTLDays);
config->segment_selection_ttl = base::Days(segment_selection_ttl_days);
config->AddSegmentId(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB);
config->AddSegmentId(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE);
config->AddSegmentId(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_VOICE);
}
return config;
}
std::unique_ptr<Config> GetConfigForContextualPageActions(
content::BrowserContext* context) {
auto config = std::make_unique<Config>();
config->segmentation_key = kContextualPageActionsKey;
config->segmentation_uma_name = kContextualPageActionsUmaName;
config->AddSegmentId(
SegmentId::OPTIMIZATION_TARGET_CONTEXTUAL_PAGE_ACTION_PRICE_TRACKING,
std::make_unique<ContextualPageActionsModel>());
config->auto_execute_and_cache = false;
return config;
}
#endif
std::unique_ptr<Config> GetConfigForWebAppInstallationPromo() { … }
std::unique_ptr<Config> GetConfigForDesktopNtpModule() { … }
}
std::vector<std::unique_ptr<Config>> GetSegmentationPlatformConfig(
content::BrowserContext* context,
home_modules::HomeModulesCardRegistry* home_modules_card_registry) { … }
void AppendConfigsFromExperiments(
std::vector<std::unique_ptr<Config>>& out_configs) { … }
FieldTrialRegisterImpl::FieldTrialRegisterImpl() = default;
FieldTrialRegisterImpl::~FieldTrialRegisterImpl() = default;
void FieldTrialRegisterImpl::RegisterFieldTrial(std::string_view trial_name,
std::string_view group_name) { … }
void FieldTrialRegisterImpl::RegisterSubsegmentFieldTrialIfNeeded(
std::string_view trial_name,
SegmentId segment_id,
int subsegment_rank) { … }
}