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

Commit 7a227c33 authored by Jack Yu's avatar Jack Yu
Browse files

Gracefully tear down networks when SIM is disabled

Telephony used to be only support graceful network tear down for
SIM removal case. Now added the support for SIM disabled case.

Fix: 362372940
Flag: com.android.internal.telephony.flags.sim_disabled_graceful_tear_down
Test: Manually disabled the SIM and observed the behavior.
Test: atest DataNetworkControllerTest
Change-Id: I2230e3f07f951a9346fddf70d15850f0500cd680
parent 44b3dbaa
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -121,3 +121,14 @@ flag {
  }
}

# OWNER=jackyu TARGET=25Q1
flag {
  name: "sim_disabled_graceful_tear_down"
  namespace: "telephony"
  description: "Gracefully tear down the networks when SIM is disabled."
  bug: ""
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}
+2 −0
Original line number Diff line number Diff line
@@ -225,6 +225,8 @@ public class DataEvaluation {
        SIM_LOADED(true),
        /** SIM is removed. */
        SIM_REMOVAL(true),
        /** SIM is disabled. */
        SIM_DISABLED(true),
        /** Data profiles changed. */
        DATA_PROFILES_CHANGED(true),
        /** When service state changes.(For now only considering data RAT and data registration). */
+11 −11
Original line number Diff line number Diff line
@@ -3542,15 +3542,6 @@ public class DataNetworkController extends Handler {
        mDataServiceBound.put(transport, bound);
    }

    /**
     * Called when SIM is absent.
     */
    private void onSimAbsent() {
        log("onSimAbsent");
        sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
                DataEvaluationReason.SIM_REMOVAL));
    }

    /**
     * Called when SIM state changes.
     *
@@ -3559,13 +3550,22 @@ public class DataNetworkController extends Handler {
    private void onSimStateChanged(@SimState int simState) {
        log("onSimStateChanged: state=" + TelephonyManager.simStateToString(simState));
        if (mSimState != simState) {
            mSimState = simState;
            if (simState == TelephonyManager.SIM_STATE_ABSENT) {
                onSimAbsent();
                log("onSimStateChanged: SIM absent.");
                sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
                        DataEvaluationReason.SIM_REMOVAL));
            } else if (simState == TelephonyManager.SIM_STATE_NOT_READY
                    && mSimState == TelephonyManager.SIM_STATE_LOADED) {
                if (mFeatureFlags.simDisabledGracefulTearDown()) {
                    log("onSimStateChanged: SIM disabled.");
                    sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
                            DataEvaluationReason.SIM_DISABLED));
                }
            } else if (simState == TelephonyManager.SIM_STATE_LOADED) {
                sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
                        DataEvaluationReason.SIM_LOADED));
            }
            mSimState = simState;
            mDataNetworkControllerCallbacks.forEach(callback -> callback.invokeFromExecutor(
                    () -> callback.onSimStateChanged(mSimState)));
        }
+50 −1
Original line number Diff line number Diff line
@@ -888,8 +888,11 @@ public class DataNetworkControllerTest extends TelephonyTest {
        doReturn(PhoneConstants.State.IDLE).when(mCT).getState();
        doReturn(new SubscriptionInfoInternal.Builder().setId(1).build())
                .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt());

        doReturn(true).when(mFeatureFlags).carrierEnabledSatelliteFlag();
        doReturn(true).when(mFeatureFlags).satelliteInternet();
        doReturn(true).when(mFeatureFlags).simDisabledGracefulTearDown();

        when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
        doReturn(true).when(mMockPackageManager).hasSystemFeature(anyString());

@@ -4196,7 +4199,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
    }

    @Test
    public void testImsGracefulTearDown() throws Exception {
    public void testImsGracefulTearDownSimRemoval() throws Exception {
        setImsRegistered(true);
        setRcsRegistered(true);

@@ -4241,6 +4244,52 @@ public class DataNetworkControllerTest extends TelephonyTest {
        assertThat(pdcs.getState()).isEqualTo(TelephonyManager.DATA_DISCONNECTED);
    }

    @Test
    public void testImsGracefulTearDownSimDisabled() throws Exception {
        setImsRegistered(true);
        setRcsRegistered(true);

        NetworkCapabilities netCaps = new NetworkCapabilities();
        netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
        netCaps.maybeMarkCapabilitiesRestricted();
        netCaps.setRequestorPackageName(FAKE_MMTEL_PACKAGE);

        NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps,
                ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId, NetworkRequest.Type.REQUEST);
        TelephonyNetworkRequest networkRequest = new TelephonyNetworkRequest(
                nativeNetworkRequest, mPhone, mFeatureFlags);

        mDataNetworkControllerUT.addNetworkRequest(networkRequest);

        processAllMessages();
        Mockito.clearInvocations(mPhone);

        // SIM disabled
        mDataNetworkControllerUT.obtainMessage(9/*EVENT_SIM_STATE_CHANGED*/,
                TelephonyManager.SIM_STATE_NOT_READY, 0).sendToTarget();
        processAllMessages();

        // Make sure data network enters disconnecting state
        ArgumentCaptor<PreciseDataConnectionState> pdcsCaptor =
                ArgumentCaptor.forClass(PreciseDataConnectionState.class);
        verify(mPhone).notifyDataConnection(pdcsCaptor.capture());
        PreciseDataConnectionState pdcs = pdcsCaptor.getValue();
        assertThat(pdcs.getState()).isEqualTo(TelephonyManager.DATA_DISCONNECTING);

        // IMS de-registered. Now data network is safe to be torn down.
        Mockito.clearInvocations(mPhone);
        setImsRegistered(false);
        setRcsRegistered(false);
        processAllMessages();

        // All data should be disconnected.
        verifyAllDataDisconnected();
        verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
        verify(mPhone).notifyDataConnection(pdcsCaptor.capture());
        pdcs = pdcsCaptor.getValue();
        assertThat(pdcs.getState()).isEqualTo(TelephonyManager.DATA_DISCONNECTED);
    }

    @Test
    public void testNoGracefulTearDownForEmergencyDataNetwork() throws Exception {
        setImsRegistered(true);