diff options
author | Hector Tellez <htellez@google.com> | 2017-03-09 17:55:43 +0000 |
---|---|---|
committer | Hector Tellez <htellez@google.com> | 2017-03-09 17:55:43 +0000 |
commit | d66c95fa907dc9eb3d7238fbbf3dc6dbd4b243a0 (patch) | |
tree | dbe983247ba3f089ce6f263f35308c76cdc520ea /packages/CompanionDeviceManager/src | |
parent | e70e6aa62c6f3a9a79624a4f9d97df95edda0364 (diff) |
Revert "Support multiple filters per association request"
This reverts commit e70e6aa62c6f3a9a79624a4f9d97df95edda0364.
Change-Id: I12857cbbea0a0c74521191ab5e3713db230626ab
Diffstat (limited to 'packages/CompanionDeviceManager/src')
2 files changed, 53 insertions, 160 deletions
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java index 14b9de59bf5a..12bab18c88c9 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java @@ -16,9 +16,10 @@ package com.android.companiondevicemanager; -import static android.companion.BluetoothDeviceFilterUtils.getDeviceMacAddress; +import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayName; import android.app.Activity; +import android.bluetooth.BluetoothDevice; import android.companion.CompanionDeviceManager; import android.content.Intent; import android.content.pm.PackageManager; @@ -33,8 +34,6 @@ import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; -import com.android.companiondevicemanager.DeviceDiscoveryService.DeviceFilterPair; - public class DeviceChooserActivity extends Activity { private static final boolean DEBUG = false; @@ -56,11 +55,11 @@ public class DeviceChooserActivity extends Activity { if (getService().mRequest.isSingleDevice()) { setContentView(R.layout.device_confirmation); - final DeviceFilterPair selectedDevice = getService().mDevicesFound.get(0); + final BluetoothDevice selectedDevice = getService().mDevicesFound.get(0); setTitle(Html.fromHtml(getString( R.string.confirmation_title, getCallingAppName(), - selectedDevice.getDisplayName()), 0)); + getDeviceDisplayName(selectedDevice)), 0)); getService().mSelectedDevice = selectedDevice; } else { setContentView(R.layout.device_chooser); @@ -128,11 +127,10 @@ public class DeviceChooserActivity extends Activity { return DeviceDiscoveryService.sInstance; } - protected void onPairTapped(DeviceFilterPair selectedDevice) { - getService().onDeviceSelected( - getCallingPackage(), getDeviceMacAddress(selectedDevice.device)); + protected void onPairTapped(BluetoothDevice selectedDevice) { + getService().onDeviceSelected(getCallingPackage(), selectedDevice.getAddress()); setResult(RESULT_OK, - new Intent().putExtra(CompanionDeviceManager.EXTRA_DEVICE, selectedDevice.device)); + new Intent().putExtra(CompanionDeviceManager.EXTRA_DEVICE, selectedDevice)); finish(); } }
\ No newline at end of file diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java index e1e60bb99374..f0f910848943 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java @@ -16,10 +16,8 @@ package com.android.companiondevicemanager; -import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayNameInternal; -import static android.companion.BluetoothDeviceFilterUtils.getDeviceMacAddress; - -import static com.android.internal.util.ArrayUtils.isEmpty; +import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayName; +import static android.companion.BluetoothLEDeviceFilter.nullsafe; import android.annotation.NonNull; import android.annotation.Nullable; @@ -34,38 +32,28 @@ import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanResult; import android.bluetooth.le.ScanSettings; import android.companion.AssociationRequest; -import android.companion.BluetoothDeviceFilter; -import android.companion.BluetoothDeviceFilterUtils; import android.companion.BluetoothLEDeviceFilter; import android.companion.CompanionDeviceManager; -import android.companion.DeviceFilter; import android.companion.ICompanionDeviceDiscoveryService; import android.companion.ICompanionDeviceDiscoveryServiceCallback; import android.companion.IFindDeviceCallback; -import android.companion.WifiDeviceFilter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.graphics.drawable.Drawable; -import android.net.wifi.WifiManager; import android.os.IBinder; -import android.os.Parcelable; import android.os.RemoteException; -import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; -import com.android.internal.util.ArrayUtils; -import com.android.internal.util.Preconditions; - import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Objects; public class DeviceDiscoveryService extends Service { @@ -75,16 +63,12 @@ public class DeviceDiscoveryService extends Service { static DeviceDiscoveryService sInstance; private BluetoothAdapter mBluetoothAdapter; - private WifiManager mWifiManager; + private BluetoothLEDeviceFilter mFilter; + private ScanFilter mScanFilter; private ScanSettings mDefaultScanSettings = new ScanSettings.Builder().build(); - private List<DeviceFilter<?>> mFilters; - private List<BluetoothLEDeviceFilter> mBLEFilters; - private List<BluetoothDeviceFilter> mBluetoothFilters; - private List<WifiDeviceFilter> mWifiFilters; - private List<ScanFilter> mBLEScanFilters; - AssociationRequest mRequest; - List<DeviceFilterPair> mDevicesFound; - DeviceFilterPair mSelectedDevice; + AssociationRequest<?> mRequest; + List<BluetoothDevice> mDevicesFound; + BluetoothDevice mSelectedDevice; DevicesAdapter mDevicesAdapter; IFindDeviceCallback mFindCallback; ICompanionDeviceDiscoveryServiceCallback mServiceCallback; @@ -111,13 +95,11 @@ public class DeviceDiscoveryService extends Service { private final ScanCallback mBLEScanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { - final DeviceFilterPair<ScanResult> deviceFilterPair - = DeviceFilterPair.findMatch(result, mBLEFilters); - if (deviceFilterPair == null) return; + final BluetoothDevice device = result.getDevice(); if (callbackType == ScanSettings.CALLBACK_TYPE_MATCH_LOST) { - onDeviceLost(deviceFilterPair); + onDeviceLost(device); } else { - onDeviceFound(deviceFilterPair); + onDeviceFound(device); } } }; @@ -127,35 +109,15 @@ public class DeviceDiscoveryService extends Service { private BroadcastReceiver mBluetoothDeviceFoundBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - final DeviceFilterPair<BluetoothDevice> deviceFilterPair - = DeviceFilterPair.findMatch(device, mBluetoothFilters); - if (deviceFilterPair == null) return; + final BluetoothDevice device = intent.getParcelableExtra( + BluetoothDevice.EXTRA_DEVICE); + if (!mFilter.matches(device)) return; // ignore device + if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) { - onDeviceFound(deviceFilterPair); + onDeviceFound(device); } else { - onDeviceLost(deviceFilterPair); - } - } - }; - - private BroadcastReceiver mWifiDeviceFoundBroadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { - List<android.net.wifi.ScanResult> scanResults = mWifiManager.getScanResults(); - - if (DEBUG) { - Log.i(LOG_TAG, "Wifi scan results: " + TextUtils.join("\n", scanResults)); - } - - 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); - } + onDeviceLost(device); } - } }; @@ -173,7 +135,6 @@ public class DeviceDiscoveryService extends Service { mBluetoothAdapter = getSystemService(BluetoothManager.class).getAdapter(); mBLEScanner = mBluetoothAdapter.getBluetoothLeScanner(); - mWifiManager = getSystemService(WifiManager.class); mDevicesFound = new ArrayList<>(); mDevicesAdapter = new DevicesAdapter(); @@ -181,39 +142,23 @@ public class DeviceDiscoveryService extends Service { sInstance = this; } - private void startDiscovery(AssociationRequest request) { + private void startDiscovery(AssociationRequest<?> request) { + //TODO support other protocols as well mRequest = request; - - mFilters = request.getDeviceFilters(); - mWifiFilters = ArrayUtils.filter(mFilters, WifiDeviceFilter.class); - mBluetoothFilters = ArrayUtils.filter(mFilters, BluetoothDeviceFilter.class); - mBLEFilters = ArrayUtils.filter(mFilters, BluetoothLEDeviceFilter.class); - mBLEScanFilters = ArrayUtils.map(mBLEFilters, BluetoothLEDeviceFilter::getScanFilter); + mFilter = nullsafe((BluetoothLEDeviceFilter) request.getDeviceFilter()); + mScanFilter = mFilter.getScanFilter(); reset(); - if (shouldScan(mBluetoothFilters)) { - final IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(BluetoothDevice.ACTION_FOUND); - intentFilter.addAction(BluetoothDevice.ACTION_DISAPPEARED); + final IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(BluetoothDevice.ACTION_FOUND); + intentFilter.addAction(BluetoothDevice.ACTION_DISAPPEARED); - registerReceiver(mBluetoothDeviceFoundBroadcastReceiver, intentFilter); - mBluetoothAdapter.startDiscovery(); - } + registerReceiver(mBluetoothDeviceFoundBroadcastReceiver, intentFilter); + mBluetoothAdapter.startDiscovery(); - if (shouldScan(mBLEFilters)) { - mBLEScanner.startScan(mBLEScanFilters, mDefaultScanSettings, mBLEScanCallback); - } - - if (shouldScan(mWifiFilters)) { - registerReceiver(mWifiDeviceFoundBroadcastReceiver, - new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); - mWifiManager.startScan(); - } - } - - private boolean shouldScan(List<? extends DeviceFilter> mediumSpecificFilters) { - return !isEmpty(mediumSpecificFilters) || isEmpty(mFilters); + mBLEScanner.startScan( + Collections.singletonList(mScanFilter), mDefaultScanSettings, mBLEScanCallback); } private void reset() { @@ -233,18 +178,25 @@ public class DeviceDiscoveryService extends Service { mBluetoothAdapter.cancelDiscovery(); mBLEScanner.stopScan(mBLEScanCallback); unregisterReceiver(mBluetoothDeviceFoundBroadcastReceiver); - unregisterReceiver(mWifiDeviceFoundBroadcastReceiver); stopSelf(); } - private void onDeviceFound(@Nullable DeviceFilterPair device) { + private void onDeviceFound(BluetoothDevice device) { if (mDevicesFound.contains(device)) { return; } - if (DEBUG) Log.i(LOG_TAG, "Found device " + device.getDisplayName() + " " - + getDeviceMacAddress(device.device)); + if (DEBUG) { + Log.i(LOG_TAG, "Considering device " + getDeviceDisplayName(device)); + } + if (!mFilter.matches(device)) { + return; + } + + if (DEBUG) { + Log.i(LOG_TAG, "Found device " + getDeviceDisplayName(device)); + } if (mDevicesFound.isEmpty()) { onReadyToShowUI(); } @@ -265,10 +217,12 @@ public class DeviceDiscoveryService extends Service { } } - private void onDeviceLost(@Nullable DeviceFilterPair device) { + private void onDeviceLost(BluetoothDevice device) { mDevicesFound.remove(device); mDevicesAdapter.notifyDataSetChanged(); - if (DEBUG) Log.i(LOG_TAG, "Lost device " + device.getDisplayName()); + if (DEBUG) { + Log.i(LOG_TAG, "Lost device " + getDeviceDisplayName(device)); + } } void onDeviceSelected(String callingPackage, String deviceAddress) { @@ -282,8 +236,7 @@ public class DeviceDiscoveryService extends Service { } } - class DevicesAdapter extends ArrayAdapter<DeviceFilterPair> { - //TODO wifi icon + class DevicesAdapter extends ArrayAdapter<BluetoothDevice> { private Drawable BLUETOOTH_ICON = icon(android.R.drawable.stat_sys_data_bluetooth); private Drawable icon(int drawableRes) { @@ -308,8 +261,8 @@ public class DeviceDiscoveryService extends Service { return view; } - private void bind(TextView textView, DeviceFilterPair device) { - textView.setText(device.getDisplayName()); + private void bind(TextView textView, BluetoothDevice device) { + textView.setText(getDeviceDisplayName(device)); textView.setBackgroundColor( device.equals(mSelectedDevice) ? Color.GRAY @@ -332,62 +285,4 @@ public class DeviceDiscoveryService extends Service { return textView; } } - - /** - * A pair of device and a filter that matched this device if any. - * - * @param <T> device type - */ - static class DeviceFilterPair<T extends Parcelable> { - public final T device; - @Nullable - public final DeviceFilter<T> filter; - - private DeviceFilterPair(T device, @Nullable DeviceFilter<T> filter) { - this.device = device; - this.filter = filter; - } - - /** - * {@code (device, null)} if the filters list is empty or null - * {@code null} if none of the provided filters match the device - * {@code (device, filter)} where filter is among the list of filters and matches the device - */ - @Nullable - public static <T extends Parcelable> DeviceFilterPair<T> findMatch( - T dev, @Nullable List<? extends DeviceFilter<T>> filters) { - if (isEmpty(filters)) return new DeviceFilterPair<>(dev, null); - final DeviceFilter<T> matchingFilter = ArrayUtils.find(filters, (f) -> f.matches(dev)); - return matchingFilter != null ? new DeviceFilterPair<>(dev, matchingFilter) : null; - } - - public String getDisplayName() { - if (filter == null) { - Preconditions.checkNotNull(device); - if (device instanceof BluetoothDevice) { - return getDeviceDisplayNameInternal((BluetoothDevice) device); - } else if (device instanceof android.net.wifi.ScanResult) { - return getDeviceDisplayNameInternal((android.net.wifi.ScanResult) device); - } else if (device instanceof ScanResult) { - return getDeviceDisplayNameInternal(((ScanResult) device).getDevice()); - } else { - throw new IllegalArgumentException("Unknown device type: " + device.getClass()); - } - } - return filter.getDeviceDisplayName(device); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DeviceFilterPair<?> that = (DeviceFilterPair<?>) o; - return Objects.equals(getDeviceMacAddress(device), getDeviceMacAddress(that.device)); - } - - @Override - public int hashCode() { - return Objects.hash(getDeviceMacAddress(device)); - } - } } |