summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
authorJaikumar Ganesh <jaikumar@google.com>2009-10-08 02:27:52 -0700
committerJaikumar Ganesh <jaikumar@google.com>2009-10-08 04:25:45 -0700
commite5d93b7ed983f98855555d560faf060836f1a52f (patch)
treebd9b6c485e3c3af23f1a60944e114783c8add72b /core/java/android
parentb134b2038ecabcbec3f9b657834d45de27707068 (diff)
downloadframeworks_base-e5d93b7ed983f98855555d560faf060836f1a52f.zip
frameworks_base-e5d93b7ed983f98855555d560faf060836f1a52f.tar.gz
frameworks_base-e5d93b7ed983f98855555d560faf060836f1a52f.tar.bz2
Set the Bond State to NONE when we receive a Agent Cancel.
Sometimes during OPP, we can get stuck in Pairing state when the remote end, cancels the Pairing process - we will just get onAgentCancel and thus not set the Pairing state properly. DrNo: Eastham Bug:2174874
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/bluetooth/BluetoothDevice.java6
-rw-r--r--core/java/android/server/BluetoothEventLoop.java21
-rw-r--r--core/java/android/server/BluetoothService.java2
3 files changed, 27 insertions, 2 deletions
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 9c23746..39a74ac 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -287,9 +287,13 @@ public final class BluetoothDevice implements Parcelable {
/** A bond attempt failed because of repeated attempts
* @hide */
public static final int UNBOND_REASON_REPEATED_ATTEMPTS = 7;
+ /** A bond attempt failed because we received an Authentication Cancel
+ * by remote end
+ * @hide */
+ public static final int UNBOND_REASON_REMOTE_AUTH_CANCELED = 8;
/** An existing bond was explicitly revoked
* @hide */
- public static final int UNBOND_REASON_REMOVED = 8;
+ public static final int UNBOND_REASON_REMOVED = 9;
/** The user will be prompted to enter a pin
* @hide */
diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java
index da1918a..c0b9a68 100644
--- a/core/java/android/server/BluetoothEventLoop.java
+++ b/core/java/android/server/BluetoothEventLoop.java
@@ -54,6 +54,7 @@ class BluetoothEventLoop {
private static final int EVENT_AUTO_PAIRING_FAILURE_ATTEMPT_DELAY = 1;
private static final int EVENT_RESTART_BLUETOOTH = 2;
private static final int EVENT_PAIRING_CONSENT_DELAYED_ACCEPT = 3;
+ private static final int EVENT_AGENT_CANCEL = 4;
private static final int CREATE_DEVICE_ALREADY_EXISTS = 1;
private static final int CREATE_DEVICE_SUCCESS = 0;
@@ -90,6 +91,22 @@ class BluetoothEventLoop {
mBluetoothService.setPairingConfirmation(address, true);
}
break;
+ case EVENT_AGENT_CANCEL:
+ // Set the Bond State to BOND_NONE.
+ // We always have only 1 device in BONDING state.
+ String[] devices =
+ mBluetoothService.getBondState().listInState(BluetoothDevice.BOND_BONDING);
+ if (devices.length == 0) {
+ break;
+ } else if (devices.length > 1) {
+ Log.e(TAG, " There is more than one device in the Bonding State");
+ break;
+ }
+ address = devices[0];
+ mBluetoothService.getBondState().setBondState(address,
+ BluetoothDevice.BOND_NONE,
+ BluetoothDevice.UNBOND_REASON_REMOTE_AUTH_CANCELED);
+ break;
}
}
};
@@ -544,6 +561,10 @@ class BluetoothEventLoop {
private void onAgentCancel() {
Intent intent = new Intent(BluetoothDevice.ACTION_PAIRING_CANCEL);
mContext.sendBroadcast(intent, BLUETOOTH_ADMIN_PERM);
+
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_AGENT_CANCEL),
+ 1500);
+
return;
}
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
index 6d4d152..7ebd91d 100644
--- a/core/java/android/server/BluetoothService.java
+++ b/core/java/android/server/BluetoothService.java
@@ -571,7 +571,7 @@ public class BluetoothService extends IBluetooth.Stub {
return state.intValue();
}
- private synchronized String[] listInState(int state) {
+ /*package*/ synchronized String[] listInState(int state) {
ArrayList<String> result = new ArrayList<String>(mState.size());
for (Map.Entry<String, Integer> e : mState.entrySet()) {
if (e.getValue().intValue() == state) {