blob: 6d42472893495af93fb14bf2cedacdd05ea53b22 [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/media_router/browser/media_router_metrics.h"
#include <algorithm>
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/strcat.h"
#include "base/strings/string_util.h"
#include "base/time/default_clock.h"
#include "components/media_router/common/media_route_provider_helper.h"
#include "components/media_router/common/media_sink.h"
#include "components/media_router/common/media_source.h"
#include "components/media_router/common/mojom/media_router.mojom.h"
#include "url/gurl.h"
#include "url/url_constants.h"
namespace media_router {
namespace {
constexpr char kHistogramProviderCreateRouteResult[] =
"MediaRouter.Provider.CreateRoute.Result";
constexpr char kHistogramProviderJoinRouteResult[] =
"MediaRouter.Provider.JoinRoute.Result";
constexpr char kHistogramProviderTerminateRouteResult[] =
"MediaRouter.Provider.TerminateRoute.Result";
std::string GetHistogramNameForProvider(
const std::string& base_name,
std::optional<mojom::MediaRouteProviderId> provider_id) {
if (!provider_id) {
return base_name;
}
switch (*provider_id) {
case mojom::MediaRouteProviderId::CAST:
return base_name + ".Cast";
case mojom::MediaRouteProviderId::DIAL:
return base_name + ".DIAL";
case mojom::MediaRouteProviderId::WIRED_DISPLAY:
return base_name + ".WiredDisplay";
case mojom::MediaRouteProviderId::ANDROID_CAF:
return base_name + ".AndroidCaf";
// The rest use the base histogram name.
case mojom::MediaRouteProviderId::TEST:
return base_name;
}
}
PresentationUrlType GetPresentationUrlType(const GURL& url) {
if (url.SchemeIs(kDialPresentationUrlScheme)) {
return PresentationUrlType::kDial;
}
if (url.SchemeIs(kCastPresentationUrlScheme)) {
return PresentationUrlType::kCast;
}
if (url.SchemeIs(kCastDialPresentationUrlScheme)) {
return PresentationUrlType::kCastDial;
}
if (url.SchemeIs(kRemotePlaybackPresentationUrlScheme)) {
return PresentationUrlType::kRemotePlayback;
}
if (base::StartsWith(url.spec(), kLegacyCastPresentationUrlPrefix,
base::CompareCase::INSENSITIVE_ASCII)) {
return PresentationUrlType::kCastLegacy;
}
if (url.SchemeIs(url::kHttpsScheme)) {
return PresentationUrlType::kHttps;
}
if (url.SchemeIs(url::kHttpScheme)) {
return PresentationUrlType::kHttp;
}
return PresentationUrlType::kOther;
}
} // namespace
MediaRouterMetrics::MediaRouterMetrics() = default;
MediaRouterMetrics::~MediaRouterMetrics() = default;
// static
const char MediaRouterMetrics::kHistogramIconClickLocation[] =
"MediaRouter.Icon.Click.Location";
const char MediaRouterMetrics::kHistogramMediaRouterFileFormat[] =
"MediaRouter.Source.LocalFileFormat";
const char MediaRouterMetrics::kHistogramMediaRouterFileSize[] =
"MediaRouter.Source.LocalFileSize";
const char MediaRouterMetrics::kHistogramMediaSinkType[] =
"MediaRouter.Sink.SelectedType";
const char MediaRouterMetrics::kHistogramPresentationUrlType[] =
"MediaRouter.PresentationRequest.AvailabilityUrlType";
const char MediaRouterMetrics::kHistogramUiDeviceCount[] =
"MediaRouter.Ui.Device.Count";
const char MediaRouterMetrics::kHistogramUiDialogIconStateAtOpen[] =
"MediaRouter.Ui.Dialog.IconStateAtOpen";
const char MediaRouterMetrics::kHistogramUiCastDialogLoadedWithData[] =
"MediaRouter.Ui.CastDialog.LoadedWithData";
const char MediaRouterMetrics::kHistogramUiGmcDialogLoadedWithData[] =
"MediaRouter.Ui.GMCDialog.LoadedWithData";
const char MediaRouterMetrics::kHistogramUiAndroidDialogType[] =
"MediaRouter.Ui.Android.DialogType";
const char MediaRouterMetrics::kHistogramUiAndroidDialogAction[] =
"MediaRouter.Ui.Android.DialogAction";
const char MediaRouterMetrics::kHistogramUiPermissionRejectedViewAction[] =
"MediaRouter.Ui.PermissionRejectedViewAction";
// static
const base::TimeDelta MediaRouterMetrics::kDeviceCountMetricDelay =
base::Seconds(3);
// static
void MediaRouterMetrics::RecordMediaRouterDialogActivationLocation(
MediaRouterDialogActivationLocation activation_location) {
base::UmaHistogramEnumeration(
kHistogramIconClickLocation, activation_location,
MediaRouterDialogActivationLocation::TOTAL_COUNT);
}
// static
void MediaRouterMetrics::RecordCastDialogLoaded(const base::TimeDelta& delta) {
base::UmaHistogramTimes(kHistogramUiCastDialogLoadedWithData, delta);
}
// static
void MediaRouterMetrics::RecordGmcDialogLoaded(const base::TimeDelta& delta) {
base::UmaHistogramTimes(kHistogramUiGmcDialogLoadedWithData, delta);
}
// static
void MediaRouterMetrics::RecordMediaRouterFileFormat(
const media::container_names::MediaContainerName format) {
base::UmaHistogramEnumeration(kHistogramMediaRouterFileFormat, format);
}
// static
void MediaRouterMetrics::RecordMediaRouterFileSize(int64_t size) {
base::UmaHistogramMemoryLargeMB(kHistogramMediaRouterFileSize, size);
}
// static
void MediaRouterMetrics::RecordPresentationUrlType(const GURL& url) {
PresentationUrlType type = GetPresentationUrlType(url);
base::UmaHistogramEnumeration(kHistogramPresentationUrlType, type,
PresentationUrlType::kPresentationUrlTypeCount);
}
// static
void MediaRouterMetrics::RecordMediaSinkType(SinkIconType sink_icon_type) {
base::UmaHistogramEnumeration(kHistogramMediaSinkType, sink_icon_type,
SinkIconType::TOTAL_COUNT);
}
// static
void MediaRouterMetrics::RecordMediaSinkTypeForGlobalMediaControls(
SinkIconType sink_icon_type) {
base::UmaHistogramEnumeration(
base::StrCat({kHistogramMediaSinkType, ".GlobalMediaControls"}),
sink_icon_type, SinkIconType::TOTAL_COUNT);
}
// static
void MediaRouterMetrics::RecordMediaSinkTypeForCastDialog(
SinkIconType sink_icon_type) {
base::UmaHistogramEnumeration(
base::StrCat({kHistogramMediaSinkType, ".CastHarmony"}), sink_icon_type,
SinkIconType::TOTAL_COUNT);
}
// static
void MediaRouterMetrics::RecordDeviceCount(int device_count) {
base::UmaHistogramCounts100(kHistogramUiDeviceCount, device_count);
}
// static
void MediaRouterMetrics::RecordIconStateAtDialogOpen(bool is_pinned) {
base::UmaHistogramBoolean(kHistogramUiDialogIconStateAtOpen, is_pinned);
}
// static
void MediaRouterMetrics::RecordCreateRouteResultCode(
mojom::RouteRequestResultCode result_code,
std::optional<mojom::MediaRouteProviderId> provider_id) {
base::UmaHistogramEnumeration(
GetHistogramNameForProvider(kHistogramProviderCreateRouteResult,
provider_id),
result_code);
}
// static
void MediaRouterMetrics::RecordJoinRouteResultCode(
mojom::RouteRequestResultCode result_code,
std::optional<mojom::MediaRouteProviderId> provider_id) {
base::UmaHistogramEnumeration(
GetHistogramNameForProvider(kHistogramProviderJoinRouteResult,
provider_id),
result_code);
}
// static
void MediaRouterMetrics::RecordMediaRouteProviderTerminateRoute(
mojom::RouteRequestResultCode result_code,
std::optional<mojom::MediaRouteProviderId> provider_id) {
base::UmaHistogramEnumeration(
GetHistogramNameForProvider(kHistogramProviderTerminateRouteResult,
provider_id),
result_code);
}
// static
void MediaRouterMetrics::RecordMediaRouterAndroidDialogType(
MediaRouterAndroidDialogType type) {
base::UmaHistogramEnumeration(kHistogramUiAndroidDialogType, type);
}
// static
void MediaRouterMetrics::RecordMediaRouterAndroidDialogAction(
MediaRouterAndroidDialogAction action) {
base::UmaHistogramEnumeration(kHistogramUiAndroidDialogAction, action);
}
void MediaRouterMetrics::RecordMediaRouterUiPermissionRejectedViewEvents(
MediaRouterUiPermissionRejectedViewEvents event) {
base::UmaHistogramEnumeration(kHistogramUiPermissionRejectedViewAction,
event);
}
} // namespace media_router