Auto-connect Bluetooth device only when user initiates pairing.

Fix bug 2271901: do not auto-connect to services on a BT device
when pairing was initiated by the device (e.g. for OPP file transfer).

Also corrected some typos and removed an unneeded lock object in
LocalBluetoothManager (synchronize on .class object instead, like
android.bluetooth.BluetoothDevice.getService() does).

Change-Id: I121105c6eee2658129f6094786754bbc7932d324
diff --git a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
index cc3db6e..4d124b3 100644
--- a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
+++ b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
@@ -83,7 +83,7 @@
                 if (bondState == BluetoothDevice.BOND_NONE) {
                     if (device.isBluetoothDock()) {
                         // After a dock is unpaired, we will forget the
-                        // setttings
+                        // settings
                         mManager.removeDockAutoConnectSetting(device.getAddress());
 
                         // if the device is undocked, remove it from the list as
diff --git a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
index 9b16005..32f7ff3 100644
--- a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
+++ b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
@@ -86,6 +86,8 @@
     // See mConnectAttempted
     private static final long MAX_UUID_DELAY_FOR_AUTO_CONNECT = 5000;
 
+    /** Auto-connect after pairing only if locally initiated. */
+    private boolean mConnectAfterPairing;
 
     /**
      * Describes the current device and profile for logging.
@@ -343,7 +345,10 @@
         if (!mDevice.createBond()) {
             mLocalManager.showError(mDevice, R.string.bluetooth_error_title,
                     R.string.bluetooth_pairing_error_message);
+            return;
         }
+
+        mConnectAfterPairing = true;  // auto-connect after pairing
     }
 
     public void unpair() {
@@ -589,9 +594,19 @@
     public void onBondingStateChanged(int bondState) {
         if (bondState == BluetoothDevice.BOND_NONE) {
             mProfiles.clear();
+            mConnectAfterPairing = false;  // cancel auto-connect
         }
 
         refresh();
+
+        if (bondState == BluetoothDevice.BOND_BONDED) {
+            if (mDevice.isBluetoothDock()) {
+                onBondingDockConnect();
+            } else if (mConnectAfterPairing) {
+                connect();
+            }
+            mConnectAfterPairing = false;
+        }
     }
 
     public void setBtClass(BluetoothClass btClass) {
diff --git a/src/com/android/settings/bluetooth/CachedBluetoothDeviceManager.java b/src/com/android/settings/bluetooth/CachedBluetoothDeviceManager.java
index 4497480..b2b1326 100644
--- a/src/com/android/settings/bluetooth/CachedBluetoothDeviceManager.java
+++ b/src/com/android/settings/bluetooth/CachedBluetoothDeviceManager.java
@@ -182,15 +182,6 @@
         }
 
         cachedDevice.onBondingStateChanged(bondState);
-
-        if (bondState == BluetoothDevice.BOND_BONDED) {
-            // Auto-connect after pairing
-            if (!device.isBluetoothDock()) {
-                cachedDevice.connect();
-            } else {
-                cachedDevice.onBondingDockConnect();
-            }
-        }
     }
 
     /**
diff --git a/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java b/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
index 2a8af5f..ed9a974 100644
--- a/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
+++ b/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
@@ -72,7 +72,7 @@
         }
 
         if (device == null) {
-            Log.w(TAG, "Activity started without a remote blueototh device");
+            Log.w(TAG, "Activity started without a remote Bluetooth device");
             finish();
         }
 
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothManager.java b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
index 97e823e..4ba06da 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
@@ -45,9 +45,8 @@
 
     private static final String SHARED_PREFERENCES_NAME = "bluetooth_settings";
 
+    /** Singleton instance. */
     private static LocalBluetoothManager INSTANCE;
-    /** Used when obtaining a reference to the singleton instance. */
-    private static Object INSTANCE_LOCK = new Object();
     private boolean mInitialized;
 
     private Context mContext;
@@ -86,7 +85,7 @@
     private long mLastScan;
 
     public static LocalBluetoothManager getInstance(Context context) {
-        synchronized (INSTANCE_LOCK) {
+        synchronized (LocalBluetoothManager.class) {
             if (INSTANCE == null) {
                 INSTANCE = new LocalBluetoothManager();
             }
diff --git a/src/com/android/settings/bluetooth/SettingsBtStatus.java b/src/com/android/settings/bluetooth/SettingsBtStatus.java
index e2285e9..c6ec23b 100644
--- a/src/com/android/settings/bluetooth/SettingsBtStatus.java
+++ b/src/com/android/settings/bluetooth/SettingsBtStatus.java
@@ -31,7 +31,7 @@
 
     public static final int CONNECTION_STATUS_UNKNOWN = 0;
     public static final int CONNECTION_STATUS_ACTIVE = 1;
-    /** Use {@link #isConnected} to check for the connected state */
+    /** Use {@link #isConnectionStatusConnected} to check for the connected state */
     public static final int CONNECTION_STATUS_CONNECTED = 2;
     public static final int CONNECTION_STATUS_CONNECTING = 3;
     public static final int CONNECTION_STATUS_DISCONNECTED = 4;