Fix ConcurrentModificationException getting emergency nums
Telephony API getting emergency number for category sometimes causes
ConcurrentModificationException. This change filters the emergency
number category by itself instead of relying on the buggy API.
There is a separeate bug tracking fix the API at the root.
Fix: 174635447
Test: manual
Change-Id: I88526bc0bdc22993678fcf64ecec455a219bdaaf
diff --git a/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java b/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java
index 12d21ca..1c0e718 100644
--- a/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java
+++ b/packages/SettingsLib/EmergencyNumber/src/com/android/settingslib/emergencynumber/EmergencyNumberUtils.java
@@ -84,8 +84,9 @@
}
private List<EmergencyNumber> getPromotedEmergencyNumbers(int categories) {
- Map<Integer, List<EmergencyNumber>> allLists = mTelephonyManager.getEmergencyNumberList(
- categories);
+ // TODO(b/171542607): Use platform API when its bug is fixed.
+ Map<Integer, List<EmergencyNumber>> allLists = filterEmergencyNumbersByCategories(
+ mTelephonyManager.getEmergencyNumberList(), categories);
if (allLists == null || allLists.isEmpty()) {
Log.w(TAG, "Unable to retrieve emergency number lists!");
return new ArrayList<>();
@@ -130,4 +131,28 @@
}
return promotedEmergencyNumberLists.get(SubscriptionManager.getDefaultSubscriptionId());
}
+
+ /**
+ * Filter emergency numbers with categories.
+ */
+ private Map<Integer, List<EmergencyNumber>> filterEmergencyNumbersByCategories(
+ Map<Integer, List<EmergencyNumber>> emergencyNumberList, int categories) {
+ Map<Integer, List<EmergencyNumber>> filteredMap = new ArrayMap<>();
+ if (emergencyNumberList == null) {
+ return filteredMap;
+ }
+ for (Integer subscriptionId : emergencyNumberList.keySet()) {
+ List<EmergencyNumber> allNumbersForSub = emergencyNumberList.get(
+ subscriptionId);
+ List<EmergencyNumber> numbersForCategoriesPerSub = new ArrayList<>();
+ for (EmergencyNumber number : allNumbersForSub) {
+ if (number.isInEmergencyServiceCategories(categories)) {
+ numbersForCategoriesPerSub.add(number);
+ }
+ }
+ filteredMap.put(
+ subscriptionId, numbersForCategoriesPerSub);
+ }
+ return filteredMap;
+ }
}