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

Commit 2ab13198 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 8469449 from b8d54c7d to tm-d1-release

Change-Id: Id8aee742be50680099e467f7bce185e3c820140e
parents 2eb68839 b8d54c7d
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -1155,6 +1155,7 @@ public class DataNetworkController extends Handler {
     * @param networkRequest The network request.
     */
    private void onAddNetworkRequest(@NonNull TelephonyNetworkRequest networkRequest) {
        // To detect IMS back-to-back release-request anomaly event
        if (mLastImsOperationIsRelease) {
            mLastImsOperationIsRelease = false;
            if (Arrays.equals(
@@ -1454,10 +1455,17 @@ public class DataNetworkController extends Handler {
        }

        // Check if only one data network is allowed.
        if (isOnlySingleDataNetworkAllowed(transport) && !mDataNetworkList.isEmpty()) {
        // Note any IMS network is ignored for the single-connection rule.
        if (isOnlySingleDataNetworkAllowed(transport)
                && !networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) {
            // if exists non-IMS network
            if (mDataNetworkList.stream()
                    .anyMatch(dataNetwork -> !dataNetwork.getNetworkCapabilities()
                                    .hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS))) {
                evaluation.addDataDisallowedReason(
                        DataDisallowedReason.ONLY_ALLOWED_SINGLE_NETWORK);
            }
        }

        if (mDataSettingsManager.isDataInitialized()) {
            if (!mDataSettingsManager.isDataEnabled(DataUtils.networkCapabilityToApnType(
@@ -1644,8 +1652,10 @@ public class DataNetworkController extends Handler {
        }

        // Check if there are other network that has higher priority, and only single data network
        // is allowed.
        if (isOnlySingleDataNetworkAllowed(dataNetwork.getTransport())) {
        // is allowed. Note IMS network is exempt from the single-connection rule.
        if (isOnlySingleDataNetworkAllowed(dataNetwork.getTransport())
                && !dataNetwork.getNetworkCapabilities()
                .hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) {
            // If there is network request that has higher priority than this data network, then
            // tear down the network, regardless that network request is satisfied or not.
            if (mAllNetworkRequestList.stream()
+2 −9
Original line number Diff line number Diff line
@@ -71,7 +71,6 @@ import android.util.LocalLog;
import com.android.ims.ImsException;
import com.android.ims.ImsManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Call;
import com.android.internal.telephony.CommandException;
import com.android.internal.telephony.ISetOpportunisticDataCallback;
import com.android.internal.telephony.IccCard;
@@ -1636,14 +1635,8 @@ public class PhoneSwitcher extends Handler {
        }

        // A phone in voice call might trigger data being switched to it.
        // We only report true if its precise call state is ACTIVE, ALERTING or HOLDING.
        // The reason is data switching is interrupting, so we only switch when necessary and
        // acknowledged by the users. For incoming call, we don't switch until answered
        // (RINGING -> ACTIVE), for outgoing call we don't switch until call is connected
        // in network (DIALING -> ALERTING).
        return (phone.getForegroundCall().getState() == Call.State.ACTIVE
                || phone.getForegroundCall().getState() == Call.State.ALERTING
                || !phone.getBackgroundCall().isIdle());
        return (!phone.getBackgroundCall().isIdle()
                || !phone.getForegroundCall().isIdle());
    }

    private void updateHalCommandToUse() {
+57 −1
Original line number Diff line number Diff line
@@ -198,7 +198,8 @@ public class DataNetworkControllerTest extends TelephonyTest {
                    .setRoamingProtocol(ApnSetting.PROTOCOL_IP)
                    .setCarrierEnabled(true)
                    .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE
                            | TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN))
                            | TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN
                            | TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT))
                    .setLingeringNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE
                            | TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN
                            | TelephonyManager.NETWORK_TYPE_BITMASK_UMTS
@@ -1533,6 +1534,60 @@ public class DataNetworkControllerTest extends TelephonyTest {
        assertThat(mDataNetworkControllerUT.isInternetUnmetered()).isFalse();
    }

    @Test
    public void testOnSinglePdnArbitrationExemptIms() throws Exception {
        // On CDMA network, only one data network is allowed.
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_1xRTT,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
        // Preferred on cellular
        doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WWAN).when(mAccessNetworksManager)
                .getPreferredTransportByNetworkCapability(anyInt());
        // Add IMS
        TelephonyNetworkRequest ims = createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS);
        mDataNetworkControllerUT.addNetworkRequest(ims);
        processAllMessages();

        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS);

        // Add internet, should be compatible with
        mDataNetworkControllerUT.addNetworkRequest(
                createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET));
        setSuccessfulSetupDataResponse(mMockedDataServiceManagers
                .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), 2);
        processAllMessages();

        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS);

        // Add MMS, whose priority > internet, internet should be town down, IMS left untouched
        mDataNetworkControllerUT.addNetworkRequest(
                createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_MMS));
        setSuccessfulSetupDataResponse(mMockedDataServiceManagers
                .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), 3);
        processAllMessages();

        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_MMS);
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS);

        // Temporarily remove IMS
        mDataNetworkControllerUT.removeNetworkRequest(ims);
        processAllMessages();
        List<DataNetwork> dataNetworks = getDataNetworks();
        dataNetworks.get(0).tearDown(DataNetwork.TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED);
        processAllMessages();

        verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS);

        // Add IMS, should be compatible with the existing internet
        setSuccessfulSetupDataResponse(mMockedDataServiceManagers
                .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), 4);
        mDataNetworkControllerUT.addNetworkRequest(
                createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS));
        processAllMessages();
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS);
    }

    @Test
    public void testLinkStatusChanged() throws Exception {
        testSetupDataNetwork();
@@ -2357,6 +2412,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
        TelephonyNetworkRequest fotaRequest = createNetworkRequest(
                NetworkCapabilities.NET_CAPABILITY_FOTA);
        mDataNetworkControllerUT.addNetworkRequest(fotaRequest);

        processAllFutureMessages();
        // The existing internet data network should be torn down.
        verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
+75 −0
Original line number Diff line number Diff line
@@ -109,6 +109,8 @@ public class PhoneSwitcherTest extends TelephonyTest {
    private GsmCdmaCall mActiveCall;
    private GsmCdmaCall mHoldingCall;
    private GsmCdmaCall mInactiveCall;
    private GsmCdmaCall mDialCall;
    private GsmCdmaCall mIncomingCall;
    private ISetOpportunisticDataCallback mSetOpptDataCallback1;
    private ISetOpportunisticDataCallback mSetOpptDataCallback2;
    PhoneSwitcher.ImsRegTechProvider mMockImsRegTechProvider;
@@ -139,6 +141,8 @@ public class PhoneSwitcherTest extends TelephonyTest {
        mActiveCall = mock(GsmCdmaCall.class);
        mHoldingCall = mock(GsmCdmaCall.class);
        mInactiveCall = mock(GsmCdmaCall.class);
        mDialCall = mock(GsmCdmaCall.class);
        mIncomingCall = mock(GsmCdmaCall.class);
        mSetOpptDataCallback1 = mock(ISetOpportunisticDataCallback.class);
        mSetOpptDataCallback2 = mock(ISetOpportunisticDataCallback.class);
        mMockImsRegTechProvider = mock(PhoneSwitcher.ImsRegTechProvider.class);
@@ -150,6 +154,8 @@ public class PhoneSwitcherTest extends TelephonyTest {
        doReturn(Call.State.ACTIVE).when(mActiveCall).getState();
        doReturn(Call.State.IDLE).when(mInactiveCall).getState();
        doReturn(Call.State.HOLDING).when(mHoldingCall).getState();
        doReturn(Call.State.DIALING).when(mDialCall).getState();
        doReturn(Call.State.INCOMING).when(mIncomingCall).getState();

        doReturn(true).when(mInactiveCall).isIdle();
        doReturn(false).when(mActiveCall).isIdle();
@@ -650,6 +656,63 @@ public class PhoneSwitcherTest extends TelephonyTest {
        assertEquals(1, mPhoneSwitcher.getPreferredDataPhoneId());
    }

    @Test
    @SmallTest
    public void testNonDefaultDataPhoneInCall_ImsCallDialingOnLte_shouldSwitchDds()
            throws Exception {
        initialize();
        setAllPhonesInactive();

        // Phone 0 has sub 1, phone 1 has sub 2.
        // Sub 1 is default data sub.
        // Both are active subscriptions are active sub, as they are in both active slots.
        setSlotIndexToSubId(0, 1);
        setSlotIndexToSubId(1, 2);
        setDefaultDataSubId(1);
        processAllMessages();

        // Phone 0 should be the default data phoneId.
        assertEquals(0, mPhoneSwitcher.getPreferredDataPhoneId());

        // Phone2 has active IMS call on LTE. And data of DEFAULT apn is enabled. This should
        // trigger data switch.
        doReturn(mImsPhone).when(mPhone2).getImsPhone();
        doReturn(true).when(mDataEnabledSettings2).isDataEnabled(ApnSetting.TYPE_DEFAULT);
        mockImsRegTech(1, REGISTRATION_TECH_LTE);
        notifyPhoneAsInDial(mImsPhone);

        // Phone 1 should become the default data phone.
        assertEquals(1, mPhoneSwitcher.getPreferredDataPhoneId());
    }
    @Test
    @SmallTest
    public void testNonDefaultDataPhoneInCall_ImsCallIncomingOnLte_shouldSwitchDds()
            throws Exception {
        initialize();
        setAllPhonesInactive();

        // Phone 0 has sub 1, phone 1 has sub 2.
        // Sub 1 is default data sub.
        // Both are active subscriptions are active sub, as they are in both active slots.
        setSlotIndexToSubId(0, 1);
        setSlotIndexToSubId(1, 2);
        setDefaultDataSubId(1);
        processAllMessages();

        // Phone 0 should be the default data phoneId.
        assertEquals(0, mPhoneSwitcher.getPreferredDataPhoneId());

        // Phone2 has active IMS call on LTE. And data of DEFAULT apn is enabled. This should
        // trigger data switch.
        doReturn(mImsPhone).when(mPhone2).getImsPhone();
        doReturn(true).when(mDataEnabledSettings2).isDataEnabled(ApnSetting.TYPE_DEFAULT);
        mockImsRegTech(1, REGISTRATION_TECH_LTE);
        notifyPhoneAsInIncomingCall(mImsPhone);

        // Phone 1 should become the default data phone.
        assertEquals(1, mPhoneSwitcher.getPreferredDataPhoneId());
    }

    @Test
    @SmallTest
    public void testNonDefaultDataPhoneInCall_ImsCallOnWlan_shouldNotSwitchDds() throws Exception {
@@ -1287,6 +1350,18 @@ public class PhoneSwitcherTest extends TelephonyTest {
        processAllMessages();
    }

    private void notifyPhoneAsInDial(Phone phone) {
        doReturn(mDialCall).when(phone).getForegroundCall();
        mPhoneSwitcher.sendEmptyMessage(EVENT_PRECISE_CALL_STATE_CHANGED);
        processAllMessages();
    }

    private void notifyPhoneAsInIncomingCall(Phone phone) {
        doReturn(mIncomingCall).when(phone).getForegroundCall();
        mPhoneSwitcher.sendEmptyMessage(EVENT_PRECISE_CALL_STATE_CHANGED);
        processAllMessages();
    }

    private void notifyPhoneAsInHoldingCall(Phone phone) {
        doReturn(mHoldingCall).when(phone).getBackgroundCall();
        mPhoneSwitcher.sendEmptyMessage(EVENT_PRECISE_CALL_STATE_CHANGED);