blob: c2bdb9dab17b8bcad9f70107f041e1527c912ad7 [file]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/default_browser/default_browser_controller.h"
#include <string>
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/string_util.h"
#include "chrome/browser/default_browser/default_browser_setter.h"
#include "default_browser_setter.h"
namespace default_browser {
namespace {
std::string SetterTypeToString(DefaultBrowserSetterType setter_type) {
switch (setter_type) {
case DefaultBrowserSetterType::kShellIntegration:
return "ShellIntegration";
case DefaultBrowserSetterType::kVisualGuide:
return "VisualGuide";
default:
NOTREACHED();
}
}
std::string UiEntrypointTypeToString(
DefaultBrowserEntrypointType ui_entrypoint) {
switch (ui_entrypoint) {
case DefaultBrowserEntrypointType::kSettingsPage:
return "SettingsPage";
case DefaultBrowserEntrypointType::kStartupInfobar:
return "InfoBar";
case DefaultBrowserEntrypointType::kChangeDetectedNotification:
return "ChangeDetectedNotification";
case DefaultBrowserEntrypointType::kBubbleDialog:
return "BubbleDialog";
case DefaultBrowserEntrypointType::kModalDialogWithSettingsIllustration:
return "ModalDialogWithSettingsIllustration";
case DefaultBrowserEntrypointType::kModalDialogWithoutSettingsIllustration:
return "ModalDialogWithoutSettingsIllustration";
default:
NOTREACHED();
}
}
std::string GetEntrypointHistogramName(
DefaultBrowserEntrypointType entrypoint_type,
DefaultBrowserSetterType setter_type,
const std::string& metric_type) {
return base::JoinString(
{"DefaultBrowser", UiEntrypointTypeToString(entrypoint_type),
SetterTypeToString(setter_type), metric_type},
".");
}
std::string GetSetterHistogramName(DefaultBrowserSetterType setter_type,
const std::string& metric_type) {
return base::JoinString(
{"DefaultBrowser", SetterTypeToString(setter_type), metric_type}, ".");
}
} // namespace
DefaultBrowserController::DefaultBrowserController(
std::unique_ptr<DefaultBrowserSetter> setter,
DefaultBrowserEntrypointType ui_entrypoint)
: setter_(std::move(setter)), ui_entrypoint_(ui_entrypoint) {}
DefaultBrowserController::~DefaultBrowserController() = default;
DefaultBrowserSetterType DefaultBrowserController::GetSetterType() const {
return setter_->GetType();
}
void DefaultBrowserController::OnShown() {
IncrementShownMetric();
}
void DefaultBrowserController::OnAccepted(
DefaultBrowserControllerCompletionCallback completion_callback) {
RecordInteractionMetric(DefaultBrowserInteractionType::kAccepted);
completion_callback_ = std::move(completion_callback);
setter_->Execute(
base::BindOnce(&DefaultBrowserController::OnSetterExecutionComplete,
weak_ptr_factory_.GetWeakPtr()));
}
void DefaultBrowserController::OnIgnored() {
RecordInteractionMetric(DefaultBrowserInteractionType::kIgnored);
}
void DefaultBrowserController::OnDismissed() {
RecordInteractionMetric(DefaultBrowserInteractionType::kDismissed);
}
void DefaultBrowserController::OnSetterExecutionComplete(
DefaultBrowserState default_browser_state) {
RecordResultMetric(default_browser_state == DefaultBrowserState::IS_DEFAULT);
std::move(completion_callback_).Run(default_browser_state);
}
void DefaultBrowserController::IncrementShownMetric() {
base::UmaHistogramCounts100(
GetEntrypointHistogramName(ui_entrypoint_, GetSetterType(), "Shown"), 1);
}
void DefaultBrowserController::RecordInteractionMetric(
DefaultBrowserInteractionType interaction) {
base::UmaHistogramEnumeration(
GetEntrypointHistogramName(ui_entrypoint_, GetSetterType(),
"Interaction"),
interaction);
}
void DefaultBrowserController::RecordResultMetric(bool success) {
base::UmaHistogramBoolean(GetSetterHistogramName(GetSetterType(), "Result"),
success);
}
} // namespace default_browser