From 2c5fd28b6e2b1b17d49611508d97b1e7412d2fc5 Mon Sep 17 00:00:00 2001 From: Stanley Tng Date: Mon, 19 Mar 2018 13:06:45 -0700 Subject: [PATCH 1/2] Remove BLE App entry from mBleApps list when App died When a registered BLE App unexpectedly dies, its entry in mBleApps list needs to be cleanup/removed. Test: Manual test by repeatedly killing the gms core process. Bug: 74076974 Change-Id: I2dc86b782dd6b07017a360a0b709504f0a375969 (cherry picked from commit 73a1651446c400ecd1b07f2f7f448d68406517f7) --- .../com/android/server/BluetoothManagerService.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 02b1380715475..ae56cb92686ef 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -632,6 +632,16 @@ class BluetoothManagerService extends IBluetoothManager.Stub { if (DBG) { Slog.d(TAG, "Binder is dead - unregister " + mPackageName); } + + for (Map.Entry entry : mBleApps.entrySet()) { + IBinder token = entry.getKey(); + ClientDeathRecipient deathRec = entry.getValue(); + if (deathRec.equals(this)) { + mBleApps.remove(token); + break; + } + } + if (isBleAppPresent()) { // Nothing to do, another app is here. return; From 600109cb79098824410c09ff7d4e70d75ba8809f Mon Sep 17 00:00:00 2001 From: Stanley Tng Date: Tue, 20 Mar 2018 16:54:27 -0700 Subject: [PATCH 2/2] Calls unlinkToDeath in binderDied to deregister When a registered BLE App unexpectedly dies and the binderDied callback is called, the unlinkToDeath is called to remove linkage. Also, refactor code to use an existing function. Test: Manual test by repeatedly killing the gms core process. Bug: 74076974 Change-Id: If47a534ecafe7fceae14f8cf8526987cabd279cd (cherry picked from commit 699f42e24658b74f4b869b10633e9f31a7a9d7a8) --- .../server/BluetoothManagerService.java | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index ae56cb92686ef..216794139c417 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -637,29 +637,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { IBinder token = entry.getKey(); ClientDeathRecipient deathRec = entry.getValue(); if (deathRec.equals(this)) { - mBleApps.remove(token); + updateBleAppCount(token, false, mPackageName); break; } } - - if (isBleAppPresent()) { - // Nothing to do, another app is here. - return; - } - if (DBG) { - Slog.d(TAG, "Disabling LE only mode after application crash"); - } - try { - mBluetoothLock.readLock().lock(); - if (mBluetooth != null && mBluetooth.getState() == BluetoothAdapter.STATE_BLE_ON) { - mEnable = false; - mBluetooth.onBrEdrDown(); - } - } catch (RemoteException e) { - Slog.e(TAG, "Unable to call onBrEdrDown", e); - } finally { - mBluetoothLock.readLock().unlock(); - } } public String getPackageName() {