summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/vpn2
diff options
context:
space:
mode:
authorChia-chi Yeh <chiachi@android.com>2011-07-27 15:49:43 -0700
committerChia-chi Yeh <chiachi@android.com>2011-07-27 17:58:26 -0700
commitd68dbe29bb0a6639bfd95449eb28e7d4b174a3fe (patch)
tree7e60ea6dfab3ea11d79b7b4873a584e64f431022 /src/com/android/settings/vpn2
parentb7cdf167bb60217b4e94c0612117efc0d54cdf73 (diff)
downloadpackages_apps_Settings-d68dbe29bb0a6639bfd95449eb28e7d4b174a3fe.zip
packages_apps_Settings-d68dbe29bb0a6639bfd95449eb28e7d4b174a3fe.tar.gz
packages_apps_Settings-d68dbe29bb0a6639bfd95449eb28e7d4b174a3fe.tar.bz2
VpnSettings: make more fields available as advanced options.
Now users can manually override DNS search domains, DNS servers, and forwarding routes for each VPN network. Change-Id: I10b8e383ac19fd19d23938dff78201a71724d58f
Diffstat (limited to 'src/com/android/settings/vpn2')
-rw-r--r--src/com/android/settings/vpn2/VpnDialog.java63
-rw-r--r--src/com/android/settings/vpn2/VpnSettings.java7
2 files changed, 65 insertions, 5 deletions
diff --git a/src/com/android/settings/vpn2/VpnDialog.java b/src/com/android/settings/vpn2/VpnDialog.java
index d644700..c1a4531 100644
--- a/src/com/android/settings/vpn2/VpnDialog.java
+++ b/src/com/android/settings/vpn2/VpnDialog.java
@@ -27,15 +27,18 @@ import android.security.KeyStore;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
+import android.view.WindowManager;
import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Spinner;
import android.widget.TextView;
-class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListener {
+import java.net.InetAddress;
+
+class VpnDialog extends AlertDialog implements TextWatcher,
+ View.OnClickListener, AdapterView.OnItemSelectedListener {
private final KeyStore mKeyStore = KeyStore.getInstance();
private final DialogInterface.OnClickListener mListener;
private final VpnProfile mProfile;
@@ -50,6 +53,7 @@ class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListen
private TextView mUsername;
private TextView mPassword;
private TextView mSearchDomains;
+ private TextView mDnsServers;
private TextView mRoutes;
private CheckBox mMppe;
private TextView mL2tpSecret;
@@ -82,6 +86,7 @@ class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListen
mUsername = (TextView) mView.findViewById(R.id.username);
mPassword = (TextView) mView.findViewById(R.id.password);
mSearchDomains = (TextView) mView.findViewById(R.id.search_domains);
+ mDnsServers = (TextView) mView.findViewById(R.id.dns_servers);
mRoutes = (TextView) mView.findViewById(R.id.routes);
mMppe = (CheckBox) mView.findViewById(R.id.mppe);
mL2tpSecret = (TextView) mView.findViewById(R.id.l2tp_secret);
@@ -98,6 +103,7 @@ class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListen
mUsername.setText(mProfile.username);
mPassword.setText(mProfile.password);
mSearchDomains.setText(mProfile.searchDomains);
+ mDnsServers.setText(mProfile.dnsServers);
mRoutes.setText(mProfile.routes);
mMppe.setChecked(mProfile.mppe);
mL2tpSecret.setText(mProfile.l2tpSecret);
@@ -115,6 +121,8 @@ class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListen
mServer.addTextChangedListener(this);
mUsername.addTextChangedListener(this);
mPassword.addTextChangedListener(this);
+ mDnsServers.addTextChangedListener(this);
+ mRoutes.addTextChangedListener(this);
mIpsecSecret.addTextChangedListener(this);
mIpsecUserCert.setOnItemSelectedListener(this);
@@ -131,6 +139,15 @@ class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListen
// Show type-specific fields.
changeType(mProfile.type);
+ // Show advanced options directly if any of them is set.
+ View showOptions = mView.findViewById(R.id.show_options);
+ if (mProfile.searchDomains.isEmpty() && mProfile.dnsServers.isEmpty() &&
+ mProfile.routes.isEmpty()) {
+ showOptions.setOnClickListener(this);
+ } else {
+ onClick(showOptions);
+ }
+
// Create a button to save the profile.
setButton(DialogInterface.BUTTON_POSITIVE,
context.getString(R.string.vpn_save), mListener);
@@ -155,6 +172,10 @@ class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListen
// Disable the action button if necessary.
getButton(DialogInterface.BUTTON_POSITIVE)
.setEnabled(mEditing ? valid : validate(false));
+
+ // Workaround to resize the dialog for the input method.
+ getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |
+ WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
@Override
@@ -171,6 +192,12 @@ class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListen
}
@Override
+ public void onClick(View showOptions) {
+ showOptions.setVisibility(View.GONE);
+ mView.findViewById(R.id.options).setVisibility(View.VISIBLE);
+ }
+
+ @Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (parent == mType) {
changeType(position);
@@ -221,7 +248,9 @@ class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListen
if (!editing) {
return mUsername.getText().length() != 0 && mPassword.getText().length() != 0;
}
- if (mName.getText().length() == 0 || mServer.getText().length() == 0) {
+ if (mName.getText().length() == 0 || mServer.getText().length() == 0 ||
+ !validateAddresses(mDnsServers.getText().toString(), false) ||
+ !validateAddresses(mRoutes.getText().toString(), true)) {
return false;
}
switch (mType.getSelectedItemPosition()) {
@@ -239,6 +268,33 @@ class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListen
return false;
}
+ private boolean validateAddresses(String addresses, boolean cidr) {
+ try {
+ for (String address : addresses.split(" ")) {
+ if (address.isEmpty()) {
+ continue;
+ }
+ // Legacy VPN currently only supports IPv4.
+ int prefixLength = 32;
+ if (cidr) {
+ String[] parts = address.split("/", 2);
+ address = parts[0];
+ prefixLength = Integer.parseInt(parts[1]);
+ }
+ byte[] bytes = InetAddress.parseNumericAddress(address).getAddress();
+ int integer = (bytes[3] & 0xFF) | (bytes[2] & 0xFF) << 8 |
+ (bytes[1] & 0xFF) << 16 | (bytes[0] & 0xFF) << 24;
+ if (bytes.length != 4 || prefixLength < 0 || prefixLength > 32 ||
+ (prefixLength < 32 && (integer << prefixLength) != 0)) {
+ return false;
+ }
+ }
+ } catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+
private void loadCertificates(Spinner spinner, String prefix, int firstId, String selected) {
Context context = getContext();
String first = (firstId == 0) ? "" : context.getString(firstId);
@@ -279,6 +335,7 @@ class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListen
profile.username = mUsername.getText().toString();
profile.password = mPassword.getText().toString();
profile.searchDomains = mSearchDomains.getText().toString().trim();
+ profile.dnsServers = mDnsServers.getText().toString().trim();
profile.routes = mRoutes.getText().toString().trim();
// Then, save type-specific fields.
diff --git a/src/com/android/settings/vpn2/VpnSettings.java b/src/com/android/settings/vpn2/VpnSettings.java
index 4dbb6bd..2ab99e8 100644
--- a/src/com/android/settings/vpn2/VpnSettings.java
+++ b/src/com/android/settings/vpn2/VpnSettings.java
@@ -108,7 +108,7 @@ public class VpnSettings extends SettingsPreferenceFragment implements
Credentials.getInstance().unlock(getActivity());
} else {
// We already tried, but it is still not working!
- getActivity().getFragmentManager().popBackStack();
+ finishFragment();
}
mUnlocking = !mUnlocking;
return;
@@ -429,8 +429,11 @@ public class VpnSettings extends SettingsPreferenceFragment implements
config.interfaze = interfaze;
config.session = profile.name;
config.routes = profile.routes;
+ if (!profile.dnsServers.isEmpty()) {
+ config.dnsServers = Arrays.asList(profile.dnsServers.split(" +"));
+ }
if (!profile.searchDomains.isEmpty()) {
- config.searchDomains = Arrays.asList(profile.searchDomains.split(" "));
+ config.searchDomains = Arrays.asList(profile.searchDomains.split(" +"));
}
mService.startLegacyVpn(config, racoon, mtpd);