From ac4d74068166677387e69dd1aebc550807d8271b Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 3 Dec 2020 12:59:47 -0800 Subject: [PATCH] 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 --- .../emergencynumber/EmergencyNumberUtils.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) 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 12d21cae48d4e..1c0e718a17b20 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 @@ public class EmergencyNumberUtils { } private List getPromotedEmergencyNumbers(int categories) { - Map> allLists = mTelephonyManager.getEmergencyNumberList( - categories); + // TODO(b/171542607): Use platform API when its bug is fixed. + Map> 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 @@ public class EmergencyNumberUtils { } return promotedEmergencyNumberLists.get(SubscriptionManager.getDefaultSubscriptionId()); } + + /** + * Filter emergency numbers with categories. + */ + private Map> filterEmergencyNumbersByCategories( + Map> emergencyNumberList, int categories) { + Map> filteredMap = new ArrayMap<>(); + if (emergencyNumberList == null) { + return filteredMap; + } + for (Integer subscriptionId : emergencyNumberList.keySet()) { + List allNumbersForSub = emergencyNumberList.get( + subscriptionId); + List numbersForCategoriesPerSub = new ArrayList<>(); + for (EmergencyNumber number : allNumbersForSub) { + if (number.isInEmergencyServiceCategories(categories)) { + numbersForCategoriesPerSub.add(number); + } + } + filteredMap.put( + subscriptionId, numbersForCategoriesPerSub); + } + return filteredMap; + } }