Prevent ANR while receiving volume broadcasts to update slices

Use ConcurrentHashMap for registering Uri to the audio stream, and
remove synchronized blocks from the receiver.

Fix: 302234235
Fix: 301777614
Test: manual, robotest
Change-Id: I5cca209baf9756aebb8ff44b7e8e9671d2c7aaad
This commit is contained in:
Jason Chiu
2023-11-08 18:10:00 +08:00
parent c5f2ce6f25
commit 769fbae59f

View File

@@ -24,7 +24,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.net.Uri;
import android.util.ArrayMap;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
@@ -32,6 +31,7 @@ import androidx.annotation.VisibleForTesting;
import com.android.settingslib.SliceBroadcastRelay;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* This helper is to handle the broadcasts of volume slices
@@ -41,7 +41,7 @@ public class VolumeSliceHelper {
private static final String TAG = "VolumeSliceHelper";
@VisibleForTesting
static Map<Uri, Integer> sRegisteredUri = new ArrayMap<>();
static Map<Uri, Integer> sRegisteredUri = new ConcurrentHashMap<>();
@VisibleForTesting
static IntentFilter sIntentFilter;
@@ -133,7 +133,6 @@ public class VolumeSliceHelper {
}
private static void handleStreamChanged(Context context, int inputType) {
synchronized (sRegisteredUri) {
for (Map.Entry<Uri, Integer> entry : sRegisteredUri.entrySet()) {
if (entry.getValue() == inputType) {
context.getContentResolver().notifyChange(entry.getKey(), null /* observer */);
@@ -143,13 +142,10 @@ public class VolumeSliceHelper {
}
}
}
}
private static void notifyAllStreamsChanged(Context context) {
synchronized (sRegisteredUri) {
sRegisteredUri.forEach((uri, audioStream) -> {
sRegisteredUri.keySet().forEach(uri -> {
context.getContentResolver().notifyChange(uri, null /* observer */);
});
}
}
}