summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dmitry Torokhov <dtor@google.com> 2015-11-05 17:40:32 -0800
committer David Riley <davidriley@google.com> 2015-12-21 12:37:17 -0800
commit365bf06a72aca38e1b6a57cf4d29686d0a0f01f6 (patch)
treef695c35180add39120779533290f53be78c9fd01
parent3d27be827b5146b4c9bc0dd0747c0f41c036fe3d (diff)
SystemUI: implement bluetooth scan timeout
When we dock with Pixel C keyboard we normally expect to find it, and so we perform a low latency scan (which uses highest duty cycle). But if keyboard is not charged or if tablet mode trigger misfires (because there was a magnetic object in proximity?) we may not find the keyboard and will continue scanning indefinitely, impacting WiFi performance and draining battery. To avoid this scenario let's stop scan if we do not find "our" device in 30 seconds. Also remove STATE_WAITING_FOR_STATE_PAIRED as it was unused. Change-Id: I4bf1a9a163d3165eaa5e8f1cc2d2938465d454af (cherry picked from commit 6c12c3a6538591b5fa6e11cb4f583aa494e0ce5c) Signed-off-by: David Riley <davidriley@google.com>
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java38
1 files changed, 31 insertions, 7 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
index d931856a822b..481b91805108 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
@@ -70,17 +70,19 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
// time for us to receive the signal that it's starting.
private static final long BLUETOOTH_START_DELAY_MILLIS = 10 * 1000;
+ // We will be scanning up to 30 seconds, after which we'll stop.
+ private static final long BLUETOOTH_SCAN_TIMEOUT_MILLIS = 30 * 1000;
+
private static final int STATE_NOT_ENABLED = -1;
private static final int STATE_UNKNOWN = 0;
private static final int STATE_WAITING_FOR_BOOT_COMPLETED = 1;
private static final int STATE_WAITING_FOR_TABLET_MODE_EXIT = 2;
private static final int STATE_WAITING_FOR_DEVICE_DISCOVERY = 3;
private static final int STATE_WAITING_FOR_BLUETOOTH = 4;
- private static final int STATE_WAITING_FOR_STATE_PAIRED = 5;
- private static final int STATE_PAIRING = 6;
- private static final int STATE_PAIRED = 7;
- private static final int STATE_USER_CANCELLED = 8;
- private static final int STATE_DEVICE_NOT_FOUND = 9;
+ private static final int STATE_PAIRING = 5;
+ private static final int STATE_PAIRED = 6;
+ private static final int STATE_USER_CANCELLED = 7;
+ private static final int STATE_DEVICE_NOT_FOUND = 8;
private static final int MSG_INIT = 0;
private static final int MSG_ON_BOOT_COMPLETED = 1;
@@ -92,6 +94,7 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
private static final int MSG_ON_BLE_SCAN_FAILED = 7;
private static final int MSG_SHOW_BLUETOOTH_DIALOG = 8;
private static final int MSG_DISMISS_BLUETOOTH_DIALOG = 9;
+ private static final int MSG_BLE_ABORT_SCAN = 10;
private volatile KeyboardHandler mHandler;
private volatile KeyboardUIHandler mUIHandler;
@@ -107,6 +110,7 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
private long mBootCompletedTime;
private int mInTabletMode = InputManager.SWITCH_STATE_UNKNOWN;
+ private int mScanAttempt = 0;
private ScanCallback mScanCallback;
private BluetoothDialog mDialog;
@@ -328,6 +332,9 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
.build();
mScanCallback = new KeyboardScanCallback();
scanner.startScan(Arrays.asList(filter), settings, mScanCallback);
+
+ Message abortMsg = mHandler.obtainMessage(MSG_BLE_ABORT_SCAN, ++mScanAttempt, 0);
+ mHandler.sendMessageDelayed(abortMsg, BLUETOOTH_SCAN_TIMEOUT_MILLIS);
}
private void stopScanning() {
@@ -338,6 +345,19 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
}
// Should only be called on the handler thread
+ private void bleAbortScanInternal(int scanAttempt) {
+ if (mState == STATE_WAITING_FOR_DEVICE_DISCOVERY && scanAttempt == mScanAttempt) {
+ if (DEBUG) {
+ Slog.d(TAG, "Bluetooth scan timed out");
+ }
+ stopScanning();
+ // FIXME: should we also try shutting off bluetooth if we enabled
+ // it in the first place?
+ mState = STATE_DEVICE_NOT_FOUND;
+ }
+ }
+
+ // Should only be called on the handler thread
private void onDeviceAddedInternal(CachedBluetoothDevice d) {
if (mState == STATE_WAITING_FOR_DEVICE_DISCOVERY && d.getName().equals(mKeyboardName)) {
stopScanning();
@@ -425,6 +445,12 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
} else {
mState = STATE_USER_CANCELLED;
}
+ break;
+ }
+ case MSG_BLE_ABORT_SCAN: {
+ int scanAttempt = msg.arg1;
+ bleAbortScanInternal(scanAttempt);
+ break;
}
case MSG_ON_BLUETOOTH_STATE_CHANGED: {
int bluetoothState = msg.arg1;
@@ -555,8 +581,6 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
return "STATE_WAITING_FOR_DEVICE_DISCOVERY";
case STATE_WAITING_FOR_BLUETOOTH:
return "STATE_WAITING_FOR_BLUETOOTH";
- case STATE_WAITING_FOR_STATE_PAIRED:
- return "STATE_WAITING_FOR_STATE_PAIRED";
case STATE_PAIRING:
return "STATE_PAIRING";
case STATE_PAIRED: