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

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

Fixed that data connections not tearing down when APN set id changes

When APN set id changes (by changing the preferred APN in settings),
the existing data connections from previous APN set id should be
torn down. Fixed by checking the APN set id when building the
waiting APN list and tethering APN list.

Fix: 159761970
Test: DcTrackerTest
Change-Id: I9c18b88ccd9177fabc9f432c65fe777aa122fbd4
parent d9e05bde
Loading
Loading
Loading
Loading
+17 −43
Original line number Diff line number Diff line
@@ -123,7 +123,6 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -1854,12 +1853,15 @@ public class DcTracker extends Handler {
        }

        for (ApnSetting dunSetting : dunCandidates) {
            if (!dunSetting.canSupportNetworkType(
            if (dunSetting.canSupportNetworkType(
                    ServiceState.rilRadioTechnologyToNetworkType(bearer))) {
                continue;
            }
                int preferredApnSetId = getPreferredApnSetId();
                if (preferredApnSetId == Telephony.Carriers.NO_APN_SET_ID
                        || preferredApnSetId == dunSetting.getApnSetId()) {
                    retDunSettings.add(dunSetting);
                }
            }
        }

        if (VDBG) log("fetchDunApns: dunSettings=" + retDunSettings);
        return retDunSettings;
@@ -2385,7 +2387,7 @@ public class DcTracker extends Handler {
        ArrayList<ApnSetting> dunSettings = null;

        if (ApnSetting.TYPE_DUN == apnType) {
            dunSettings = sortApnListByPreferred(fetchDunApns());
            dunSettings = fetchDunApns();
        }
        if (DBG) {
            log("checkForCompatibleDataConnection: apnContext=" + apnContext);
@@ -3358,7 +3360,7 @@ public class DcTracker extends Handler {
                    apnList.add(dun);
                    if (DBG) log("buildWaitingApns: X added APN_TYPE_DUN apnList=" + apnList);
                }
                return sortApnListByPreferred(apnList);
                return apnList;
            }
        }

@@ -3397,7 +3399,6 @@ public class DcTracker extends Handler {
                if (mPreferredApn.canSupportNetworkType(
                        ServiceState.rilRadioTechnologyToNetworkType(radioTech))) {
                    apnList.add(mPreferredApn);
                    apnList = sortApnListByPreferred(apnList);
                    if (DBG) log("buildWaitingApns: X added preferred apnList=" + apnList);
                    return apnList;
                }
@@ -3412,8 +3413,15 @@ public class DcTracker extends Handler {
            if (apn.canHandleType(requestedApnTypeBitmask)) {
                if (apn.canSupportNetworkType(
                        ServiceState.rilRadioTechnologyToNetworkType(radioTech))) {
                    int preferredApnSetId = getPreferredApnSetId();
                    if (preferredApnSetId == Telephony.Carriers.NO_APN_SET_ID
                            || preferredApnSetId == apn.getApnSetId()) {
                        if (VDBG) log("buildWaitingApns: adding apn=" + apn);
                        apnList.add(apn);
                    } else {
                        log("buildWaitingApns: APN set id " + apn.getApnSetId()
                                + " does not match the preferred set id " + preferredApnSetId);
                    }
                } else {
                    if (DBG) {
                        log("buildWaitingApns: networkTypeBitmask:"
@@ -3428,44 +3436,10 @@ public class DcTracker extends Handler {
            }
        }

        apnList = sortApnListByPreferred(apnList);
        if (DBG) log("buildWaitingApns: " + apnList.size() + " APNs in the list: " + apnList);
        return apnList;
    }

    /**
     * Sort a list of ApnSetting objects, with the preferred APNs at the front of the list
     *
     * e.g. if the preferred APN set = 2 and we have
     *   1. APN with apn_set_id = 0 = Carriers.NO_SET_SET (no set is set)
     *   2. APN with apn_set_id = 1 (not preferred set)
     *   3. APN with apn_set_id = 2 (preferred set)
     * Then the return order should be (3, 1, 2) or (3, 2, 1)
     *
     * e.g. if the preferred APN set = Carriers.NO_SET_SET (no preferred set) then the
     * return order can be anything
     */
    @VisibleForTesting
    public ArrayList<ApnSetting> sortApnListByPreferred(ArrayList<ApnSetting> list) {
        if (list == null || list.size() <= 1) return list;
        int preferredApnSetId = getPreferredApnSetId();
        if (preferredApnSetId != Telephony.Carriers.NO_APN_SET_ID) {
            list.sort(new Comparator<ApnSetting>() {
                @Override
                public int compare(ApnSetting apn1, ApnSetting apn2) {
                    if (apn1.getApnSetId() == preferredApnSetId) {
                        return -1;
                    }
                    if (apn2.getApnSetId() == preferredApnSetId) {
                        return 1;
                    }
                    return 0;
                }
            });
        }
        return list;
    }

    private String apnListToString (ArrayList<ApnSetting> apns) {
        StringBuilder result = new StringBuilder();
        for (int i = 0, size = apns.size(); i < size; i++) {
+16 −3
Original line number Diff line number Diff line
@@ -1348,7 +1348,7 @@ public class DcTrackerTest extends TelephonyTest {
                + "0,,,,,,,,,,1";
        // apnSetId=0
        String dunApnString2 = "[ApnSettingV5]HOT mobile PC,pc.coldm,,,,,,,,,440,10,,DUN,,,true,"
                + "0,,,,,,,,,,0";
                + "0,,,,,,,,,,2";

        ApnSetting dunApnExpected = ApnSetting.fromString(dunApnString1);

@@ -1362,8 +1362,21 @@ public class DcTrackerTest extends TelephonyTest {
        cr.update(PREFERAPN_URI, values, null, null);

        // return APN from Setting with apnSetId=1
        ArrayList<ApnSetting> dunApns = mDct.sortApnListByPreferred(mDct.fetchDunApns());
        assertEquals(2, dunApns.size());
        ArrayList<ApnSetting> dunApns = mDct.fetchDunApns();
        assertEquals(1, dunApns.size());
        assertEquals(1, dunApns.get(0).getApnSetId());
        assertTrue(dunApnExpected.equals(dunApns.get(0)));

        // set that we prefer apn set 2
        values = new ContentValues();
        values.put(Telephony.Carriers.APN_SET_ID, 2);
        cr.update(PREFERAPN_URI, values, null, null);

        // return APN from Setting with apnSetId=2
        dunApns = mDct.fetchDunApns();
        assertEquals(1, dunApns.size());
        assertEquals(2, dunApns.get(0).getApnSetId());
        dunApnExpected = ApnSetting.fromString(dunApnString2);
        assertTrue(dunApnExpected.equals(dunApns.get(0)));
    }