910e62b5创建于 1月15日历史提交
// 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.

#ifndef COMPONENTS_ACCESS_CODE_CAST_COMMON_ACCESS_CODE_CAST_METRICS_H_
#define COMPONENTS_ACCESS_CODE_CAST_COMMON_ACCESS_CODE_CAST_METRICS_H_

#include "base/component_export.h"
#include "base/time/time.h"

// NOTE: Do not renumber enums as that would confuse interpretation of
// previously logged data. When making changes, also update the enum list
// in tools/metrics/histograms/enums.xml to keep it in sync.

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class AccessCodeCastAddSinkResult {
  kUnknownError = 0,
  kOk = 1,
  kAuthError = 2,
  kHttpResponseCodeError = 3,
  kResponseMalformed = 4,
  kEmptyResponse = 5,
  kInvalidAccessCode = 6,
  kAccessCodeNotFound = 7,
  kTooManyRequests = 8,
  kServiceNotPresent = 9,
  kServerError = 10,
  kSinkCreationError = 11,
  kChannelOpenError = 12,
  kProfileSyncError = 13,
  kInternalMediaRouterError = 14,

  // NOTE: Do not reorder existing entries, and add entries only immediately
  // above this line.
  kMaxValue = kInternalMediaRouterError
};

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class AccessCodeCastCastMode {
  kPresentation = 0,
  kTabMirror = 1,
  kDesktopMirror = 2,
  kRemotePlayback = 3,

  // NOTE: Do not reorder existing entries, and add entries only immediately
  // above this line.
  kMaxValue = kRemotePlayback,
};

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class AccessCodeCastDialogCloseReason {
  kFocus = 0,
  kCancel = 1,
  kCastSuccess = 2,

  // NOTE: Do not reorder existing entries, and add entries only immediately
  // above this line.
  kMaxValue = kCastSuccess
};

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class AccessCodeCastDialogOpenLocation {
  kBrowserCastMenu = 0,
  kSystemTrayCastFeaturePod = 1,
  kSystemTrayCastMenu = 2,

  // NOTE: Do not reorder existing entries, and add entries only immediately
  // above this line.
  kMaxValue = kSystemTrayCastMenu
};

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class AccessCodeCastDiscoveryTypeAndSource {
  kUnknown = 0,
  kSavedDevicePresentation = 1,
  kSavedDeviceTabMirror = 2,
  kSavedDeviceDesktopMirror = 3,
  kSavedDeviceRemotePlayback = 4,
  kNewDevicePresentation = 5,
  kNewDeviceTabMirror = 6,
  kNewDeviceDesktopMirror = 7,
  kNewDeviceRemotePlayback = 8,

  // NOTE: Do not reorder existing entries, and add entries only immediately
  // above this line.
  kMaxValue = kNewDeviceRemotePlayback
};

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class AccessCodeCastUiTabSwitcherUsage {
  kTabSwitcherUiShownAndNotUsed = 0,
  kTabSwitcherUiShownAndUsedToSwitchTabs = 1,

  // NOTE: Do not reorder existing entries, and add entries only immediately
  // above this line.
  kMaxValue = kTabSwitcherUiShownAndUsedToSwitchTabs,
};

class COMPONENT_EXPORT(COMPONENTS_ACCESS_CODE_CAST_COMMON)
    AccessCodeCastMetrics {
 public:
  AccessCodeCastMetrics();
  ~AccessCodeCastMetrics();

  // UMA histogram names.
  static const char kHistogramAccessCodeNotFoundCount[];
  static const char kHistogramAddSinkResultNew[];
  static const char kHistogramAddSinkResultRemembered[];
  static const char kHistogramCastModeOnSuccess[];
  static const char kHistogramDeviceDurationOnRoute[];
  static const char kHistogramDialogCloseReason[];
  static const char kHistogramDialogLoadTime[];
  static const char kHistogramDialogOpenLocation[];
  static const char kHistogramFreezeCount[];
  static const char kHistogramFreezeDuration[];
  static const char kHistogramNewDeviceRouteCreationDuration[];
  static const char kHistogramRememberedDevicesCount[];
  static const char kHistogramRouteDiscoveryTypeAndSource[];
  static const char kHistogramRouteDuration[];
  static const char kHistogramSavedDeviceRouteCreationDuration[];
  static const char kHistogramUiTabSwitcherUsageType[];
  static const char kHistogramUiTabSwitchingCount[];

  // Records metrics relating to starting a cast session (route). Mode is
  // media_router::MediaCastMode.
  static void OnCastSessionResult(int route_request_result_code,
                                  AccessCodeCastCastMode mode);

  // Records the count of ACCESS_CODE_NOT_FOUND errors per instance of dialog.
  static void RecordAccessCodeNotFoundCount(int count);

  // Records the value of the device duration pref on successful creation of
  // an access code route. Also records the discovery type and cast source.
  static void RecordAccessCodeRouteStarted(base::TimeDelta duration,
                                           bool is_saved,
                                           AccessCodeCastCastMode mode);

  // Records the result of adding an access code sink.
  static void RecordAddSinkResult(bool is_remembered,
                                  AccessCodeCastAddSinkResult result);

  // Records the time it takes for the AccessCodeCast dialog to load.
  static void RecordDialogLoadTime(base::TimeDelta load_time);

  // Records the reason that the AccessCodeCast dialog closed.
  static void RecordDialogCloseReason(AccessCodeCastDialogCloseReason reason);

  // Records where the user clicked to open the AccessCodeCast dialog.
  static void RecordDialogOpenLocation(
      AccessCodeCastDialogOpenLocation location);

  // Records the number of times a mirroring session is paused during its
  // duration.
  static void RecordMirroringPauseCount(int count);

  // Records the duration of time that a mirroring session is paused.
  static void RecordMirroringPauseDuration(base::TimeDelta duration);

  // Records the count of cast devices which are currently being remembered
  // being the AccessCodeCastSinkService.
  static void RecordRememberedDevicesCount(int count);

  // Records the length of time that a route to an access code device lasts.
  // The minimum length of time reported is one second, so any lower durations
  // will be rounded up. Also, the largest time reported is 8 hours, and any
  // longer times will be bucketed down.
  static void RecordRouteDuration(base::TimeDelta duration);

  // Records the count of tabs a user switches to during a tab mirroring
  // session.
  static void RecordTabSwitchesCountInTabSession(int count);

  // Records the usage type of tab switcher UI, i.e. shown only and not used or
  // shown and actually used to switch tabs.
  static void RecordTabSwitcherUsageCase(
      AccessCodeCastUiTabSwitcherUsage usage);

  // Records the time that it takes to connect to a saved device. It is a
  // combination of the time to request a mirroring route + waiting for a
  // success. It is only recorded if the request was successful.
  static void RecordSavedDeviceConnectDuration(base::TimeDelta duration);

  // Records the time it takes to connect to a new device. It is the combination
  // of connecting to our server, validating the access code, constructing a
  // cast device, opening a channel to that device, and then waiting for
  // success.
  static void RecordNewDeviceConnectDuration(base::TimeDelta duration);
};

#endif  // COMPONENTS_ACCESS_CODE_CAST_COMMON_ACCESS_CODE_CAST_METRICS_H_