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

Commit 8e6de2f1 authored by Shuo Qian's avatar Shuo Qian
Browse files

Remove prefix for emergency number address while dialing per carrier requirement

Test: atest RILTest#testDialEmergencyNumberWithoutPrefix
Bug: 182126268
Change-Id: Ib9c72e94685e56940b0f4c06d05696b353ed7c48
Merged-In: Ib9c72e94685e56940b0f4c06d05696b353ed7c48
(cherry picked from commit 061d5b38)
parent 6083c272
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import android.os.Build;
import android.os.Handler;
import android.os.HwBinder;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.os.RemoteException;
@@ -79,6 +80,7 @@ import android.provider.Settings;
import android.service.carrier.CarrierIdentifier;
import android.sysprop.TelephonyProperties;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierRestrictionRules;
import android.telephony.CellInfo;
import android.telephony.CellSignalStrengthCdma;
@@ -129,6 +131,7 @@ import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.nano.TelephonyProto.SmsSession;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.telephony.util.ArrayUtils;
import com.android.internal.telephony.util.TelephonyUtils;
import com.android.telephony.Rlog;

@@ -1300,10 +1303,39 @@ public class RIL extends BaseCommands implements CommandsInterface {
        }
    }

    private String getEmergencyNumberAddressWithoutPrefix(String address) {
        SubscriptionManager subscriptionManager = mContext.getSystemService(
                SubscriptionManager.class);
        int subId = subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(
                mPhoneId).getSubscriptionId();
        CarrierConfigManager configMgr = mContext.getSystemService(CarrierConfigManager.class);
        if (configMgr == null) {
            return null;
        }
        PersistableBundle b = configMgr.getConfigForSubId(subId);
        String[] prefixes = b == null ? null : b.getStringArray(
                CarrierConfigManager.KEY_EMERGENCY_NUMBER_PREFIX_STRING_ARRAY);
        if (ArrayUtils.isEmpty(prefixes)) {
            return address;
        }
        for (String prefix : prefixes) {
            // If emergencyNumber starts with this prefix, remove this prefix to retrieve the
            // actual emergency number.
            if (!TextUtils.isEmpty(prefix) && address.startsWith(prefix)) {
                return address.substring(prefix.length());
            }
        }
        return address;
    }

    @Override
    public void dial(String address, boolean isEmergencyCall, EmergencyNumber emergencyNumberInfo,
                     boolean hasKnownUserIntentEmergency, int clirMode, UUSInfo uusInfo,
                     Message result) {
        // Remove prefix while dialing emergency number with modem
        if (isEmergencyCall) {
            address = getEmergencyNumberAddressWithoutPrefix(address);
        }
        if (isEmergencyCall && mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_4)
                && emergencyNumberInfo != null) {
            emergencyDial(address, emergencyNumberInfo, hasKnownUserIntentEmergency, clirMode,
+62 −0
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ import android.content.pm.ApplicationInfo;
import android.hardware.radio.V1_0.Carrier;
import android.hardware.radio.V1_0.CdmaSmsMessage;
import android.hardware.radio.V1_0.DataProfileInfo;
import android.hardware.radio.V1_0.Dial;
import android.hardware.radio.V1_0.GsmSmsMessage;
import android.hardware.radio.V1_0.ImsSmsMessage;
import android.hardware.radio.V1_0.NvWriteItem;
@@ -114,6 +115,7 @@ import android.hardware.radio.V1_0.RadioResponseInfo;
import android.hardware.radio.V1_0.RadioResponseType;
import android.hardware.radio.V1_0.RadioTechnologyFamily;
import android.hardware.radio.V1_0.SmsWriteArgs;
import android.hardware.radio.V1_0.UusInfo;
import android.hardware.radio.V1_6.IRadio;
import android.hardware.radio.deprecated.V1_0.IOemHook;
import android.net.ConnectivityManager;
@@ -124,10 +126,12 @@ import android.os.IPowerManager;
import android.os.IThermalService;
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.PowerManager;
import android.os.WorkSource;
import android.service.carrier.CarrierIdentifier;
import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
import android.telephony.CellIdentityCdma;
import android.telephony.CellIdentityGsm;
import android.telephony.CellIdentityLte;
@@ -153,6 +157,7 @@ import android.telephony.RadioAccessSpecifier;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.SmsManager;
import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
@@ -161,6 +166,7 @@ import android.telephony.data.EpsQos;
import android.telephony.data.QosBearerFilter;
import android.telephony.data.QosBearerSession;
import android.telephony.data.TrafficDescriptor;
import android.telephony.emergency.EmergencyNumber;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

@@ -196,6 +202,10 @@ public class RILTest extends TelephonyTest {
    // refer to RIL#DEFAULT_WAKE_LOCK_TIMEOUT_MS
    private static final int DEFAULT_WAKE_LOCK_TIMEOUT_MS = 60000;

    @Mock
    private CarrierConfigManager mMockCarrierConfigManager;
    @Mock
    private SubscriptionInfo mSubscriptionInfo;
    @Mock
    private ConnectivityManager mConnectionManager;
    @Mock
@@ -216,6 +226,7 @@ public class RILTest extends TelephonyTest {
    private RIL mRILInstance;
    private RIL mRILUnderTest;
    ArgumentCaptor<Integer> mSerialNumberCaptor = ArgumentCaptor.forClass(Integer.class);
    ArgumentCaptor<Dial> mDialArgumentCaptor = ArgumentCaptor.forClass(Dial.class);

    // Constants
    private static final String ALPHA_LONG = "long";
@@ -300,6 +311,10 @@ public class RILTest extends TelephonyTest {
        Context context = new ContextFixture().getTestDouble();
        doReturn(true).when(mConnectionManager)
            .isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
        doReturn(mSubscriptionManager).when(context)
                .getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
        doReturn(mMockCarrierConfigManager).when(context)
                .getSystemService(Context.CARRIER_CONFIG_SERVICE);
        doReturn(mConnectionManager).when(context)
            .getSystemService(Context.CONNECTIVITY_SERVICE);
        doReturn(mTelephonyManager).when(context)
@@ -750,6 +765,53 @@ public class RILTest extends TelephonyTest {
        verifyRILResponse(mRILUnderTest, mSerialNumberCaptor.getValue(), RIL_REQUEST_DTMF);
    }

    private void setEmergencyNumberPrefixCarrierConfig(String[] prefixes) {
        doReturn(mSubscriptionInfo).when(mSubscriptionManager)
                .getActiveSubscriptionInfoForSimSlotIndex(anyInt());
        doReturn(0).when(mSubscriptionInfo).getSubscriptionId();

        final PersistableBundle bundle = new PersistableBundle();
        bundle.putStringArray(
                CarrierConfigManager.KEY_EMERGENCY_NUMBER_PREFIX_STRING_ARRAY, prefixes);
        doReturn(bundle).when(mMockCarrierConfigManager).getConfigForSubId(anyInt());
    }

    @FlakyTest
    @Test
    public void testDialEmergencyNumberWithoutPrefix() throws Exception {
        String[] prefixes = {"999"};
        setEmergencyNumberPrefixCarrierConfig(prefixes);

        String addressWithPrefix = "99912345";
        boolean isEmergencyCall = true;
        EmergencyNumber emergencyNumber = new EmergencyNumber(
                "99912345",
                "us",
                "30",
                EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED,
                new ArrayList<String>(),
                EmergencyNumber.EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING,
                EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL);
        boolean hasKnownUserIntentEmergency = true;
        int clirMode = 0;
        UUSInfo uusInfo = null;
        Message result = obtainMessage();

        Dial dialInfo = new Dial();
        dialInfo.address = "12345";
        dialInfo.clir = clirMode;
        if (uusInfo != null) {
            UusInfo info = new UusInfo();
            dialInfo.uusInfo.add(info);
        }

        mRILUnderTest.dial(addressWithPrefix, isEmergencyCall, emergencyNumber,
                hasKnownUserIntentEmergency, clirMode, uusInfo, result);
        verify(mRadioProxy).dial(mSerialNumberCaptor.capture(),
                mDialArgumentCaptor.capture());
        assertEquals(mDialArgumentCaptor.getValue().address, "12345");
    }

    @FlakyTest
    @Test
    public void testSendSMS() throws Exception {