summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Devarshi Bhatt <devarshimb@google.com> 2024-02-06 04:52:56 +0000
committer Devarshi Bhatt <devarshimb@google.com> 2024-02-13 05:30:02 +0000
commitfdddc978fa2e910431bf49eb87dcbdf573aae3f3 (patch)
treeed34d5dbcb3bcdd8126ff66ac3c757b2ab863fb6
parent3e8e34d7d87f3e4e6dd8781b7b6abd4b1c36c087 (diff)
Fetch bluetooth cached device name outside synchronized block.
mConnectedDevices is being accessed from both main and background thread in BluetoothControllerImpl. This is leading to an ANR in cases where the resource is being used in the background thread, and the main thread is trying to update it in a synchronized block. Bug: 323995015 Test: local CPU profiling Flag: NONE Change-Id: I72d1a0b61038b29a273c1b712461837e5e065e5e
-rw-r--r--packages/SystemUI/aconfig/systemui.aconfig9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java19
2 files changed, 25 insertions, 3 deletions
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index 56576f1f0c03..407873e02aea 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -420,3 +420,12 @@ flag {
}
}
+flag {
+ name: "get_connected_device_name_unsynchronized"
+ namespace: "systemui"
+ description: "Decide whether to fetch the connected bluetooth device name outside a synchronized block."
+ bug: "323995015"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
index fc2f6e958b32..c089092c9b86 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
@@ -35,6 +35,7 @@ import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfile;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
+import com.android.systemui.Flags;
import com.android.systemui.bluetooth.BluetoothLogger;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
@@ -240,9 +241,21 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa
@WorkerThread
@Override
public String getConnectedDeviceName() {
- synchronized (mConnectedDevices) {
- if (mConnectedDevices.size() == 1) {
- return mConnectedDevices.get(0).getName();
+ if (Flags.getConnectedDeviceNameUnsynchronized()) {
+ CachedBluetoothDevice connectedDevice = null;
+ // Calling the getName() API for CachedBluetoothDevice outside the synchronized block
+ // so that the main thread is not blocked.
+ synchronized (mConnectedDevices) {
+ if (mConnectedDevices.size() == 1) {
+ connectedDevice = mConnectedDevices.get(0);
+ }
+ }
+ return connectedDevice != null ? connectedDevice.getName() : null;
+ } else {
+ synchronized (mConnectedDevices) {
+ if (mConnectedDevices.size() == 1) {
+ return mConnectedDevices.get(0).getName();
+ }
}
}
return null;