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

Commit 94ddffc0 authored by Shuo Qian's avatar Shuo Qian Committed by android-build-merger
Browse files

Merge "Add Emergency Dial into RIL/RIL response and Migrate function into...

Merge "Add Emergency Dial into RIL/RIL response and Migrate function into EmergencyNumberTracker" am: 80c72b56
am: 2b35b3ef

Change-Id: I93e282f62644ab3187fdbb75a796daf4ba317dfa
parents fae6df8a 2b35b3ef
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -825,7 +825,8 @@ public interface CommandsInterface {
     * CLIR_SUPPRESSION == on "CLIR suppression" (allow CLI presentation)
     * CLIR_INVOCATION  == on "CLIR invocation" (restrict CLI presentation)
     */
    void dial (String address, int clirMode, Message result);
    void dial(String address, boolean isEmergencyCall, int emergencyServiceCategories,
               int clirMode, Message result);

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

    /**
     *  returned message
+95 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import android.telecom.ConferenceParticipant;
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 java.util.ArrayList;
@@ -226,6 +228,29 @@ public abstract class Connection {
    private boolean mAnsweringDisconnectsActiveCall;
    private boolean mAllowAddCallDuringVideoCall;

    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.
     */
    private int mEmergencyServiceCategories;

    /**
     * When {@code true}, the network has indicated that this is an emergency call.
     */
@@ -432,6 +457,76 @@ public abstract class Connection {
        mIsIncoming = isIncoming;
    }

    /**
     * Checks if the connection is for an emergency call.
     *
     * @return {@code true} if the call is an emergency call
     *         or {@code false} otherwise.
     */
    public boolean isEmergencyCall() {
        return mIsEmergencyCall;
    }

    /**
     * Sets whether this call is an emergency call or not.
     *
     * @param isEmergencyCall {@code true} if the call is an emergency call,
     *                        or {@code false} otherwise.
     */
    public void setEmergencyCall(boolean isEmergencyCall) {
        mIsEmergencyCall = isEmergencyCall;
    }


    /**
     * Set the emergency service categories. The set value is valid only if
     * {@link #getEmergencyServiceCategories()} returns {@code true}
     *
     * @return the emergency service categories,
     *
     * 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 @EmergencyServiceCategories int getEmergencyServiceCategories() {
        return mEmergencyServiceCategories;
    }

    /**
     * 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;
    }

    /**
     * If this Connection is connected, then it is associated with
     * a Call.
+9 −3
Original line number Diff line number Diff line
@@ -330,7 +330,9 @@ public class GsmCdmaCallTracker extends CallTracker {
            // Always unmute when initiating a new call
            setMute(false);

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

        if (mNumberConverted) {
@@ -445,7 +447,9 @@ 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(), clirMode, obtainCompleteMessage());
                mCi.dial(mPendingMO.getAddress(), mPendingMO.isEmergencyCall(),
                        mPendingMO.getEmergencyServiceCategories(), clirMode,
                        obtainCompleteMessage());
            } else {
                mPhone.exitEmergencyCallbackMode();
                mPhone.setOnEcbModeExitResponse(this,EVENT_EXIT_ECM_RESPONSE_CDMA, null);
@@ -1529,7 +1533,9 @@ public class GsmCdmaCallTracker extends CallTracker {
                if (!isPhoneTypeGsm()) {
                    // no matter the result, we still do the same here
                    if (mPendingCallInEcm) {
                        mCi.dial(mPendingMO.getAddress(), mPendingCallClirMode, obtainCompleteMessage());
                        mCi.dial(mPendingMO.getAddress(), mPendingMO.isEmergencyCall(),
                                mPendingMO.getEmergencyServiceCategories(), mPendingCallClirMode,
                                obtainCompleteMessage());
                        mPendingCallInEcm = false;
                    }
                    mPhone.unsetOnEcbModeExitResponse(this);
+39 −5
Original line number Diff line number Diff line
@@ -29,6 +29,9 @@ 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;
@@ -37,6 +40,10 @@ 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}
 */
@@ -73,8 +80,6 @@ public class GsmCdmaConnection extends Connection {

    private PowerManager.WakeLock mPartialWakeLock;

    private boolean mIsEmergencyCall = false;

    // The cached delay to be used between DTMF tones fetched from carrier config.
    private int mDtmfToneDelay = 0;

@@ -135,7 +140,9 @@ public class GsmCdmaConnection extends Connection {
        mHandler = new MyHandler(mOwner.getLooper());

        mAddress = dc.number;
        mIsEmergencyCall = PhoneNumberUtils.isLocalEmergencyNumber(phone.getContext(), mAddress);
        setEmergencyCall(TelephonyManager.getDefault().isCurrentEmergencyNumber(mAddress));
        setEmergencyServiceCategories(fetchEmergencyServiceCategories());

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

        mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString);
        mIsEmergencyCall = isEmergencyCall;
        setEmergencyCall(isEmergencyCall);
        setEmergencyServiceCategories(fetchEmergencyServiceCategories());

        mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString);

        mIndex = -1;
@@ -540,7 +549,7 @@ public class GsmCdmaConnection extends Connection {
                if (serviceState == ServiceState.STATE_POWER_OFF) {
                    return DisconnectCause.POWER_OFF;
                }
                if (!mIsEmergencyCall) {
                if (!isEmergencyCall()) {
                    // Only send OUT_OF_SERVICE if it is not an emergency call. We can still
                    // technically be in STATE_OUT_OF_SERVICE or STATE_EMERGENCY_ONLY during
                    // an emergency call and when it ends, we do not want to mistakenly generate
@@ -1122,6 +1131,31 @@ 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;
    }
+44 −3
Original line number Diff line number Diff line
@@ -851,12 +851,20 @@ public class RIL extends BaseCommands implements CommandsInterface {
    }

    @Override
    public void dial(String address, int clirMode, Message result) {
        dial(address, clirMode, null, result);
    public void dial(String address, boolean isEmergencyCall, int emergencyServiceCategories,
                     int clirMode, Message result) {
        dial(address, isEmergencyCall, emergencyServiceCategories, clirMode, null, result);
    }

    @Override
    public void dial(String address, int clirMode, UUSInfo uusInfo, Message result) {
    public void dial(String address, boolean isEmergencyCall, int emergencyServiceCategories,
                     int clirMode, UUSInfo uusInfo, Message result) {
        if (isEmergencyCall && mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_4)) {
            emergencyDial(address, emergencyServiceCategories, clirMode, uusInfo,
                    result);
            return;
        }

        IRadio radioProxy = getRadioProxy(result);
        if (radioProxy != null) {
            RILRequest rr = obtainRequest(RIL_REQUEST_DIAL, result,
@@ -886,6 +894,39 @@ public class RIL extends BaseCommands implements CommandsInterface {
        }
    }

    private void emergencyDial(String address, int emergencyServiceCategories, int clirMode,
                              UUSInfo uusInfo, Message result) {
        IRadio radioProxy = getRadioProxy(result);
        // IRadio V1.4
        android.hardware.radio.V1_4.IRadio radioProxy14 =
                (android.hardware.radio.V1_4.IRadio) radioProxy;
        if (radioProxy != null) {
            RILRequest rr = obtainRequest(RIL_REQUEST_EMERGENCY_DIAL, result,
                    mRILDefaultWorkSource);
            Dial dialInfo = new Dial();
            dialInfo.address = convertNullToEmptyString(address);
            dialInfo.clir = clirMode;
            if (uusInfo != null) {
                UusInfo info = new UusInfo();
                info.uusType = uusInfo.getType();
                info.uusDcs = uusInfo.getDcs();
                info.uusData = new String(uusInfo.getUserData());
                dialInfo.uusInfo.add(info);
            }

            if (RILJ_LOGD) {
                // Do not log function arg for privacy
                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
            }

            try {
                radioProxy14.emergencyDial(rr.mSerial, dialInfo, emergencyServiceCategories);
            } catch (RemoteException | RuntimeException e) {
                handleRadioProxyExceptionForRR(rr, "emergencyDial", e);
            }
        }
    }

    @Override
    public void getIMSI(Message result) {
        getIMSIForApp(null, result);
Loading