OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "content/browser/bluetooth/bluetooth_device_chooser_controller.h" | 5 #include "content/browser/bluetooth/bluetooth_device_chooser_controller.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <string> | 8 #include <string> |
9 #include <unordered_set> | 9 #include <unordered_set> |
10 | 10 |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 FROM_HERE, | 207 FROM_HERE, |
208 // TODO(jyasskin): Add a way for tests to control the dialog | 208 // TODO(jyasskin): Add a way for tests to control the dialog |
209 // directly, and change this to a reasonable discovery timeout. | 209 // directly, and change this to a reasonable discovery timeout. |
210 base::TimeDelta::FromSeconds( | 210 base::TimeDelta::FromSeconds( |
211 use_test_scan_duration_ ? kTestScanDuration : kScanDuration), | 211 use_test_scan_duration_ ? kTestScanDuration : kScanDuration), |
212 base::Bind(&BluetoothDeviceChooserController::StopDeviceDiscovery, | 212 base::Bind(&BluetoothDeviceChooserController::StopDeviceDiscovery, |
213 // base::Timer guarantees it won't call back after its | 213 // base::Timer guarantees it won't call back after its |
214 // destructor starts. | 214 // destructor starts. |
215 base::Unretained(this)), | 215 base::Unretained(this)), |
216 /*is_repeating=*/false), | 216 /*is_repeating=*/false), |
| 217 should_update_chooser_(false), |
217 weak_ptr_factory_(this) { | 218 weak_ptr_factory_(this) { |
218 CHECK(adapter_); | 219 CHECK(adapter_); |
219 } | 220 } |
220 | 221 |
221 BluetoothDeviceChooserController::~BluetoothDeviceChooserController() { | 222 BluetoothDeviceChooserController::~BluetoothDeviceChooserController() { |
222 if (chooser_) { | 223 if (chooser_) { |
223 DCHECK(!error_callback_.is_null()); | 224 DCHECK(!error_callback_.is_null()); |
224 error_callback_.Run(blink::mojom::WebBluetoothError::CHOOSER_CANCELLED); | 225 error_callback_.Run(blink::mojom::WebBluetoothError::CHOOSER_CANCELLED); |
225 } | 226 } |
226 } | 227 } |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 return; | 325 return; |
325 } | 326 } |
326 | 327 |
327 if (!chooser_->CanAskForScanningPermission()) { | 328 if (!chooser_->CanAskForScanningPermission()) { |
328 VLOG(1) << "Closing immediately because Chooser cannot obtain permission."; | 329 VLOG(1) << "Closing immediately because Chooser cannot obtain permission."; |
329 OnBluetoothChooserEvent(BluetoothChooser::Event::DENIED_PERMISSION, | 330 OnBluetoothChooserEvent(BluetoothChooser::Event::DENIED_PERMISSION, |
330 "" /* device_address */); | 331 "" /* device_address */); |
331 return; | 332 return; |
332 } | 333 } |
333 | 334 |
| 335 should_update_chooser_ = true; |
334 PopulateConnectedDevices(); | 336 PopulateConnectedDevices(); |
335 if (!chooser_.get()) { | 337 if (!chooser_.get()) { |
336 // If the dialog's closing, no need to do any of the rest of this. | 338 // If the dialog's closing, no need to do any of the rest of this. |
337 return; | 339 return; |
338 } | 340 } |
339 | 341 |
340 if (!adapter_->IsPowered()) { | 342 if (!adapter_->IsPowered()) { |
341 chooser_->SetAdapterPresence( | 343 chooser_->SetAdapterPresence( |
342 BluetoothChooser::AdapterPresence::POWERED_OFF); | 344 BluetoothChooser::AdapterPresence::POWERED_OFF); |
343 return; | 345 return; |
344 } | 346 } |
345 | 347 |
346 StartDeviceDiscovery(); | 348 StartDeviceDiscovery(); |
347 } | 349 } |
348 | 350 |
349 void BluetoothDeviceChooserController::AddFilteredDevice( | 351 void BluetoothDeviceChooserController::AddFilteredDevice( |
350 const device::BluetoothDevice& device) { | 352 const device::BluetoothDevice& device) { |
351 if (chooser_.get() && MatchesFilters(device, options_->filters)) { | 353 if (should_update_chooser_ && chooser_.get() && |
| 354 MatchesFilters(device, options_->filters)) { |
352 base::Optional<int8_t> rssi = device.GetInquiryRSSI(); | 355 base::Optional<int8_t> rssi = device.GetInquiryRSSI(); |
353 chooser_->AddOrUpdateDevice( | 356 chooser_->AddOrUpdateDevice( |
354 device.GetAddress(), !!device.GetName() /* should_update_name */, | 357 device.GetAddress(), !!device.GetName() /* should_update_name */, |
355 device.GetNameForDisplay(), | 358 device.GetNameForDisplay(), |
356 // TODO(http://crbug.com/543466): Show connection and paired status. | 359 // TODO(http://crbug.com/543466): Show connection and paired status. |
357 false /* is_gatt_connected */, false /* is_paired */, | 360 false /* is_gatt_connected */, false /* is_paired */, |
358 rssi ? CalculateSignalStrengthLevel(rssi.value()) : -1); | 361 rssi ? CalculateSignalStrengthLevel(rssi.value()) : -1); |
359 } | 362 } |
360 } | 363 } |
361 | 364 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 base::Bind( | 422 base::Bind( |
420 &BluetoothDeviceChooserController::OnStartDiscoverySessionSuccess, | 423 &BluetoothDeviceChooserController::OnStartDiscoverySessionSuccess, |
421 weak_ptr_factory_.GetWeakPtr()), | 424 weak_ptr_factory_.GetWeakPtr()), |
422 base::Bind( | 425 base::Bind( |
423 &BluetoothDeviceChooserController::OnStartDiscoverySessionFailed, | 426 &BluetoothDeviceChooserController::OnStartDiscoverySessionFailed, |
424 weak_ptr_factory_.GetWeakPtr())); | 427 weak_ptr_factory_.GetWeakPtr())); |
425 } | 428 } |
426 | 429 |
427 void BluetoothDeviceChooserController::StopDeviceDiscovery() { | 430 void BluetoothDeviceChooserController::StopDeviceDiscovery() { |
428 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 431 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 432 should_update_chooser_ = false; |
429 StopDiscoverySession(std::move(discovery_session_)); | 433 StopDiscoverySession(std::move(discovery_session_)); |
430 if (chooser_) { | 434 if (chooser_) { |
431 chooser_->ShowDiscoveryState(BluetoothChooser::DiscoveryState::IDLE); | 435 chooser_->ShowDiscoveryState(BluetoothChooser::DiscoveryState::IDLE); |
432 } | 436 } |
433 } | 437 } |
434 | 438 |
435 void BluetoothDeviceChooserController::OnStartDiscoverySessionSuccess( | 439 void BluetoothDeviceChooserController::OnStartDiscoverySessionSuccess( |
436 std::unique_ptr<device::BluetoothDiscoverySession> discovery_session) { | 440 std::unique_ptr<device::BluetoothDiscoverySession> discovery_session) { |
437 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 441 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
438 VLOG(1) << "Started discovery session."; | 442 VLOG(1) << "Started discovery session."; |
(...skipping 14 matching lines...) Expand all Loading... |
453 | 457 |
454 void BluetoothDeviceChooserController::OnBluetoothChooserEvent( | 458 void BluetoothDeviceChooserController::OnBluetoothChooserEvent( |
455 BluetoothChooser::Event event, | 459 BluetoothChooser::Event event, |
456 const std::string& device_address) { | 460 const std::string& device_address) { |
457 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 461 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
458 // Shouldn't recieve an event from a closed chooser. | 462 // Shouldn't recieve an event from a closed chooser. |
459 DCHECK(chooser_.get()); | 463 DCHECK(chooser_.get()); |
460 | 464 |
461 switch (event) { | 465 switch (event) { |
462 case BluetoothChooser::Event::RESCAN: | 466 case BluetoothChooser::Event::RESCAN: |
| 467 should_update_chooser_ = true; |
463 PopulateConnectedDevices(); | 468 PopulateConnectedDevices(); |
464 DCHECK(chooser_); | 469 DCHECK(chooser_); |
465 StartDeviceDiscovery(); | 470 StartDeviceDiscovery(); |
466 // No need to close the chooser so we return. | 471 // No need to close the chooser so we return. |
467 return; | 472 return; |
468 case BluetoothChooser::Event::DENIED_PERMISSION: | 473 case BluetoothChooser::Event::DENIED_PERMISSION: |
469 RecordRequestDeviceOutcome(OutcomeFromChooserEvent(event)); | 474 RecordRequestDeviceOutcome(OutcomeFromChooserEvent(event)); |
470 PostErrorCallback(blink::mojom::WebBluetoothError:: | 475 PostErrorCallback(blink::mojom::WebBluetoothError:: |
471 CHOOSER_NOT_SHOWN_USER_DENIED_PERMISSION_TO_SCAN); | 476 CHOOSER_NOT_SHOWN_USER_DENIED_PERMISSION_TO_SCAN); |
472 break; | 477 break; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 | 514 |
510 void BluetoothDeviceChooserController::PostErrorCallback( | 515 void BluetoothDeviceChooserController::PostErrorCallback( |
511 blink::mojom::WebBluetoothError error) { | 516 blink::mojom::WebBluetoothError error) { |
512 if (!base::ThreadTaskRunnerHandle::Get()->PostTask( | 517 if (!base::ThreadTaskRunnerHandle::Get()->PostTask( |
513 FROM_HERE, base::Bind(error_callback_, error))) { | 518 FROM_HERE, base::Bind(error_callback_, error))) { |
514 LOG(WARNING) << "No TaskRunner."; | 519 LOG(WARNING) << "No TaskRunner."; |
515 } | 520 } |
516 } | 521 } |
517 | 522 |
518 } // namespace content | 523 } // namespace content |
OLD | NEW |