Loading src/java/com/android/internal/telephony/CommandsInterface.java +4 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading src/java/com/android/internal/telephony/Connection.java +95 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. */ Loading Loading @@ -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. Loading src/java/com/android/internal/telephony/GsmCdmaCallTracker.java +9 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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); Loading src/java/com/android/internal/telephony/GsmCdmaConnection.java +39 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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} */ Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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; } Loading src/java/com/android/internal/telephony/RIL.java +44 −3 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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 Loading
src/java/com/android/internal/telephony/CommandsInterface.java +4 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading
src/java/com/android/internal/telephony/Connection.java +95 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. */ Loading Loading @@ -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. Loading
src/java/com/android/internal/telephony/GsmCdmaCallTracker.java +9 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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); Loading
src/java/com/android/internal/telephony/GsmCdmaConnection.java +39 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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} */ Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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; } Loading
src/java/com/android/internal/telephony/RIL.java +44 −3 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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