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

Commit a111d5ed authored by Joonhun Shin's avatar Joonhun Shin Committed by Android (Google) Code Review
Browse files

Merge "Using carrier config value if there is no value of the call forward no...

Merge "Using carrier config value if there is no value of the call forward no reply time from MMI code" into main
parents 0deed7fe a0d82b1e
Loading
Loading
Loading
Loading
+8 −9
Original line number Diff line number Diff line
@@ -1016,8 +1016,8 @@ public class ImsPhone extends ImsPhoneBase {

        // Only look at the Network portion for mmi
        String networkPortion = PhoneNumberUtils.extractNetworkPortionAlt(newDialString);
        ImsPhoneMmiCode mmi =
                ImsPhoneMmiCode.newFromDialString(networkPortion, this, wrappedCallback);
        ImsPhoneMmiCode mmi =  ImsPhoneMmiCode.newFromDialString(networkPortion, this,
                wrappedCallback, mFeatureFlags);
        if (DBG) logd("dialInternal: dialing w/ mmi '" + mmi + "'...");

        if (mmi == null) {
@@ -1440,12 +1440,13 @@ public class ImsPhone extends ImsPhoneBase {
    }

    @Override
    public void sendUssdResponse(String ussdMessge) {
    public void sendUssdResponse(String ussdMessage) {
        logd("sendUssdResponse");
        ImsPhoneMmiCode mmi = ImsPhoneMmiCode.newFromUssdUserInput(ussdMessge, this);
        ImsPhoneMmiCode mmi = ImsPhoneMmiCode.newFromUssdUserInput(ussdMessage, this,
                mFeatureFlags);
        mPendingMMIs.add(mmi);
        mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
        mmi.sendUssd(ussdMessge);
        mmi.sendUssd(ussdMessage);
    }

    public void sendUSSD(String ussdString, Message response) {
@@ -1575,14 +1576,12 @@ public class ImsPhone extends ImsPhoneBase {
                // also, discard if there is no message to present
                ImsPhoneMmiCode mmi;
                mmi = ImsPhoneMmiCode.newNetworkInitiatedUssd(ussdMessage,
                        isUssdRequest,
                        this);
                        isUssdRequest, this, mFeatureFlags);
                onNetworkInitiatedUssd(mmi);
        } else if (isUssdError) {
            ImsPhoneMmiCode mmi;
            mmi = ImsPhoneMmiCode.newNetworkInitiatedUssd(ussdMessage,
                    true,
                    this);
                    true, this, mFeatureFlags);
            mmi.onUssdFinishedError();
        }
    }
+1 −1
Original line number Diff line number Diff line
@@ -4959,7 +4959,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
            }
            case EVENT_SUPP_SERVICE_INDICATION: {
                ar = (AsyncResult) msg.obj;
                ImsPhoneMmiCode mmiCode = new ImsPhoneMmiCode(mPhone);
                ImsPhoneMmiCode mmiCode = new ImsPhoneMmiCode(mPhone, mFeatureFlags);
                try {
                    mmiCode.setIsSsInfo(true);
                    mmiCode.processImsSsData(ar);
+58 −15
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ import com.android.internal.telephony.CommandException;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.MmiCode;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.gsm.GsmMmiCode;
import com.android.internal.telephony.uicc.IccRecords;
import com.android.telephony.Rlog;
@@ -165,6 +166,9 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
    private static final int NUM_PRESENTATION_ALLOWED     = 0;
    private static final int NUM_PRESENTATION_RESTRICTED  = 1;

    // Using same value with CallForwardEditPreference#DEFAULT_NO_REPLY_TIMER_FOR_CFNRY
    private static final int DEFAULT_NO_REPLY_TIMER_FOR_CFNRY = 20;

    //***** Supplementary Service Query Bundle Keys
    // Used by IMS Service layer to put supp. serv. query
    // responses into the ssInfo Bundle.
@@ -245,6 +249,8 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
    private static final int MATCH_GROUP_DIALING_NUMBER = 12;
    static private String[] sTwoDigitNumberPattern;

    private final FeatureFlags mFeatureFlags;

    //***** Public Class methods

    /**
@@ -262,12 +268,13 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {

    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    @VisibleForTesting
    public static ImsPhoneMmiCode newFromDialString(String dialString, ImsPhone phone) {
       return newFromDialString(dialString, phone, null);
    public static ImsPhoneMmiCode newFromDialString(String dialString, ImsPhone phone,
            FeatureFlags featureFlags) {
        return newFromDialString(dialString, phone, null, featureFlags);
    }

    static ImsPhoneMmiCode newFromDialString(String dialString,
                                             ImsPhone phone, ResultReceiver wrappedCallback) {
    static ImsPhoneMmiCode newFromDialString(String dialString, ImsPhone phone,
            ResultReceiver wrappedCallback, FeatureFlags featureFlags) {
        Matcher m;
        ImsPhoneMmiCode ret = null;

@@ -287,7 +294,7 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {

        // Is this formatted like a standard supplementary service code?
        if (m.matches()) {
            ret = new ImsPhoneMmiCode(phone);
            ret = new ImsPhoneMmiCode(phone, featureFlags);
            ret.mPoundString = makeEmptyNull(m.group(MATCH_GROUP_POUND_STRING));
            ret.mAction = makeEmptyNull(m.group(MATCH_GROUP_ACTION));
            ret.mSc = makeEmptyNull(m.group(MATCH_GROUP_SERVICE_CODE));
@@ -305,7 +312,7 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
            if (ret.mDialingNumber != null &&
                    ret.mDialingNumber.endsWith("#") &&
                    dialString.endsWith("#")){
                ret = new ImsPhoneMmiCode(phone);
                ret = new ImsPhoneMmiCode(phone, featureFlags);
                ret.mPoundString = dialString;
            }
        } else if (dialString.endsWith("#")) {
@@ -313,7 +320,7 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
            // "Entry of any characters defined in the 3GPP TS 23.038 [8] Default Alphabet
            // (up to the maximum defined in 3GPP TS 24.080 [10]), followed by #SEND".

            ret = new ImsPhoneMmiCode(phone);
            ret = new ImsPhoneMmiCode(phone, featureFlags);
            ret.mPoundString = dialString;
        } else if (GsmMmiCode.isTwoDigitShortCode(phone.getContext(), phone.getSubId(),
                dialString)) {
@@ -321,7 +328,7 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
            ret = null;
        } else if (isShortCode(dialString, phone)) {
            // this may be a short code, as defined in TS 22.030, 6.5.3.2
            ret = new ImsPhoneMmiCode(phone);
            ret = new ImsPhoneMmiCode(phone, featureFlags);
            ret.mDialingNumber = dialString;
        }
        return ret;
@@ -348,10 +355,10 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
    }

    public static ImsPhoneMmiCode newNetworkInitiatedUssd(String ussdMessage,
            boolean isUssdRequest, ImsPhone phone) {
            boolean isUssdRequest, ImsPhone phone, FeatureFlags featureFlags) {
        ImsPhoneMmiCode ret;

        ret = new ImsPhoneMmiCode(phone);
        ret = new ImsPhoneMmiCode(phone, featureFlags);

        ret.mMessage = ussdMessage;
        ret.mIsUssdRequest = isUssdRequest;
@@ -368,10 +375,11 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
        return ret;
    }

    static ImsPhoneMmiCode newFromUssdUserInput(String ussdMessge, ImsPhone phone) {
        ImsPhoneMmiCode ret = new ImsPhoneMmiCode(phone);
    static ImsPhoneMmiCode newFromUssdUserInput(String ussdMessage, ImsPhone phone,
            FeatureFlags featureFlags) {
        ImsPhoneMmiCode ret = new ImsPhoneMmiCode(phone, featureFlags);

        ret.mMessage = ussdMessge;
        ret.mMessage = ussdMessage;
        ret.mState = State.PENDING;
        ret.mIsPendingUSSD = true;

@@ -584,13 +592,15 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {

    //***** Constructor

    public ImsPhoneMmiCode(ImsPhone phone) {
    public ImsPhoneMmiCode(ImsPhone phone, FeatureFlags featureFlags) {
        // The telephony unit-test cases may create ImsPhoneMmiCode's
        // in secondary threads
        super(phone.getHandler().getLooper());
        mPhone = phone;
        mContext = phone.getContext();
        mIccRecords = mPhone.mDefaultPhone.getIccRecords();

        mFeatureFlags = featureFlags;
    }

    //***** MmiCode implementation
@@ -907,7 +917,19 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
                String dialingNumber = mSia;
                int reason = scToCallForwardReason(mSc);
                int serviceClass = siToServiceClass(mSib);
                int time = siToTime(mSic);
                int time;

                if (mFeatureFlags.useCarrierConfigForCfnryTimeViaMmi()) {
                    // If the code is CFNRy and time is null(empty)
                    // use the default time value from CarrierConfig
                    if (mSc.equals(SC_CFNRy) && isEmptyOrNull(mSic)) {
                        time = getCfnryTime();
                    } else {
                        time = siToTime(mSic);
                    }
                } else {
                    time = siToTime(mSic);
                }

                if (isInterrogate()) {
                    mPhone.getCallForwardingOption(reason, serviceClass,
@@ -1147,6 +1169,27 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
        }
    }

    private int getCfnryTime() {
        CarrierConfigManager configManager = mContext.getSystemService(CarrierConfigManager.class);
        if (configManager == null) {
            return DEFAULT_NO_REPLY_TIMER_FOR_CFNRY;
        }

        PersistableBundle carrierConfig = configManager.getConfigForSubId(mPhone.getSubId());
        if (carrierConfig == null
                || !carrierConfig.getBoolean(
                        CarrierConfigManager.KEY_SUPPORT_NO_REPLY_TIMER_FOR_CFNRY_BOOL, true)) {
            return DEFAULT_NO_REPLY_TIMER_FOR_CFNRY;
        }

        int time = carrierConfig.getInt(
                CarrierConfigManager.KEY_NO_REPLY_TIMER_FOR_CFNRY_SEC_INT,
                DEFAULT_NO_REPLY_TIMER_FOR_CFNRY);

        Rlog.d(LOG_TAG, "getCfnryTime: " + time);
        return time;
    }

    private boolean isUssdOverImsAllowed() {
        if (mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_allow_ussd_over_ims)) {
+90 −5
Original line number Diff line number Diff line
@@ -19,10 +19,13 @@ package com.android.internal.telephony.imsphone;
import static junit.framework.Assert.fail;

import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.os.AsyncResult;
@@ -35,6 +38,7 @@ import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;

import com.android.internal.telephony.CommandException;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.flags.FeatureFlags;

@@ -54,6 +58,9 @@ public class ImsPhoneMmiCodeTest extends TelephonyTest {
    private static final String TEST_DIAL_STRING_SERVICE_CODE = "*67911";
    private static final String TEST_DIAL_STRING_NO_SERVICE_CODE = "*767911";
    private static final String TEST_DIAL_STRING_NON_EMERGENCY_NUMBER = "11976";
    private static final String TEST_DIAL_NUMBER = "123456789";
    private static final String TEST_DIAL_STRING_CFNRY_ACTIVE_CODE = "**61*" + TEST_DIAL_NUMBER;
    private static final String TEST_DIAL_STRING_CFNRY_DEACTIVE_CODE = "##61#";
    private ImsPhoneMmiCode mImsPhoneMmiCode;
    private ImsPhone mImsPhoneUT;

@@ -90,7 +97,7 @@ public class ImsPhoneMmiCodeTest extends TelephonyTest {
        // Test *67911 is treated as temporary mode CLIR
        doReturn(true).when(mTelephonyManager).isEmergencyNumber(TEST_DIAL_STRING_SERVICE_CODE);
        mImsPhoneMmiCode = ImsPhoneMmiCode.newFromDialString(TEST_DIAL_STRING_SERVICE_CODE,
                mImsPhoneUT);
                mImsPhoneUT, mFeatureFlags);
        assertTrue(mImsPhoneMmiCode.isTemporaryModeCLIR());
    }

@@ -99,7 +106,7 @@ public class ImsPhoneMmiCodeTest extends TelephonyTest {
        // Test if prefix isn't *67 or *82
        doReturn(true).when(mTelephonyManager).isEmergencyNumber(TEST_DIAL_STRING_NO_SERVICE_CODE);
        mImsPhoneMmiCode = ImsPhoneMmiCode.newFromDialString(TEST_DIAL_STRING_NO_SERVICE_CODE,
                mImsPhoneUT);
                mImsPhoneUT, mFeatureFlags);
        assertTrue(mImsPhoneMmiCode == null);
    }

@@ -107,13 +114,14 @@ public class ImsPhoneMmiCodeTest extends TelephonyTest {
    public void testIsTemporaryModeCLIRForNonEmergencyNumber() {
        // Test if dialing string isn't an emergency number
        mImsPhoneMmiCode = ImsPhoneMmiCode.newFromDialString(TEST_DIAL_STRING_NON_EMERGENCY_NUMBER,
                mImsPhoneUT);
                mImsPhoneUT, mFeatureFlags);
        assertTrue(mImsPhoneMmiCode == null);
    }

    @Test
    public void testNoCrashOnEmptyMessage() {
        ImsPhoneMmiCode mmi = ImsPhoneMmiCode.newNetworkInitiatedUssd(null, true, mImsPhoneUT);
        ImsPhoneMmiCode mmi = ImsPhoneMmiCode.newNetworkInitiatedUssd(null, true, mImsPhoneUT,
                mFeatureFlags);
        try {
            mmi.onUssdFinishedError();
        } catch (Exception e) {
@@ -134,7 +142,8 @@ public class ImsPhoneMmiCodeTest extends TelephonyTest {
    @Test
    @SmallTest
    public void testOperationNotSupported() {
        mImsPhoneMmiCode = ImsPhoneMmiCode.newNetworkInitiatedUssd(null, true, mImsPhoneUT);
        mImsPhoneMmiCode = ImsPhoneMmiCode.newNetworkInitiatedUssd(null, true, mImsPhoneUT,
                mFeatureFlags);

        // Emulate request not supported from the network.
        AsyncResult ar = new AsyncResult(null, null,
@@ -143,4 +152,80 @@ public class ImsPhoneMmiCodeTest extends TelephonyTest {
        verify(mContext.getResources()).getText(
                eq(com.android.internal.R.string.mmiErrorNotSupported));
    }

    @Test
    @SmallTest
    public void testActivationCfnrWithCfnry() throws Exception {
        doNothing().when(mImsPhone).setCallForwardingOption(
                anyInt(), anyInt(), any(), anyInt(), anyInt(), any());

        doReturn(true).when(mFeatureFlags).useCarrierConfigForCfnryTimeViaMmi();

        int carrierConfigTime = 40;
        PersistableBundle bundle = new PersistableBundle();
        bundle.putInt(CarrierConfigManager
                .KEY_NO_REPLY_TIMER_FOR_CFNRY_SEC_INT, carrierConfigTime);
        doReturn(bundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());

        int mmiTime = 30;
        String withoutTimeCode = TEST_DIAL_STRING_CFNRY_ACTIVE_CODE + "#";
        String withTimeCode = TEST_DIAL_STRING_CFNRY_ACTIVE_CODE + "**" + mmiTime + "#";

        mImsPhoneMmiCode = ImsPhoneMmiCode.newFromDialString(withoutTimeCode, mImsPhoneUT,
                mFeatureFlags);
        // For verification, replace the internal object of target with mock
        replaceInstance(ImsPhoneMmiCode.class, "mPhone", mImsPhoneMmiCode, mImsPhone);

        mImsPhoneMmiCode.processCode();
        verify(mImsPhone, times(1)).setCallForwardingOption(
                eq(CommandsInterface.CF_ACTION_REGISTRATION),
                anyInt(),
                eq(TEST_DIAL_NUMBER),
                anyInt(),
                eq(carrierConfigTime),
                any());

        mImsPhoneMmiCode = ImsPhoneMmiCode.newFromDialString(withTimeCode, mImsPhoneUT,
                mFeatureFlags);
        // For verification, replace the internal object of target with mock
        replaceInstance(ImsPhoneMmiCode.class, "mPhone", mImsPhoneMmiCode, mImsPhone);

        mImsPhoneMmiCode.processCode();
        verify(mImsPhone, times(1)).setCallForwardingOption(
                eq(CommandsInterface.CF_ACTION_REGISTRATION),
                anyInt(),
                eq(TEST_DIAL_NUMBER),
                anyInt(),
                eq(mmiTime),
                any());
    }

    @Test
    @SmallTest
    public void testDeactivationCfnrWithCfnry() throws Exception {
        doNothing().when(mImsPhone).setCallForwardingOption(
                anyInt(), anyInt(), any(), anyInt(), anyInt(), any());

        doReturn(true).when(mFeatureFlags).useCarrierConfigForCfnryTimeViaMmi();

        int carrierConfigTime = 40;
        PersistableBundle bundle = new PersistableBundle();
        bundle.putInt(CarrierConfigManager
                .KEY_NO_REPLY_TIMER_FOR_CFNRY_SEC_INT, carrierConfigTime);
        doReturn(bundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());

        mImsPhoneMmiCode = ImsPhoneMmiCode.newFromDialString(TEST_DIAL_STRING_CFNRY_DEACTIVE_CODE,
                mImsPhoneUT, mFeatureFlags);
        // For verification, replace the internal object of target with mock
        replaceInstance(ImsPhoneMmiCode.class, "mPhone", mImsPhoneMmiCode, mImsPhone);

        mImsPhoneMmiCode.processCode();
        verify(mImsPhone, times(1)).setCallForwardingOption(
                eq(CommandsInterface.CF_ACTION_ERASURE),
                anyInt(),
                eq(null),
                anyInt(),
                eq(carrierConfigTime),
                any());
    }
}