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

#include <optional>

#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom.h"

namespace device {
class BluetoothUUID;
}

namespace content {

// General Metrics

// Enumeration for outcomes of querying the bluetooth cache.
enum class CacheQueryOutcome {
  kSuccess = 0,
  kBadRenderer = 1,
  kNoDevice = 2,
  kNoService = 3,
  kNoCharacteristic = 4,
  kNoDescriptor = 5,
};

// requestDevice() Metrics

// Records stats about the arguments used when calling requestDevice.
//  - The union of filtered and optional service UUIDs.
void RecordRequestDeviceOptions(
    const blink::mojom::WebBluetoothRequestDeviceOptionsPtr& options);

// GattServer.connect() Metrics

enum class UMAConnectGATTOutcome {
  kSuccess = 0,
  kNoDevice = 1,
  kUnknown = 2,
  kInProgress = 3,
  kFailed = 4,
  kAuthFailed = 5,
  kAuthCanceled = 6,
  kAuthRejected = 7,
  kAuthTimeout = 8,
  kUnsupportedDevice = 9,
  kNotReady = 10,
  kAlreadyConnected = 11,
  kAlreadyExists = 12,
  kNotConnected = 13,
  kDoesNotExist = 14,
  kInvalidArgs = 15,
  kNonAuthTimeout = 16,
  kNoMemory = 17,
  kJniEnvironment = 18,
  kJniThreadAttach = 19,
  kWakelock = 20,
  kUnexpectedState = 21,
  kSocketError = 22,
  // Note: Add new ConnectGATT outcomes immediately above this line. Make sure
  // to update the enum list in
  // tools/metrics/histograms/metadata/bluetooth/enums.xml accordingly.
  kMaxValue = kSocketError,
};

// There should be a call to this function before every
// Send(BluetoothMsg_ConnectGATTSuccess) and
// Send(BluetoothMsg_ConnectGATTError).
void RecordConnectGATTOutcome(UMAConnectGATTOutcome outcome);

// Records the outcome of the cache query for connectGATT. Should only be called
// if QueryCacheForDevice fails.
void RecordConnectGATTOutcome(CacheQueryOutcome outcome);

// getPrimaryService() and getPrimaryServices() Metrics

// Records the UUID of the service used when calling getPrimaryService.
void RecordGetPrimaryServicesServices(
    blink::mojom::WebBluetoothGATTQueryQuantity quantity,
    const std::optional<device::BluetoothUUID>& service);

// getCharacteristic() and getCharacteristics() Metrics

enum class UMAGetCharacteristicOutcome {
  kSuccess = 0,
  kNoDevice = 1,
  kNoService = 2,
  kNotFound = 3,
  kBlocklisted = 4,
  kNoCharacteristics = 5,
  // Note: Add new outcomes immediately above this line.
  // Make sure to update the enum list in
  // tools/metrics/histogram/histograms.xml accordingly.
  kMaxValue = kNoCharacteristics,
};

enum class UMAGetDescriptorOutcome {
  kSuccess = 0,
  kNoDevice = 1,
  kNoService = 2,
  kNoCharacteristic = 3,
  kNotFound = 4,
  kBlocklisted = 5,
  kNoDescriptors = 6,
  // Note: Add new outcomes immediately above this line.
  // Make sure to update the enum list in
  // tools/metrics/histogram/histograms.xml accordingly.
  kMaxValue = kNoDescriptors,
};

// There should be a call to this function whenever
// RemoteServiceGetCharacteristicsCallback is run.
// Pass blink::mojom::WebBluetoothGATTQueryQuantity::SINGLE for
// getCharacteristic.
// Pass blink::mojom::WebBluetoothGATTQueryQuantity::MULTIPLE for
// getCharacteristics.
void RecordGetCharacteristicsOutcome(
    blink::mojom::WebBluetoothGATTQueryQuantity quantity,
    UMAGetCharacteristicOutcome outcome);

// Records the outcome of the cache query for getCharacteristics. Should only be
// called if QueryCacheForService fails.
void RecordGetCharacteristicsOutcome(
    blink::mojom::WebBluetoothGATTQueryQuantity quantity,
    CacheQueryOutcome outcome);

// Records the UUID of the characteristic used when calling getCharacteristic.
void RecordGetCharacteristicsCharacteristic(
    blink::mojom::WebBluetoothGATTQueryQuantity quantity,
    const std::optional<device::BluetoothUUID>& characteristic);

// Records the outcome of the cache query for getDescriptors. Should only be
// called if QueryCacheForService fails.
void RecordGetDescriptorsOutcome(
    blink::mojom::WebBluetoothGATTQueryQuantity quantity,
    CacheQueryOutcome outcome);

// GATT Operations Metrics

// These are the possible outcomes when performing GATT operations i.e.
// characteristic.readValue/writeValue descriptor.readValue/writeValue.
enum class UMAGATTOperationOutcome {
  kSuccess = 0,
  kNoDevice = 1,
  kNoService = 2,
  kNoCharacteristic = 3,
  kNoDescriptor = 4,
  kUnknown = 5,
  kFailed = 6,
  kInProgress = 7,
  kInvalidLength = 8,
  kNotPermitted = 9,
  kNotAuthorized = 10,
  kNotPaired = 11,
  kNotSupported = 12,
  kBlocklisted = 13,
  // Note: Add new GATT Outcomes immediately above this line.
  // Make sure to update the enum list in
  // tools/metrics/histograms/histograms.xml accordingly.
  kMaxValue = kBlocklisted
};

// Values below do NOT map to UMA metric values.
enum class UMAGATTOperation {
  kCharacteristicRead,
  kCharacteristicWrite,
  kStartNotifications,
  kDescriptorReadObsolete,
  kDescriptorWriteObsolete,
};

// Records the outcome of a GATT operation.
// There should be a call to this function whenever the corresponding operation
// doesn't have a call to Record[Operation]Outcome.
void RecordGATTOperationOutcome(UMAGATTOperation operation,
                                UMAGATTOperationOutcome outcome);

// Characteristic.readValue() Metrics:
// There should be a call to this function for every Mojo
// bluetooth.mojom.Device.ReadValueForCharacteristic response.
void RecordCharacteristicReadValueOutcome(UMAGATTOperationOutcome error);

// Records the outcome of a cache query for readValue. Should only be called if
// QueryCacheForCharacteristic fails.
void RecordCharacteristicReadValueOutcome(CacheQueryOutcome outcome);

// Characteristic.writeValue() Metrics
// There should be a call to this function for every Mojo
// bluetooth.mojom.Device.WriteValueForCharacteristic response.
void RecordCharacteristicWriteValueOutcome(UMAGATTOperationOutcome error);

// Records the outcome of a cache query for writeValue. Should only be called if
// QueryCacheForCharacteristic fails.
void RecordCharacteristicWriteValueOutcome(CacheQueryOutcome outcome);

// Characteristic.startNotifications() Metrics
// There should be a call to this function for every call to the
// blink.mojom.WebBluetoothService.RemoteCharacteristicStartNotifications Mojo
// call.
void RecordStartNotificationsOutcome(UMAGATTOperationOutcome outcome);

// Records the outcome of a cache query for startNotifications. Should only be
// called if QueryCacheForCharacteristic fails.
void RecordStartNotificationsOutcome(CacheQueryOutcome outcome);

enum class UMARSSISignalStrengthLevel {
  kLessThanOrEqualToMinRssi = 0,
  kLevel0 = 1,
  kLevel1 = 2,
  kLevel2 = 3,
  kLevel3 = 4,
  kLevel4 = 5,
  kGreaterThanOrEqualToMaxRssi = 6,
  // Note: Add new RSSI signal strength level immediately above this line.
  kMaxValue = kGreaterThanOrEqualToMaxRssi,
};

// Records the raw RSSI, and processed result displayed to users, when
// content::BluetoothDeviceChooserController::CalculateSignalStrengthLevel() is
// called.
void RecordRSSISignalStrength(int rssi);
void RecordRSSISignalStrengthLevel(UMARSSISignalStrengthLevel level);

}  // namespace content

#endif  // CONTENT_BROWSER_BLUETOOTH_BLUETOOTH_METRICS_H_