cast_bluetooth_chooser.cc 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright 2018 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. #include "chromecast/browser/bluetooth/cast_bluetooth_chooser.h"
  5. #include "base/bind.h"
  6. #include "base/logging.h"
  7. #include "mojo/public/cpp/bindings/remote.h"
  8. namespace chromecast {
  9. CastBluetoothChooser::CastBluetoothChooser(
  10. content::BluetoothChooser::EventHandler event_handler,
  11. mojo::PendingRemote<mojom::BluetoothDeviceAccessProvider> pending_provider)
  12. : event_handler_(std::move(event_handler)) {
  13. DCHECK(event_handler_);
  14. mojo::Remote<mojom::BluetoothDeviceAccessProvider> provider(
  15. std::move(pending_provider));
  16. provider->RequestDeviceAccess(receiver_.BindNewPipeAndPassRemote());
  17. receiver_.set_disconnect_handler(base::BindOnce(
  18. &CastBluetoothChooser::OnClientConnectionError, base::Unretained(this)));
  19. }
  20. CastBluetoothChooser::~CastBluetoothChooser() = default;
  21. void CastBluetoothChooser::GrantAccess(const std::string& address) {
  22. DCHECK(event_handler_);
  23. if (all_devices_approved_) {
  24. LOG(WARNING) << __func__ << " called after access granted to all devices!";
  25. return;
  26. }
  27. if (available_devices_.find(address) != available_devices_.end()) {
  28. RunEventHandlerAndResetReceiver(content::BluetoothChooserEvent::SELECTED,
  29. address);
  30. return;
  31. }
  32. approved_devices_.insert(address);
  33. }
  34. void CastBluetoothChooser::GrantAccessToAllDevices() {
  35. DCHECK(event_handler_);
  36. all_devices_approved_ = true;
  37. if (!available_devices_.empty()) {
  38. RunEventHandlerAndResetReceiver(content::BluetoothChooserEvent::SELECTED,
  39. *available_devices_.begin());
  40. }
  41. }
  42. void CastBluetoothChooser::AddOrUpdateDevice(const std::string& device_id,
  43. bool should_update_name,
  44. const std::u16string& device_name,
  45. bool is_gatt_connected,
  46. bool is_paired,
  47. int signal_strength_level) {
  48. DCHECK(event_handler_);
  49. // Note: |device_id| is just a canonical Bluetooth address.
  50. if (all_devices_approved_ ||
  51. approved_devices_.find(device_id) != approved_devices_.end()) {
  52. RunEventHandlerAndResetReceiver(content::BluetoothChooserEvent::SELECTED,
  53. device_id);
  54. return;
  55. }
  56. available_devices_.insert(device_id);
  57. }
  58. void CastBluetoothChooser::RunEventHandlerAndResetReceiver(
  59. content::BluetoothChooserEvent event,
  60. std::string address) {
  61. DCHECK(event_handler_);
  62. std::move(event_handler_).Run(event, std::move(address));
  63. receiver_.reset();
  64. }
  65. void CastBluetoothChooser::OnClientConnectionError() {
  66. // If the DeviceAccessProvider has granted access to all devices, it may
  67. // tear down the client immediately. In this case, do not run the event
  68. // handler, as we may have not had the opportunity to select a device.
  69. if (!all_devices_approved_ && event_handler_) {
  70. RunEventHandlerAndResetReceiver(content::BluetoothChooserEvent::CANCELLED,
  71. "");
  72. }
  73. }
  74. } // namespace chromecast