Loading src/java/com/android/internal/telephony/GsmCdmaPhone.java +14 −14 Original line number Diff line number Diff line Loading @@ -948,29 +948,29 @@ public class GsmCdmaPhone extends Phone { /** * ImsService reports "IN_SERVICE" for its voice registration state even if the device * has lost the physical link to the tower. This helper method merges the IMS and modem * ServiceState, only overriding the voice registration state when we are registered to IMS over * IWLAN. In this case the voice registration state will always be "OUT_OF_SERVICE", so override * the voice registration state with the data registration state. * ServiceState, only overriding the voice registration state when we are registered to IMS. In * this case the voice registration state may be "OUT_OF_SERVICE", so override the voice * registration state with the data registration state. */ private ServiceState mergeServiceStates(ServiceState baseSs, ServiceState imsSs) { // No need to merge states if the baseSs is IN_SERVICE. if (baseSs.getVoiceRegState() == ServiceState.STATE_IN_SERVICE) { return baseSs; } // "IN_SERVICE" in this case means IMS is registered. if (imsSs.getVoiceRegState() != ServiceState.STATE_IN_SERVICE) { return baseSs; } if (imsSs.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN) { ServiceState newSs = new ServiceState(baseSs); // Voice override for IWLAN. In this case, voice registration is OUT_OF_SERVICE, but // the data RAT is IWLAN, so use that as a basis for determining whether or not the // physical link is available. // Voice override for IMS case. In this case, voice registration is OUT_OF_SERVICE, but // IMS is available, so use data registration state as a basis for determining // whether or not the physical link is available. newSs.setVoiceRegState(baseSs.getDataRegState()); newSs.setEmergencyOnly(false); // only get here if voice is IN_SERVICE return newSs; } return baseSs; } private boolean handleCallDeflectionIncallSupplementaryService( String dialString) { if (dialString.length() > 1) { Loading tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java +82 −7 Original line number Diff line number Diff line Loading @@ -158,14 +158,87 @@ public class GsmCdmaPhoneTest extends TelephonyTest { public void testGetMergedServiceState() throws Exception { ServiceState imsServiceState = new ServiceState(); NetworkRegistrationInfo imsCsWwanRegInfo = new NetworkRegistrationInfo.Builder() NetworkRegistrationInfo imsPsWwanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_HOME) .build(); NetworkRegistrationInfo imsPsWlanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_HOME) .build(); // Only PS states are tracked for IMS. imsServiceState.addNetworkRegistrationInfo(imsPsWwanRegInfo); imsServiceState.addNetworkRegistrationInfo(imsPsWlanRegInfo); // Voice reg state in this case is whether or not IMS is registered. imsServiceState.setVoiceRegState(ServiceState.STATE_IN_SERVICE); imsServiceState.setDataRegState(ServiceState.STATE_IN_SERVICE); imsServiceState.setIwlanPreferred(true); doReturn(imsServiceState).when(mImsPhone).getServiceState(); replaceInstance(Phone.class, "mImsPhone", mPhoneUT, mImsPhone); ServiceState serviceState = new ServiceState(); NetworkRegistrationInfo csWwanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_CS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) .build(); NetworkRegistrationInfo psWwanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) .build(); NetworkRegistrationInfo psWlanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_HOME) .build(); serviceState.addNetworkRegistrationInfo(csWwanRegInfo); serviceState.addNetworkRegistrationInfo(psWwanRegInfo); serviceState.addNetworkRegistrationInfo(psWlanRegInfo); serviceState.setVoiceRegState(ServiceState.STATE_OUT_OF_SERVICE); serviceState.setDataRegState(ServiceState.STATE_IN_SERVICE); serviceState.setIwlanPreferred(true); mSST.mSS = serviceState; mPhoneUT.mSST = mSST; ServiceState mergedServiceState = mPhoneUT.getServiceState(); assertEquals(ServiceState.STATE_IN_SERVICE, mergedServiceState.getVoiceRegState()); assertEquals(ServiceState.STATE_IN_SERVICE, mergedServiceState.getDataRegState()); assertEquals(TelephonyManager.NETWORK_TYPE_IWLAN, mergedServiceState.getDataNetworkType()); } /** * Some vendors do not provide a voice registration for LTE when attached to LTE only (no CSFB * available). In this case, we should still get IN_SERVICE for voice service state, since * IMS is registered. */ @Test @SmallTest public void testGetMergedServiceStateNoCsfb() throws Exception { ServiceState imsServiceState = new ServiceState(); NetworkRegistrationInfo imsPsWwanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) Loading @@ -179,13 +252,14 @@ public class GsmCdmaPhoneTest extends TelephonyTest { .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_HOME) NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) .build(); imsServiceState.addNetworkRegistrationInfo(imsCsWwanRegInfo); // Only PS states are tracked for IMS. imsServiceState.addNetworkRegistrationInfo(imsPsWwanRegInfo); imsServiceState.addNetworkRegistrationInfo(imsPsWlanRegInfo); // Voice reg state in this case is whether or not IMS is registered. imsServiceState.setVoiceRegState(ServiceState.STATE_IN_SERVICE); imsServiceState.setDataRegState(ServiceState.STATE_IN_SERVICE); imsServiceState.setIwlanPreferred(true); Loading @@ -198,7 +272,7 @@ public class GsmCdmaPhoneTest extends TelephonyTest { NetworkRegistrationInfo csWwanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_CS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UNKNOWN) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) .build(); Loading @@ -208,7 +282,7 @@ public class GsmCdmaPhoneTest extends TelephonyTest { .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) NetworkRegistrationInfo.REGISTRATION_STATE_HOME) .build(); NetworkRegistrationInfo psWlanRegInfo = new NetworkRegistrationInfo.Builder() Loading @@ -216,12 +290,13 @@ public class GsmCdmaPhoneTest extends TelephonyTest { .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_HOME) NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) .build(); serviceState.addNetworkRegistrationInfo(csWwanRegInfo); serviceState.addNetworkRegistrationInfo(psWwanRegInfo); serviceState.addNetworkRegistrationInfo(psWlanRegInfo); // No CSFB, voice is OOS for LTE only attach serviceState.setVoiceRegState(ServiceState.STATE_OUT_OF_SERVICE); serviceState.setDataRegState(ServiceState.STATE_IN_SERVICE); serviceState.setIwlanPreferred(true); Loading @@ -233,7 +308,7 @@ public class GsmCdmaPhoneTest extends TelephonyTest { assertEquals(ServiceState.STATE_IN_SERVICE, mergedServiceState.getVoiceRegState()); assertEquals(ServiceState.STATE_IN_SERVICE, mergedServiceState.getDataRegState()); assertEquals(TelephonyManager.NETWORK_TYPE_IWLAN, mergedServiceState.getDataNetworkType()); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mergedServiceState.getDataNetworkType()); } @Test Loading Loading
src/java/com/android/internal/telephony/GsmCdmaPhone.java +14 −14 Original line number Diff line number Diff line Loading @@ -948,29 +948,29 @@ public class GsmCdmaPhone extends Phone { /** * ImsService reports "IN_SERVICE" for its voice registration state even if the device * has lost the physical link to the tower. This helper method merges the IMS and modem * ServiceState, only overriding the voice registration state when we are registered to IMS over * IWLAN. In this case the voice registration state will always be "OUT_OF_SERVICE", so override * the voice registration state with the data registration state. * ServiceState, only overriding the voice registration state when we are registered to IMS. In * this case the voice registration state may be "OUT_OF_SERVICE", so override the voice * registration state with the data registration state. */ private ServiceState mergeServiceStates(ServiceState baseSs, ServiceState imsSs) { // No need to merge states if the baseSs is IN_SERVICE. if (baseSs.getVoiceRegState() == ServiceState.STATE_IN_SERVICE) { return baseSs; } // "IN_SERVICE" in this case means IMS is registered. if (imsSs.getVoiceRegState() != ServiceState.STATE_IN_SERVICE) { return baseSs; } if (imsSs.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN) { ServiceState newSs = new ServiceState(baseSs); // Voice override for IWLAN. In this case, voice registration is OUT_OF_SERVICE, but // the data RAT is IWLAN, so use that as a basis for determining whether or not the // physical link is available. // Voice override for IMS case. In this case, voice registration is OUT_OF_SERVICE, but // IMS is available, so use data registration state as a basis for determining // whether or not the physical link is available. newSs.setVoiceRegState(baseSs.getDataRegState()); newSs.setEmergencyOnly(false); // only get here if voice is IN_SERVICE return newSs; } return baseSs; } private boolean handleCallDeflectionIncallSupplementaryService( String dialString) { if (dialString.length() > 1) { Loading
tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java +82 −7 Original line number Diff line number Diff line Loading @@ -158,14 +158,87 @@ public class GsmCdmaPhoneTest extends TelephonyTest { public void testGetMergedServiceState() throws Exception { ServiceState imsServiceState = new ServiceState(); NetworkRegistrationInfo imsCsWwanRegInfo = new NetworkRegistrationInfo.Builder() NetworkRegistrationInfo imsPsWwanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_HOME) .build(); NetworkRegistrationInfo imsPsWlanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_HOME) .build(); // Only PS states are tracked for IMS. imsServiceState.addNetworkRegistrationInfo(imsPsWwanRegInfo); imsServiceState.addNetworkRegistrationInfo(imsPsWlanRegInfo); // Voice reg state in this case is whether or not IMS is registered. imsServiceState.setVoiceRegState(ServiceState.STATE_IN_SERVICE); imsServiceState.setDataRegState(ServiceState.STATE_IN_SERVICE); imsServiceState.setIwlanPreferred(true); doReturn(imsServiceState).when(mImsPhone).getServiceState(); replaceInstance(Phone.class, "mImsPhone", mPhoneUT, mImsPhone); ServiceState serviceState = new ServiceState(); NetworkRegistrationInfo csWwanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_CS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) .build(); NetworkRegistrationInfo psWwanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) .build(); NetworkRegistrationInfo psWlanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_HOME) .build(); serviceState.addNetworkRegistrationInfo(csWwanRegInfo); serviceState.addNetworkRegistrationInfo(psWwanRegInfo); serviceState.addNetworkRegistrationInfo(psWlanRegInfo); serviceState.setVoiceRegState(ServiceState.STATE_OUT_OF_SERVICE); serviceState.setDataRegState(ServiceState.STATE_IN_SERVICE); serviceState.setIwlanPreferred(true); mSST.mSS = serviceState; mPhoneUT.mSST = mSST; ServiceState mergedServiceState = mPhoneUT.getServiceState(); assertEquals(ServiceState.STATE_IN_SERVICE, mergedServiceState.getVoiceRegState()); assertEquals(ServiceState.STATE_IN_SERVICE, mergedServiceState.getDataRegState()); assertEquals(TelephonyManager.NETWORK_TYPE_IWLAN, mergedServiceState.getDataNetworkType()); } /** * Some vendors do not provide a voice registration for LTE when attached to LTE only (no CSFB * available). In this case, we should still get IN_SERVICE for voice service state, since * IMS is registered. */ @Test @SmallTest public void testGetMergedServiceStateNoCsfb() throws Exception { ServiceState imsServiceState = new ServiceState(); NetworkRegistrationInfo imsPsWwanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) Loading @@ -179,13 +252,14 @@ public class GsmCdmaPhoneTest extends TelephonyTest { .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_HOME) NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) .build(); imsServiceState.addNetworkRegistrationInfo(imsCsWwanRegInfo); // Only PS states are tracked for IMS. imsServiceState.addNetworkRegistrationInfo(imsPsWwanRegInfo); imsServiceState.addNetworkRegistrationInfo(imsPsWlanRegInfo); // Voice reg state in this case is whether or not IMS is registered. imsServiceState.setVoiceRegState(ServiceState.STATE_IN_SERVICE); imsServiceState.setDataRegState(ServiceState.STATE_IN_SERVICE); imsServiceState.setIwlanPreferred(true); Loading @@ -198,7 +272,7 @@ public class GsmCdmaPhoneTest extends TelephonyTest { NetworkRegistrationInfo csWwanRegInfo = new NetworkRegistrationInfo.Builder() .setDomain(NetworkRegistrationInfo.DOMAIN_CS) .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UNKNOWN) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) .build(); Loading @@ -208,7 +282,7 @@ public class GsmCdmaPhoneTest extends TelephonyTest { .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) NetworkRegistrationInfo.REGISTRATION_STATE_HOME) .build(); NetworkRegistrationInfo psWlanRegInfo = new NetworkRegistrationInfo.Builder() Loading @@ -216,12 +290,13 @@ public class GsmCdmaPhoneTest extends TelephonyTest { .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) .setRegistrationState( NetworkRegistrationInfo.REGISTRATION_STATE_HOME) NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) .build(); serviceState.addNetworkRegistrationInfo(csWwanRegInfo); serviceState.addNetworkRegistrationInfo(psWwanRegInfo); serviceState.addNetworkRegistrationInfo(psWlanRegInfo); // No CSFB, voice is OOS for LTE only attach serviceState.setVoiceRegState(ServiceState.STATE_OUT_OF_SERVICE); serviceState.setDataRegState(ServiceState.STATE_IN_SERVICE); serviceState.setIwlanPreferred(true); Loading @@ -233,7 +308,7 @@ public class GsmCdmaPhoneTest extends TelephonyTest { assertEquals(ServiceState.STATE_IN_SERVICE, mergedServiceState.getVoiceRegState()); assertEquals(ServiceState.STATE_IN_SERVICE, mergedServiceState.getDataRegState()); assertEquals(TelephonyManager.NETWORK_TYPE_IWLAN, mergedServiceState.getDataNetworkType()); assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mergedServiceState.getDataNetworkType()); } @Test Loading