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

Commit 2d99bb6a authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Prioritize to use a preferred APN for tethering if it can handle DUN"...

Merge "Prioritize to use a preferred APN for tethering if it can handle DUN" am: 0cc06eb2 am: 265d3f65 am: 0a74b00c

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/1659602

Change-Id: I92e755729bb49599ef413a0cee41d196342b7254
parents 89a659be 0a74b00c
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -1929,14 +1929,21 @@ public class DcTracker extends Handler {
        }

        int preferredApnSetId = getPreferredApnSetId();
        ApnSetting preferredApn = getPreferredApnFromDB();
        for (ApnSetting dunSetting : dunCandidates) {
            if (dunSetting.canSupportNetworkType(
                    ServiceState.rilRadioTechnologyToNetworkType(bearer))) {
                if (preferredApnSetId == dunSetting.getApnSetId()) {
                    if (preferredApn != null && preferredApn.equals(dunSetting)) {
                        // If there is a preferred APN can handled DUN type, prepend it to list to
                        // use it preferred.
                        retDunSettings.add(0, dunSetting);
                    } else {
                        retDunSettings.add(dunSetting);
                    }
                }
            }
        }

        if (VDBG) log("fetchDunApns: dunSettings=" + retDunSettings);
        return retDunSettings;
+399 −321
Original line number Diff line number Diff line
@@ -205,46 +205,8 @@ public class DcTrackerTest extends TelephonyTest {
    }

    private class ApnSettingContentProvider extends MockContentProvider {
        private int mPreferredApnSet = 0;

        private String mFakeApn1Types = "default,supl";

        private int mNetworkTypeBitmask = NETWORK_TYPE_LTE_BITMASK;

        private int mRowIdOffset = 0;

        public void setFakeApn1Types(String apnTypes) {
            mFakeApn1Types = apnTypes;
        }

        public void setFakeApn1NetworkTypeBitmask(int bitmask) {
            mNetworkTypeBitmask = bitmask;
        }

        public void setRowIdOffset(int rowIdOffset) {
            mRowIdOffset = rowIdOffset;
        }

        @Override
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
                            String sortOrder) {
            logd("ApnSettingContentProvider: query");
            logd("   uri = " + uri);
            logd("   projection = " + Arrays.toString(projection));
            logd("   selection = " + selection);
            logd("   selectionArgs = " + Arrays.toString(selectionArgs));
            logd("   sortOrder = " + sortOrder);

            if (uri.compareTo(Telephony.Carriers.CONTENT_URI) == 0
                    || uri.toString().startsWith(Uri.withAppendedPath(
                            Telephony.Carriers.CONTENT_URI, "filtered").toString())
                    || uri.toString().startsWith(Uri.withAppendedPath(
                            Telephony.Carriers.SIM_APN_URI, "filtered").toString())) {
                if (projection == null) {

                    logd("Query '" + FAKE_PLMN + "' APN settings");
                    MatrixCursor mc = new MatrixCursor(
                            new String[]{Telephony.Carriers._ID, Telephony.Carriers.NUMERIC,
        public final String[] FAKE_APN_COLUMNS = new String[]{
                Telephony.Carriers._ID, Telephony.Carriers.NUMERIC,
                Telephony.Carriers.NAME, Telephony.Carriers.APN,
                Telephony.Carriers.PROXY, Telephony.Carriers.PORT,
                Telephony.Carriers.MMSC, Telephony.Carriers.MMSPROXY,
@@ -266,9 +228,43 @@ public class DcTrackerTest extends TelephonyTest {
                Telephony.Carriers.NETWORK_TYPE_BITMASK,
                Telephony.Carriers.APN_SET_ID,
                Telephony.Carriers.CARRIER_ID,
                                    Telephony.Carriers.SKIP_464XLAT});
                Telephony.Carriers.SKIP_464XLAT
        };

        private int mPreferredApnSet = 0;

        private Object[] mPreferredApn = null;

        private String mFakeApn1Types = "default,supl";

        private String mFakeApn5Types = "dun";

                    mc.addRow(new Object[]{
        private int mNetworkTypeBitmask = NETWORK_TYPE_LTE_BITMASK;

        private int mRowIdOffset = 0;

        public void setFakeApn1Types(String apnTypes) {
            mFakeApn1Types = apnTypes;
        }

        public void setFakeApn5Types(String apnTypes) {
            mFakeApn5Types = apnTypes;
        }

        public void setFakeApn1NetworkTypeBitmask(int bitmask) {
            mNetworkTypeBitmask = bitmask;
        }

        public void setRowIdOffset(int rowIdOffset) {
            mRowIdOffset = rowIdOffset;
        }

        public void setFakePreferredApn(Object[] fakeApn) {
            mPreferredApn = fakeApn;
        }

        public Object[] getFakeApn1() {
            return new Object[]{
                    2163 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    "sp-mode",              // name
@@ -299,9 +295,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    });
            };
        }

                    mc.addRow(new Object[]{
        public Object[] getFakeApn2() {
            return new Object[]{
                    2164 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    "mopera U",             // name
@@ -332,9 +330,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    });
            };
        }

                    mc.addRow(new Object[]{
        public Object[] getFakeApn3() {
            return new Object[]{
                    2165 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    "b-mobile for Nexus",   // name
@@ -365,9 +365,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    });
            };
        }

                    mc.addRow(new Object[]{
        public Object[] getFakeApn4() {
            return new Object[]{
                    2166 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    "sp-mode ehrpd",        // name
@@ -398,9 +400,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    });
            };
        }

                    mc.addRow(new Object[]{
        public Object[] getFakeApn5() {
            return new Object[]{
                    2167 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    "b-mobile for Nexus",   // name
@@ -413,7 +417,7 @@ public class DcTrackerTest extends TelephonyTest {
                    "",                     // user
                    "",                     // password
                    -1,                     // authtype
                            "dun",                  // types
                    mFakeApn5Types,         // types
                    "IP",                   // protocol
                    "IP",                   // roaming_protocol
                    1,                      // carrier_enabled
@@ -431,9 +435,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    });
            };
        }

                    mc.addRow(new Object[]{
        public Object[] getFakeApn6() {
            return new Object[]{
                    2168 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    "sp-mode",              // name
@@ -464,9 +470,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    });
            };
        }

                    mc.addRow(new Object[]{
        public Object[] getFakeApn7() {
            return new Object[]{
                    2169 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    "sp-mode",              // name
@@ -497,9 +505,11 @@ public class DcTrackerTest extends TelephonyTest {
                    1,                      // apn_set_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    });
            };
        }

                    mc.addRow(new Object[]{
        public Object[] getFakeApn8() {
            return new Object[]{
                    2170 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    "IMS",                  // name
@@ -530,9 +540,11 @@ public class DcTrackerTest extends TelephonyTest {
                    -1,                      // apn_set_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    });
            };
        }

                    mc.addRow(new Object[]{
        public Object[] getFakeApn9() {
            return new Object[]{
                    2171 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    "sp-mode nr",           // name
@@ -563,7 +575,37 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    });
            };
        }

        @Override
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
                            String sortOrder) {
            logd("ApnSettingContentProvider: query");
            logd("   uri = " + uri);
            logd("   projection = " + Arrays.toString(projection));
            logd("   selection = " + selection);
            logd("   selectionArgs = " + Arrays.toString(selectionArgs));
            logd("   sortOrder = " + sortOrder);

            if (uri.compareTo(Telephony.Carriers.CONTENT_URI) == 0
                    || uri.toString().startsWith(Uri.withAppendedPath(
                            Telephony.Carriers.CONTENT_URI, "filtered").toString())
                    || uri.toString().startsWith(Uri.withAppendedPath(
                            Telephony.Carriers.SIM_APN_URI, "filtered").toString())) {
                if (projection == null) {

                    logd("Query '" + FAKE_PLMN + "' APN settings");
                    MatrixCursor mc = new MatrixCursor(FAKE_APN_COLUMNS);
                    mc.addRow(getFakeApn1());
                    mc.addRow(getFakeApn2());
                    mc.addRow(getFakeApn3());
                    mc.addRow(getFakeApn4());
                    mc.addRow(getFakeApn5());
                    mc.addRow(getFakeApn6());
                    mc.addRow(getFakeApn7());
                    mc.addRow(getFakeApn8());
                    mc.addRow(getFakeApn9());

                    return mc;
                }
@@ -575,6 +617,15 @@ public class DcTrackerTest extends TelephonyTest {
                mc.addRow(new Object[]{ mPreferredApnSet });
                mc.addRow(new Object[]{ 0 });
                return mc;
            } else if (isPathPrefixMatch(uri,
                    Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "preferapn_no_update"))) {
                if (mPreferredApn == null) {
                    return null;
                } else {
                    MatrixCursor mc = new MatrixCursor(FAKE_APN_COLUMNS);
                    mc.addRow(mPreferredApn);
                    return mc;
                }
            }

            return null;
@@ -1583,6 +1634,33 @@ public class DcTrackerTest extends TelephonyTest {
                Settings.Global.TETHER_DUN_APN, null);
    }

    /**
     * Test that fetchDunApns() returns list that prioritize the preferred APN when the preferred
     * APN including DUN type.
     */
    @Test
    public void testFetchDunApnWithPreferredApn() {
        // Set support APN types of FAKE_APN1 and FAKE_APN5
        mApnSettingContentProvider.setFakeApn1Types("default,dun");
        mApnSettingContentProvider.setFakeApn5Types("default,dun");

        // Set prefer apn set id.
        ContentResolver cr = mContext.getContentResolver();
        ContentValues values = new ContentValues();
        values.put(Telephony.Carriers.APN_SET_ID, 0);
        cr.update(PREFERAPN_URI, values, null, null);
        // Set FAKE_APN5 as the preferred APN.
        mApnSettingContentProvider.setFakePreferredApn(mApnSettingContentProvider.getFakeApn5());

        sendInitializationEvents();

        // Return the APN list that set the preferred APN at the top.
        ArrayList<ApnSetting> dunApns = mDct.fetchDunApns();
        assertEquals(2, dunApns.size());
        assertEquals(FAKE_APN5, dunApns.get(0).getApnName());
        assertEquals(FAKE_APN1, dunApns.get(1).getApnName());
    }

    // This tests simulates the race case where the sim status change event is triggered, the
    // default data connection is attached, and then the carrier config gets changed which bumps
    // the database id which we want to ignore when cleaning up connections and matching against