Merge "Synchronize the ArrayMap.put method calls." into main
diff --git a/core/java/android/app/BroadcastStickyCache.java b/core/java/android/app/BroadcastStickyCache.java
index fe2e107..0b6cf59 100644
--- a/core/java/android/app/BroadcastStickyCache.java
+++ b/core/java/android/app/BroadcastStickyCache.java
@@ -35,6 +35,7 @@
import android.util.ArrayMap;
import android.view.WindowManagerPolicyConstants;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
@@ -71,8 +72,10 @@
@VisibleForTesting
public static final ArrayMap<String, String> sActionApiNameMap = new ArrayMap<>();
+ @GuardedBy("BroadcastStickyCache.class")
private static final ArrayMap<String, IpcDataCache.Config> sActionConfigMap = new ArrayMap<>();
+ @GuardedBy("BroadcastStickyCache.class")
private static final ArrayMap<StickyBroadcastFilter, IpcDataCache<Void, Intent>>
sFilterCacheMap = new ArrayMap<>();
@@ -154,37 +157,44 @@
@Nullable String broadcastPermission,
@UserIdInt int userId,
@RegisterReceiverFlags int flags) {
- IpcDataCache<Void, Intent> intentDataCache = findIpcDataCache(filter);
+ IpcDataCache<Void, Intent> intentDataCache;
- if (intentDataCache == null) {
- final String action = filter.getAction(0);
- final StickyBroadcastFilter stickyBroadcastFilter =
- new StickyBroadcastFilter(filter, action);
- final Config config = getConfig(action);
+ synchronized (BroadcastStickyCache.class) {
+ intentDataCache = findIpcDataCache(filter);
- intentDataCache =
- new IpcDataCache<>(config,
- (query) -> ActivityManager.getService().registerReceiverWithFeature(
- applicationThread,
- mBasePackageName,
- attributionTag,
- /* receiverId= */ "null",
- /* receiver= */ null,
- filter,
- broadcastPermission,
- userId,
- flags));
- sFilterCacheMap.put(stickyBroadcastFilter, intentDataCache);
+ if (intentDataCache == null) {
+ final String action = filter.getAction(0);
+ final StickyBroadcastFilter stickyBroadcastFilter =
+ new StickyBroadcastFilter(filter, action);
+ final Config config = getConfig(action);
+
+ intentDataCache =
+ new IpcDataCache<>(config,
+ (query) -> ActivityManager.getService().registerReceiverWithFeature(
+ applicationThread,
+ mBasePackageName,
+ attributionTag,
+ /* receiverId= */ "null",
+ /* receiver= */ null,
+ filter,
+ broadcastPermission,
+ userId,
+ flags));
+ sFilterCacheMap.put(stickyBroadcastFilter, intentDataCache);
+ }
}
return intentDataCache.query(null);
}
@VisibleForTesting
public static void clearCacheForTest() {
- sFilterCacheMap.clear();
+ synchronized (BroadcastStickyCache.class) {
+ sFilterCacheMap.clear();
+ }
}
@Nullable
+ @GuardedBy("BroadcastStickyCache.class")
private static IpcDataCache<Void, Intent> findIpcDataCache(
@NonNull IntentFilter filter) {
for (int i = sFilterCacheMap.size() - 1; i >= 0; i--) {
@@ -198,6 +208,7 @@
}
@NonNull
+ @GuardedBy("BroadcastStickyCache.class")
private static IpcDataCache.Config getConfig(@NonNull String action) {
if (!sActionConfigMap.containsKey(action)) {
// We only need 1 entry per cache but just to be on the safer side we are choosing 32