quick_pair_mediator.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef ASH_QUICK_PAIR_KEYED_SERVICE_QUICK_PAIR_MEDIATOR_H_
  5. #define ASH_QUICK_PAIR_KEYED_SERVICE_QUICK_PAIR_MEDIATOR_H_
  6. #include <memory>
  7. #include "ash/quick_pair/feature_status_tracker/quick_pair_feature_status_tracker.h"
  8. #include "ash/quick_pair/keyed_service/fast_pair_bluetooth_config_delegate.h"
  9. #include "ash/quick_pair/pairing/pairer_broker.h"
  10. #include "ash/quick_pair/pairing/retroactive_pairing_detector.h"
  11. #include "ash/quick_pair/scanning/scanner_broker.h"
  12. #include "ash/quick_pair/ui/ui_broker.h"
  13. #include "base/memory/scoped_refptr.h"
  14. #include "base/scoped_observation.h"
  15. #include "chromeos/services/bluetooth_config/adapter_state_controller.h"
  16. #include "chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom.h"
  17. #include "mojo/public/cpp/bindings/receiver.h"
  18. #include "mojo/public/cpp/bindings/remote.h"
  19. class PrefRegistrySimple;
  20. namespace chromeos {
  21. namespace bluetooth_config {
  22. class FastPairDelegate;
  23. } // namespace bluetooth_config
  24. } // namespace chromeos
  25. namespace ash {
  26. namespace quick_pair {
  27. class FastPairRepository;
  28. struct Device;
  29. class QuickPairProcessManager;
  30. class QuickPairMetricsLogger;
  31. class MessageStreamLookup;
  32. class BatteryUpdateMessageHandler;
  33. // Implements the Mediator design pattern for the components in the Quick Pair
  34. // system, e.g. the UI Broker, Scanning Broker and Pairing Broker.
  35. class Mediator final
  36. : public FeatureStatusTracker::Observer,
  37. public ScannerBroker::Observer,
  38. public PairerBroker::Observer,
  39. public UIBroker::Observer,
  40. public RetroactivePairingDetector::Observer,
  41. public FastPairBluetoothConfigDelegate::Observer,
  42. public chromeos::bluetooth_config::AdapterStateController::Observer,
  43. public chromeos::bluetooth_config::mojom::DiscoverySessionStatusObserver {
  44. public:
  45. class Factory {
  46. public:
  47. static std::unique_ptr<Mediator> Create();
  48. static void SetFactoryForTesting(Factory* factory);
  49. virtual ~Factory() = default;
  50. private:
  51. virtual std::unique_ptr<Mediator> BuildInstance() = 0;
  52. };
  53. Mediator(
  54. std::unique_ptr<FeatureStatusTracker> feature_status_tracker,
  55. std::unique_ptr<ScannerBroker> scanner_broker,
  56. std::unique_ptr<RetroactivePairingDetector> retroactive_pairing_detector,
  57. std::unique_ptr<MessageStreamLookup> message_stream_lookup,
  58. std::unique_ptr<PairerBroker> pairer_broker,
  59. std::unique_ptr<UIBroker> ui_broker,
  60. std::unique_ptr<FastPairRepository> fast_pair_repository,
  61. std::unique_ptr<QuickPairProcessManager> process_manager);
  62. Mediator(const Mediator&) = delete;
  63. Mediator& operator=(const Mediator&) = delete;
  64. ~Mediator() override;
  65. static void RegisterProfilePrefs(PrefRegistrySimple* registry);
  66. static void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
  67. chromeos::bluetooth_config::FastPairDelegate* GetFastPairDelegate();
  68. // FeatureStatusTracker::Observer
  69. void OnFastPairEnabledChanged(bool is_enabled) override;
  70. // ScannerBroker::Observer
  71. void OnDeviceFound(scoped_refptr<Device> device) override;
  72. void OnDeviceLost(scoped_refptr<Device> device) override;
  73. // PairerBroker::Observer
  74. void OnDevicePaired(scoped_refptr<Device> device) override;
  75. void OnPairFailure(scoped_refptr<Device> device,
  76. PairFailure failure) override;
  77. void OnAccountKeyWrite(scoped_refptr<Device> device,
  78. absl::optional<AccountKeyFailure> error) override;
  79. // UIBroker::Observer
  80. void OnDiscoveryAction(scoped_refptr<Device> device,
  81. DiscoveryAction action) override;
  82. void OnPairingFailureAction(scoped_refptr<Device> device,
  83. PairingFailedAction action) override;
  84. void OnCompanionAppAction(scoped_refptr<Device> device,
  85. CompanionAppAction action) override;
  86. void OnAssociateAccountAction(scoped_refptr<Device> device,
  87. AssociateAccountAction action) override;
  88. // RetroactivePairingDetector::Observer
  89. void OnRetroactivePairFound(scoped_refptr<Device> device) override;
  90. // FastPairBluetoothConfigDelegate::Observer
  91. void OnAdapterStateControllerChanged(
  92. chromeos::bluetooth_config::AdapterStateController*
  93. adapter_state_controller) override;
  94. // chromeos::bluetooth_config::AdapterStateController::Observer
  95. void OnAdapterStateChanged() override;
  96. // chromeos::bluetooth_config::mojom::DiscoverySessionStatusObserver
  97. void OnHasAtLeastOneDiscoverySessionChanged(
  98. bool has_at_least_one_discovery_session) override;
  99. private:
  100. void SetFastPairState(bool is_enabled);
  101. void BindToCrosBluetoothConfig();
  102. void CancelPairing();
  103. bool has_at_least_one_discovery_session_ = false;
  104. std::unique_ptr<FeatureStatusTracker> feature_status_tracker_;
  105. std::unique_ptr<ScannerBroker> scanner_broker_;
  106. std::unique_ptr<MessageStreamLookup> message_stream_lookup_;
  107. std::unique_ptr<PairerBroker> pairer_broker_;
  108. std::unique_ptr<RetroactivePairingDetector> retroactive_pairing_detector_;
  109. std::unique_ptr<UIBroker> ui_broker_;
  110. std::unique_ptr<FastPairRepository> fast_pair_repository_;
  111. std::unique_ptr<QuickPairProcessManager> process_manager_;
  112. std::unique_ptr<QuickPairMetricsLogger> metrics_logger_;
  113. std::unique_ptr<FastPairBluetoothConfigDelegate>
  114. fast_pair_bluetooth_config_delegate_;
  115. std::unique_ptr<BatteryUpdateMessageHandler> battery_update_message_handler_;
  116. base::ScopedObservation<FeatureStatusTracker, FeatureStatusTracker::Observer>
  117. feature_status_tracker_observation_{this};
  118. base::ScopedObservation<ScannerBroker, ScannerBroker::Observer>
  119. scanner_broker_observation_{this};
  120. base::ScopedObservation<PairerBroker, PairerBroker::Observer>
  121. pairer_broker_observation_{this};
  122. base::ScopedObservation<RetroactivePairingDetector,
  123. RetroactivePairingDetector::Observer>
  124. retroactive_pairing_detector_observation_{this};
  125. base::ScopedObservation<UIBroker, UIBroker::Observer> ui_broker_observation_{
  126. this};
  127. base::ScopedObservation<FastPairBluetoothConfigDelegate,
  128. FastPairBluetoothConfigDelegate::Observer>
  129. config_delegate_observation_{this};
  130. base::ScopedObservation<
  131. chromeos::bluetooth_config::AdapterStateController,
  132. chromeos::bluetooth_config::AdapterStateController::Observer>
  133. adapter_state_controller_observation_{this};
  134. mojo::Remote<chromeos::bluetooth_config::mojom::CrosBluetoothConfig>
  135. remote_cros_bluetooth_config_;
  136. mojo::Receiver<
  137. chromeos::bluetooth_config::mojom::DiscoverySessionStatusObserver>
  138. cros_discovery_session_observer_receiver_{this};
  139. base::WeakPtrFactory<Mediator> weak_ptr_factory_{this};
  140. };
  141. } // namespace quick_pair
  142. } // namespace ash
  143. #endif // ASH_QUICK_PAIR_KEYED_SERVICE_QUICK_PAIR_MEDIATOR_H_