// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_QUICK_PAIR_KEYED_SERVICE_QUICK_PAIR_METRICS_LOGGER_H_
#define ASH_QUICK_PAIR_KEYED_SERVICE_QUICK_PAIR_METRICS_LOGGER_H_
#include "ash/quick_pair/pairing/pairer_broker.h"
#include "ash/quick_pair/pairing/retroactive_pairing_detector.h"
#include "ash/quick_pair/scanning/scanner_broker.h"
#include "ash/quick_pair/ui/ui_broker.h"
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "base/time/time.h"
#include "device/bluetooth/bluetooth_adapter.h"
namespace ash {
namespace quick_pair {
class Device;
class FastPairFeatureUsageMetricsLogger;
// Observes pairing, scanning and UI events and logs corresponding metrics.
class QuickPairMetricsLogger : public PairerBroker::Observer,
public ScannerBroker::Observer,
public UIBroker::Observer,
public RetroactivePairingDetector::Observer,
public device::BluetoothAdapter::Observer {
public:
QuickPairMetricsLogger(
ScannerBroker* scanner_broker,
PairerBroker* pairer_broker,
UIBroker* ui_broker,
RetroactivePairingDetector* retroactive_pairing_detector);
QuickPairMetricsLogger(const QuickPairMetricsLogger&) = delete;
QuickPairMetricsLogger& operator=(const QuickPairMetricsLogger&) = delete;
~QuickPairMetricsLogger() override;
private:
// PairerBroker::Observer
void OnPairingStart(scoped_refptr<Device> device) override;
void OnHandshakeComplete(scoped_refptr<Device> device) override;
void OnDevicePaired(scoped_refptr<Device> device) override;
void OnAccountKeyWrite(scoped_refptr<Device> device,
std::optional<AccountKeyFailure> error) override;
void OnPairingComplete(scoped_refptr<Device> device) override;
void OnPairFailure(scoped_refptr<Device> device,
PairFailure failure) override;
// UIBroker::Observer
void OnDiscoveryAction(scoped_refptr<Device> device,
DiscoveryAction action) override;
void OnCompanionAppAction(scoped_refptr<Device> device,
CompanionAppAction action) override;
void OnPairingFailureAction(scoped_refptr<Device> device,
PairingFailedAction action) override;
void OnAssociateAccountAction(scoped_refptr<Device> device,
AssociateAccountAction action) override;
// ScannerBroker::Observer
void OnDeviceFound(scoped_refptr<Device> device) override;
void OnDeviceLost(scoped_refptr<Device> device) override;
// RetroactivePairingDetector::Observer
void OnRetroactivePairFound(scoped_refptr<Device> device) override;
// device::BluetoothAdapter::Observer
void DevicePairedChanged(device::BluetoothAdapter* adapter,
device::BluetoothDevice* device,
bool new_paired_status) override;
// Internal method called by BluetoothAdapterFactory to provide the adapter
// object.
void OnGetAdapter(scoped_refptr<device::BluetoothAdapter> adapter);
// Helper function called to get the Bluetooth Device that corresponds with
// the address saved in |device|. Returns nullptr if the adapter_ is not
// initialized or the device is not found.
const device::BluetoothDevice* GetBluetoothDevice(
scoped_refptr<Device> device) const;
// Map of devices to the time at which a pairing was initiated. This is used
// to calculate the time between the user electing to pair the device and
// the pairing entering a terminal state (success or failure).
base::flat_map<scoped_refptr<Device>, base::TimeTicks>
device_pairing_start_timestamps_;
// Set of devices of which on the Associate Account UI and Discovery UI shown,
// the Learn More button was pressed. We need this map to know which
// |FastPairRetroactiveEngagementFlowEvent| or
// |FastPairEngagementFlowEvent| event to log at the subsequent
// events that will follow, since the LearnMore event is not a terminal state.
base::flat_set<scoped_refptr<Device>> associate_account_learn_more_devices_;
base::flat_set<scoped_refptr<Device>> discovery_learn_more_devices_;
// The classic pairing addresses of Fast Pair devices that we have already
// paired to.
base::flat_set<std::string> fast_pair_addresses_;
scoped_refptr<device::BluetoothAdapter> adapter_;
std::unique_ptr<FastPairFeatureUsageMetricsLogger>
feature_usage_metrics_logger_;
base::ScopedObservation<device::BluetoothAdapter,
device::BluetoothAdapter::Observer>
adapter_observation_{this};
base::ScopedObservation<ScannerBroker, ScannerBroker::Observer>
scanner_broker_observation_{this};
base::ScopedObservation<PairerBroker, PairerBroker::Observer>
pairer_broker_observation_{this};
base::ScopedObservation<RetroactivePairingDetector,
RetroactivePairingDetector::Observer>
retroactive_pairing_detector_observation_{this};
base::ScopedObservation<UIBroker, UIBroker::Observer> ui_broker_observation_{
this};
base::WeakPtrFactory<QuickPairMetricsLogger> weak_ptr_factory_{this};
};
} // namespace quick_pair
} // namespace ash
#endif // ASH_QUICK_PAIR_KEYED_SERVICE_QUICK_PAIR_METRICS_LOGGER_H_