Fixed incorrect merge service state
The existing logic for merging service state when device is on
IWLAN does not work properly on AP-assisted mode devices. Fixed
by copying the IWLAN preferred flag into IMS service state so
it can get the correct data RAT for AP-assisted mode devices.
Bug: 134706530
Test: WFC manual tests
Change-Id: Idaa6d4aa1b885fc27b6b5fef0a9628cbe4c0b860
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index f769427..5856ad1 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -4093,6 +4093,7 @@
pw.println(" getActiveApnTypes()=" + getActiveApnTypes());
pw.println(" needsOtaServiceProvisioning=" + needsOtaServiceProvisioning());
pw.println(" isInEmergencySmsMode=" + isInEmergencySmsMode());
+ pw.println(" service state=" + getServiceState());
pw.flush();
pw.println("++++++++++++++++++++++++++++++++");
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index c53489f..e1c53c3 100755
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -5223,6 +5223,10 @@
mNewSS.addNetworkRegistrationInfo(nri);
}
mNewSS.setOperatorAlphaLong(operator);
+ // Since it's in airplane mode, cellular must be out of service. The only possible
+ // transport for data to go through is the IWLAN transport. Setting this to true
+ // so that ServiceState.getDataNetworkType can report the right RAT.
+ mNewSS.setIwlanPreferred(true);
log("pollStateDone: mNewSS = " + mNewSS);
}
return;
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
index 539a539..138f875 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
@@ -1452,6 +1452,7 @@
mSS.addNetworkRegistrationInfo(nri);
}
+ mSS.setIwlanPreferred(ss.isIwlanPreferred());
logd("updateDataServiceState: defSs = " + ss + " imsSs = " + mSS);
}
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java b/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java
index 8655279..f24353e 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java
@@ -169,6 +169,89 @@
@Test
@SmallTest
+ public void testGetMergedServiceState() throws Exception {
+ ServiceState imsServiceState = new ServiceState();
+
+ NetworkRegistrationInfo imsCsWwanRegInfo = new NetworkRegistrationInfo.Builder()
+ .setDomain(NetworkRegistrationInfo.DOMAIN_CS)
+ .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
+ .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE)
+ .setRegistrationState(
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
+ .build();
+
+ 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();
+
+ imsServiceState.addNetworkRegistrationInfo(imsCsWwanRegInfo);
+ imsServiceState.addNetworkRegistrationInfo(imsPsWwanRegInfo);
+ imsServiceState.addNetworkRegistrationInfo(imsPsWlanRegInfo);
+
+ 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());
+ }
+
+ @Test
+ @SmallTest
public void testGetSubscriberIdForGsmPhone() {
final String subscriberId = "123456789";
IccRecords iccRecords = Mockito.mock(IccRecords.class);
@@ -1002,3 +1085,4 @@
assertEquals(msisdn, mPhoneUT.getLine1Number());
}
}
+