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

Commit 7887de41 authored by sqian's avatar sqian Committed by Shuo Qian
Browse files

Add Emergency Call Routing field

Some countries or carriers require some emergency numbers that must
be handled with normal call routing or emergency routing.

Do not send service types from the database
as the emergency service categoreis

When searching for the corresponding service categories,
try to find the one that comes from the radio indication.

Use the same rule to set Emergency call information for connection and
ImsProfile as the phone selection rule that is applied to
TelephonyConnectionService

Test: Treehugger
Bug: 112657134
Change-Id: Idcaae194cf43ee2c82a20c2359b189a23dc4d387
parent 20e94afa
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.telephony.ClientRequestStats;
import android.telephony.ImsiEncryptionInfo;
import android.telephony.NetworkScanRequest;
import android.telephony.data.DataProfile;
import android.telephony.emergency.EmergencyNumber;

import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
import com.android.internal.telephony.dataconnection.TransportManager;
@@ -824,7 +825,7 @@ public interface CommandsInterface {
     * CLIR_SUPPRESSION == on "CLIR suppression" (allow CLI presentation)
     * CLIR_INVOCATION  == on "CLIR invocation" (restrict CLI presentation)
     */
    void dial(String address, boolean isEmergencyCall, int emergencyServiceCategories,
    void dial(String address, boolean isEmergencyCall, EmergencyNumber emergencyNumberInfo,
              int clirMode, Message result);

    /**
@@ -838,7 +839,7 @@ public interface CommandsInterface {
     * CLIR_SUPPRESSION == on "CLIR suppression" (allow CLI presentation)
     * CLIR_INVOCATION  == on "CLIR invocation" (restrict CLI presentation)
     */
    void dial(String address, boolean isEmergencyCall, int emergencyServiceCategories,
    void dial(String address, boolean isEmergencyCall, EmergencyNumber emergencyNumberInfo,
              int clirMode, UUSInfo uusInfo, Message result);

    /**
+28 −70
Original line number Diff line number Diff line
@@ -24,9 +24,10 @@ import android.telephony.DisconnectCause;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories;
import android.util.Log;

import com.android.internal.telephony.emergency.EmergencyNumberTracker;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -231,25 +232,10 @@ public abstract class Connection {
    private boolean mIsEmergencyCall;

    /**
     * The emergency service categories, only valid if {@link #isEmergencyCall()} returns
     * {@code true}
     *
     * If valid, the value is the bitwise-OR combination of the following constants:
     * <ol>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_POLICE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_AMBULANCE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_FIRE_BRIGADE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MARINE_GUARD} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MOUNTAIN_RESCUE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MIEC} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_AIEC} </li>
     * </ol>
     *
     * Reference: 3gpp 23.167, Section 6 - Functional description;
     *            3gpp 22.101, Section 10 - Emergency Calls.
     * The emergency number information, only valid if {@link #isEmergencyCall} returns
     * {@code true}.
     */
    private int mEmergencyServiceCategories;
    private EmergencyNumber mEmergencyNumberInfo;

    /**
     * When {@code true}, the network has indicated that this is an emergency call.
@@ -468,63 +454,35 @@ public abstract class Connection {
    }

    /**
     * Sets whether this call is an emergency call or not.
     * Get the emergency number info. The value is valid only if {@link #isEmergencyCall()}
     * returns {@code true}.
     *
     * @param isEmergencyCall {@code true} if the call is an emergency call,
     *                        or {@code false} otherwise.
     * @return the emergency number info
     */
    public void setEmergencyCall(boolean isEmergencyCall) {
        mIsEmergencyCall = isEmergencyCall;
    public EmergencyNumber getEmergencyNumberInfo() {
        return mEmergencyNumberInfo;
    }


    /**
     * Set the emergency service categories. The set value is valid only if
     * {@link #getEmergencyServiceCategories()} returns {@code true}
     *
     * @return the emergency service categories,
     * Set the emergency numbe information if it is an emergency call.
     *
     * If valid, the value is the bitwise-OR combination of the following constants:
     * <ol>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_POLICE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_AMBULANCE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_FIRE_BRIGADE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MARINE_GUARD} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MOUNTAIN_RESCUE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MIEC} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_AIEC} </li>
     * </ol>
     *
     * Reference: 3gpp 23.167, Section 6 - Functional description;
     *            3gpp 22.101, Section 10 - Emergency Calls.
     * @hide
     */
    public @EmergencyServiceCategories int getEmergencyServiceCategories() {
        return mEmergencyServiceCategories;
    public void setEmergencyCallInfo() {
        Call call = getCall();
        if (call != null) {
            Phone phone = call.getPhone();
            if (phone != null) {
                EmergencyNumberTracker tracker = phone.getEmergencyNumberTracker();
                if (tracker != null) {
                    EmergencyNumber num = tracker.getEmergencyNumber(mAddress);
                    if (num != null) {
                        mIsEmergencyCall = true;
                        mEmergencyNumberInfo = num;
                    }
                }
            }
        }

    /**
     * Set the emergency service categories. The set value is valid only if
     * {@link #getEmergencyServiceCategories()} returns {@code true}
     *
     * If valid, the value is the bitwise-OR combination of the following constants:
     * <ol>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_POLICE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_AMBULANCE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_FIRE_BRIGADE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MARINE_GUARD} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MOUNTAIN_RESCUE} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MIEC} </li>
     * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_AIEC} </li>
     * </ol>
     *
     * Reference: 3gpp 23.167, Section 6 - Functional description;
     *            3gpp 22.101, Section 10 - Emergency Calls.
     */
    public void setEmergencyServiceCategories(
            @EmergencyServiceCategories int emergencyServiceCategories) {
        mEmergencyServiceCategories = emergencyServiceCategories;
    }

    /**
+4 −4
Original line number Diff line number Diff line
@@ -331,7 +331,7 @@ public class GsmCdmaCallTracker extends CallTracker {
            setMute(false);

            mCi.dial(mPendingMO.getAddress(), mPendingMO.isEmergencyCall(),
                    mPendingMO.getEmergencyServiceCategories(), clirMode, uusInfo,
                    mPendingMO.getEmergencyNumberInfo(), clirMode, uusInfo,
                    obtainCompleteMessage());
        }

@@ -448,7 +448,7 @@ public class GsmCdmaCallTracker extends CallTracker {
            // In Ecm mode, if another emergency call is dialed, Ecm mode will not exit.
            if(!isPhoneInEcmMode || (isPhoneInEcmMode && isEmergencyCall)) {
                mCi.dial(mPendingMO.getAddress(), mPendingMO.isEmergencyCall(),
                        mPendingMO.getEmergencyServiceCategories(), clirMode,
                        mPendingMO.getEmergencyNumberInfo(), clirMode,
                        obtainCompleteMessage());
            } else {
                mPhone.exitEmergencyCallbackMode();
@@ -1534,8 +1534,8 @@ public class GsmCdmaCallTracker extends CallTracker {
                    // no matter the result, we still do the same here
                    if (mPendingCallInEcm) {
                        mCi.dial(mPendingMO.getAddress(), mPendingMO.isEmergencyCall(),
                                mPendingMO.getEmergencyServiceCategories(), mPendingCallClirMode,
                                obtainCompleteMessage());
                                mPendingMO.getEmergencyNumberInfo(),
                                mPendingCallClirMode, obtainCompleteMessage());
                        mPendingCallInEcm = false;
                    }
                    mPhone.unsetOnEcbModeExitResponse(this);
+4 −36
Original line number Diff line number Diff line
@@ -29,9 +29,6 @@ import android.telephony.DisconnectCause;
import android.telephony.PhoneNumberUtils;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories;
import android.text.TextUtils;

import com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
@@ -40,10 +37,6 @@ import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
import com.android.internal.telephony.uicc.UiccCardApplication;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * {@hide}
 */
@@ -140,8 +133,7 @@ public class GsmCdmaConnection extends Connection {
        mHandler = new MyHandler(mOwner.getLooper());

        mAddress = dc.number;
        setEmergencyCall(TelephonyManager.getDefault().isCurrentEmergencyNumber(mAddress));
        setEmergencyServiceCategories(fetchEmergencyServiceCategories());
        setEmergencyCallInfo();

        mIsIncoming = dc.isMT;
        mCreateTime = System.currentTimeMillis();
@@ -183,8 +175,9 @@ public class GsmCdmaConnection extends Connection {
        }

        mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString);
        setEmergencyCall(isEmergencyCall);
        setEmergencyServiceCategories(fetchEmergencyServiceCategories());
        if (isEmergencyCall) {
            setEmergencyCallInfo();
        }

        mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString);

@@ -1131,31 +1124,6 @@ public class GsmCdmaConnection extends Connection {
        }
    }

    private @EmergencyServiceCategories int fetchEmergencyServiceCategories() {
        Map<Integer, List<EmergencyNumber>> emergencyNumberListInternal = new HashMap<>();
        for (Phone phone: PhoneFactory.getPhones()) {
            if (phone.getEmergencyNumberTracker() != null
                    && phone.getEmergencyNumberTracker().getEmergencyNumberList() != null) {
                emergencyNumberListInternal.put(
                        phone.getSubId(),
                        phone.getEmergencyNumberTracker().getEmergencyNumberList());
            }
        }
        if (emergencyNumberListInternal != null) {
            for (List<EmergencyNumber> emergencyNumberList
                    : emergencyNumberListInternal.values()) {
                if (emergencyNumberList != null) {
                    for (EmergencyNumber num : emergencyNumberList) {
                        if (num.getNumber().equals(mAddress)) {
                            return num.getEmergencyServiceCategoryBitmask();
                        }
                    }
                }
            }
        }
        return EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED;
    }

    private boolean isPhoneTypeGsm() {
        return mOwner.getPhone().getPhoneType() == PhoneConstants.PHONE_TYPE_GSM;
    }
+12 −0
Original line number Diff line number Diff line
@@ -3861,6 +3861,18 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
        return mDcTrackers.get(transportType);
    }

    /**
     * Get the HAL version.
     *
     * @return the current HalVersion
     */
    public HalVersion getHalVersion() {
        if (mCi != null && mCi instanceof RIL) {
            return ((RIL) mCi).getHalVersion();
        }
        return RIL.RADIO_HAL_VERSION_UNKNOWN;
    }

    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        pw.println("Phone: subId=" + getSubId());
        pw.println(" mPhoneId=" + mPhoneId);
Loading