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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
@@ -109,6 +110,17 @@ public class CollectionUtils {
|
||||
return cur == null ? Collections.emptyList() : cur;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user