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

Commit 0b04fbde authored by Gwen Lin's avatar Gwen Lin Committed by Gerrit Code Review
Browse files

Merge "Handling ussd request based on KEY_CARRIER_USSD_METHOD_INT"

parents da81de26 ce3c74d8
Loading
Loading
Loading
Loading
+36 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.telephony.gsm;

import static android.telephony.CarrierConfigManager.USSD_OVER_IMS_ONLY;

import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_DATA;
import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_DATA_ASYNC;
import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_DATA_SYNC;
@@ -1120,7 +1122,18 @@ public final class GsmMmiCode extends Handler implements MmiCode {
                    throw new RuntimeException ("Ivalid register/action=" + mAction);
                }
            } else if (mPoundString != null) {
                if (mContext.getResources().getBoolean(
                        com.android.internal.R.bool.config_allow_ussd_over_ims)) {
                    int ussd_method = getIntCarrierConfig(
                                    CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT);
                    if (ussd_method != USSD_OVER_IMS_ONLY) {
                        sendUssd(mPoundString);
                    } else {
                        throw new RuntimeException("The USSD request is not allowed over CS");
                    }
                } else {
                    sendUssd(mPoundString);
                }
            } else {
                Rlog.d(LOG_TAG, "processCode: Invalid or Unsupported MMI Code");
                throw new RuntimeException ("Invalid or Unsupported MMI Code");
@@ -1752,6 +1765,28 @@ public final class GsmMmiCode extends Handler implements MmiCode {
        return sb;
    }

    /**
     * Get the int config from carrier config manager.
     *
     * @param key config key defined in CarrierConfigManager
     * @return integer value of corresponding key.
     */
    private int getIntCarrierConfig(String key) {
        CarrierConfigManager ConfigManager =
                (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
        PersistableBundle b = null;
        if (ConfigManager != null) {
            // If an invalid subId is used, this bundle will contain default values.
            b = ConfigManager.getConfigForSubId(mPhone.getSubId());
        }
        if (b != null) {
            return b.getInt(key);
        } else {
            // Return static default defined in CarrierConfigManager.
            return CarrierConfigManager.getDefaultConfig().getInt(key);
        }
    }

    public ResultReceiver getUssdCallbackReceiver() {
        return this.mCallbackReceiver;
    }
+16 −1
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.internal.telephony.imsphone;

import static android.telephony.CarrierConfigManager.USSD_OVER_CS_PREFERRED;
import static android.telephony.CarrierConfigManager.USSD_OVER_IMS_ONLY;

import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;
import static com.android.internal.telephony.Phone.CS_FALLBACK;

@@ -830,6 +833,12 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
    private Map<Pair<Integer, String>, Integer> mImsReasonCodeMap = new ArrayMap<>();


    /**
      * Carrier configuration option which specifies how the carrier handles USSD request.
      * See {@link CarrierConfigManager#KEY_CARRIER_USSD_METHOD_INT} for more information.
      */
    private int mUssdMethod = USSD_OVER_CS_PREFERRED;

    /**
     * TODO: Remove this code; it is a workaround.
     * When {@code true}, forces {@link ImsManager#updateImsServiceConfig} to
@@ -1429,6 +1438,11 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        mSupportCepOnPeer = carrierConfig.getBoolean(
                CarrierConfigManager.KEY_SUPPORT_IMS_CONFERENCE_EVENT_PACKAGE_ON_PEER_BOOL);

        if (mPhone.getContext().getResources().getBoolean(
                com.android.internal.R.bool.config_allow_ussd_over_ims)) {
            mUssdMethod = carrierConfig.getInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT);
        }

        String[] mappings = carrierConfig
                .getStringArray(CarrierConfigManager.KEY_IMS_REASONINFO_MAPPING_STRING_ARRAY);
        if (mappings != null && mappings.length > 0) {
@@ -3677,7 +3691,8 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
            if (mUssdSession != null) {
                if (DBG) log("mUssdSession is not null");
                // To initiate sending Ussd under circuit-switched call
                if (reasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED) {
                if (reasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED
                        && mUssdMethod != USSD_OVER_IMS_ONLY) {
                    mUssdSession = null;
                    mPhone.getPendingMmiCodes().clear();
                    mPhone.initiateSilentRedial();
+63 −12
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@

package com.android.internal.telephony.imsphone;

import static android.telephony.CarrierConfigManager.USSD_OVER_CS_ONLY;
import static android.telephony.CarrierConfigManager.USSD_OVER_CS_PREFERRED;
import static android.telephony.CarrierConfigManager.USSD_OVER_IMS_ONLY;
import static android.telephony.CarrierConfigManager.USSD_OVER_IMS_PREFERRED;
import static android.telephony.ServiceState.STATE_IN_SERVICE;

import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_DATA;
@@ -36,7 +40,9 @@ import android.os.AsyncResult;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.ResultReceiver;
import android.telephony.CarrierConfigManager;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsCallForwardInfo;
@@ -1064,6 +1070,11 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
            } else if (mPoundString != null) {
                if (mContext.getResources().getBoolean(
                        com.android.internal.R.bool.config_allow_ussd_over_ims)) {
                    int ussd_method = getIntCarrierConfig(
                                    CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT);

                    switch (ussd_method) {
                        case USSD_OVER_CS_PREFERRED:
                            // We'll normally send USSD over the CS pipe, but if it happens that
                            // the CS phone is out of service, we'll just try over IMS instead.
                            if (mPhone.getDefaultPhone().getServiceStateTracker().mSS.getState()
@@ -1073,9 +1084,27 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
                                        + "(allowed over ims).");
                                throw new CallStateException(Phone.CS_FALLBACK);
                            } else {
                        Rlog.i(LOG_TAG, "processCode: CS is out of service, sending ussd string '"
                                Rlog.i(LOG_TAG, "processCode: CS is out of service, "
                                        + "sending ussd string '"
                                        + Rlog.pii(LOG_TAG, mPoundString) + "' over IMS pipe.");
                                sendUssd(mPoundString);
                            }
                            break;
                        case USSD_OVER_IMS_PREFERRED:
                        case USSD_OVER_IMS_ONLY:
                            Rlog.i(LOG_TAG, "processCode: Sending ussd string '"
                                    + Rlog.pii(LOG_TAG, mPoundString) + "' over IMS pipe.");
                            sendUssd(mPoundString);
                            break;
                        case USSD_OVER_CS_ONLY:
                            Rlog.i(LOG_TAG, "processCode: Sending ussd string '"
                                    + Rlog.pii(LOG_TAG, mPoundString) + "' over CS pipe.");
                            throw new CallStateException(Phone.CS_FALLBACK);
                        default:
                            Rlog.i(LOG_TAG, "processCode: Sending ussd string '"
                                    + Rlog.pii(LOG_TAG, mPoundString) + "' over CS pipe."
                                    + "(unsupported method)");
                            throw new CallStateException(Phone.CS_FALLBACK);
                    }
                } else {
                    // USSD codes are not supported over IMS due to modem limitations; send over
@@ -1816,6 +1845,28 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
        }
    }

    /**
     * Get the int config from carrier config manager.
     *
     * @param key config key defined in CarrierConfigManager
     * @return integer value of corresponding key.
     */
    private int getIntCarrierConfig(String key) {
        CarrierConfigManager ConfigManager =
                (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
        PersistableBundle b = null;
        if (ConfigManager != null) {
            // If an invalid subId is used, this bundle will contain default values.
            b = ConfigManager.getConfigForSubId(mPhone.getSubId());
        }
        if (b != null) {
            return b.getInt(key);
        } else {
            // Return static default defined in CarrierConfigManager.
            return CarrierConfigManager.getDefaultConfig().getInt(key);
        }
    }

    @Override
    public ResultReceiver getUssdCallbackReceiver() {
        return this.mCallbackReceiver;
+60 −1
Original line number Diff line number Diff line
@@ -16,6 +16,11 @@

package com.android.internal.telephony.imsphone;

import static android.telephony.CarrierConfigManager.USSD_OVER_CS_ONLY;
import static android.telephony.CarrierConfigManager.USSD_OVER_CS_PREFERRED;
import static android.telephony.CarrierConfigManager.USSD_OVER_IMS_ONLY;
import static android.telephony.CarrierConfigManager.USSD_OVER_IMS_PREFERRED;

import static com.android.internal.telephony.CommandsInterface.CF_ACTION_ENABLE;
import static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL;

@@ -70,12 +75,12 @@ import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.Connection;
import com.android.internal.telephony.imsphone.ImsPhone.SS;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.gsm.SuppServiceNotification;
import com.android.internal.telephony.imsphone.ImsPhone.SS;

import org.junit.After;
import org.junit.Before;
@@ -847,6 +852,8 @@ public class ImsPhoneTest extends TelephonyTest {
    public void testSendUssdAllowUssdOverImsInOutOfService() throws Exception {
        Resources resources = mContext.getResources();

        mBundle.putInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT,
                        USSD_OVER_CS_PREFERRED);
        doReturn(true).when(resources).getBoolean(
                com.android.internal.R.bool.config_allow_ussd_over_ims);
        doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mSST.mSS).getState();
@@ -861,6 +868,8 @@ public class ImsPhoneTest extends TelephonyTest {
        String errorCode = "";
        Resources resources = mContext.getResources();

        mBundle.putInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT,
                        USSD_OVER_CS_PREFERRED);
        doReturn(true).when(resources).getBoolean(
                com.android.internal.R.bool.config_allow_ussd_over_ims);
        doReturn(ServiceState.STATE_IN_SERVICE).when(mSST.mSS).getState();
@@ -890,6 +899,56 @@ public class ImsPhoneTest extends TelephonyTest {
        assertEquals(Phone.CS_FALLBACK, errorCode);
    }

    @Test
    @SmallTest
    public void testSendUssdAllowUssdOverImswithIMSPreferred() throws Exception {
        Resources resources = mContext.getResources();

        mBundle.putInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT,
                        USSD_OVER_IMS_PREFERRED);
        doReturn(true).when(resources).getBoolean(
                com.android.internal.R.bool.config_allow_ussd_over_ims);
        doReturn(ServiceState.STATE_IN_SERVICE).when(mSST.mSS).getState();

        mImsPhoneUT.dial("*135#", new ImsPhone.ImsDialArgs.Builder().build());
        verify(mImsCT).sendUSSD(eq("*135#"), any());
    }

    @Test
    @SmallTest
    public void testSendUssdAllowUssdOverImswithCSOnly() throws Exception {
        String errorCode = "";
        Resources resources = mContext.getResources();

        mBundle.putInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT,
                        USSD_OVER_CS_ONLY);
        doReturn(true).when(resources).getBoolean(
                com.android.internal.R.bool.config_allow_ussd_over_ims);
        doReturn(ServiceState.STATE_IN_SERVICE).when(mSST.mSS).getState();

        try {
            mImsPhoneUT.dial("*135#", new ImsPhone.ImsDialArgs.Builder().build());
        } catch (CallStateException e) {
            errorCode = e.getMessage();
        }
        assertEquals(Phone.CS_FALLBACK, errorCode);
    }

    @Test
    @SmallTest
    public void testSendUssdAllowUssdOverImswithIMSOnly() throws Exception {
        Resources resources = mContext.getResources();

        mBundle.putInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT,
                        USSD_OVER_IMS_ONLY);
        doReturn(true).when(resources).getBoolean(
                com.android.internal.R.bool.config_allow_ussd_over_ims);
        doReturn(ServiceState.STATE_IN_SERVICE).when(mSST.mSS).getState();

        mImsPhoneUT.dial("*135#", new ImsPhone.ImsDialArgs.Builder().build());
        verify(mImsCT).sendUSSD(eq("*135#"), any());
    }

    private ServiceState getServiceStateDataAndVoice(int rat, int regState, boolean isRoaming) {
        ServiceState ss = new ServiceState();
        ss.setStateOutOfService();