Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneMmiCode.java +47 −43 Original line number Diff line number Diff line Loading @@ -892,9 +892,15 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode { Rlog.d(LOG_TAG, "processCode: isShortCode"); // These just get treated as USSD. if (isUssdOverImsAllowed()) { Rlog.d(LOG_TAG, "processCode: Sending short code '" + mDialingNumber + "' over IMS pipe."); sendUssd(mDialingNumber); } else { Rlog.d(LOG_TAG, "processCode: Sending short code '" + mDialingNumber + "' over CS pipe."); throw new CallStateException(Phone.CS_FALLBACK); } } else if (isServiceCodeCallForwarding(mSc)) { Rlog.d(LOG_TAG, "processCode: is CF"); Loading Loading @@ -1120,6 +1126,28 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode { throw new RuntimeException ("Invalid or Unsupported MMI Code"); } } else if (mPoundString != null) { if (isUssdOverImsAllowed()) { Rlog.i(LOG_TAG, "processCode: Sending ussd string '" + Rlog.pii(LOG_TAG, mPoundString) + "' over IMS pipe."); sendUssd(mPoundString); } else { Rlog.i(LOG_TAG, "processCode: Sending ussd string '" + Rlog.pii(LOG_TAG, mPoundString) + "' over CS pipe."); throw new CallStateException(Phone.CS_FALLBACK); } } else { Rlog.d(LOG_TAG, "processCode: invalid or unsupported MMI"); throw new RuntimeException ("Invalid or Unsupported MMI Code"); } } catch (RuntimeException exc) { mState = State.FAILED; mMessage = mContext.getText(com.android.internal.R.string.mmiError); Rlog.d(LOG_TAG, "processCode: RuntimeException = " + exc); mPhone.onMMIDone(this); } } private boolean isUssdOverImsAllowed() { if (mContext.getResources().getBoolean( com.android.internal.R.bool.config_allow_ussd_over_ims)) { int ussd_method = getIntCarrierConfig( Loading @@ -1131,49 +1159,25 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode { // the CS phone is out of service, we'll just try over IMS instead. if (mPhone.getDefaultPhone().getServiceStateTracker().mSS.getState() == STATE_IN_SERVICE) { Rlog.i(LOG_TAG, "processCode: Sending ussd string '" + Rlog.pii(LOG_TAG, mPoundString) + "' over CS pipe " + "(allowed over ims)."); throw new CallStateException(Phone.CS_FALLBACK); return false; } else { Rlog.i(LOG_TAG, "processCode: CS is out of service, " + "sending ussd string '" + Rlog.pii(LOG_TAG, mPoundString) + "' over IMS pipe."); sendUssd(mPoundString); Rlog.i(LOG_TAG, "isUssdOverImsAllowed: CS is out of service"); return true; } 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; return true; 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); return false; 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); Rlog.i(LOG_TAG, "isUssdOverImsAllowed: Unsupported method"); return false; } } else { // USSD codes are not supported over IMS due to modem limitations; send over // the CS pipe instead. This should be fixed in the future. Rlog.i(LOG_TAG, "processCode: Sending ussd string '" + Rlog.pii(LOG_TAG, mPoundString) + "' over CS pipe."); throw new CallStateException(Phone.CS_FALLBACK); } } else { Rlog.d(LOG_TAG, "processCode: invalid or unsupported MMI"); throw new RuntimeException ("Invalid or Unsupported MMI Code"); } } catch (RuntimeException exc) { mState = State.FAILED; mMessage = mContext.getText(com.android.internal.R.string.mmiError); Rlog.d(LOG_TAG, "processCode: RuntimeException = " + exc); mPhone.onMMIDone(this); Rlog.i(LOG_TAG, "isUssdOverImsAllowed: USSD over IMS pipe is not supported."); return false; } } Loading tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java +33 −3 Original line number Diff line number Diff line Loading @@ -813,6 +813,9 @@ public class ImsPhoneTest extends TelephonyTest { mImsPhoneUT.dial("*135#", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("*135#"), any()); mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("91"), any()); } @Test Loading @@ -833,6 +836,13 @@ public class ImsPhoneTest extends TelephonyTest { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); try { mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); } catch (CallStateException e) { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); } @Test Loading @@ -850,11 +860,18 @@ public class ImsPhoneTest extends TelephonyTest { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); try { mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); } catch (CallStateException e) { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); } @Test @SmallTest public void testSendUssdAllowUssdOverImswithIMSPreferred() throws Exception { public void testSendUssdAllowUssdOverImsWithImsPreferred() throws Exception { Resources resources = mContext.getResources(); mBundle.putInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT, Loading @@ -865,11 +882,14 @@ public class ImsPhoneTest extends TelephonyTest { mImsPhoneUT.dial("*135#", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("*135#"), any()); mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("91"), any()); } @Test @SmallTest public void testSendUssdAllowUssdOverImswithCSOnly() throws Exception { public void testSendUssdAllowUssdOverImsWithCsOnly() throws Exception { String errorCode = ""; Resources resources = mContext.getResources(); Loading @@ -885,11 +905,18 @@ public class ImsPhoneTest extends TelephonyTest { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); try { mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); } catch (CallStateException e) { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); } @Test @SmallTest public void testSendUssdAllowUssdOverImswithIMSOnly() throws Exception { public void testSendUssdAllowUssdOverImsWithImsOnly() throws Exception { Resources resources = mContext.getResources(); mBundle.putInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT, Loading @@ -900,6 +927,9 @@ public class ImsPhoneTest extends TelephonyTest { mImsPhoneUT.dial("*135#", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("*135#"), any()); mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("91"), any()); } @Test Loading Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneMmiCode.java +47 −43 Original line number Diff line number Diff line Loading @@ -892,9 +892,15 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode { Rlog.d(LOG_TAG, "processCode: isShortCode"); // These just get treated as USSD. if (isUssdOverImsAllowed()) { Rlog.d(LOG_TAG, "processCode: Sending short code '" + mDialingNumber + "' over IMS pipe."); sendUssd(mDialingNumber); } else { Rlog.d(LOG_TAG, "processCode: Sending short code '" + mDialingNumber + "' over CS pipe."); throw new CallStateException(Phone.CS_FALLBACK); } } else if (isServiceCodeCallForwarding(mSc)) { Rlog.d(LOG_TAG, "processCode: is CF"); Loading Loading @@ -1120,6 +1126,28 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode { throw new RuntimeException ("Invalid or Unsupported MMI Code"); } } else if (mPoundString != null) { if (isUssdOverImsAllowed()) { Rlog.i(LOG_TAG, "processCode: Sending ussd string '" + Rlog.pii(LOG_TAG, mPoundString) + "' over IMS pipe."); sendUssd(mPoundString); } else { Rlog.i(LOG_TAG, "processCode: Sending ussd string '" + Rlog.pii(LOG_TAG, mPoundString) + "' over CS pipe."); throw new CallStateException(Phone.CS_FALLBACK); } } else { Rlog.d(LOG_TAG, "processCode: invalid or unsupported MMI"); throw new RuntimeException ("Invalid or Unsupported MMI Code"); } } catch (RuntimeException exc) { mState = State.FAILED; mMessage = mContext.getText(com.android.internal.R.string.mmiError); Rlog.d(LOG_TAG, "processCode: RuntimeException = " + exc); mPhone.onMMIDone(this); } } private boolean isUssdOverImsAllowed() { if (mContext.getResources().getBoolean( com.android.internal.R.bool.config_allow_ussd_over_ims)) { int ussd_method = getIntCarrierConfig( Loading @@ -1131,49 +1159,25 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode { // the CS phone is out of service, we'll just try over IMS instead. if (mPhone.getDefaultPhone().getServiceStateTracker().mSS.getState() == STATE_IN_SERVICE) { Rlog.i(LOG_TAG, "processCode: Sending ussd string '" + Rlog.pii(LOG_TAG, mPoundString) + "' over CS pipe " + "(allowed over ims)."); throw new CallStateException(Phone.CS_FALLBACK); return false; } else { Rlog.i(LOG_TAG, "processCode: CS is out of service, " + "sending ussd string '" + Rlog.pii(LOG_TAG, mPoundString) + "' over IMS pipe."); sendUssd(mPoundString); Rlog.i(LOG_TAG, "isUssdOverImsAllowed: CS is out of service"); return true; } 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; return true; 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); return false; 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); Rlog.i(LOG_TAG, "isUssdOverImsAllowed: Unsupported method"); return false; } } else { // USSD codes are not supported over IMS due to modem limitations; send over // the CS pipe instead. This should be fixed in the future. Rlog.i(LOG_TAG, "processCode: Sending ussd string '" + Rlog.pii(LOG_TAG, mPoundString) + "' over CS pipe."); throw new CallStateException(Phone.CS_FALLBACK); } } else { Rlog.d(LOG_TAG, "processCode: invalid or unsupported MMI"); throw new RuntimeException ("Invalid or Unsupported MMI Code"); } } catch (RuntimeException exc) { mState = State.FAILED; mMessage = mContext.getText(com.android.internal.R.string.mmiError); Rlog.d(LOG_TAG, "processCode: RuntimeException = " + exc); mPhone.onMMIDone(this); Rlog.i(LOG_TAG, "isUssdOverImsAllowed: USSD over IMS pipe is not supported."); return false; } } Loading
tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java +33 −3 Original line number Diff line number Diff line Loading @@ -813,6 +813,9 @@ public class ImsPhoneTest extends TelephonyTest { mImsPhoneUT.dial("*135#", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("*135#"), any()); mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("91"), any()); } @Test Loading @@ -833,6 +836,13 @@ public class ImsPhoneTest extends TelephonyTest { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); try { mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); } catch (CallStateException e) { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); } @Test Loading @@ -850,11 +860,18 @@ public class ImsPhoneTest extends TelephonyTest { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); try { mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); } catch (CallStateException e) { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); } @Test @SmallTest public void testSendUssdAllowUssdOverImswithIMSPreferred() throws Exception { public void testSendUssdAllowUssdOverImsWithImsPreferred() throws Exception { Resources resources = mContext.getResources(); mBundle.putInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT, Loading @@ -865,11 +882,14 @@ public class ImsPhoneTest extends TelephonyTest { mImsPhoneUT.dial("*135#", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("*135#"), any()); mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("91"), any()); } @Test @SmallTest public void testSendUssdAllowUssdOverImswithCSOnly() throws Exception { public void testSendUssdAllowUssdOverImsWithCsOnly() throws Exception { String errorCode = ""; Resources resources = mContext.getResources(); Loading @@ -885,11 +905,18 @@ public class ImsPhoneTest extends TelephonyTest { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); try { mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); } catch (CallStateException e) { errorCode = e.getMessage(); } assertEquals(Phone.CS_FALLBACK, errorCode); } @Test @SmallTest public void testSendUssdAllowUssdOverImswithIMSOnly() throws Exception { public void testSendUssdAllowUssdOverImsWithImsOnly() throws Exception { Resources resources = mContext.getResources(); mBundle.putInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT, Loading @@ -900,6 +927,9 @@ public class ImsPhoneTest extends TelephonyTest { mImsPhoneUT.dial("*135#", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("*135#"), any()); mImsPhoneUT.dial("91", new ImsPhone.ImsDialArgs.Builder().build()); verify(mImsCT).sendUSSD(eq("91"), any()); } @Test Loading