Loading src/java/com/android/internal/telephony/dataconnection/ApnSetting.java +54 −7 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.internal.telephony.dataconnection; import android.content.Context; import android.hardware.radio.V1_0.ApnTypes; import android.os.PersistableBundle; import android.provider.Telephony.Carriers; import android.telephony.CarrierConfigManager; import android.telephony.Rlog; import android.telephony.ServiceState; Loading Loading @@ -50,6 +51,7 @@ public class ApnSetting { static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*"; static final String V3_FORMAT_REGEX = "^\\[ApnSettingV3\\]\\s*"; static final String V4_FORMAT_REGEX = "^\\[ApnSettingV4\\]\\s*"; static final String V5_FORMAT_REGEX = "^\\[ApnSettingV5\\]\\s*"; static final String TAG = "ApnSetting"; public final String carrier; Loading Loading @@ -128,6 +130,16 @@ public class ApnSetting { */ public final String mvnoMatchData; /** * The APN set id. * * APNs that are part of the same set should be preferred together, e.g. if the * user selects a default APN with apnSetId=1, then we will prefer all APNs with apnSetId=1. * * If the apnSetId=Carriers.NO_SET_SET (=0) then the APN is not part of a set. */ public final int apnSetId; /** * Indicates this APN setting is permanently failed and cannot be * retried by the retry manager anymore. Loading Loading @@ -179,10 +191,12 @@ public class ApnSetting { this.mtu = mtu; this.mvnoType = mvnoType; this.mvnoMatchData = mvnoMatchData; this.apnSetId = Carriers.NO_SET_SET; this.networkTypeBitmask = ServiceState.convertBearerBitmaskToNetworkTypeBitmask( this.bearerBitmask); } // Constructor with default apn set id public ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port, String mmsc, String mmsProxy, String mmsPort, Loading @@ -191,6 +205,20 @@ public class ApnSetting { int networkTypeBitmask, int profileId, boolean modemCognitive, int maxConns, int waitTime, int maxConnsTime, int mtu, String mvnoType, String mvnoMatchData) { this(id, numeric, carrier, apn, proxy, port, mmsc, mmsProxy, mmsPort, user, password, authType, types, protocol, roamingProtocol, carrierEnabled, networkTypeBitmask, profileId, modemCognitive, maxConns, waitTime, maxConnsTime, mtu, mvnoType, mvnoMatchData, Carriers.NO_SET_SET); } public ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port, String mmsc, String mmsProxy, String mmsPort, String user, String password, int authType, String[] types, String protocol, String roamingProtocol, boolean carrierEnabled, int networkTypeBitmask, int profileId, boolean modemCognitive, int maxConns, int waitTime, int maxConnsTime, int mtu, String mvnoType, String mvnoMatchData, int apnSetId) { this.id = id; this.numeric = numeric; this.carrier = carrier; Loading Loading @@ -225,6 +253,7 @@ public class ApnSetting { this.mtu = mtu; this.mvnoType = mvnoType; this.mvnoMatchData = mvnoMatchData; this.apnSetId = apnSetId; } public ApnSetting(ApnSetting apn) { Loading @@ -232,7 +261,7 @@ public class ApnSetting { apn.mmsPort, apn.user, apn.password, apn.authType, apn.types, apn.protocol, apn.roamingProtocol, apn.carrierEnabled, apn.networkTypeBitmask, apn.profileId, apn.modemCognitive, apn.maxConns, apn.waitTime, apn.maxConnsTime, apn.mtu, apn.mvnoType, apn.mvnoMatchData); apn.mtu, apn.mvnoType, apn.mvnoMatchData, apn.apnSetId); } /** Loading Loading @@ -267,6 +296,13 @@ public class ApnSetting { * <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime>, <mtu>, * <mvnoType>, <mvnoMatchData>, <networkTypeBitmask> * * v5 format: * [ApnSettingV5] <carrier>, <apn>, <proxy>, <port>, <user>, <password>, <server>, * <mmsc>, <mmsproxy>, <mmsport>, <mcc>, <mnc>, <authtype>, * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearerBitmask>, * <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime>, <mtu>, * <mvnoType>, <mvnoMatchData>, <networkTypeBitmask>, <apnSetId> * * Note that the strings generated by toString() do not contain the username * and password and thus cannot be read by this method. */ Loading @@ -275,7 +311,10 @@ public class ApnSetting { int version; // matches() operates on the whole string, so append .* to the regex. if (data.matches(V4_FORMAT_REGEX + ".*")) { if (data.matches(V5_FORMAT_REGEX + ".*")) { version = 5; data = data.replaceFirst(V5_FORMAT_REGEX, ""); } else if (data.matches(V4_FORMAT_REGEX + ".*")) { version = 4; data = data.replaceFirst(V4_FORMAT_REGEX, ""); } else if (data.matches(V3_FORMAT_REGEX + ".*")) { Loading Loading @@ -313,6 +352,7 @@ public class ApnSetting { int mtu = PhoneConstants.UNSET_MTU; String mvnoType = ""; String mvnoMatchData = ""; int apnSetId = Carriers.NO_SET_SET; if (version == 1) { typeArray = new String[a.length - 13]; System.arraycopy(a, 13, typeArray, 0, a.length - 13); Loading Loading @@ -353,6 +393,9 @@ public class ApnSetting { if (a.length > 26) { networkTypeBitmask = ServiceState.getBitmaskFromString(a[26]); } if (a.length > 27) { apnSetId = Integer.parseInt(a[27]); } } // If both bearerBitmask and networkTypeBitmask were specified, bearerBitmask would be Loading @@ -364,7 +407,7 @@ public class ApnSetting { return new ApnSetting(-1, a[10] + a[11], a[0], a[1], a[2], a[3], a[7], a[8], a[9], a[4], a[5], authType, typeArray, protocol, roamingProtocol, carrierEnabled, networkTypeBitmask, profileId, modemCognitive, maxConns, waitTime, maxConnsTime, mtu, mvnoType, mvnoMatchData); mtu, mvnoType, mvnoMatchData, apnSetId); } /** Loading Loading @@ -393,7 +436,7 @@ public class ApnSetting { @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("[ApnSettingV4] ") sb.append("[ApnSettingV5] ") .append(carrier) .append(", ").append(id) .append(", ").append(numeric) Loading Loading @@ -425,6 +468,7 @@ public class ApnSetting { sb.append(", ").append(mvnoMatchData); sb.append(", ").append(permanentFailed); sb.append(", ").append(networkTypeBitmask); sb.append(", ").append(apnSetId); return sb.toString(); } Loading Loading @@ -651,7 +695,8 @@ public class ApnSetting { && mtu == other.mtu && mvnoType.equals(other.mvnoType) && mvnoMatchData.equals(other.mvnoMatchData) && networkTypeBitmask == other.networkTypeBitmask; && networkTypeBitmask == other.networkTypeBitmask && apnSetId == other.apnSetId; } /** Loading Loading @@ -696,7 +741,8 @@ public class ApnSetting { && maxConnsTime == other.maxConnsTime && mtu == other.mtu && mvnoType.equals(other.mvnoType) && mvnoMatchData.equals(other.mvnoMatchData); && mvnoMatchData.equals(other.mvnoMatchData) && apnSetId == other.apnSetId; } /** Loading @@ -722,7 +768,8 @@ public class ApnSetting { && xorEquals(this.mmsc, other.mmsc) && xorEquals(this.mmsProxy, other.mmsProxy) && xorEquals(this.mmsPort, other.mmsPort)) && this.networkTypeBitmask == other.networkTypeBitmask; && this.networkTypeBitmask == other.networkTypeBitmask && this.apnSetId == other.apnSetId; } // check whether the types of two APN same (even only one type of each APN is same) Loading src/java/com/android/internal/telephony/dataconnection/DcTracker.java +3 −2 Original line number Diff line number Diff line Loading @@ -1859,7 +1859,8 @@ public class DcTracker extends Handler { cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MAX_CONNS_TIME)), cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MTU)), cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_TYPE)), cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_MATCH_DATA))); cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_MATCH_DATA)), cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.APN_SET_ID))); return apn; } Loading Loading @@ -3389,7 +3390,7 @@ public class DcTracker extends Handler { dest.authType, resultTypes.toArray(new String[0]), protocol, roamingProtocol, dest.carrierEnabled, networkTypeBitmask, dest.profileId, (dest.modemCognitive || src.modemCognitive), dest.maxConns, dest.waitTime, dest.maxConnsTime, dest.mtu, dest.mvnoType, dest.mvnoMatchData); dest.maxConnsTime, dest.mtu, dest.mvnoType, dest.mvnoMatchData, dest.apnSetId); } /** Return the DC AsyncChannel for the new data connection */ Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/ApnSettingTest.java +37 −3 Original line number Diff line number Diff line Loading @@ -138,6 +138,7 @@ public class ApnSettingTest extends TelephonyTest { assertEquals(a1.mvnoType, a2.mvnoType); assertEquals(a1.mvnoMatchData, a2.mvnoMatchData); assertEquals(a1.networkTypeBitmask, a2.networkTypeBitmask); assertEquals(a1.apnSetId, a2.apnSetId); } @Test Loading Loading @@ -230,6 +231,22 @@ public class ApnSettingTest extends TelephonyTest { "testspn"); assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString)); // A v5 string with apnSetId=0 testString = "[ApnSettingV5] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,0,0"; expectedApn = new ApnSetting( -1, "12345", "Name", "apn", "", "", "", "", "", "", "", 0, mmsTypes, "IPV6", "IP", true, 0, 0, 0, false, 0, 0, 0, 0, "spn", "testspn"); assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString)); // A v5 string with apnSetId=3 testString = "[ApnSettingV5] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,0,3"; expectedApn = new ApnSetting( -1, "12345", "Name", "apn", "", "", "", "", "", "", "", 0, mmsTypes, "IPV6", "IP", true, 0, 0, false, 0, 0, 0, 0, "spn", "testspn", 3); assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString)); // Return no apn if insufficient fields given. testString = "[ApnSettingV3] Name,apn,,,,,,,,,123, 45,,mms|*"; assertEquals(null, ApnSetting.fromString(testString)); Loading @@ -248,6 +265,8 @@ public class ApnSettingTest extends TelephonyTest { " ;[ApnSettingV3] Name1,apn1,,,,,,,,,123,46,,mms,IPV6,IP,true,12,,,,,,,gid,testGid"; testString += " ;[ApnSettingV3] Name1,apn2,,,,,,,,,123,46,,mms,IPV6,IP,true,12,,,,,,,,"; testString += " ;[ApnSettingV5] Name1,apn2,,,,,,,,,123,46,,mms,IPV6,IP,true,0,,,,,,,,,,3"; List<ApnSetting> expectedApns = new ArrayList<ApnSetting>(); expectedApns.add(new ApnSetting( -1, "12345", "Name", "apn", "", "", "", "", "", "", "", 0, new String[]{"mms"}, "IPV6", Loading @@ -258,6 +277,9 @@ public class ApnSettingTest extends TelephonyTest { expectedApns.add(new ApnSetting( -1, "12346", "Name1", "apn2", "", "", "", "", "", "", "", 0, new String[]{"mms"}, "IPV6", "IP", true, 12, 0, 0, false, 0, 0, 0, 0, "", "")); expectedApns.add(new ApnSetting( -1, "12346", "Name1", "apn2", "", "", "", "", "", "", "", 0, new String[]{"mms"}, "IPV6", "IP", true, 0, 0, false, 0, 0, 0, 0, "", "", 3)); assertApnSettingsEqual(expectedApns, ApnSetting.arrayFromString(testString)); } Loading @@ -265,13 +287,25 @@ public class ApnSettingTest extends TelephonyTest { @SmallTest public void testToString() throws Exception { String[] types = {"default", "*"}; // use default apn_set_id constructor ApnSetting apn = new ApnSetting( 99, "12345", "Name", "apn", "proxy", "port", "mmsc", "mmsproxy", "mmsport", "user", "password", 0, types, "IPV6", "IP", true, 14, 0, 0, false, 0, 0, 0, 0, "", ""); String expected = "[ApnSettingV4] Name, 99, 12345, apn, proxy, " String expected = "[ApnSettingV5] Name, 99, 12345, apn, proxy, " + "mmsc, mmsproxy, mmsport, port, 0, default | *, " + "IPV6, IP, true, 14, 8192, 0, false, 0, 0, 0, 0, , , false, 4096"; + "IPV6, IP, true, 14, 8192, 0, false, 0, 0, 0, 0, , , false, 4096, 0"; assertEquals(expected, apn.toString()); int networkTypeBitmask = 1 << (14 - 1); int bearerBitmask = ServiceState.convertNetworkTypeBitmaskToBearerBitmask(networkTypeBitmask); apn = new ApnSetting(99, "12345", "Name", "apn", "proxy", "port", "mmsc", "mmsproxy", "mmsport", "user", "password", 0, types, "IPV6", "IP", true, networkTypeBitmask, 0, false, 0, 0, 0, 0, "", "", 3); expected = "[ApnSettingV5] Name, 99, 12345, apn, proxy, " + "mmsc, mmsproxy, mmsport, port, 0, default | *, IPV6, IP, true, 0, " + bearerBitmask + ", 0, false, 0, 0, 0, 0, , , false, 8192, 3"; assertEquals(expected, apn.toString()); } Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +55 −7 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import static org.mockito.Mockito.verify; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; Loading Loading @@ -121,6 +122,9 @@ public class DcTrackerTest extends TelephonyTest { 1 << (TelephonyManager.NETWORK_TYPE_LTE - 1); private static final int NETWORK_TYPE_EHRPD_BITMASK = 1 << (TelephonyManager.NETWORK_TYPE_EHRPD - 1); private static final Uri PREFERAPN_URI = Uri.parse( Telephony.Carriers.CONTENT_URI + "/preferapn"); @Mock ISub mIsub; Loading Loading @@ -222,7 +226,8 @@ public class DcTrackerTest extends TelephonyTest { Telephony.Carriers.MAX_CONNS_TIME, Telephony.Carriers.MTU, Telephony.Carriers.MVNO_TYPE, Telephony.Carriers.MVNO_MATCH_DATA, Telephony.Carriers.NETWORK_TYPE_BITMASK}); Telephony.Carriers.NETWORK_TYPE_BITMASK, Telephony.Carriers.APN_SET_ID}); mc.addRow(new Object[]{ 2163, // id Loading Loading @@ -251,7 +256,8 @@ public class DcTrackerTest extends TelephonyTest { 0, // mtu "", // mvno_type "", // mnvo_match_data NETWORK_TYPE_LTE_BITMASK // network_type_bitmask NETWORK_TYPE_LTE_BITMASK, // network_type_bitmask 0 // apn_set_id }); mc.addRow(new Object[]{ Loading Loading @@ -281,7 +287,8 @@ public class DcTrackerTest extends TelephonyTest { 0, // mtu "", // mvno_type "", // mnvo_match_data NETWORK_TYPE_LTE_BITMASK // network_type_bitmask NETWORK_TYPE_LTE_BITMASK, // network_type_bitmask 0 // apn_set_id }); mc.addRow(new Object[]{ Loading Loading @@ -311,7 +318,8 @@ public class DcTrackerTest extends TelephonyTest { 0, // mtu "", // mvno_type "", // mnvo_match_data 0 // network_type_bitmask 0, // network_type_bitmask 0 // apn_set_id }); mc.addRow(new Object[]{ Loading Loading @@ -341,7 +349,8 @@ public class DcTrackerTest extends TelephonyTest { 0, // mtu "", // mvno_type "", // mnvo_match_data NETWORK_TYPE_EHRPD_BITMASK // network_type_bitmask NETWORK_TYPE_EHRPD_BITMASK, // network_type_bitmask 0 // apn_set_id }); mc.addRow(new Object[]{ Loading Loading @@ -371,7 +380,8 @@ public class DcTrackerTest extends TelephonyTest { 0, // mtu "", // mvno_type "", // mnvo_match_data 0 // network_type_bitmask 0, // network_type_bitmask 0 // apn_set_id }); return mc; } Loading @@ -379,6 +389,11 @@ public class DcTrackerTest extends TelephonyTest { return null; } @Override public int update(Uri url, ContentValues values, String where, String[] whereArgs) { return 0; } } @Before Loading Loading @@ -1285,6 +1300,39 @@ public class DcTrackerTest extends TelephonyTest { dunApn = mDct.fetchDunApn(); assertEquals(FAKE_APN5, dunApn.apn); } // Test for fetchDunApn() with apn set id @Test @SmallTest @Ignore public void testFetchDunApnWithPreferredApnSet() { logd("Sending EVENT_RECORDS_LOADED"); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null)); waitForMs(200); // apnSetId=1 String dunApnString1 = "[ApnSettingV5]HOT mobile PC,pc.hotm,,,,,,,,,440,10,,DUN,,,true," + "0,,,,,,,,,1"; // apnSetId=2 String dunApnString2 = "[ApnSettingV5]HOT mobile PC,pc.hotm,,,,,,,,,440,10,,DUN,,,true," + "0,,,,,,,,,2"; ApnSetting dunApnExpected = ApnSetting.fromString(dunApnString1); ContentResolver cr = mContext.getContentResolver(); Settings.Global.putString(cr, Settings.Global.TETHER_DUN_APN, dunApnString1 + ";" + dunApnString2); // set that we prefer apn set 1 ContentValues values = new ContentValues(); values.put(Telephony.Carriers.APN_SET_ID, 1); cr.update(PREFERAPN_URI, values, null, null); // currently a noop // TODO(70172263) should return APN from Setting with apnSetId=1 ApnSetting dunApn = mDct.fetchDunApn(); assertTrue(dunApnExpected.equals(dunApn)); } // Test oos @Test @SmallTest Loading Loading
src/java/com/android/internal/telephony/dataconnection/ApnSetting.java +54 −7 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.internal.telephony.dataconnection; import android.content.Context; import android.hardware.radio.V1_0.ApnTypes; import android.os.PersistableBundle; import android.provider.Telephony.Carriers; import android.telephony.CarrierConfigManager; import android.telephony.Rlog; import android.telephony.ServiceState; Loading Loading @@ -50,6 +51,7 @@ public class ApnSetting { static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*"; static final String V3_FORMAT_REGEX = "^\\[ApnSettingV3\\]\\s*"; static final String V4_FORMAT_REGEX = "^\\[ApnSettingV4\\]\\s*"; static final String V5_FORMAT_REGEX = "^\\[ApnSettingV5\\]\\s*"; static final String TAG = "ApnSetting"; public final String carrier; Loading Loading @@ -128,6 +130,16 @@ public class ApnSetting { */ public final String mvnoMatchData; /** * The APN set id. * * APNs that are part of the same set should be preferred together, e.g. if the * user selects a default APN with apnSetId=1, then we will prefer all APNs with apnSetId=1. * * If the apnSetId=Carriers.NO_SET_SET (=0) then the APN is not part of a set. */ public final int apnSetId; /** * Indicates this APN setting is permanently failed and cannot be * retried by the retry manager anymore. Loading Loading @@ -179,10 +191,12 @@ public class ApnSetting { this.mtu = mtu; this.mvnoType = mvnoType; this.mvnoMatchData = mvnoMatchData; this.apnSetId = Carriers.NO_SET_SET; this.networkTypeBitmask = ServiceState.convertBearerBitmaskToNetworkTypeBitmask( this.bearerBitmask); } // Constructor with default apn set id public ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port, String mmsc, String mmsProxy, String mmsPort, Loading @@ -191,6 +205,20 @@ public class ApnSetting { int networkTypeBitmask, int profileId, boolean modemCognitive, int maxConns, int waitTime, int maxConnsTime, int mtu, String mvnoType, String mvnoMatchData) { this(id, numeric, carrier, apn, proxy, port, mmsc, mmsProxy, mmsPort, user, password, authType, types, protocol, roamingProtocol, carrierEnabled, networkTypeBitmask, profileId, modemCognitive, maxConns, waitTime, maxConnsTime, mtu, mvnoType, mvnoMatchData, Carriers.NO_SET_SET); } public ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port, String mmsc, String mmsProxy, String mmsPort, String user, String password, int authType, String[] types, String protocol, String roamingProtocol, boolean carrierEnabled, int networkTypeBitmask, int profileId, boolean modemCognitive, int maxConns, int waitTime, int maxConnsTime, int mtu, String mvnoType, String mvnoMatchData, int apnSetId) { this.id = id; this.numeric = numeric; this.carrier = carrier; Loading Loading @@ -225,6 +253,7 @@ public class ApnSetting { this.mtu = mtu; this.mvnoType = mvnoType; this.mvnoMatchData = mvnoMatchData; this.apnSetId = apnSetId; } public ApnSetting(ApnSetting apn) { Loading @@ -232,7 +261,7 @@ public class ApnSetting { apn.mmsPort, apn.user, apn.password, apn.authType, apn.types, apn.protocol, apn.roamingProtocol, apn.carrierEnabled, apn.networkTypeBitmask, apn.profileId, apn.modemCognitive, apn.maxConns, apn.waitTime, apn.maxConnsTime, apn.mtu, apn.mvnoType, apn.mvnoMatchData); apn.mtu, apn.mvnoType, apn.mvnoMatchData, apn.apnSetId); } /** Loading Loading @@ -267,6 +296,13 @@ public class ApnSetting { * <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime>, <mtu>, * <mvnoType>, <mvnoMatchData>, <networkTypeBitmask> * * v5 format: * [ApnSettingV5] <carrier>, <apn>, <proxy>, <port>, <user>, <password>, <server>, * <mmsc>, <mmsproxy>, <mmsport>, <mcc>, <mnc>, <authtype>, * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearerBitmask>, * <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime>, <mtu>, * <mvnoType>, <mvnoMatchData>, <networkTypeBitmask>, <apnSetId> * * Note that the strings generated by toString() do not contain the username * and password and thus cannot be read by this method. */ Loading @@ -275,7 +311,10 @@ public class ApnSetting { int version; // matches() operates on the whole string, so append .* to the regex. if (data.matches(V4_FORMAT_REGEX + ".*")) { if (data.matches(V5_FORMAT_REGEX + ".*")) { version = 5; data = data.replaceFirst(V5_FORMAT_REGEX, ""); } else if (data.matches(V4_FORMAT_REGEX + ".*")) { version = 4; data = data.replaceFirst(V4_FORMAT_REGEX, ""); } else if (data.matches(V3_FORMAT_REGEX + ".*")) { Loading Loading @@ -313,6 +352,7 @@ public class ApnSetting { int mtu = PhoneConstants.UNSET_MTU; String mvnoType = ""; String mvnoMatchData = ""; int apnSetId = Carriers.NO_SET_SET; if (version == 1) { typeArray = new String[a.length - 13]; System.arraycopy(a, 13, typeArray, 0, a.length - 13); Loading Loading @@ -353,6 +393,9 @@ public class ApnSetting { if (a.length > 26) { networkTypeBitmask = ServiceState.getBitmaskFromString(a[26]); } if (a.length > 27) { apnSetId = Integer.parseInt(a[27]); } } // If both bearerBitmask and networkTypeBitmask were specified, bearerBitmask would be Loading @@ -364,7 +407,7 @@ public class ApnSetting { return new ApnSetting(-1, a[10] + a[11], a[0], a[1], a[2], a[3], a[7], a[8], a[9], a[4], a[5], authType, typeArray, protocol, roamingProtocol, carrierEnabled, networkTypeBitmask, profileId, modemCognitive, maxConns, waitTime, maxConnsTime, mtu, mvnoType, mvnoMatchData); mtu, mvnoType, mvnoMatchData, apnSetId); } /** Loading Loading @@ -393,7 +436,7 @@ public class ApnSetting { @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("[ApnSettingV4] ") sb.append("[ApnSettingV5] ") .append(carrier) .append(", ").append(id) .append(", ").append(numeric) Loading Loading @@ -425,6 +468,7 @@ public class ApnSetting { sb.append(", ").append(mvnoMatchData); sb.append(", ").append(permanentFailed); sb.append(", ").append(networkTypeBitmask); sb.append(", ").append(apnSetId); return sb.toString(); } Loading Loading @@ -651,7 +695,8 @@ public class ApnSetting { && mtu == other.mtu && mvnoType.equals(other.mvnoType) && mvnoMatchData.equals(other.mvnoMatchData) && networkTypeBitmask == other.networkTypeBitmask; && networkTypeBitmask == other.networkTypeBitmask && apnSetId == other.apnSetId; } /** Loading Loading @@ -696,7 +741,8 @@ public class ApnSetting { && maxConnsTime == other.maxConnsTime && mtu == other.mtu && mvnoType.equals(other.mvnoType) && mvnoMatchData.equals(other.mvnoMatchData); && mvnoMatchData.equals(other.mvnoMatchData) && apnSetId == other.apnSetId; } /** Loading @@ -722,7 +768,8 @@ public class ApnSetting { && xorEquals(this.mmsc, other.mmsc) && xorEquals(this.mmsProxy, other.mmsProxy) && xorEquals(this.mmsPort, other.mmsPort)) && this.networkTypeBitmask == other.networkTypeBitmask; && this.networkTypeBitmask == other.networkTypeBitmask && this.apnSetId == other.apnSetId; } // check whether the types of two APN same (even only one type of each APN is same) Loading
src/java/com/android/internal/telephony/dataconnection/DcTracker.java +3 −2 Original line number Diff line number Diff line Loading @@ -1859,7 +1859,8 @@ public class DcTracker extends Handler { cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MAX_CONNS_TIME)), cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MTU)), cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_TYPE)), cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_MATCH_DATA))); cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_MATCH_DATA)), cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.APN_SET_ID))); return apn; } Loading Loading @@ -3389,7 +3390,7 @@ public class DcTracker extends Handler { dest.authType, resultTypes.toArray(new String[0]), protocol, roamingProtocol, dest.carrierEnabled, networkTypeBitmask, dest.profileId, (dest.modemCognitive || src.modemCognitive), dest.maxConns, dest.waitTime, dest.maxConnsTime, dest.mtu, dest.mvnoType, dest.mvnoMatchData); dest.maxConnsTime, dest.mtu, dest.mvnoType, dest.mvnoMatchData, dest.apnSetId); } /** Return the DC AsyncChannel for the new data connection */ Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/ApnSettingTest.java +37 −3 Original line number Diff line number Diff line Loading @@ -138,6 +138,7 @@ public class ApnSettingTest extends TelephonyTest { assertEquals(a1.mvnoType, a2.mvnoType); assertEquals(a1.mvnoMatchData, a2.mvnoMatchData); assertEquals(a1.networkTypeBitmask, a2.networkTypeBitmask); assertEquals(a1.apnSetId, a2.apnSetId); } @Test Loading Loading @@ -230,6 +231,22 @@ public class ApnSettingTest extends TelephonyTest { "testspn"); assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString)); // A v5 string with apnSetId=0 testString = "[ApnSettingV5] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,0,0"; expectedApn = new ApnSetting( -1, "12345", "Name", "apn", "", "", "", "", "", "", "", 0, mmsTypes, "IPV6", "IP", true, 0, 0, 0, false, 0, 0, 0, 0, "spn", "testspn"); assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString)); // A v5 string with apnSetId=3 testString = "[ApnSettingV5] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,0,3"; expectedApn = new ApnSetting( -1, "12345", "Name", "apn", "", "", "", "", "", "", "", 0, mmsTypes, "IPV6", "IP", true, 0, 0, false, 0, 0, 0, 0, "spn", "testspn", 3); assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString)); // Return no apn if insufficient fields given. testString = "[ApnSettingV3] Name,apn,,,,,,,,,123, 45,,mms|*"; assertEquals(null, ApnSetting.fromString(testString)); Loading @@ -248,6 +265,8 @@ public class ApnSettingTest extends TelephonyTest { " ;[ApnSettingV3] Name1,apn1,,,,,,,,,123,46,,mms,IPV6,IP,true,12,,,,,,,gid,testGid"; testString += " ;[ApnSettingV3] Name1,apn2,,,,,,,,,123,46,,mms,IPV6,IP,true,12,,,,,,,,"; testString += " ;[ApnSettingV5] Name1,apn2,,,,,,,,,123,46,,mms,IPV6,IP,true,0,,,,,,,,,,3"; List<ApnSetting> expectedApns = new ArrayList<ApnSetting>(); expectedApns.add(new ApnSetting( -1, "12345", "Name", "apn", "", "", "", "", "", "", "", 0, new String[]{"mms"}, "IPV6", Loading @@ -258,6 +277,9 @@ public class ApnSettingTest extends TelephonyTest { expectedApns.add(new ApnSetting( -1, "12346", "Name1", "apn2", "", "", "", "", "", "", "", 0, new String[]{"mms"}, "IPV6", "IP", true, 12, 0, 0, false, 0, 0, 0, 0, "", "")); expectedApns.add(new ApnSetting( -1, "12346", "Name1", "apn2", "", "", "", "", "", "", "", 0, new String[]{"mms"}, "IPV6", "IP", true, 0, 0, false, 0, 0, 0, 0, "", "", 3)); assertApnSettingsEqual(expectedApns, ApnSetting.arrayFromString(testString)); } Loading @@ -265,13 +287,25 @@ public class ApnSettingTest extends TelephonyTest { @SmallTest public void testToString() throws Exception { String[] types = {"default", "*"}; // use default apn_set_id constructor ApnSetting apn = new ApnSetting( 99, "12345", "Name", "apn", "proxy", "port", "mmsc", "mmsproxy", "mmsport", "user", "password", 0, types, "IPV6", "IP", true, 14, 0, 0, false, 0, 0, 0, 0, "", ""); String expected = "[ApnSettingV4] Name, 99, 12345, apn, proxy, " String expected = "[ApnSettingV5] Name, 99, 12345, apn, proxy, " + "mmsc, mmsproxy, mmsport, port, 0, default | *, " + "IPV6, IP, true, 14, 8192, 0, false, 0, 0, 0, 0, , , false, 4096"; + "IPV6, IP, true, 14, 8192, 0, false, 0, 0, 0, 0, , , false, 4096, 0"; assertEquals(expected, apn.toString()); int networkTypeBitmask = 1 << (14 - 1); int bearerBitmask = ServiceState.convertNetworkTypeBitmaskToBearerBitmask(networkTypeBitmask); apn = new ApnSetting(99, "12345", "Name", "apn", "proxy", "port", "mmsc", "mmsproxy", "mmsport", "user", "password", 0, types, "IPV6", "IP", true, networkTypeBitmask, 0, false, 0, 0, 0, 0, "", "", 3); expected = "[ApnSettingV5] Name, 99, 12345, apn, proxy, " + "mmsc, mmsproxy, mmsport, port, 0, default | *, IPV6, IP, true, 0, " + bearerBitmask + ", 0, false, 0, 0, 0, 0, , , false, 8192, 3"; assertEquals(expected, apn.toString()); } Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +55 −7 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import static org.mockito.Mockito.verify; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; Loading Loading @@ -121,6 +122,9 @@ public class DcTrackerTest extends TelephonyTest { 1 << (TelephonyManager.NETWORK_TYPE_LTE - 1); private static final int NETWORK_TYPE_EHRPD_BITMASK = 1 << (TelephonyManager.NETWORK_TYPE_EHRPD - 1); private static final Uri PREFERAPN_URI = Uri.parse( Telephony.Carriers.CONTENT_URI + "/preferapn"); @Mock ISub mIsub; Loading Loading @@ -222,7 +226,8 @@ public class DcTrackerTest extends TelephonyTest { Telephony.Carriers.MAX_CONNS_TIME, Telephony.Carriers.MTU, Telephony.Carriers.MVNO_TYPE, Telephony.Carriers.MVNO_MATCH_DATA, Telephony.Carriers.NETWORK_TYPE_BITMASK}); Telephony.Carriers.NETWORK_TYPE_BITMASK, Telephony.Carriers.APN_SET_ID}); mc.addRow(new Object[]{ 2163, // id Loading Loading @@ -251,7 +256,8 @@ public class DcTrackerTest extends TelephonyTest { 0, // mtu "", // mvno_type "", // mnvo_match_data NETWORK_TYPE_LTE_BITMASK // network_type_bitmask NETWORK_TYPE_LTE_BITMASK, // network_type_bitmask 0 // apn_set_id }); mc.addRow(new Object[]{ Loading Loading @@ -281,7 +287,8 @@ public class DcTrackerTest extends TelephonyTest { 0, // mtu "", // mvno_type "", // mnvo_match_data NETWORK_TYPE_LTE_BITMASK // network_type_bitmask NETWORK_TYPE_LTE_BITMASK, // network_type_bitmask 0 // apn_set_id }); mc.addRow(new Object[]{ Loading Loading @@ -311,7 +318,8 @@ public class DcTrackerTest extends TelephonyTest { 0, // mtu "", // mvno_type "", // mnvo_match_data 0 // network_type_bitmask 0, // network_type_bitmask 0 // apn_set_id }); mc.addRow(new Object[]{ Loading Loading @@ -341,7 +349,8 @@ public class DcTrackerTest extends TelephonyTest { 0, // mtu "", // mvno_type "", // mnvo_match_data NETWORK_TYPE_EHRPD_BITMASK // network_type_bitmask NETWORK_TYPE_EHRPD_BITMASK, // network_type_bitmask 0 // apn_set_id }); mc.addRow(new Object[]{ Loading Loading @@ -371,7 +380,8 @@ public class DcTrackerTest extends TelephonyTest { 0, // mtu "", // mvno_type "", // mnvo_match_data 0 // network_type_bitmask 0, // network_type_bitmask 0 // apn_set_id }); return mc; } Loading @@ -379,6 +389,11 @@ public class DcTrackerTest extends TelephonyTest { return null; } @Override public int update(Uri url, ContentValues values, String where, String[] whereArgs) { return 0; } } @Before Loading Loading @@ -1285,6 +1300,39 @@ public class DcTrackerTest extends TelephonyTest { dunApn = mDct.fetchDunApn(); assertEquals(FAKE_APN5, dunApn.apn); } // Test for fetchDunApn() with apn set id @Test @SmallTest @Ignore public void testFetchDunApnWithPreferredApnSet() { logd("Sending EVENT_RECORDS_LOADED"); mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null)); waitForMs(200); // apnSetId=1 String dunApnString1 = "[ApnSettingV5]HOT mobile PC,pc.hotm,,,,,,,,,440,10,,DUN,,,true," + "0,,,,,,,,,1"; // apnSetId=2 String dunApnString2 = "[ApnSettingV5]HOT mobile PC,pc.hotm,,,,,,,,,440,10,,DUN,,,true," + "0,,,,,,,,,2"; ApnSetting dunApnExpected = ApnSetting.fromString(dunApnString1); ContentResolver cr = mContext.getContentResolver(); Settings.Global.putString(cr, Settings.Global.TETHER_DUN_APN, dunApnString1 + ";" + dunApnString2); // set that we prefer apn set 1 ContentValues values = new ContentValues(); values.put(Telephony.Carriers.APN_SET_ID, 1); cr.update(PREFERAPN_URI, values, null, null); // currently a noop // TODO(70172263) should return APN from Setting with apnSetId=1 ApnSetting dunApn = mDct.fetchDunApn(); assertTrue(dunApnExpected.equals(dunApn)); } // Test oos @Test @SmallTest Loading