diff options
author | Benjamin Franz <bfranz@google.com> | 2014-12-09 18:58:45 +0000 |
---|---|---|
committer | Benjamin Franz <bfranz@google.com> | 2014-12-10 17:06:06 +0000 |
commit | 5b614593e1a212e8ad9ac4a1e22a2954bb499233 (patch) | |
tree | fba114ea8af361c9b76a6dc03edc28daff5915b6 | |
parent | fa3f43145ac1af62ed063d3cd7ba1c30a81bb3fd (diff) | |
download | frameworks_base-5b614593e1a212e8ad9ac4a1e22a2954bb499233.zip frameworks_base-5b614593e1a212e8ad9ac4a1e22a2954bb499233.tar.gz frameworks_base-5b614593e1a212e8ad9ac4a1e22a2954bb499233.tar.bz2 |
Only add successfully bound profile services to mProfileServices.
This causes crashes on all devices that disable the BluetoothHeadset
service when disabling bluetooth and thereby trying to unbind all
services.
Bug: 18669882
Change-Id: I48978a1556ead967c848c5bd9f6e001d38754b8d
-rw-r--r-- | services/core/java/com/android/server/BluetoothManagerService.java | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 3117a17..ca376fd 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -535,15 +535,14 @@ class BluetoothManagerService extends IBluetoothManager.Stub { Log.d(TAG, "Creating new ProfileServiceConnections object for" + " profile: " + bluetoothProfile); } - Intent intent = null; - if (bluetoothProfile == BluetoothProfile.HEADSET) { - intent = new Intent(IBluetoothHeadset.class.getName()); - } else { - return false; - } + + if (bluetoothProfile != BluetoothProfile.HEADSET) return false; + + Intent intent = new Intent(IBluetoothHeadset.class.getName()); psc = new ProfileServiceConnections(intent); + if (!psc.bindService()) return false; + mProfileServices.put(new Integer(bluetoothProfile), psc); - psc.bindService(); } } @@ -571,7 +570,11 @@ class BluetoothManagerService extends IBluetoothManager.Stub { synchronized (mProfileServices) { for (Integer i : mProfileServices.keySet()) { ProfileServiceConnections psc = mProfileServices.get(i); - mContext.unbindService(psc); + try { + mContext.unbindService(psc); + } catch (IllegalArgumentException e) { + Log.e(TAG, "Unable to unbind service with intent: " + psc.mIntent, e); + } psc.removeAllProxies(); } mProfileServices.clear(); @@ -596,16 +599,16 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mIntent = intent; } - private void bindService() { - if (mIntent != null && mService == null) { - if (!doBind(mIntent, this, 0, UserHandle.CURRENT_OR_SELF)) { - Log.w(TAG, "Unable to bind with intent: " + mIntent - + ". Triggering retry."); - } + private boolean bindService() { + if (mIntent != null && mService == null && + doBind(mIntent, this, 0, UserHandle.CURRENT_OR_SELF)) { Message msg = mHandler.obtainMessage(MESSAGE_BIND_PROFILE_SERVICE); msg.obj = this; mHandler.sendMessageDelayed(msg, TIMEOUT_BIND_MS); + return true; } + Log.w(TAG, "Unable to bind with intent: " + mIntent); + return false; } private void addProxy(IBluetoothProfileServiceConnection proxy) { |