Support configuring the protocol in APN settings.
Bug: 3333633
Change-Id: I0797cd97074fe1b8a1318168b86fe4627488215a
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 1a8e17b..560e6e3 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -354,6 +354,22 @@
<item>3</item>
</string-array>
+ <!-- Authentication Types used in APN editor -->
+ <string-array name="apn_protocol_entries">
+ <item>IPv4</item>
+ <item>IPv6</item>
+ <item>IPv4/IPv6</item>
+ </string-array>
+
+ <string-array translatable="false" name="apn_protocol_values">
+ <!-- Do not translate. -->
+ <item>IP</item>
+ <!-- Do not translate. -->
+ <item>IPV6</item>
+ <!-- Do not translate. -->
+ <item>IPV4V6</item>
+ </string-array>
+
<!-- Apps on SD instalaltion location options in ApplicationSettings -->
<string-array name="app_install_location_entries">
<item>Internal device storage</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9dee4fd..999cf76 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1397,6 +1397,8 @@
<string name="apn_auth_type_pap_chap">PAP or CHAP</string>
<!-- Edit access point labels: The type of APN -->
<string name="apn_type">APN type</string>
+ <!-- Edit access point labels: The protocol of the APN, e.g., "IPv4", "IPv6", or "IPv4/IPv6". -->
+ <string name="apn_protocol">APN protocol</string>
<!-- Edit access point screen menu option to delete this APN -->
<string name="menu_delete">Delete APN</string>
<!-- APNs screen menu option to create a brand spanking new APN -->
diff --git a/res/xml/apn_editor.xml b/res/xml/apn_editor.xml
index 3835a2c..287a6f8 100644
--- a/res/xml/apn_editor.xml
+++ b/res/xml/apn_editor.xml
@@ -114,4 +114,11 @@
android:singleLine="true"
android:inputType="textNoSuggestions"
/>
+ <ListPreference
+ android:title="@string/apn_protocol"
+ android:dialogTitle="@string/apn_protocol"
+ android:key="apn_protocol"
+ android:entries="@array/apn_protocol_entries"
+ android:entryValues="@array/apn_protocol_values"
+ />
</PreferenceScreen>
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
index e097854..4ac7401 100644
--- a/src/com/android/settings/ApnEditor.java
+++ b/src/com/android/settings/ApnEditor.java
@@ -37,6 +37,7 @@
import android.view.MenuItem;
import com.android.internal.telephony.TelephonyProperties;
+import com.android.internal.telephony.RILConstants;
public class ApnEditor extends PreferenceActivity
@@ -47,6 +48,7 @@
private final static String SAVED_POS = "pos";
private final static String KEY_AUTH_TYPE = "auth_type";
+ private final static String KEY_PROTOCOL = "apn_protocol";
private static final int MENU_DELETE = Menu.FIRST;
private static final int MENU_SAVE = Menu.FIRST + 1;
@@ -67,6 +69,7 @@
private EditTextPreference mMmsPort;
private ListPreference mAuthType;
private EditTextPreference mApnType;
+ private ListPreference mProtocol;
private String mCurMnc;
private String mCurMcc;
@@ -97,6 +100,7 @@
Telephony.Carriers.MMSPORT, // 13
Telephony.Carriers.AUTH_TYPE, // 14
Telephony.Carriers.TYPE, // 15
+ Telephony.Carriers.PROTOCOL, // 16
};
private static final int ID_INDEX = 0;
@@ -114,6 +118,7 @@
private static final int MMSPORT_INDEX = 13;
private static final int AUTH_TYPE_INDEX = 14;
private static final int TYPE_INDEX = 15;
+ private static final int PROTOCOL_INDEX = 16;
@Override
@@ -137,9 +142,12 @@
mMnc = (EditTextPreference) findPreference("apn_mnc");
mApnType = (EditTextPreference) findPreference("apn_type");
- mAuthType = (ListPreference) findPreference("auth_type");
+ mAuthType = (ListPreference) findPreference(KEY_AUTH_TYPE);
mAuthType.setOnPreferenceChangeListener(this);
+ mProtocol = (ListPreference) findPreference(KEY_PROTOCOL);
+ mProtocol.setOnPreferenceChangeListener(this);
+
mRes = getResources();
final Intent intent = getIntent();
@@ -234,6 +242,7 @@
mAuthType.setValueIndex(authVal);
}
+ mProtocol.setValue(mCursor.getString(PROTOCOL_INDEX));
}
mName.setSummary(checkNull(mName.getText()));
@@ -260,6 +269,28 @@
} else {
mAuthType.setSummary(sNotSet);
}
+
+ mProtocol.setSummary(
+ checkNull(protocolDescription(mProtocol.getValue())));
+ }
+
+ /**
+ * Returns the UI choice (e.g., "IPv4/IPv6") corresponding to the given
+ * raw value of the protocol preference (e.g., "IPV4V6"). If unknown,
+ * return null.
+ */
+ private String protocolDescription(String raw) {
+ int protocolIndex = mProtocol.findIndexOfValue(raw);
+ if (protocolIndex == -1) {
+ return null;
+ } else {
+ String[] values = mRes.getStringArray(R.array.apn_protocol_entries);
+ try {
+ return values[protocolIndex];
+ } catch (ArrayIndexOutOfBoundsException e) {
+ return null;
+ }
+ }
}
public boolean onPreferenceChange(Preference preference, Object newValue) {
@@ -274,6 +305,16 @@
} catch (NumberFormatException e) {
return false;
}
+ return true;
+ }
+
+ if (KEY_PROTOCOL.equals(key)) {
+ String protocol = protocolDescription((String) newValue);
+ if (protocol == null) {
+ return false;
+ }
+ mProtocol.setSummary(protocol);
+ mProtocol.setValue((String) newValue);
}
return true;
}
@@ -396,6 +437,13 @@
values.put(Telephony.Carriers.AUTH_TYPE, Integer.parseInt(authVal));
}
+ values.put(Telephony.Carriers.PROTOCOL, checkNotSet(mProtocol.getValue()));
+
+ // Hardcode IPv4 roaming for now until the carriers sort out all the
+ // billing arrangements.
+ values.put(Telephony.Carriers.ROAMING_PROTOCOL,
+ RILConstants.SETUP_DATA_PROTOCOL_IP);
+
values.put(Telephony.Carriers.TYPE, checkNotSet(mApnType.getText()));
values.put(Telephony.Carriers.MCC, mcc);