From f4ded970a7437c4c2c064cc7dded94da61b8a8a5 Mon Sep 17 00:00:00 2001 From: Shuo Qian Date: Fri, 30 Oct 2020 16:17:14 -0700 Subject: [PATCH] Fix ConcurrentModificationException of getEmergencyNumberList Test: atest; treehugger Bug: 171542607 Change-Id: I5812469dfb96f30b5b185fc1bb983e3357bb4efa --- .../android/telephony/TelephonyManager.java | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index e341e0c19cf5f..246429aae25b9 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -12321,23 +12321,15 @@ public class TelephonyManager { @NonNull public Map> getEmergencyNumberList( @EmergencyServiceCategories int categories) { - Map> emergencyNumberList = new HashMap<>(); + Map> emergencyNumberListForCategories = new HashMap<>(); try { ITelephony telephony = getITelephony(); if (telephony != null) { - emergencyNumberList = telephony.getEmergencyNumberList( - mContext.getOpPackageName(), mContext.getAttributionTag()); - if (emergencyNumberList != null) { - for (Integer subscriptionId : emergencyNumberList.keySet()) { - List numberList = emergencyNumberList.get(subscriptionId); - for (EmergencyNumber number : numberList) { - if (!number.isInEmergencyServiceCategories(categories)) { - numberList.remove(number); - } - } - } - } - return emergencyNumberList; + Map> emergencyNumberList = + telephony.getEmergencyNumberList(mContext.getOpPackageName(), + mContext.getAttributionTag()); + emergencyNumberListForCategories = + filterEmergencyNumbersByCategories(emergencyNumberList, categories); } else { throw new IllegalStateException("telephony service is null."); } @@ -12345,7 +12337,34 @@ public class TelephonyManager { Log.e(TAG, "getEmergencyNumberList with Categories RemoteException", ex); ex.rethrowAsRuntimeException(); } - return emergencyNumberList; + return emergencyNumberListForCategories; + } + + /** + * Filter emergency numbers with categories. + * + * @hide + */ + @VisibleForTesting + public Map> filterEmergencyNumbersByCategories( + Map> emergencyNumberList, + @EmergencyServiceCategories int categories) { + Map> emergencyNumberListForCategories = new HashMap<>(); + if (emergencyNumberList != null) { + 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); + } + } + emergencyNumberListForCategories.put( + subscriptionId, numbersForCategoriesPerSub); + } + } + return emergencyNumberListForCategories; } /**