Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e023040a authored by Jack Yu's avatar Jack Yu
Browse files

Fixed unnecessary network request removal

Telephony network factory used to remove network requests
from both cellular and IWLAN DcTrackers. This causes one extra
network request removal on the new data stack, which is no harm but
generate misleading debug messages.

Fix: 228839789
Test: atest FrameworksTelephonyTests & Manual
Merged-In: Ia9113e92a0f7c84b16fd76970c865513e3e04e7e
Change-Id: Ia9113e92a0f7c84b16fd76970c865513e3e04e7e
parent 376b8ce3
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -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);
    }

@@ -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;
    }

@@ -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);
    }

    /**
+27 −12
Original line number Diff line number Diff line
@@ -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) {
@@ -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);
@@ -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) {
+0 −37
Original line number Diff line number Diff line
@@ -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());
    }
}