blob: f61b5ce3a16f10c1747cea7e774e90ef55c7da6a [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.
#ifndef COMPONENTS_MEDIA_ROUTER_BROWSER_MEDIA_ROUTER_METRICS_H_
#define COMPONENTS_MEDIA_ROUTER_BROWSER_MEDIA_ROUTER_METRICS_H_
#include <optional>
#include "base/gtest_prod_util.h"
#include "base/time/time.h"
#include "components/media_router/common/media_route_provider_helper.h"
#include "components/media_router/common/media_source.h"
#include "components/media_router/common/mojom/media_router.mojom-forward.h"
#include "components/media_router/common/route_request_result.h"
#include "media/base/container_names.h"
class GURL;
namespace media_router {
enum class SinkIconType;
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused. When making changes, also update the
// enum list in tools/metrics/histograms/enums.xml to keep it in sync.
// NOTE: For metrics specific to the Media Router component extension, see
// mojo/media_router_mojo_metrics.h.
// This enum is a cartesian product of dialog activation locations and Cast
// modes. Per tools/metrics/histograms/README.md, a multidimensional histogram
// must be flattened into one dimension.
enum class DialogActivationLocationAndCastMode {
kPinnedIconAndPresentation,
kPinnedIconAndTabMirror,
kPinnedIconAndDesktopMirror,
kPinnedIconAndLocalFile, // Obsolete.
// One can start casting from an ephemeral icon by stopping a session, then
// starting another from the same dialog.
kEphemeralIconAndPresentation,
kEphemeralIconAndTabMirror,
kEphemeralIconAndDesktopMirror,
kEphemeralIconAndLocalFile, // Obsolete.
kContextMenuAndPresentation,
kContextMenuAndTabMirror,
kContextMenuAndDesktopMirror,
kContextMenuAndLocalFile, // Obsolete.
kPageAndPresentation,
kPageAndTabMirror,
kPageAndDesktopMirror,
kPageAndLocalFile, // Obsolete.
kAppMenuAndPresentation,
kAppMenuAndTabMirror,
kAppMenuAndDesktopMirror,
kAppMenuAndLocalFile, // Obsolete.
kSharingHubAndPresentation,
kSharingHubAndTabMirror,
kSharingHubAndDesktopMirror,
kPinnedIconAndRemotePlayback,
kEphemeralIconAndRemotePlayback,
kContextMenuAndRemotePlayback,
kPageAndRemotePlayback,
kAppMenuAndRemotePlayback,
kSharingHubAndRemotePlayback,
// NOTE: Do not reorder existing entries, and add entries only immediately
// above this line. Remember to also update
// tools/metrics/histograms/enums.xml.
kMaxValue = kSharingHubAndRemotePlayback,
};
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
// Where the user clicked to open the Media Router dialog.
enum class MediaRouterDialogActivationLocation {
TOOLBAR = 0,
OVERFLOW_MENU = 1,
CONTEXTUAL_MENU = 2,
PAGE = 3,
APP_MENU = 4,
SYSTEM_TRAY = 5,
SHARING_HUB = 6,
// NOTE: Add entries only immediately above this line. Remember to also update
// tools/metrics/histograms/enums.xml.
TOTAL_COUNT = 7
};
enum class PresentationUrlType {
kOther,
kCast, // cast:
kCastDial, // cast-dial:
kCastLegacy, // URLs that start with |kLegacyCastPresentationUrlPrefix|.
kDial, // dial:
kHttp, // http:
kHttps, // https:
kRemotePlayback, // remote-playback:
// Add new types only immediately above this line. Remember to also update
// tools/metrics/histograms/enums.xml.
kPresentationUrlTypeCount
};
enum class UiType {
kCastDialog,
kGlobalMediaControls,
};
enum class MediaRouterAndroidDialogType {
kRouteController = 0,
kRouteChooser = 1,
kMaxValue = kRouteChooser,
};
enum class MediaRouterAndroidDialogAction {
kTerminateRoute = 0,
kStartRoute = 1,
kMaxValue = kStartRoute,
};
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class MediaRouterUserPromptWhenLaunchingCast {
kPendingUserAuth = 0,
kUserNotAllowed = 1,
// Add new types only immediately above this line. Remember to also update
// tools/metrics/histograms/enums.xml.
kMaxValue = kUserNotAllowed,
};
class MediaRouterMetrics {
public:
MediaRouterMetrics();
~MediaRouterMetrics();
// UMA histogram names.
static const char kHistogramIconClickLocation[];
static const char kHistogramMediaRouterFileFormat[];
static const char kHistogramMediaRouterFileSize[];
static const char kHistogramMediaSinkType[];
static const char kHistogramPresentationUrlType[];
static const char kHistogramUiDeviceCount[];
static const char kHistogramUiDialogActivationLocationAndCastMode[];
static const char kHistogramUiDialogIconStateAtOpen[];
static const char kHistogramUiCastDialogLoadedWithData[];
static const char kHistogramUiGmcDialogLoadedWithData[];
static const char kHistogramUiFirstAction[];
static const char kHistogramUiIconStateAtInit[];
static const char kHistogramUiAndroidDialogType[];
static const char kHistogramUiAndroidDialogAction[];
static const char kHistogramUserPromptWhenLaunchingCast[];
static const char kHistogramPendingUserAuthLatency[];
// When recording the number of devices shown in UI we record after a delay
// because discovering devices can take some time after the UI is shown.
static const base::TimeDelta kDeviceCountMetricDelay;
// Records where the user clicked to open the Media Router dialog.
static void RecordMediaRouterDialogActivationLocation(
MediaRouterDialogActivationLocation activation_location);
// Records the duration it takes for the Cast or GMC dialog to load its
// initial data after a user clicks to open the dialog.
static void RecordCastDialogLoaded(const base::TimeDelta& delta);
static void RecordGmcDialogLoaded(const base::TimeDelta& delta);
// Records the format of a cast file.
static void RecordMediaRouterFileFormat(
media::container_names::MediaContainerName format);
// Records the size of a cast file.
static void RecordMediaRouterFileSize(int64_t size);
// Records the type of Presentation URL used by a web page.
static void RecordPresentationUrlType(const GURL& url);
// Records the type of the sink that media is being Cast to.
static void RecordMediaSinkType(SinkIconType sink_icon_type);
static void RecordMediaSinkTypeForGlobalMediaControls(
SinkIconType sink_icon_type);
static void RecordMediaSinkTypeForCastDialog(SinkIconType sink_icon_type);
// Records the number of devices shown in the Cast dialog. The device count
// may be 0.
static void RecordDeviceCount(int device_count);
// Records the index of the device the user has started casting to on the
// devices list. The index starts at 0.
static void RecordStartRouteDeviceIndex(int index);
// Records whether or not an attempt to start casting was successful.
static void RecordStartLocalSessionSuccessful(bool success);
// Records whether the toolbar icon is pinned by the user pref / admin policy.
// Recorded whenever the Cast dialog is opened.
static void RecordIconStateAtDialogOpen(bool is_pinned);
// Records the outcome of a create route request to a Media Route Provider.
// This and the following methods that record ResultCode use per-provider
// histograms.
static void RecordCreateRouteResultCode(
mojom::RouteRequestResultCode result_code,
std::optional<mojom::MediaRouteProviderId> provider_id = std::nullopt);
// Records the outcome of a join route request to a Media Route Provider.
static void RecordJoinRouteResultCode(
mojom::RouteRequestResultCode result_code,
std::optional<mojom::MediaRouteProviderId> provider_id = std::nullopt);
// Records the outcome of a call to terminateRoute() on a Media Route
// Provider.
static void RecordMediaRouteProviderTerminateRoute(
mojom::RouteRequestResultCode result_code,
std::optional<mojom::MediaRouteProviderId> provider_id = std::nullopt);
// Records the type of the MediaRouter dialog opened. Android only.
static void RecordMediaRouterAndroidDialogType(
MediaRouterAndroidDialogType type);
// Records the action taken on the MediaRouter dialog. Android only.
static void RecordMediaRouterAndroidDialogAction(
MediaRouterAndroidDialogAction action);
// Records the number of times the user was asked to allow casting and the
// number of times the user didn't allow it
static void RecordMediaRouterUserPromptWhenLaunchingCast(
MediaRouterUserPromptWhenLaunchingCast user_prompt);
// Records the duration it takes between sending cast request and receiving a
// response of UserPendingAuthorization
static void RecordMediaRouterPendingUserAuthLatency(
const base::TimeDelta& delta);
};
} // namespace media_router
#endif // COMPONENTS_MEDIA_ROUTER_BROWSER_MEDIA_ROUTER_METRICS_H_