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

Commit 9f65cb29 authored by Malcolm Chen's avatar Malcolm Chen
Browse files

Dynamically revoke Internet capability in NetworkAgent.

When we switch Internt data from a subscription where
its Internet and IMS are on the same APN, the dataConnection
is not really torn down because IMS is still needed. Here
we still report capability of Internet + IMS through NetworkAgent.
Therefore the ConnectivityService will stick to that network
and tear down the new one. By revoking the capability
of Internet through NetworkAgent API, this problem is resolved.

Bug: 118347948
Test: manual
Change-Id: I2f8fd0812d1016f87063f645b1ce4ca3bedff276
parent 93685281
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -189,6 +189,7 @@ public class DataConnection extends StateMachine {
    private NetworkInfo mNetworkInfo;
    private DcNetworkAgent mNetworkAgent;
    private LocalLog mNetCapsLocalLog = new LocalLog(50);
    private int mDisabledApnTypeBitMask = 0;

    int mTag;
    public int mCid;
@@ -738,6 +739,7 @@ public class DataConnection extends StateMachine {
        mUnmeteredUseOnly = false;
        mRestrictedNetworkOverride = false;
        mDcFailCause = null;
        mDisabledApnTypeBitMask = 0;
    }

    /**
@@ -990,7 +992,7 @@ public class DataConnection extends StateMachine {

        if (mApnSetting != null) {
            final String[] types = ApnSetting.getApnTypesStringFromBitmask(
                mApnSetting.getApnTypeBitmask()).split(",");
                mApnSetting.getApnTypeBitmask() & ~mDisabledApnTypeBitMask).split(",");
            for (String type : types) {
                if (!mRestrictedNetworkOverride && mUnmeteredUseOnly
                        && ApnSettingUtils.isMeteredApnType(type, mPhone)) {
@@ -1759,6 +1761,10 @@ public class DataConnection extends StateMachine {
                    // either add this new apn context to our set or
                    // update the existing cp with the latest connection generation number
                    mApnContexts.put(cp.mApnContext, cp);
                    // TODO (b/118347948): evaluate if it's still needed after assigning
                    // different scores to different Cellular network.
                    mDisabledApnTypeBitMask &= ~cp.mApnContext.getApnTypeBitmask();
                    mNetworkAgent.sendNetworkCapabilities(getNetworkCapabilities());
                    if (DBG) {
                        log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this);
                    }
@@ -1787,6 +1793,10 @@ public class DataConnection extends StateMachine {
                            transitionTo(mDisconnectingState);
                        } else {
                            mApnContexts.remove(dp.mApnContext);
                            // TODO (b/118347948): evaluate if it's still needed after assigning
                            // different scores to different Cellular network.
                            mDisabledApnTypeBitMask |= dp.mApnContext.getApnTypeBitmask();
                            mNetworkAgent.sendNetworkCapabilities(getNetworkCapabilities());
                            notifyDisconnectCompleted(dp, false);
                        }
                    } else {
+6 −2
Original line number Diff line number Diff line
@@ -859,11 +859,15 @@ public class DcTracker extends Handler {
        if (apnContext != null) apnContext.requestNetwork(networkRequest, log);
    }

    public void releaseNetwork(NetworkRequest networkRequest, LocalLog log) {
    public void releaseNetwork(NetworkRequest networkRequest, LocalLog log,
            boolean cleanUpConnection) {
        final int apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest);
        final ApnContext apnContext = mApnContextsByType.get(apnType);
        log.log("DcTracker.releaseNetwork for " + networkRequest + " found " + apnContext);
        if (apnContext != null) apnContext.releaseNetwork(networkRequest, log);
        if (apnContext != null) {
            apnContext.releaseNetwork(networkRequest, log);
            if (cleanUpConnection) cleanUpConnectionInternal(true, apnContext);
        }
    }

    // Turn telephony radio on or off.
+8 −7
Original line number Diff line number Diff line
@@ -160,8 +160,8 @@ public class TelephonyNetworkFactory extends NetworkFactory {
    private static final int ACTION_REQUEST = 1;
    private static final int ACTION_RELEASE = 2;

    private void applyRequests(HashMap<NetworkRequest, LocalLog> requestMap,
            int action, String logStr) {
    private void applyRequestsOnActivePhoneSwitch(HashMap<NetworkRequest, LocalLog> requestMap,
            boolean cleanUpOnRelease, int action, String logStr) {
        if (action == ACTION_NO_OP) return;

        for (NetworkRequest networkRequest : requestMap.keySet()) {
@@ -170,7 +170,7 @@ public class TelephonyNetworkFactory extends NetworkFactory {
            if (action == ACTION_REQUEST) {
                mDcTracker.requestNetwork(networkRequest, localLog);
            } else if (action == ACTION_RELEASE) {
                mDcTracker.releaseNetwork(networkRequest, localLog);
                mDcTracker.releaseNetwork(networkRequest, localLog, cleanUpOnRelease);
            }
        }
    }
@@ -196,9 +196,10 @@ public class TelephonyNetworkFactory extends NetworkFactory {
                + "newIsActiveForDefault " + newIsActiveForDefault + ")";
        if (DBG) log(logString);

        applyRequests(mSpecificRequests, getAction(mIsActive, newIsActive), logString);
        applyRequests(mDefaultRequests, getAction(mIsActiveForDefault, newIsActiveForDefault),
                logString);
        applyRequestsOnActivePhoneSwitch(mSpecificRequests, false,
                getAction(mIsActive, newIsActive), logString);
        applyRequestsOnActivePhoneSwitch(mDefaultRequests, true,
                getAction(mIsActiveForDefault, newIsActiveForDefault), logString);

        mIsActive = newIsActive;
        mIsActiveForDefault = newIsActiveForDefault;
@@ -279,7 +280,7 @@ public class TelephonyNetworkFactory extends NetworkFactory {
            String s = "onReleaseNetworkFor";
            localLog.log(s);
            log(s + " " + networkRequest);
            mDcTracker.releaseNetwork(networkRequest, localLog);
            mDcTracker.releaseNetwork(networkRequest, localLog, false);
        } else {
            String s = "not releasing - isApplicable=" + isApplicable + ", mIsActive=" + mIsActive;
            localLog.log(s);
+2 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.android.internal.telephony.TelephonyTestUtils.waitForMs;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.doAnswer;

import android.content.Context;
@@ -116,7 +117,7 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {
        doAnswer(invocation -> {
            mNetworkRequestList.remove((NetworkRequest) invocation.getArguments()[0]);
            return null;
        }).when(mDcTracker).releaseNetwork(any(), any());
        }).when(mDcTracker).releaseNetwork(any(), any(), anyBoolean());
    }

    @After