summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Franz <bfranz@google.com>2014-12-09 18:58:45 +0000
committerBenjamin Franz <bfranz@google.com>2014-12-10 17:06:06 +0000
commit5b614593e1a212e8ad9ac4a1e22a2954bb499233 (patch)
treefba114ea8af361c9b76a6dc03edc28daff5915b6
parentfa3f43145ac1af62ed063d3cd7ba1c30a81bb3fd (diff)
downloadframeworks_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.java31
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) {