diff options
author | Eugene Susla <eugenesusla@google.com> | 2017-06-09 18:03:14 -0700 |
---|---|---|
committer | Eugene Susla <eugenesusla@google.com> | 2017-06-12 16:21:51 -0700 |
commit | 0c4a9266264d37e724f7372ef7ef932cf60c505c (patch) | |
tree | 063e57a2358af8c523c82eca6e3b392c5b444a77 | |
parent | ffd8343ba87c7cdf84287b91972b987ffc41d4fb (diff) |
Support associating with an already-paired device
This is required for migration scenario, where device(s) are already
paired(and thus no longer discoverable) but didn't go through companion
flow.
This also fixes a bug with filtering by mac address, which is also relevant to
the use-case of associating a specific device
Test: Pair with a device first, and call associate with a filter with its MAC
address and single device requested. Ensure the device is found.
Ensure only that device is ever returned when filtering by MAC address.
Bug: 62487084
Change-Id: Ic7cc6affc0648ad85b15620e8c3aba4b9fc91aa1
3 files changed, 38 insertions, 6 deletions
diff --git a/core/java/android/companion/BluetoothDeviceFilterUtils.java b/core/java/android/companion/BluetoothDeviceFilterUtils.java index 3665d1b85bcb..4ee38fe4990e 100644 --- a/core/java/android/companion/BluetoothDeviceFilterUtils.java +++ b/core/java/android/companion/BluetoothDeviceFilterUtils.java @@ -58,7 +58,7 @@ public class BluetoothDeviceFilterUtils { static boolean matchesAddress(String deviceAddress, BluetoothDevice device) { final boolean result = deviceAddress == null - || (device == null || !deviceAddress.equals(device.getAddress())); + || (device != null && deviceAddress.equals(device.getAddress())); if (DEBUG) debugLogMatchResult(result, device, deviceAddress); return result; } diff --git a/core/java/com/android/internal/util/CollectionUtils.java b/core/java/com/android/internal/util/CollectionUtils.java index 96b443d28abc..1f84061a5978 100644 --- a/core/java/com/android/internal/util/CollectionUtils.java +++ b/core/java/com/android/internal/util/CollectionUtils.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.function.Function; import java.util.stream.Stream; @@ -101,7 +102,7 @@ public class CollectionUtils { /** * Returns the given list, or an immutable empty list if the provided list is null * - * This can be used to guaranty null-safety without paying the price of extra allocations + * This can be used to guarantee null-safety without paying the price of extra allocations * * @see Collections#emptyList */ @@ -110,6 +111,17 @@ public class CollectionUtils { } /** + * Returns the given set, or an immutable empty set if the provided set is null + * + * This can be used to guarantee null-safety without paying the price of extra allocations + * + * @see Collections#emptySet + */ + public static @NonNull <T> Set<T> emptyIfNull(@Nullable Set<T> cur) { + return cur == null ? Collections.emptySet() : cur; + } + + /** * Returns the size of the given list, or 0 if the list is null */ public static int size(@Nullable Collection<?> cur) { diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java index 2a4ab0f550e5..3b29a6cd7b6c 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java @@ -20,6 +20,8 @@ import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayNameI import static android.companion.BluetoothDeviceFilterUtils.getDeviceMacAddress; import static com.android.internal.util.ArrayUtils.isEmpty; +import static com.android.internal.util.CollectionUtils.emptyIfNull; +import static com.android.internal.util.CollectionUtils.size; import android.annotation.NonNull; import android.annotation.Nullable; @@ -154,6 +156,25 @@ public class DeviceDiscoveryService extends Service { onReadyToShowUI(); } + // If filtering to get single device by mac address, also search in the set of already + // bonded devices to allow linking those directly + String singleMacAddressFilter = null; + if (mRequest.isSingleDevice()) { + int numFilters = size(mBluetoothFilters); + for (int i = 0; i < numFilters; i++) { + BluetoothDeviceFilter filter = mBluetoothFilters.get(i); + if (!TextUtils.isEmpty(filter.getAddress())) { + singleMacAddressFilter = filter.getAddress(); + break; + } + } + } + if (singleMacAddressFilter != null) { + for (BluetoothDevice dev : emptyIfNull(mBluetoothAdapter.getBondedDevices())) { + onDeviceFound(DeviceFilterPair.findMatch(dev, mBluetoothFilters)); + } + } + if (shouldScan(mBluetoothFilters)) { final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BluetoothDevice.ACTION_FOUND); @@ -211,6 +232,8 @@ public class DeviceDiscoveryService extends Service { } private void onDeviceFound(@Nullable DeviceFilterPair device) { + if (device == null) return; + if (mDevicesFound.contains(device)) { return; } @@ -444,12 +467,9 @@ public class DeviceDiscoveryService extends Service { } for (int i = 0; i < scanResults.size(); i++) { - DeviceFilterPair<android.net.wifi.ScanResult> deviceFilterPair = - DeviceFilterPair.findMatch(scanResults.get(i), mWifiFilters); - if (deviceFilterPair != null) onDeviceFound(deviceFilterPair); + onDeviceFound(DeviceFilterPair.findMatch(scanResults.get(i), mWifiFilters)); } } - } } } |