diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2011-02-04 17:41:11 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-02-04 17:41:11 -0800 |
commit | 24401c79665e9af458fbe646165c68434335dda4 (patch) | |
tree | 40dcf3f22558cbe5451c3e4a6406fd8c67672a37 /telephony | |
parent | d4a3d032b119a4f325d2724649da55e540a322b9 (diff) | |
parent | 8e63c3e33b2dc8ed8020915ceee011b99cbad99f (diff) | |
download | frameworks_base-24401c79665e9af458fbe646165c68434335dda4.zip frameworks_base-24401c79665e9af458fbe646165c68434335dda4.tar.gz frameworks_base-24401c79665e9af458fbe646165c68434335dda4.tar.bz2 |
Merge "Add a protocol property to the APNs and use it."
Diffstat (limited to 'telephony')
5 files changed, 201 insertions, 31 deletions
diff --git a/telephony/java/com/android/internal/telephony/ApnSetting.java b/telephony/java/com/android/internal/telephony/ApnSetting.java index 5af8e35..20dbaf3 100644 --- a/telephony/java/com/android/internal/telephony/ApnSetting.java +++ b/telephony/java/com/android/internal/telephony/ApnSetting.java @@ -21,6 +21,8 @@ package com.android.internal.telephony; */ public class ApnSetting { + static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*"; + public String carrier; public String apn; public String proxy; @@ -34,11 +36,14 @@ public class ApnSetting { public String[] types; public int id; public String numeric; + public String protocol; + public String roamingProtocol; - - public ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port, + 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 user, String password, int authType, String[] types, + String protocol, String roamingProtocol) { this.id = id; this.numeric = numeric; this.carrier = carrier; @@ -52,40 +57,81 @@ public class ApnSetting { this.password = password; this.authType = authType; this.types = types; + this.protocol = protocol; + this.roamingProtocol = roamingProtocol; } - // data[0] = name - // data[1] = apn - // data[2] = proxy - // data[3] = port - // data[4] = username - // data[5] = password - // data[6] = server - // data[7] = mmsc - // data[8] = mmsproxy - // data[9] = mmsport - // data[10] = mcc - // data[11] = mnc - // data[12] = auth - // data[13] = first type... + /** + * Creates an ApnSetting object from a string. + * + * @param data the string to read. + * + * The string must be in one of two formats (newlines added for clarity, + * spaces are optional): + * + * v1 format: + * <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, + * <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>, + * <type>[, <type>...] + * + * v2 format: + * [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, + * <mmsport>, <user>, <password, <authtype>, <mcc>, <mnc>, + * <type>[| <type>...], <protocol>, <roaming_protocol> + * + * Note that the strings generated by toString() do not contain the username + * and password and thus cannot be read by this method. + * + * @see ApnSettingTest + */ public static ApnSetting fromString(String data) { if (data == null) return null; + + int version; + // matches() operates on the whole string, so append .* to the regex. + if (data.matches(V2_FORMAT_REGEX + ".*")) { + version = 2; + data = data.replaceFirst(V2_FORMAT_REGEX, ""); + } else { + version = 1; + } + String[] a = data.split("\\s*,\\s*"); - if (a.length < 14) return null; - int authType = 0; + if (a.length < 14) { + return null; + } + + int authType; try { authType = Integer.parseInt(a[12]); } catch (Exception e) { + authType = 0; } - String[] typeArray = new String[a.length - 13]; - System.arraycopy(a, 13, typeArray, 0, a.length - 13); + + String[] typeArray; + String protocol, roamingProtocol; + if (version == 1) { + typeArray = new String[a.length - 13]; + System.arraycopy(a, 13, typeArray, 0, a.length - 13); + protocol = RILConstants.SETUP_DATA_PROTOCOL_IP; + roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP; + } else { + if (a.length < 16) { + return null; + } + typeArray = a[13].split("\\s*\\|\\s*"); + protocol = a[14]; + roamingProtocol = a[15]; + } + 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); + a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol); } public String toString() { StringBuilder sb = new StringBuilder(); - sb.append(carrier) + sb.append("[ApnSettingV2] ") + .append(carrier) .append(", ").append(id) .append(", ").append(numeric) .append(", ").append(apn) @@ -94,10 +140,15 @@ public class ApnSetting { .append(", ").append(mmsProxy) .append(", ").append(mmsPort) .append(", ").append(port) - .append(", ").append(authType); - for (String t : types) { - sb.append(", ").append(t); + .append(", ").append(authType).append(", "); + for (int i = 0; i < types.length; i++) { + sb.append(types[i]); + if (i < types.length - 1) { + sb.append(" | "); + } } + sb.append(", ").append(protocol); + sb.append(", ").append(roamingProtocol); return sb.toString(); } diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java index 60df7df..c324a71 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java @@ -336,7 +336,8 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { types = mDefaultApnTypes; apnId = mDefaultApnId; } - mActiveApn = new ApnSetting(apnId, "", "", "", "", "", "", "", "", "", "", 0, types); + mActiveApn = new ApnSetting(apnId, "", "", "", "", "", "", "", "", "", + "", 0, types, "IP", "IP"); if (DBG) log("setupData: mActiveApn=" + mActiveApn); Message msg = obtainMessage(); diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java index 1d60bda..4689b2d 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java @@ -92,12 +92,19 @@ public class GsmDataConnection extends DataConnection { authType = (apn.user != null) ? RILConstants.SETUP_DATA_AUTH_PAP_CHAP : RILConstants.SETUP_DATA_AUTH_NONE; } + + String protocol; + if (phone.getServiceState().getRoaming()) { + protocol = apn.roamingProtocol; + } else { + protocol = apn.protocol; + } + phone.mCM.setupDataCall( Integer.toString(RILConstants.SETUP_DATA_TECH_GSM), Integer.toString(RILConstants.DATA_PROFILE_DEFAULT), - apn.apn, apn.user, apn.password, - Integer.toString(authType), - RILConstants.SETUP_DATA_PROTOCOL_IP, msg); + apn.apn, apn.user, apn.password, Integer.toString(authType), + protocol, msg); } @Override diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index cd0d9e3..f2cdf0c 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -432,7 +432,10 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)), cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)), cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)), - types); + types, + cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)), + cursor.getString(cursor.getColumnIndexOrThrow( + Telephony.Carriers.ROAMING_PROTOCOL))); result.add(apn); } while (cursor.moveToNext()); } diff --git a/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java b/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java new file mode 100644 index 0000000..1032074 --- /dev/null +++ b/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.telephony; + +import junit.framework.TestCase; + +import android.test.suitebuilder.annotation.SmallTest; + +public class ApnSettingTest extends TestCase { + + public static final String[] TYPES = {"default", "*"}; + + public static void assertApnSettingEqual(ApnSetting a1, ApnSetting a2) { + assertEquals(a1.carrier, a2.carrier); + assertEquals(a1.apn, a2.apn); + assertEquals(a1.proxy, a2.proxy); + assertEquals(a1.port, a2.port); + assertEquals(a1.mmsc, a2.mmsc); + assertEquals(a1.mmsProxy, a2.mmsProxy); + assertEquals(a1.mmsPort, a2.mmsPort); + assertEquals(a1.user, a2.user); + assertEquals(a1.password, a2.password); + assertEquals(a1.authType, a2.authType); + assertEquals(a1.id, a2.id); + assertEquals(a1.numeric, a2.numeric); + assertEquals(a1.protocol, a2.protocol); + assertEquals(a1.roamingProtocol, a2.roamingProtocol); + assertEquals(a1.types.length, a2.types.length); + int i; + for (i = 0; i < a1.types.length; i++) { + assertEquals(a1.types[i], a2.types[i]); + } + } + + @SmallTest + public void testFromString() throws Exception { + String[] dunTypes = {"DUN"}; + String[] mmsTypes = {"mms", "*"}; + + ApnSetting expected_apn; + String testString; + + // A real-world v1 example string. + testString = "Vodafone IT,web.omnitel.it,,,,,,,,,222,10,,DUN"; + expected_apn = new ApnSetting( + -1, "22210", "Vodafone IT", "web.omnitel.it", "", "", + "", "", "", "", "", 0, dunTypes, "IP", "IP"); + assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString)); + + // A v2 string. + testString = "[ApnSettingV2] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP"; + expected_apn = new ApnSetting( + -1, "12345", "Name", "apn", "", "", + "", "", "", "", "", 0, mmsTypes, "IPV6", "IP"); + assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString)); + + // A v2 string with spaces. + testString = "[ApnSettingV2] Name,apn, ,,,,,,,,123,45,,mms|*,IPV4V6, IP"; + expected_apn = new ApnSetting( + -1, "12345", "Name", "apn", "", "", + "", "", "", "", "", 0, mmsTypes, "IPV4V6", "IP"); + assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString)); + + // Return null if insufficient fields given. + testString = "[ApnSettingV2] Name,apn,,,,,,,,,123, 45,,mms|*"; + assertEquals(null, ApnSetting.fromString(testString)); + + testString = "Name,apn,,,,,,,,,123, 45,"; + assertEquals(null, ApnSetting.fromString(testString)); + + // Parse (incorrect) V2 format without the tag as V1. + testString = "Name,apn,,,,,,,,,123, 45,,mms|*,IPV6"; + String[] incorrectTypes = {"mms|*", "IPV6"}; + expected_apn = new ApnSetting( + -1, "12345", "Name", "apn", "", "", + "", "", "", "", "", 0, incorrectTypes, "IP", "IP"); + assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString)); + } + + + @SmallTest + public void testToString() throws Exception { + String[] types = {"default", "*"}; + ApnSetting apn = new ApnSetting( + 99, "12345", "Name", "apn", "proxy", "port", + "mmsc", "mmsproxy", "mmsport", "user", "password", 0, + types, "IPV4V6", "IP"); + String expected = "[ApnSettingV2] Name, 99, 12345, apn, proxy, " + + "mmsc, mmsproxy, mmsport, port, 0, default | *, " + + "IPV4V6, IP"; + assertEquals(expected, apn.toString()); + } +} + |