Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b9960aa authored by Shuo Qian's avatar Shuo Qian
Browse files

Fix ConcurrentModificationException of getEmergencyNumberList

Test: atest; treehugger
Bug: 171542607
Change-Id: I5812469dfb96f30b5b185fc1bb983e3357bb4efa
Merged-In: I5812469dfb96f30b5b185fc1bb983e3357bb4efa
(cherry picked from commit f4ded970)
parent ea8ca4b8
Loading
Loading
Loading
Loading
+34 −15
Original line number Diff line number Diff line
@@ -12300,23 +12300,15 @@ public class TelephonyManager {
    @NonNull
    public Map<Integer, List<EmergencyNumber>> getEmergencyNumberList(
            @EmergencyServiceCategories int categories) {
        Map<Integer, List<EmergencyNumber>> emergencyNumberList = new HashMap<>();
        Map<Integer, List<EmergencyNumber>> 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<EmergencyNumber> numberList = emergencyNumberList.get(subscriptionId);
                        for (EmergencyNumber number : numberList) {
                            if (!number.isInEmergencyServiceCategories(categories)) {
                                numberList.remove(number);
                            }
                        }
                    }
                }
                return emergencyNumberList;
                Map<Integer, List<EmergencyNumber>> emergencyNumberList =
                        telephony.getEmergencyNumberList(mContext.getOpPackageName(),
                                mContext.getAttributionTag());
                emergencyNumberListForCategories =
                        filterEmergencyNumbersByCategories(emergencyNumberList, categories);
            } else {
                throw new IllegalStateException("telephony service is null.");
            }
@@ -12324,7 +12316,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<Integer, List<EmergencyNumber>> filterEmergencyNumbersByCategories(
            Map<Integer, List<EmergencyNumber>> emergencyNumberList,
                    @EmergencyServiceCategories int categories) {
        Map<Integer, List<EmergencyNumber>> emergencyNumberListForCategories = new HashMap<>();
        if (emergencyNumberList != null) {
            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);
                    }
                }
                emergencyNumberListForCategories.put(
                        subscriptionId, numbersForCategoriesPerSub);
            }
        }
        return emergencyNumberListForCategories;
    }
    /**