| Index: device/bluetooth/bluetooth_device_experimental_chromeos.cc
|
| diff --git a/device/bluetooth/bluetooth_device_experimental_chromeos.cc b/device/bluetooth/bluetooth_device_experimental_chromeos.cc
|
| index fb36c8450c43312e928c254f5a19fdd1135a32ea..33767756aae3e6612830b3b039132c041a26c228 100644
|
| --- a/device/bluetooth/bluetooth_device_experimental_chromeos.cc
|
| +++ b/device/bluetooth/bluetooth_device_experimental_chromeos.cc
|
| @@ -74,7 +74,10 @@ bool BluetoothDeviceExperimentalChromeOS::IsPaired() const {
|
| GetProperties(object_path_);
|
| DCHECK(properties);
|
|
|
| - return properties->paired.value();
|
| + // Trusted devices are devices that don't support pairing but that the
|
| + // user has explicitly connected; it makes no sense for UI purposes to
|
| + // treat them differently from each other.
|
| + return properties->paired.value() || properties->trusted.value();
|
| }
|
|
|
| bool BluetoothDeviceExperimentalChromeOS::IsConnected() const {
|
| @@ -139,8 +142,8 @@ void BluetoothDeviceExperimentalChromeOS::Connect(
|
| VLOG(1) << object_path_.value() << ": Connecting, " << num_connecting_calls_
|
| << " in progress";
|
|
|
| - if (IsPaired() || IsConnected() || !pairing_delegate) {
|
| - // No need to pair, skip straight to connection.
|
| + if (IsPaired() || IsConnected() || !pairing_delegate || !IsPairable()) {
|
| + // No need to pair, or unable to, skip straight to connection.
|
| ConnectInternal(callback, error_callback);
|
| } else {
|
| // Initiate high-security connection with pairing.
|
| @@ -396,6 +399,8 @@ void BluetoothDeviceExperimentalChromeOS::OnConnect(
|
| VLOG(1) << object_path_.value() << ": Connected, " << num_connecting_calls_
|
| << " still in progress";
|
|
|
| + SetTrusted();
|
| +
|
| callback.Run();
|
| }
|
|
|
| @@ -465,21 +470,8 @@ void BluetoothDeviceExperimentalChromeOS::OnPair(
|
| const base::Closure& callback,
|
| const ConnectErrorCallback& error_callback) {
|
| VLOG(1) << object_path_.value() << ": Paired";
|
| -
|
| - // Now that we're paired, we need to set the device as trusted so that
|
| - // incoming connections will be accepted. This should only ever fail if
|
| - // the device is removed mid-pairing, so do it in the background while
|
| - // we connect and don't worry about errors.
|
| - DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()->
|
| - GetProperties(object_path_)->trusted.Set(
|
| - true,
|
| - base::Bind(
|
| - &BluetoothDeviceExperimentalChromeOS::OnSetTrusted,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -
|
| UnregisterAgent();
|
| -
|
| - // Now we can connect to the device!
|
| + SetTrusted();
|
| ConnectInternal(callback, error_callback);
|
| }
|
|
|
| @@ -520,6 +512,19 @@ void BluetoothDeviceExperimentalChromeOS::OnCancelPairingError(
|
| << error_name << ": " << error_message;
|
| }
|
|
|
| +void BluetoothDeviceExperimentalChromeOS::SetTrusted() {
|
| + // Unconditionally send the property change, rather than checking the value
|
| + // first; there's no harm in doing this and it solves any race conditions
|
| + // with the property becoming true or false and this call happening before
|
| + // we get the D-Bus signal about the earlier change.
|
| + DBusThreadManager::Get()->GetExperimentalBluetoothDeviceClient()->
|
| + GetProperties(object_path_)->trusted.Set(
|
| + true,
|
| + base::Bind(
|
| + &BluetoothDeviceExperimentalChromeOS::OnSetTrusted,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| +}
|
| +
|
| void BluetoothDeviceExperimentalChromeOS::OnSetTrusted(bool success) {
|
| LOG_IF(WARNING, !success) << object_path_.value()
|
| << ": Failed to set device as trusted";
|
|
|