Loading src/java/com/android/internal/telephony/imsphone/ImsPhone.java +8 −8 Original line number Diff line number Diff line Loading @@ -273,7 +273,7 @@ public class ImsPhone extends ImsPhoneBase { private ImsRegistrationCallbackHelper mImsMmTelRegistrationHelper; // The roaming state if currently in service, or the last roaming state when was in service. private boolean mRoaming = false; private boolean mLastKnownRoamingState = false; private boolean mIsInImsEcm = false; Loading Loading @@ -2312,15 +2312,15 @@ public class ImsPhone extends ImsPhoneBase { } boolean newRoamingState = ss.getRoaming(); // Do not recalculate if there is no change to state. if (mRoaming == newRoamingState) { if (mLastKnownRoamingState == newRoamingState) { return; } boolean isInService = (ss.getState() == ServiceState.STATE_IN_SERVICE || ss.getDataRegistrationState() == ServiceState.STATE_IN_SERVICE); // If we are not IN_SERVICE for voice or data, ignore change roaming state, as we always // move to home in this case. if (!isInService) { logi("updateRoamingState: we are OUT_OF_SERVICE, ignoring roaming change."); if (!isInService || !mDefaultPhone.isRadioOn()) { logi("updateRoamingState: we are not IN_SERVICE, ignoring roaming change."); return; } // We ignore roaming changes when moving to IWLAN because it always sets the roaming Loading @@ -2334,7 +2334,7 @@ public class ImsPhone extends ImsPhoneBase { } if (mCT.getState() == PhoneConstants.State.IDLE) { if (DBG) logd("updateRoamingState now: " + newRoamingState); mRoaming = newRoamingState; mLastKnownRoamingState = newRoamingState; CarrierConfigManager configManager = (CarrierConfigManager) getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); // Don't set wfc mode if carrierconfig has not loaded. It will be set by GsmCdmaPhone Loading Loading @@ -2484,8 +2484,8 @@ public class ImsPhone extends ImsPhoneBase { getBackgroundCall().getState() != Call.State.IDLE); } public boolean getRoamingState() { return mRoaming; public boolean getLastKnownRoamingState() { return mLastKnownRoamingState; } @Override Loading @@ -2506,7 +2506,7 @@ public class ImsPhone extends ImsPhoneBase { pw.println(" mSilentRedialRegistrants = " + mSilentRedialRegistrants); pw.println(" mImsMmTelRegistrationState = " + mImsMmTelRegistrationHelper.getImsRegistrationState()); pw.println(" mRoaming = " + mRoaming); pw.println(" mLastKnownRoamingState = " + mLastKnownRoamingState); pw.println(" mSsnRegistrants = " + mSsnRegistrants); pw.println(" Registration Log:"); pw.increaseIndent(); Loading tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java +32 −0 Original line number Diff line number Diff line Loading @@ -712,6 +712,7 @@ public class ImsPhoneTest extends TelephonyTest { @SmallTest public void testRoamingDuplicateMessages() throws Exception { doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - data registration only on LTE Message m = getServiceStateChangedMessage(getServiceStateDataOnly( Loading @@ -729,12 +730,40 @@ public class ImsPhoneTest extends TelephonyTest { verify(mImsManager, times(1)).setWfcMode(anyInt(), anyBoolean()); } @Test @SmallTest public void testRoamingToAirplanModeIwlanInService() throws Exception { doReturn(true).when(mTransportManager).isInLegacyMode(); doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - data registration only on LTE Message m = getServiceStateChangedMessage(getServiceStateDataOnly( ServiceState.RIL_RADIO_TECHNOLOGY_LTE, ServiceState.STATE_IN_SERVICE, true)); // Inject the message synchronously instead of waiting for the thread to do it. mImsPhoneUT.handleMessage(m); m.recycle(); verify(mImsManager, times(1)).setWfcMode(anyInt(), eq(true)); // move to airplane mode + IWLAN in service doReturn(false).when(mPhone).isRadioOn(); m = getServiceStateChangedMessage(getServiceStateDataOnly( ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN, ServiceState.STATE_IN_SERVICE, false)); mImsPhoneUT.handleMessage(m); m.recycle(); // setWfcMode should not be called again, airplane mode should not trigger move out of // roaming. verify(mImsManager, times(1)).setWfcMode(anyInt(), anyBoolean()); } @Test @SmallTest public void testRoamingToOutOfService() throws Exception { doReturn(true).when(mTransportManager).isInLegacyMode(); doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - data registration only on LTE Message m = getServiceStateChangedMessage(getServiceStateDataOnly( Loading @@ -760,6 +789,7 @@ public class ImsPhoneTest extends TelephonyTest { public void testRoamingChangeForLteInLegacyMode() throws Exception { doReturn(true).when(mTransportManager).isInLegacyMode(); doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - data registration only on LTE Message m = getServiceStateChangedMessage(getServiceStateDataOnly( Loading @@ -784,6 +814,7 @@ public class ImsPhoneTest extends TelephonyTest { public void testDataOnlyRoamingCellToIWlanInLegacyMode() throws Exception { doReturn(true).when(mTransportManager).isInLegacyMode(); doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - data registration only on LTE Message m = getServiceStateChangedMessage(getServiceStateDataOnly( Loading @@ -809,6 +840,7 @@ public class ImsPhoneTest extends TelephonyTest { public void testCellVoiceDataChangeToWlanInLegacyMode() throws Exception { doReturn(true).when(mTransportManager).isInLegacyMode(); doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - voice/data registration on LTE ServiceState ss = getServiceStateDataAndVoice( Loading Loading
src/java/com/android/internal/telephony/imsphone/ImsPhone.java +8 −8 Original line number Diff line number Diff line Loading @@ -273,7 +273,7 @@ public class ImsPhone extends ImsPhoneBase { private ImsRegistrationCallbackHelper mImsMmTelRegistrationHelper; // The roaming state if currently in service, or the last roaming state when was in service. private boolean mRoaming = false; private boolean mLastKnownRoamingState = false; private boolean mIsInImsEcm = false; Loading Loading @@ -2312,15 +2312,15 @@ public class ImsPhone extends ImsPhoneBase { } boolean newRoamingState = ss.getRoaming(); // Do not recalculate if there is no change to state. if (mRoaming == newRoamingState) { if (mLastKnownRoamingState == newRoamingState) { return; } boolean isInService = (ss.getState() == ServiceState.STATE_IN_SERVICE || ss.getDataRegistrationState() == ServiceState.STATE_IN_SERVICE); // If we are not IN_SERVICE for voice or data, ignore change roaming state, as we always // move to home in this case. if (!isInService) { logi("updateRoamingState: we are OUT_OF_SERVICE, ignoring roaming change."); if (!isInService || !mDefaultPhone.isRadioOn()) { logi("updateRoamingState: we are not IN_SERVICE, ignoring roaming change."); return; } // We ignore roaming changes when moving to IWLAN because it always sets the roaming Loading @@ -2334,7 +2334,7 @@ public class ImsPhone extends ImsPhoneBase { } if (mCT.getState() == PhoneConstants.State.IDLE) { if (DBG) logd("updateRoamingState now: " + newRoamingState); mRoaming = newRoamingState; mLastKnownRoamingState = newRoamingState; CarrierConfigManager configManager = (CarrierConfigManager) getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); // Don't set wfc mode if carrierconfig has not loaded. It will be set by GsmCdmaPhone Loading Loading @@ -2484,8 +2484,8 @@ public class ImsPhone extends ImsPhoneBase { getBackgroundCall().getState() != Call.State.IDLE); } public boolean getRoamingState() { return mRoaming; public boolean getLastKnownRoamingState() { return mLastKnownRoamingState; } @Override Loading @@ -2506,7 +2506,7 @@ public class ImsPhone extends ImsPhoneBase { pw.println(" mSilentRedialRegistrants = " + mSilentRedialRegistrants); pw.println(" mImsMmTelRegistrationState = " + mImsMmTelRegistrationHelper.getImsRegistrationState()); pw.println(" mRoaming = " + mRoaming); pw.println(" mLastKnownRoamingState = " + mLastKnownRoamingState); pw.println(" mSsnRegistrants = " + mSsnRegistrants); pw.println(" Registration Log:"); pw.increaseIndent(); Loading
tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java +32 −0 Original line number Diff line number Diff line Loading @@ -712,6 +712,7 @@ public class ImsPhoneTest extends TelephonyTest { @SmallTest public void testRoamingDuplicateMessages() throws Exception { doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - data registration only on LTE Message m = getServiceStateChangedMessage(getServiceStateDataOnly( Loading @@ -729,12 +730,40 @@ public class ImsPhoneTest extends TelephonyTest { verify(mImsManager, times(1)).setWfcMode(anyInt(), anyBoolean()); } @Test @SmallTest public void testRoamingToAirplanModeIwlanInService() throws Exception { doReturn(true).when(mTransportManager).isInLegacyMode(); doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - data registration only on LTE Message m = getServiceStateChangedMessage(getServiceStateDataOnly( ServiceState.RIL_RADIO_TECHNOLOGY_LTE, ServiceState.STATE_IN_SERVICE, true)); // Inject the message synchronously instead of waiting for the thread to do it. mImsPhoneUT.handleMessage(m); m.recycle(); verify(mImsManager, times(1)).setWfcMode(anyInt(), eq(true)); // move to airplane mode + IWLAN in service doReturn(false).when(mPhone).isRadioOn(); m = getServiceStateChangedMessage(getServiceStateDataOnly( ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN, ServiceState.STATE_IN_SERVICE, false)); mImsPhoneUT.handleMessage(m); m.recycle(); // setWfcMode should not be called again, airplane mode should not trigger move out of // roaming. verify(mImsManager, times(1)).setWfcMode(anyInt(), anyBoolean()); } @Test @SmallTest public void testRoamingToOutOfService() throws Exception { doReturn(true).when(mTransportManager).isInLegacyMode(); doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - data registration only on LTE Message m = getServiceStateChangedMessage(getServiceStateDataOnly( Loading @@ -760,6 +789,7 @@ public class ImsPhoneTest extends TelephonyTest { public void testRoamingChangeForLteInLegacyMode() throws Exception { doReturn(true).when(mTransportManager).isInLegacyMode(); doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - data registration only on LTE Message m = getServiceStateChangedMessage(getServiceStateDataOnly( Loading @@ -784,6 +814,7 @@ public class ImsPhoneTest extends TelephonyTest { public void testDataOnlyRoamingCellToIWlanInLegacyMode() throws Exception { doReturn(true).when(mTransportManager).isInLegacyMode(); doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - data registration only on LTE Message m = getServiceStateChangedMessage(getServiceStateDataOnly( Loading @@ -809,6 +840,7 @@ public class ImsPhoneTest extends TelephonyTest { public void testCellVoiceDataChangeToWlanInLegacyMode() throws Exception { doReturn(true).when(mTransportManager).isInLegacyMode(); doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState(); doReturn(true).when(mPhone).isRadioOn(); //roaming - voice/data registration on LTE ServiceState ss = getServiceStateDataAndVoice( Loading