summaryrefslogtreecommitdiffstats
path: root/device/bluetooth/bluetooth_device_experimental_chromeos.cc
diff options
context:
space:
mode:
Diffstat (limited to 'device/bluetooth/bluetooth_device_experimental_chromeos.cc')
-rw-r--r--device/bluetooth/bluetooth_device_experimental_chromeos.cc39
1 files changed, 22 insertions, 17 deletions
diff --git a/device/bluetooth/bluetooth_device_experimental_chromeos.cc b/device/bluetooth/bluetooth_device_experimental_chromeos.cc
index fb36c845..3376775 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";