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

Commit 7b5ad053 authored by Automerger Merge Worker's avatar Automerger Merge Worker Committed by Tyler Gunn
Browse files

Handle potential IllegalStateExceptions in Telecom.

The EmergencyNumber APIs can potentially throw an IllegalStateException
in some cases.  Adding catch blocks to ensure they don't crash Telecom.

Test: Run telecom unit tests.
Bug: 134100020
Fixes: 152231444
Merged-In: I1705c44e93fe9cdf64feb78f307364f6ec098aad
Change-Id: I1705c44e93fe9cdf64feb78f307364f6ec098aad
(cherry picked from commit b431b6be)
parent e92d8c81
Loading
Loading
Loading
Loading
+18 −7
Original line number Diff line number Diff line
@@ -1199,8 +1199,14 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable,
            // Let's not allow resetting of the emergency flag. Once a call becomes an emergency
            // call, it will remain so for the rest of it's lifetime.
            if (!mIsEmergencyCall) {
                try {
                    mIsEmergencyCall = mHandle != null &&
                        getTelephonyManager().isEmergencyNumber(mHandle.getSchemeSpecificPart());
                            getTelephonyManager().isEmergencyNumber(
                                    mHandle.getSchemeSpecificPart());
                } catch (IllegalStateException ise) {
                    Log.e(this, ise, "setHandle: can't determine if number is emergency");
                    mIsEmergencyCall = false;
                }
                mAnalytics.setCallIsEmergency(mIsEmergencyCall);
            }
            if (!mIsTestEmergencyCall) {
@@ -1215,11 +1221,16 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable,
    }

    private boolean isTestEmergencyCall(String number) {
        Map<Integer, List<EmergencyNumber>> eMap = getTelephonyManager().getEmergencyNumberList();
        try {
            Map<Integer, List<EmergencyNumber>> eMap =
                    getTelephonyManager().getEmergencyNumberList();
            return eMap.values().stream().flatMap(Collection::stream)
                    .anyMatch(eNumber ->
                            eNumber.isFromSources(EmergencyNumber.EMERGENCY_NUMBER_SOURCE_TEST) &&
                                    number.equals(eNumber.getNumber()));
        } catch (IllegalStateException ise) {
            return false;
        }
    }

    public String getCallerDisplayName() {
+11 −3
Original line number Diff line number Diff line
@@ -1947,13 +1947,22 @@ public class CallsManager extends Call.ListenerBase

        boolean endEarly = false;
        String disconnectReason = "";

        String callRedirectionApp = mRoleManagerAdapter.getDefaultCallRedirectionApp();

        boolean isPotentialEmergencyNumber;
        try {
            isPotentialEmergencyNumber =
                    handle != null && getTelephonyManager().isPotentialEmergencyNumber(
                            handle.getSchemeSpecificPart());
        } catch (IllegalStateException ise) {
            isPotentialEmergencyNumber = false;
        }

        if (shouldCancelCall) {
            Log.w(this, "onCallRedirectionComplete: call is canceled");
            endEarly = true;
            disconnectReason = "Canceled from Call Redirection Service";

            // Show UX when user-defined call redirection service does not response; the UX
            // is not needed to show if the call is disconnected (e.g. by the user)
            if (uiAction.equals(CallRedirectionProcessor.UI_TYPE_USER_DEFINED_TIMEOUT)
@@ -1974,8 +1983,7 @@ public class CallsManager extends Call.ListenerBase
            Log.w(this, "onCallRedirectionComplete: phoneAccountHandle is null");
            endEarly = true;
            disconnectReason = "Null phoneAccountHandle from Call Redirection Service";
        } else if (getTelephonyManager().isPotentialEmergencyNumber(
                handle.getSchemeSpecificPart())) {
        } else if (isPotentialEmergencyNumber) {
            Log.w(this, "onCallRedirectionComplete: emergency number %s is redirected from Call"
                    + " Redirection Service", handle.getSchemeSpecificPart());
            endEarly = true;
+7 −3
Original line number Diff line number Diff line
@@ -70,8 +70,12 @@ public final class TelephonyUtil {
    }

    public static boolean shouldProcessAsEmergency(Context context, Uri handle) {
        try {
            TelephonyManager tm = (TelephonyManager) context.getSystemService(
                    Context.TELEPHONY_SERVICE);
            return handle != null && tm.isEmergencyNumber(handle.getSchemeSpecificPart());
        } catch (IllegalStateException ise) {
            return false;
        }
    }
}