Loading src/java/com/android/internal/telephony/gsm/GsmMmiCode.java +36 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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; } Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +16 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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) { Loading Loading @@ -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(); Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneMmiCode.java +63 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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() Loading @@ -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 Loading Loading @@ -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; Loading tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java +60 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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(); Loading Loading @@ -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(); Loading Loading
src/java/com/android/internal/telephony/gsm/GsmMmiCode.java +36 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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; } Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +16 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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) { Loading Loading @@ -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(); Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneMmiCode.java +63 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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() Loading @@ -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 Loading Loading @@ -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; Loading
tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java +60 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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(); Loading Loading @@ -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(); Loading