SystemUI: fix automatic pairing of BT keyboards

am: 79f00cf06f

* commit '79f00cf06f5e70047d73b48d20910b967353b075':
  SystemUI: fix automatic pairing of BT keyboards
This commit is contained in:
Dmitry Torokhov
2015-10-22 18:13:36 +00:00
committed by android-build-merger

View File

@@ -23,6 +23,7 @@ import android.bluetooth.BluetoothManager;
import android.bluetooth.le.BluetoothLeScanner; import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback; import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanFilter;
import android.bluetooth.le.ScanRecord;
import android.bluetooth.le.ScanResult; import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanSettings; import android.bluetooth.le.ScanSettings;
import android.content.ContentResolver; import android.content.ContentResolver;
@@ -230,17 +231,19 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
} }
CachedBluetoothDevice device = getPairedKeyboard(); CachedBluetoothDevice device = getPairedKeyboard();
if ((mState == STATE_WAITING_FOR_TABLET_MODE_EXIT || mState == STATE_WAITING_FOR_BLUETOOTH) if (mState == STATE_WAITING_FOR_TABLET_MODE_EXIT || mState == STATE_WAITING_FOR_BLUETOOTH) {
&& device != null) { if (device != null) {
// If we're just coming out of tablet mode or BT just turned on, // If we're just coming out of tablet mode or BT just turned on,
// then we want to go ahead and automatically connect to the // then we want to go ahead and automatically connect to the
// keyboard. We want to avoid this in other cases because we might // keyboard. We want to avoid this in other cases because we might
// be spuriously called after the user has manually disconnected // be spuriously called after the user has manually disconnected
// the keyboard, meaning we shouldn't try to automtically connect // the keyboard, meaning we shouldn't try to automtically connect
// it again. // it again.
mState = STATE_PAIRED; mState = STATE_PAIRED;
device.connect(false); device.connect(false);
return; return;
}
mCachedDeviceManager.clearNonBondedDevices();
} }
device = getDiscoveredKeyboard(); device = getDiscoveredKeyboard();
@@ -459,21 +462,36 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
} }
private final class KeyboardScanCallback extends ScanCallback { private final class KeyboardScanCallback extends ScanCallback {
private boolean isDeviceDiscoverable(ScanResult result) {
final ScanRecord scanRecord = result.getScanRecord();
final int flags = scanRecord.getAdvertiseFlags();
final int BT_DISCOVERABLE_MASK = 0x03;
return (flags & BT_DISCOVERABLE_MASK) != 0;
}
@Override @Override
public void onBatchScanResults(List<ScanResult> results) { public void onBatchScanResults(List<ScanResult> results) {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "onBatchScanResults(" + results.size() + ")"); Slog.d(TAG, "onBatchScanResults(" + results.size() + ")");
} }
if (!results.isEmpty()) {
BluetoothDevice bestDevice = results.get(0).getDevice(); BluetoothDevice bestDevice = null;
int bestRssi = results.get(0).getRssi(); int bestRssi = Integer.MIN_VALUE;
final int N = results.size();
for (int i = 0; i < N; i++) { for (ScanResult result : results) {
ScanResult r = results.get(i); if (DEBUG) {
if (r.getRssi() > bestRssi) { Slog.d(TAG, "onBatchScanResults: considering " + result);
bestDevice = r.getDevice();
}
} }
if (isDeviceDiscoverable(result) && result.getRssi() > bestRssi) {
bestDevice = result.getDevice();
bestRssi = result.getRssi();
}
}
if (bestDevice != null) {
mHandler.obtainMessage(MSG_ON_BLUETOOTH_DEVICE_ADDED, bestDevice).sendToTarget(); mHandler.obtainMessage(MSG_ON_BLUETOOTH_DEVICE_ADDED, bestDevice).sendToTarget();
} }
} }
@@ -491,8 +509,14 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "onScanResult(" + callbackType + ", " + result + ")"); Slog.d(TAG, "onScanResult(" + callbackType + ", " + result + ")");
} }
mHandler.obtainMessage(MSG_ON_BLUETOOTH_DEVICE_ADDED,
result.getDevice()).sendToTarget(); if (isDeviceDiscoverable(result)) {
mHandler.obtainMessage(MSG_ON_BLUETOOTH_DEVICE_ADDED,
result.getDevice()).sendToTarget();
} else if (DEBUG) {
Slog.d(TAG, "onScanResult: device " + result.getDevice() +
" is not discoverable, ignoring");
}
} }
} }