diff options
author | Chia-chi Yeh <chiachi@android.com> | 2011-07-27 15:49:43 -0700 |
---|---|---|
committer | Chia-chi Yeh <chiachi@android.com> | 2011-07-27 17:58:26 -0700 |
commit | d68dbe29bb0a6639bfd95449eb28e7d4b174a3fe (patch) | |
tree | 7e60ea6dfab3ea11d79b7b4873a584e64f431022 /src/com | |
parent | b7cdf167bb60217b4e94c0612117efc0d54cdf73 (diff) | |
download | packages_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')
-rw-r--r-- | src/com/android/settings/vpn2/VpnDialog.java | 63 | ||||
-rw-r--r-- | src/com/android/settings/vpn2/VpnSettings.java | 7 |
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); |