Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +11 −8 Original line number Diff line number Diff line Loading @@ -1157,7 +1157,7 @@ public class DataNetworkController extends Handler { loge("onAddNetworkRequest: Duplicate network request. " + networkRequest); return; } logv("onAddNetworkRequest: added " + networkRequest); log("onAddNetworkRequest: added " + networkRequest); onSatisfyNetworkRequest(networkRequest); } Loading Loading @@ -1495,12 +1495,15 @@ public class DataNetworkController extends Handler { } networkRequest.setEvaluation(evaluation); // EXTERNAL_QUERY generates too many log spam. if (reason != DataEvaluationReason.EXTERNAL_QUERY) { log(evaluation.toString() + ", network type=" + TelephonyManager.getNetworkTypeName(getDataNetworkType(transport)) + ", reg state=" + NetworkRegistrationInfo.registrationStateToString( getDataRegistrationState(transport)) + ", " + networkRequest); } return evaluation; } Loading Loading @@ -1921,7 +1924,7 @@ public class DataNetworkController extends Handler { if (networkRequest.getAttachedNetwork() != null) { networkRequest.getAttachedNetwork().detachNetworkRequest(networkRequest); } logv("onRemoveNetworkRequest: Removed " + networkRequest); log("onRemoveNetworkRequest: Removed " + networkRequest); } /** Loading src/java/com/android/internal/telephony/data/TelephonyNetworkFactory.java +27 −12 Original line number Diff line number Diff line Loading @@ -267,6 +267,13 @@ public class TelephonyNetworkFactory extends NetworkFactory { } } private void releaseNetworkInternal(TelephonyNetworkRequest networkRequest) { NetworkRequestsStats.addNetworkRelease(networkRequest.getNativeNetworkRequest(), mSubscriptionId); mPhone.getDataNetworkController().removeNetworkRequest(networkRequest); } // TODO: Clean this up after old data stack removed. private void releaseNetworkInternal(TelephonyNetworkRequest networkRequest, @ReleaseNetworkType int releaseType, int transport) { Loading Loading @@ -311,9 +318,13 @@ public class TelephonyNetworkFactory extends NetworkFactory { requestNetworkInternal(networkRequest, DcTracker.REQUEST_TYPE_NORMAL, getTransportTypeFromNetworkRequest(networkRequest), null); } else if (action == ACTION_RELEASE) { if (mPhone.isUsingNewDataStack()) { releaseNetworkInternal(networkRequest); } else { releaseNetworkInternal(networkRequest, DcTracker.RELEASE_TYPE_DETACH, getTransportTypeFromNetworkRequest(networkRequest)); } } mNetworkRequests.put(networkRequest, shouldApply ? transportType : AccessNetworkConstants.TRANSPORT_TYPE_INVALID); Loading Loading @@ -375,18 +386,22 @@ public class TelephonyNetworkFactory extends NetworkFactory { logl("onReleaseNetworkFor " + networkRequest + " applied " + applied); if (applied) { // Most of the time, the network request only exists in one of the DcTracker, but in the // middle of handover, the network request temporarily exists in both DcTrackers. If // connectivity service releases the network request while handover is ongoing, we need // to remove network requests from both DcTrackers. // Note that this part will be refactored in T, where we won't even have DcTracker at // all. if (mPhone.isUsingNewDataStack()) { releaseNetworkInternal(networkRequest); } else { // Most of the time, the network request only exists in one of the DcTracker, but in // the middle of handover, the network request temporarily exists in both // DcTrackers. If connectivity service releases the network request while handover // is ongoing, we need to remove network requests from both DcTrackers. // Note that this part will be refactored in T, where we won't even have DcTracker // at all. releaseNetworkInternal(networkRequest, DcTracker.RELEASE_TYPE_NORMAL, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); releaseNetworkInternal(networkRequest, DcTracker.RELEASE_TYPE_NORMAL, AccessNetworkConstants.TRANSPORT_TYPE_WLAN); } } } private void onDataHandoverNeeded(@ApnType int apnType, int targetTransport, HandoverParams handoverParams) { Loading tests/telephonytests/src/com/android/internal/telephony/data/TelephonyNetworkFactoryTest.java +0 −37 Original line number Diff line number Diff line Loading @@ -439,41 +439,4 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest { verify(mDataNetworkController, times(1)).removeNetworkRequest(any()); verify(mDataNetworkController, times(1)).addNetworkRequest(any()); } @Test @SmallTest public void testNetworkRequestReleasedDuringHandover() throws Exception { createMockedTelephonyComponents(); doReturn(0).when(mSubscriptionController).getSubIdUsingPhoneId(0); mTelephonyNetworkFactoryUT.mInternalHandler.sendEmptyMessage( TelephonyNetworkFactory.EVENT_SUBSCRIPTION_CHANGED); activatePhoneInPhoneSwitcher(0, true); makeDefaultInternetRequest(); NetworkRequest mmsNetworkRequest = makeSubSpecificMmsRequest(0); processAllMessages(); Field f = TelephonyNetworkFactory.class.getDeclaredField("mInternalHandler"); f.setAccessible(true); Handler h = (Handler) f.get(mTelephonyNetworkFactoryUT); HandoverCallback handoverCallback = mock(HandoverCallback.class); //Mockito.reset(mDcTracker); doReturn(mDataConnection).when(mDcTracker).getDataConnectionByApnType(anyString()); doReturn(true).when(mDataConnection).isActive(); HandoverParams hp = new HandoverParams(ApnSetting.TYPE_MMS, AccessNetworkConstants.TRANSPORT_TYPE_WLAN, handoverCallback); AsyncResult ar = new AsyncResult(null, hp, null); h.sendMessage(h.obtainMessage(5 /* EVENT_DATA_HANDOVER_NEEDED */, ar)); processAllMessages(); // Now release the network request while handover is still ongoing. mTelephonyNetworkFactoryUT.releaseNetworkFor(mmsNetworkRequest); processAllMessages(); // Ensure the release is called one more time after the normal release verify(mDataNetworkController, times(2)).removeNetworkRequest(any()); } } Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +11 −8 Original line number Diff line number Diff line Loading @@ -1157,7 +1157,7 @@ public class DataNetworkController extends Handler { loge("onAddNetworkRequest: Duplicate network request. " + networkRequest); return; } logv("onAddNetworkRequest: added " + networkRequest); log("onAddNetworkRequest: added " + networkRequest); onSatisfyNetworkRequest(networkRequest); } Loading Loading @@ -1495,12 +1495,15 @@ public class DataNetworkController extends Handler { } networkRequest.setEvaluation(evaluation); // EXTERNAL_QUERY generates too many log spam. if (reason != DataEvaluationReason.EXTERNAL_QUERY) { log(evaluation.toString() + ", network type=" + TelephonyManager.getNetworkTypeName(getDataNetworkType(transport)) + ", reg state=" + NetworkRegistrationInfo.registrationStateToString( getDataRegistrationState(transport)) + ", " + networkRequest); } return evaluation; } Loading Loading @@ -1921,7 +1924,7 @@ public class DataNetworkController extends Handler { if (networkRequest.getAttachedNetwork() != null) { networkRequest.getAttachedNetwork().detachNetworkRequest(networkRequest); } logv("onRemoveNetworkRequest: Removed " + networkRequest); log("onRemoveNetworkRequest: Removed " + networkRequest); } /** Loading
src/java/com/android/internal/telephony/data/TelephonyNetworkFactory.java +27 −12 Original line number Diff line number Diff line Loading @@ -267,6 +267,13 @@ public class TelephonyNetworkFactory extends NetworkFactory { } } private void releaseNetworkInternal(TelephonyNetworkRequest networkRequest) { NetworkRequestsStats.addNetworkRelease(networkRequest.getNativeNetworkRequest(), mSubscriptionId); mPhone.getDataNetworkController().removeNetworkRequest(networkRequest); } // TODO: Clean this up after old data stack removed. private void releaseNetworkInternal(TelephonyNetworkRequest networkRequest, @ReleaseNetworkType int releaseType, int transport) { Loading Loading @@ -311,9 +318,13 @@ public class TelephonyNetworkFactory extends NetworkFactory { requestNetworkInternal(networkRequest, DcTracker.REQUEST_TYPE_NORMAL, getTransportTypeFromNetworkRequest(networkRequest), null); } else if (action == ACTION_RELEASE) { if (mPhone.isUsingNewDataStack()) { releaseNetworkInternal(networkRequest); } else { releaseNetworkInternal(networkRequest, DcTracker.RELEASE_TYPE_DETACH, getTransportTypeFromNetworkRequest(networkRequest)); } } mNetworkRequests.put(networkRequest, shouldApply ? transportType : AccessNetworkConstants.TRANSPORT_TYPE_INVALID); Loading Loading @@ -375,18 +386,22 @@ public class TelephonyNetworkFactory extends NetworkFactory { logl("onReleaseNetworkFor " + networkRequest + " applied " + applied); if (applied) { // Most of the time, the network request only exists in one of the DcTracker, but in the // middle of handover, the network request temporarily exists in both DcTrackers. If // connectivity service releases the network request while handover is ongoing, we need // to remove network requests from both DcTrackers. // Note that this part will be refactored in T, where we won't even have DcTracker at // all. if (mPhone.isUsingNewDataStack()) { releaseNetworkInternal(networkRequest); } else { // Most of the time, the network request only exists in one of the DcTracker, but in // the middle of handover, the network request temporarily exists in both // DcTrackers. If connectivity service releases the network request while handover // is ongoing, we need to remove network requests from both DcTrackers. // Note that this part will be refactored in T, where we won't even have DcTracker // at all. releaseNetworkInternal(networkRequest, DcTracker.RELEASE_TYPE_NORMAL, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); releaseNetworkInternal(networkRequest, DcTracker.RELEASE_TYPE_NORMAL, AccessNetworkConstants.TRANSPORT_TYPE_WLAN); } } } private void onDataHandoverNeeded(@ApnType int apnType, int targetTransport, HandoverParams handoverParams) { Loading
tests/telephonytests/src/com/android/internal/telephony/data/TelephonyNetworkFactoryTest.java +0 −37 Original line number Diff line number Diff line Loading @@ -439,41 +439,4 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest { verify(mDataNetworkController, times(1)).removeNetworkRequest(any()); verify(mDataNetworkController, times(1)).addNetworkRequest(any()); } @Test @SmallTest public void testNetworkRequestReleasedDuringHandover() throws Exception { createMockedTelephonyComponents(); doReturn(0).when(mSubscriptionController).getSubIdUsingPhoneId(0); mTelephonyNetworkFactoryUT.mInternalHandler.sendEmptyMessage( TelephonyNetworkFactory.EVENT_SUBSCRIPTION_CHANGED); activatePhoneInPhoneSwitcher(0, true); makeDefaultInternetRequest(); NetworkRequest mmsNetworkRequest = makeSubSpecificMmsRequest(0); processAllMessages(); Field f = TelephonyNetworkFactory.class.getDeclaredField("mInternalHandler"); f.setAccessible(true); Handler h = (Handler) f.get(mTelephonyNetworkFactoryUT); HandoverCallback handoverCallback = mock(HandoverCallback.class); //Mockito.reset(mDcTracker); doReturn(mDataConnection).when(mDcTracker).getDataConnectionByApnType(anyString()); doReturn(true).when(mDataConnection).isActive(); HandoverParams hp = new HandoverParams(ApnSetting.TYPE_MMS, AccessNetworkConstants.TRANSPORT_TYPE_WLAN, handoverCallback); AsyncResult ar = new AsyncResult(null, hp, null); h.sendMessage(h.obtainMessage(5 /* EVENT_DATA_HANDOVER_NEEDED */, ar)); processAllMessages(); // Now release the network request while handover is still ongoing. mTelephonyNetworkFactoryUT.releaseNetworkFor(mmsNetworkRequest); processAllMessages(); // Ensure the release is called one more time after the normal release verify(mDataNetworkController, times(2)).removeNetworkRequest(any()); } }