OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/proximity_auth/ble/bluetooth_low_energy_connection_finder.h
" | 5 #include "components/proximity_auth/ble/bluetooth_low_energy_connection_finder.h
" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 if (adapter_->IsPowered() && discovery_session_ && | 107 if (adapter_->IsPowered() && discovery_session_ && |
108 discovery_session_->IsActive()) | 108 discovery_session_->IsActive()) |
109 HandleDeviceUpdated(device); | 109 HandleDeviceUpdated(device); |
110 } | 110 } |
111 | 111 |
112 void BluetoothLowEnergyConnectionFinder::DeviceChanged( | 112 void BluetoothLowEnergyConnectionFinder::DeviceChanged( |
113 BluetoothAdapter* adapter, | 113 BluetoothAdapter* adapter, |
114 BluetoothDevice* device) { | 114 BluetoothDevice* device) { |
115 DCHECK_EQ(adapter_.get(), adapter); | 115 DCHECK_EQ(adapter_.get(), adapter); |
116 DCHECK(device); | 116 DCHECK(device); |
117 PA_LOG(INFO) << "Device changed: " << device->GetAddress(); | |
118 | 117 |
119 // Note: Only consider |device| when it was actually added/updated during a | 118 // Note: Only consider |device| when it was actually added/updated during a |
120 // scanning, otherwise the device is stale and the GATT connection will fail. | 119 // scanning, otherwise the device is stale and the GATT connection will fail. |
121 // For instance, when |adapter_| change status from unpowered to powered, | 120 // For instance, when |adapter_| change status from unpowered to powered, |
122 // |DeviceAdded| is called for each paired |device|. | 121 // |DeviceAdded| is called for each paired |device|. |
123 if (adapter_->IsPowered() && discovery_session_ && | 122 if (adapter_->IsPowered() && discovery_session_ && |
124 discovery_session_->IsActive()) | 123 discovery_session_->IsActive()) { |
| 124 if (device_whitelist_->HasDeviceWithAddress(device->GetAddress())) |
| 125 PA_LOG(INFO) << "Whitelisted device changed: " << device->GetAddress(); |
125 HandleDeviceUpdated(device); | 126 HandleDeviceUpdated(device); |
| 127 } |
126 } | 128 } |
127 | 129 |
128 void BluetoothLowEnergyConnectionFinder::HandleDeviceUpdated( | 130 void BluetoothLowEnergyConnectionFinder::HandleDeviceUpdated( |
129 BluetoothDevice* device) { | 131 BluetoothDevice* device) { |
130 // Ensuring only one call to |CreateConnection()| is made. A new |connection_| | 132 // Ensuring only one call to |CreateConnection()| is made. A new |connection_| |
131 // can be created only when the previous one disconnects, triggering a call to | 133 // can be created only when the previous one disconnects, triggering a call to |
132 // |OnConnectionStatusChanged|. | 134 // |OnConnectionStatusChanged|. |
133 if (connection_ || !device->IsPaired()) | 135 if (connection_ || !device->IsPaired()) |
134 return; | 136 return; |
135 | 137 |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 Connection::Status old_status, | 261 Connection::Status old_status, |
260 Connection::Status new_status) { | 262 Connection::Status new_status) { |
261 DCHECK_EQ(connection, connection_.get()); | 263 DCHECK_EQ(connection, connection_.get()); |
262 PA_LOG(INFO) << "OnConnectionStatusChanged: " << old_status << " -> " | 264 PA_LOG(INFO) << "OnConnectionStatusChanged: " << old_status << " -> " |
263 << new_status; | 265 << new_status; |
264 | 266 |
265 if (!connection_callback_.is_null() && connection_->IsConnected()) { | 267 if (!connection_callback_.is_null() && connection_->IsConnected()) { |
266 adapter_->RemoveObserver(this); | 268 adapter_->RemoveObserver(this); |
267 connection_->RemoveObserver(this); | 269 connection_->RemoveObserver(this); |
268 | 270 |
269 // Note: any observer of |connection_| added in |connection_callback_| will | 271 // If we invoke the callback now, the callback function may install its own |
270 // also receive this |OnConnectionStatusChanged| notification (IN_PROGRESS | 272 // observer to |connection_|. Because we are in the ConnectionObserver |
271 // -> CONNECTED). | 273 // callstack, this new observer will receive this connection event. |
272 connection_callback_.Run(connection_.Pass()); | 274 // Therefore, we need to invoke the callback asynchronously. |
273 connection_callback_.Reset(); | 275 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 276 FROM_HERE, |
| 277 base::Bind(&BluetoothLowEnergyConnectionFinder::InvokeCallbackAsync, |
| 278 weak_ptr_factory_.GetWeakPtr())); |
274 } else if (old_status == Connection::IN_PROGRESS) { | 279 } else if (old_status == Connection::IN_PROGRESS) { |
275 PA_LOG(WARNING) << "Connection failed. Retrying."; | 280 PA_LOG(WARNING) << "Connection failed. Retrying."; |
276 RestartDiscoverySessionWhenReady(); | 281 RestartDiscoverySessionWhenReady(); |
277 } | 282 } |
278 } | 283 } |
279 | 284 |
280 void BluetoothLowEnergyConnectionFinder::RestartDiscoverySessionWhenReady() { | 285 void BluetoothLowEnergyConnectionFinder::RestartDiscoverySessionWhenReady() { |
281 PA_LOG(INFO) << "Trying to restart discovery."; | 286 PA_LOG(INFO) << "Trying to restart discovery."; |
282 | 287 |
283 // To restart scanning for devices, it's necessary to ensure that: | 288 // To restart scanning for devices, it's necessary to ensure that: |
(...skipping 24 matching lines...) Expand all Loading... |
308 // This is a bug in the way device::BluetoothAdapter is storing the devices | 313 // This is a bug in the way device::BluetoothAdapter is storing the devices |
309 // (see crbug.com/497841). | 314 // (see crbug.com/497841). |
310 std::vector<BluetoothDevice*> devices = adapter_->GetDevices(); | 315 std::vector<BluetoothDevice*> devices = adapter_->GetDevices(); |
311 for (const auto& device : devices) { | 316 for (const auto& device : devices) { |
312 if (device->GetAddress() == device_address) | 317 if (device->GetAddress() == device_address) |
313 return device; | 318 return device; |
314 } | 319 } |
315 return nullptr; | 320 return nullptr; |
316 } | 321 } |
317 | 322 |
| 323 void BluetoothLowEnergyConnectionFinder::InvokeCallbackAsync() { |
| 324 connection_callback_.Run(connection_.Pass()); |
| 325 } |
| 326 |
318 } // namespace proximity_auth | 327 } // namespace proximity_auth |
OLD | NEW |