OSDN Git Service

b/2608693 Fix the problem where BT was automatically reconnecting
authorMichael Chan <mchan@android.com>
Thu, 22 Apr 2010 23:07:35 +0000 (16:07 -0700)
committerMichael Chan <mchan@android.com>
Thu, 22 Apr 2010 23:07:35 +0000 (16:07 -0700)
... after the user unpaired while docked.

Change-Id: I65642f440109968387401fc3c103da0f2b15f49f

src/com/android/settings/bluetooth/CachedBluetoothDevice.java

index 57bffa9..acc8551 100644 (file)
@@ -95,7 +95,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
     private static final long MAX_WAIT_TIME_FOR_FRAMEWORK = 25 * 1000;
 
     private enum BluetoothCommand {
-        CONNECT, DISCONNECT,
+        CONNECT, DISCONNECT, REMOVE_BOND,
     }
 
     static class BluetoothJob {
@@ -118,7 +118,9 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
             StringBuilder sb = new StringBuilder();
             sb.append(command.name());
             sb.append(" Address:").append(cachedDevice.mDevice);
-            sb.append(" Profile:").append(profile.name());
+            if (profile != null) {
+                sb.append(" Profile:").append(profile.name());
+            }
             sb.append(" TimeSent:");
             if (timeSent == 0) {
                 sb.append("not yet");
@@ -210,6 +212,12 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
             case DISCONNECT:
                 successful = disconnectInt(job.cachedDevice, job.profile);
                 break;
+            case REMOVE_BOND:
+                BluetoothDevice dev = job.cachedDevice.getDevice();
+                if (dev != null) {
+                    successful = dev.removeBond();
+                }
+                break;
             }
 
             if (successful) {
@@ -510,32 +518,16 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
     }
 
     public void unpair() {
-        synchronized (workQueue) {
-            // Remove any pending commands for this device
-            boolean processNow = false;
-            Iterator<BluetoothJob> it = workQueue.iterator();
-            while (it.hasNext()) {
-                BluetoothJob job = it.next();
-                if (job.cachedDevice.mDevice.equals(this.mDevice)) {
-                    it.remove();
-                    if (job.timeSent != 0) {
-                        processNow = true;
-                    }
-                }
-            }
-            if (processNow) {
-                processCommands();
-            }
-        }
+        disconnect();
 
-        switch (getBondState()) {
-        case BluetoothDevice.BOND_BONDED:
-            mDevice.removeBond();
-            break;
+        int state = getBondState();
 
-        case BluetoothDevice.BOND_BONDING:
+        if (state == BluetoothDevice.BOND_BONDING) {
             mDevice.cancelBondProcess();
-            break;
+        }
+
+        if (state != BluetoothDevice.BOND_NONE) {
+            queueCommand(new BluetoothJob(BluetoothCommand.REMOVE_BOND, this, null));
         }
     }