Loading src/java/com/android/internal/telephony/dataconnection/DcTracker.java +7 −2 Original line number Diff line number Diff line Loading @@ -4364,10 +4364,15 @@ public class DcTracker extends Handler { if (mAllApnSettings != null && mAllApnSettings.isEmpty()) { cleanUpAllConnections(tearDown, Phone.REASON_APN_CHANGED); } else { int radioTech = mPhone.getServiceState().getRilDataRadioTechnology(); if (radioTech == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) { // unknown rat is an exception for data rat change. Its only received when out of // service and is not applicable for apn bearer bitmask. We should bypass the check // of waiting apn list and keep the data connection on. return; } for (ApnContext apnContext : mApnContexts.values()) { ArrayList<ApnSetting> currentWaitingApns = apnContext.getWaitingApns(); int radioTech = mPhone.getServiceState().getRilDataRadioTechnology(); ArrayList<ApnSetting> waitingApns = buildWaitingApns( apnContext.getApnType(), radioTech); if (VDBG) log("new waitingApns:" + waitingApns); Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +50 −0 Original line number Diff line number Diff line Loading @@ -1107,4 +1107,54 @@ public class DcTrackerTest extends TelephonyTest { verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, LTE_BEARER_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); } // Test oos @Test @SmallTest public void testDataRatChangeOOS() throws Exception { doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD).when(mServiceState) .getRilDataRadioTechnology(); mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS, new String[]{PhoneConstants.APN_TYPE_DEFAULT}); mDct.setEnabled(0, true); mDct.setDataEnabled(true); initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL}); logd("Sending EVENT_RECORDS_LOADED"); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null)); waitForMs(200); logd("Sending EVENT_DATA_CONNECTION_ATTACHED"); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null)); waitForMs(200); ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class); // Verify if RIL command was sent properly. verify(mSimulatedCommandsVerifier).setupDataCall( eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(), eq(false), eq(false), any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN4, 0, 5, 2, EHRPD_BEARER_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); // Data rat change from ehrpd to unknown due to OOS logd("Sending EVENT_DATA_RAT_CHANGED"); doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN).when(mServiceState) .getRilDataRadioTechnology(); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_RAT_CHANGED, null)); waitForMs(200); // Verify data connection is on verify(mSimulatedCommandsVerifier, times(0)).deactivateDataCall(anyInt(), anyInt(), any(Message.class)); // Data rat resume from unknown to ehrpd doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD).when(mServiceState) .getRilDataRadioTechnology(); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_RAT_CHANGED, null)); waitForMs(200); // Verify the same data connection assertEquals(FAKE_APN4, mDct.getActiveApnString(PhoneConstants.APN_TYPE_DEFAULT)); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); } } Loading
src/java/com/android/internal/telephony/dataconnection/DcTracker.java +7 −2 Original line number Diff line number Diff line Loading @@ -4364,10 +4364,15 @@ public class DcTracker extends Handler { if (mAllApnSettings != null && mAllApnSettings.isEmpty()) { cleanUpAllConnections(tearDown, Phone.REASON_APN_CHANGED); } else { int radioTech = mPhone.getServiceState().getRilDataRadioTechnology(); if (radioTech == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) { // unknown rat is an exception for data rat change. Its only received when out of // service and is not applicable for apn bearer bitmask. We should bypass the check // of waiting apn list and keep the data connection on. return; } for (ApnContext apnContext : mApnContexts.values()) { ArrayList<ApnSetting> currentWaitingApns = apnContext.getWaitingApns(); int radioTech = mPhone.getServiceState().getRilDataRadioTechnology(); ArrayList<ApnSetting> waitingApns = buildWaitingApns( apnContext.getApnType(), radioTech); if (VDBG) log("new waitingApns:" + waitingApns); Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +50 −0 Original line number Diff line number Diff line Loading @@ -1107,4 +1107,54 @@ public class DcTrackerTest extends TelephonyTest { verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, LTE_BEARER_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); } // Test oos @Test @SmallTest public void testDataRatChangeOOS() throws Exception { doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD).when(mServiceState) .getRilDataRadioTechnology(); mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS, new String[]{PhoneConstants.APN_TYPE_DEFAULT}); mDct.setEnabled(0, true); mDct.setDataEnabled(true); initApns(PhoneConstants.APN_TYPE_DEFAULT, new String[]{PhoneConstants.APN_TYPE_ALL}); logd("Sending EVENT_RECORDS_LOADED"); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null)); waitForMs(200); logd("Sending EVENT_DATA_CONNECTION_ATTACHED"); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null)); waitForMs(200); ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class); // Verify if RIL command was sent properly. verify(mSimulatedCommandsVerifier).setupDataCall( eq(mServiceState.getRilDataRadioTechnology()), dpCaptor.capture(), eq(false), eq(false), any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN4, 0, 5, 2, EHRPD_BEARER_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); // Data rat change from ehrpd to unknown due to OOS logd("Sending EVENT_DATA_RAT_CHANGED"); doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN).when(mServiceState) .getRilDataRadioTechnology(); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_RAT_CHANGED, null)); waitForMs(200); // Verify data connection is on verify(mSimulatedCommandsVerifier, times(0)).deactivateDataCall(anyInt(), anyInt(), any(Message.class)); // Data rat resume from unknown to ehrpd doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD).when(mServiceState) .getRilDataRadioTechnology(); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_RAT_CHANGED, null)); waitForMs(200); // Verify the same data connection assertEquals(FAKE_APN4, mDct.getActiveApnString(PhoneConstants.APN_TYPE_DEFAULT)); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); } }