From dd79a33ba53fec530094f4d2fe37f0538530d9f8 Mon Sep 17 00:00:00 2001 From: Jake Hamby Date: Thu, 23 Sep 2010 19:16:28 -0700 Subject: [PATCH] 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 --- .../settings/bluetooth/BluetoothEventRedirector.java | 2 +- .../android/settings/bluetooth/CachedBluetoothDevice.java | 15 +++++++++++++++ .../settings/bluetooth/CachedBluetoothDeviceManager.java | 9 --------- .../bluetooth/ConnectSpecificProfilesActivity.java | 2 +- .../android/settings/bluetooth/LocalBluetoothManager.java | 5 ++--- src/com/android/settings/bluetooth/SettingsBtStatus.java | 2 +- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java index cc3db6e47a..4d124b33ef 100644 --- a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java +++ b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java @@ -83,7 +83,7 @@ public class BluetoothEventRedirector { 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 9b16005c49..32f7ff320c 100644 --- a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java +++ b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java @@ -86,6 +86,8 @@ public class CachedBluetoothDevice implements Comparable // 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 @@ public class CachedBluetoothDevice implements Comparable 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 class CachedBluetoothDevice implements Comparable 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 44974804b9..b2b1326a48 100644 --- a/src/com/android/settings/bluetooth/CachedBluetoothDeviceManager.java +++ b/src/com/android/settings/bluetooth/CachedBluetoothDeviceManager.java @@ -182,15 +182,6 @@ public class CachedBluetoothDeviceManager { } 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 2a8af5fdec..ed9a974110 100644 --- a/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java +++ b/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java @@ -72,7 +72,7 @@ public class ConnectSpecificProfilesActivity extends PreferenceActivity } 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 97e823ed1c..4ba06daa55 100644 --- a/src/com/android/settings/bluetooth/LocalBluetoothManager.java +++ b/src/com/android/settings/bluetooth/LocalBluetoothManager.java @@ -45,9 +45,8 @@ public class LocalBluetoothManager { 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 @@ public class LocalBluetoothManager { 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 e2285e9bca..c6ec23b263 100644 --- a/src/com/android/settings/bluetooth/SettingsBtStatus.java +++ b/src/com/android/settings/bluetooth/SettingsBtStatus.java @@ -31,7 +31,7 @@ public class SettingsBtStatus { 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; -- 2.11.0