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

Commit ac4d7406 authored by Fan Zhang's avatar Fan Zhang
Browse files

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
parent 0433f42f
Loading
Loading
Loading
Loading
+27 −2
Original line number Diff line number Diff line
@@ -84,8 +84,9 @@ public class EmergencyNumberUtils {
    }

    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 @@ public class EmergencyNumberUtils {
        }
        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;
    }
}