Loading src/java/com/android/internal/telephony/dataconnection/DcTracker.java +8 −1 Original line number Diff line number Diff line Loading @@ -1924,14 +1924,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; Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +399 −321 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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; } Loading @@ -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; Loading Loading @@ -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 Loading Loading
src/java/com/android/internal/telephony/dataconnection/DcTracker.java +8 −1 Original line number Diff line number Diff line Loading @@ -1924,14 +1924,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; Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +399 −321 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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; } Loading @@ -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; Loading Loading @@ -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 Loading