Loading res/layout/vpn_dialog.xml +40 −0 Original line number Diff line number Diff line Loading @@ -140,6 +140,46 @@ android:labelFor="@+id/routes"/> <EditText style="@style/vpn_value" android:id="@+id/routes" android:hint="@string/vpn_not_used"/> <TextView android:id="@+id/vpn_proxy_settings_title" style="@style/vpn_label" android:text="@string/proxy_settings_title" android:labelFor="@+id/vpn_proxy_settings" /> <Spinner android:id="@+id/vpn_proxy_settings" style="@style/vpn_value" android:prompt="@string/proxy_settings_title" android:entries="@array/vpn_proxy_settings" /> <LinearLayout android:id="@+id/vpn_proxy_fields" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:visibility="gone" > <TextView style="@style/vpn_label" android:text="@string/proxy_hostname_label" android:labelFor="@+id/vpn_proxy_host" /> <EditText android:id="@+id/vpn_proxy_host" style="@style/vpn_value" android:hint="@string/proxy_hostname_hint" android:inputType="textNoSuggestions" /> <TextView style="@style/vpn_label" android:text="@string/proxy_port_label" android:labelFor="@+id/vpn_proxy_port" /> <EditText android:id="@+id/vpn_proxy_port" style="@style/vpn_value" android:hint="@string/proxy_port_hint" android:inputType="number" /> </LinearLayout> </LinearLayout> <LinearLayout android:id="@+id/login" Loading res/values/arrays.xml +8 −0 Original line number Diff line number Diff line Loading @@ -939,6 +939,14 @@ <item>IPSec VPN with certificates and hybrid authentication</item> </string-array> <!-- VPN proxy settings. --> <string-array name="vpn_proxy_settings"> <!-- No HTTP proxy is used for the current VPN [CHAR LIMIT=25] --> <item>None</item> <!-- Manual HTTP proxy settings are used for the current VPN [CHAR LIMIT=25] --> <item>Manual</item> </string-array> <!-- Match this with the constants in LegacyVpnInfo. --> <skip /> <!-- Status for a VPN network. [CHAR LIMIT=100] --> <string-array name="vpn_states"> Loading src/com/android/settings/vpn2/ConfigDialog.java +63 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.settings.vpn2; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.net.Proxy; import android.net.ProxyInfo; import android.os.Bundle; import android.os.SystemProperties; import android.security.Credentials; Loading Loading @@ -66,6 +68,9 @@ class ConfigDialog extends AlertDialog implements TextWatcher, private TextView mSearchDomains; private TextView mDnsServers; private TextView mRoutes; private Spinner mProxySettings; private TextView mProxyHost; private TextView mProxyPort; private CheckBox mMppe; private TextView mL2tpSecret; private TextView mIpsecIdentifier; Loading Loading @@ -104,6 +109,9 @@ class ConfigDialog extends AlertDialog implements TextWatcher, mSearchDomains = (TextView) mView.findViewById(R.id.search_domains); mDnsServers = (TextView) mView.findViewById(R.id.dns_servers); mRoutes = (TextView) mView.findViewById(R.id.routes); mProxySettings = (Spinner) mView.findViewById(R.id.vpn_proxy_settings); mProxyHost = (TextView) mView.findViewById(R.id.vpn_proxy_host); mProxyPort = (TextView) mView.findViewById(R.id.vpn_proxy_port); mMppe = (CheckBox) mView.findViewById(R.id.mppe); mL2tpSecret = (TextView) mView.findViewById(R.id.l2tp_secret); mIpsecIdentifier = (TextView) mView.findViewById(R.id.ipsec_identifier); Loading @@ -127,6 +135,11 @@ class ConfigDialog extends AlertDialog implements TextWatcher, mSearchDomains.setText(mProfile.searchDomains); mDnsServers.setText(mProfile.dnsServers); mRoutes.setText(mProfile.routes); if (mProfile.proxy != null) { mProxyHost.setText(mProfile.proxy.getHost()); int port = mProfile.proxy.getPort(); mProxyPort.setText(port == 0 ? "" : Integer.toString(port)); } mMppe.setChecked(mProfile.mppe); mL2tpSecret.setText(mProfile.l2tpSecret); mIpsecIdentifier.setText(mProfile.ipsecIdentifier); Loading @@ -152,6 +165,9 @@ class ConfigDialog extends AlertDialog implements TextWatcher, mPassword.addTextChangedListener(this); mDnsServers.addTextChangedListener(this); mRoutes.addTextChangedListener(this); mProxySettings.setOnItemSelectedListener(this); mProxyHost.addTextChangedListener(this); mProxyPort.addTextChangedListener(this); mIpsecSecret.addTextChangedListener(this); mIpsecUserCert.setOnItemSelectedListener(this); mShowOptions.setOnClickListener(this); Loading @@ -174,7 +190,8 @@ class ConfigDialog extends AlertDialog implements TextWatcher, // Switch to advanced view immediately if any advanced options are on if (!mProfile.searchDomains.isEmpty() || !mProfile.dnsServers.isEmpty() || !mProfile.routes.isEmpty()) { !mProfile.routes.isEmpty() || (mProfile.proxy != null && (!mProfile.proxy.getHost().isEmpty() || mProfile.proxy.getPort() != 0))) { showAdvancedOptions(); } Loading Loading @@ -245,6 +262,8 @@ class ConfigDialog extends AlertDialog implements TextWatcher, public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if (parent == mType) { changeType(position); } else if (parent == mProxySettings) { updateProxyFieldsVisibility(position); } updateUiControls(); } Loading @@ -270,6 +289,7 @@ class ConfigDialog extends AlertDialog implements TextWatcher, * These include: * "Always-on VPN" checkbox * Reason for "Always-on VPN" being disabled, when necessary * Proxy info if manually configured * "Save account information" checkbox * "Save" and "Connect" buttons */ Loading Loading @@ -297,6 +317,13 @@ class ConfigDialog extends AlertDialog implements TextWatcher, mAlwaysOnInvalidReason.setVisibility(View.VISIBLE); } // Show proxy fields if any proxy field is filled. if (mProfile.proxy != null && (!mProfile.proxy.getHost().isEmpty() || mProfile.proxy.getPort() != 0)) { mProxySettings.setSelection(VpnProfile.PROXY_MANUAL); updateProxyFieldsVisibility(VpnProfile.PROXY_MANUAL); } // Save account information if (mAlwaysOnVpn.isChecked()) { mSaveLogin.setChecked(true); Loading @@ -310,6 +337,11 @@ class ConfigDialog extends AlertDialog implements TextWatcher, getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(validate(mEditing)); } private void updateProxyFieldsVisibility(int position) { final int visible = position == VpnProfile.PROXY_MANUAL ? View.VISIBLE : View.GONE; mView.findViewById(R.id.vpn_proxy_fields).setVisibility(visible); } private void showAdvancedOptions() { mView.findViewById(R.id.options).setVisibility(View.VISIBLE); mShowOptions.setVisibility(View.GONE); Loading Loading @@ -360,6 +392,11 @@ class ConfigDialog extends AlertDialog implements TextWatcher, !validateAddresses(mRoutes.getText().toString(), true)) { return false; } if (!validateProxy()) { return false; } switch (mType.getSelectedItemPosition()) { case VpnProfile.TYPE_PPTP: case VpnProfile.TYPE_IPSEC_HYBRID_RSA: Loading Loading @@ -434,6 +471,10 @@ class ConfigDialog extends AlertDialog implements TextWatcher, return mEditing; } boolean hasProxy() { return mProxySettings.getSelectedItemPosition() == VpnProfile.PROXY_MANUAL; } VpnProfile getProfile() { // First, save common fields. VpnProfile profile = new VpnProfile(mProfile.key); Loading @@ -445,7 +486,16 @@ class ConfigDialog extends AlertDialog implements TextWatcher, profile.searchDomains = mSearchDomains.getText().toString().trim(); profile.dnsServers = mDnsServers.getText().toString().trim(); profile.routes = mRoutes.getText().toString().trim(); if (hasProxy()) { String proxyHost = mProxyHost.getText().toString().trim(); String proxyPort = mProxyPort.getText().toString().trim(); // 0 is a last resort default, but the interface validates that the proxy port is // present and non-zero. int port = proxyPort.isEmpty() ? 0 : Integer.parseInt(proxyPort); profile.proxy = new ProxyInfo(proxyHost, port, null); } else { profile.proxy = null; } // Then, save type-specific fields. switch (profile.type) { case VpnProfile.TYPE_PPTP: Loading Loading @@ -482,4 +532,15 @@ class ConfigDialog extends AlertDialog implements TextWatcher, profile.saveLogin = mSaveLogin.isChecked() || (mEditing && hasLogin); return profile; } private boolean validateProxy() { if (!hasProxy()) { return true; } final String host = mProxyHost.getText().toString().trim(); final String port = mProxyPort.getText().toString().trim(); return Proxy.validate(host, port, "") == Proxy.PROXY_VALID; } } Loading
res/layout/vpn_dialog.xml +40 −0 Original line number Diff line number Diff line Loading @@ -140,6 +140,46 @@ android:labelFor="@+id/routes"/> <EditText style="@style/vpn_value" android:id="@+id/routes" android:hint="@string/vpn_not_used"/> <TextView android:id="@+id/vpn_proxy_settings_title" style="@style/vpn_label" android:text="@string/proxy_settings_title" android:labelFor="@+id/vpn_proxy_settings" /> <Spinner android:id="@+id/vpn_proxy_settings" style="@style/vpn_value" android:prompt="@string/proxy_settings_title" android:entries="@array/vpn_proxy_settings" /> <LinearLayout android:id="@+id/vpn_proxy_fields" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:visibility="gone" > <TextView style="@style/vpn_label" android:text="@string/proxy_hostname_label" android:labelFor="@+id/vpn_proxy_host" /> <EditText android:id="@+id/vpn_proxy_host" style="@style/vpn_value" android:hint="@string/proxy_hostname_hint" android:inputType="textNoSuggestions" /> <TextView style="@style/vpn_label" android:text="@string/proxy_port_label" android:labelFor="@+id/vpn_proxy_port" /> <EditText android:id="@+id/vpn_proxy_port" style="@style/vpn_value" android:hint="@string/proxy_port_hint" android:inputType="number" /> </LinearLayout> </LinearLayout> <LinearLayout android:id="@+id/login" Loading
res/values/arrays.xml +8 −0 Original line number Diff line number Diff line Loading @@ -939,6 +939,14 @@ <item>IPSec VPN with certificates and hybrid authentication</item> </string-array> <!-- VPN proxy settings. --> <string-array name="vpn_proxy_settings"> <!-- No HTTP proxy is used for the current VPN [CHAR LIMIT=25] --> <item>None</item> <!-- Manual HTTP proxy settings are used for the current VPN [CHAR LIMIT=25] --> <item>Manual</item> </string-array> <!-- Match this with the constants in LegacyVpnInfo. --> <skip /> <!-- Status for a VPN network. [CHAR LIMIT=100] --> <string-array name="vpn_states"> Loading
src/com/android/settings/vpn2/ConfigDialog.java +63 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.settings.vpn2; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.net.Proxy; import android.net.ProxyInfo; import android.os.Bundle; import android.os.SystemProperties; import android.security.Credentials; Loading Loading @@ -66,6 +68,9 @@ class ConfigDialog extends AlertDialog implements TextWatcher, private TextView mSearchDomains; private TextView mDnsServers; private TextView mRoutes; private Spinner mProxySettings; private TextView mProxyHost; private TextView mProxyPort; private CheckBox mMppe; private TextView mL2tpSecret; private TextView mIpsecIdentifier; Loading Loading @@ -104,6 +109,9 @@ class ConfigDialog extends AlertDialog implements TextWatcher, mSearchDomains = (TextView) mView.findViewById(R.id.search_domains); mDnsServers = (TextView) mView.findViewById(R.id.dns_servers); mRoutes = (TextView) mView.findViewById(R.id.routes); mProxySettings = (Spinner) mView.findViewById(R.id.vpn_proxy_settings); mProxyHost = (TextView) mView.findViewById(R.id.vpn_proxy_host); mProxyPort = (TextView) mView.findViewById(R.id.vpn_proxy_port); mMppe = (CheckBox) mView.findViewById(R.id.mppe); mL2tpSecret = (TextView) mView.findViewById(R.id.l2tp_secret); mIpsecIdentifier = (TextView) mView.findViewById(R.id.ipsec_identifier); Loading @@ -127,6 +135,11 @@ class ConfigDialog extends AlertDialog implements TextWatcher, mSearchDomains.setText(mProfile.searchDomains); mDnsServers.setText(mProfile.dnsServers); mRoutes.setText(mProfile.routes); if (mProfile.proxy != null) { mProxyHost.setText(mProfile.proxy.getHost()); int port = mProfile.proxy.getPort(); mProxyPort.setText(port == 0 ? "" : Integer.toString(port)); } mMppe.setChecked(mProfile.mppe); mL2tpSecret.setText(mProfile.l2tpSecret); mIpsecIdentifier.setText(mProfile.ipsecIdentifier); Loading @@ -152,6 +165,9 @@ class ConfigDialog extends AlertDialog implements TextWatcher, mPassword.addTextChangedListener(this); mDnsServers.addTextChangedListener(this); mRoutes.addTextChangedListener(this); mProxySettings.setOnItemSelectedListener(this); mProxyHost.addTextChangedListener(this); mProxyPort.addTextChangedListener(this); mIpsecSecret.addTextChangedListener(this); mIpsecUserCert.setOnItemSelectedListener(this); mShowOptions.setOnClickListener(this); Loading @@ -174,7 +190,8 @@ class ConfigDialog extends AlertDialog implements TextWatcher, // Switch to advanced view immediately if any advanced options are on if (!mProfile.searchDomains.isEmpty() || !mProfile.dnsServers.isEmpty() || !mProfile.routes.isEmpty()) { !mProfile.routes.isEmpty() || (mProfile.proxy != null && (!mProfile.proxy.getHost().isEmpty() || mProfile.proxy.getPort() != 0))) { showAdvancedOptions(); } Loading Loading @@ -245,6 +262,8 @@ class ConfigDialog extends AlertDialog implements TextWatcher, public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if (parent == mType) { changeType(position); } else if (parent == mProxySettings) { updateProxyFieldsVisibility(position); } updateUiControls(); } Loading @@ -270,6 +289,7 @@ class ConfigDialog extends AlertDialog implements TextWatcher, * These include: * "Always-on VPN" checkbox * Reason for "Always-on VPN" being disabled, when necessary * Proxy info if manually configured * "Save account information" checkbox * "Save" and "Connect" buttons */ Loading Loading @@ -297,6 +317,13 @@ class ConfigDialog extends AlertDialog implements TextWatcher, mAlwaysOnInvalidReason.setVisibility(View.VISIBLE); } // Show proxy fields if any proxy field is filled. if (mProfile.proxy != null && (!mProfile.proxy.getHost().isEmpty() || mProfile.proxy.getPort() != 0)) { mProxySettings.setSelection(VpnProfile.PROXY_MANUAL); updateProxyFieldsVisibility(VpnProfile.PROXY_MANUAL); } // Save account information if (mAlwaysOnVpn.isChecked()) { mSaveLogin.setChecked(true); Loading @@ -310,6 +337,11 @@ class ConfigDialog extends AlertDialog implements TextWatcher, getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(validate(mEditing)); } private void updateProxyFieldsVisibility(int position) { final int visible = position == VpnProfile.PROXY_MANUAL ? View.VISIBLE : View.GONE; mView.findViewById(R.id.vpn_proxy_fields).setVisibility(visible); } private void showAdvancedOptions() { mView.findViewById(R.id.options).setVisibility(View.VISIBLE); mShowOptions.setVisibility(View.GONE); Loading Loading @@ -360,6 +392,11 @@ class ConfigDialog extends AlertDialog implements TextWatcher, !validateAddresses(mRoutes.getText().toString(), true)) { return false; } if (!validateProxy()) { return false; } switch (mType.getSelectedItemPosition()) { case VpnProfile.TYPE_PPTP: case VpnProfile.TYPE_IPSEC_HYBRID_RSA: Loading Loading @@ -434,6 +471,10 @@ class ConfigDialog extends AlertDialog implements TextWatcher, return mEditing; } boolean hasProxy() { return mProxySettings.getSelectedItemPosition() == VpnProfile.PROXY_MANUAL; } VpnProfile getProfile() { // First, save common fields. VpnProfile profile = new VpnProfile(mProfile.key); Loading @@ -445,7 +486,16 @@ class ConfigDialog extends AlertDialog implements TextWatcher, profile.searchDomains = mSearchDomains.getText().toString().trim(); profile.dnsServers = mDnsServers.getText().toString().trim(); profile.routes = mRoutes.getText().toString().trim(); if (hasProxy()) { String proxyHost = mProxyHost.getText().toString().trim(); String proxyPort = mProxyPort.getText().toString().trim(); // 0 is a last resort default, but the interface validates that the proxy port is // present and non-zero. int port = proxyPort.isEmpty() ? 0 : Integer.parseInt(proxyPort); profile.proxy = new ProxyInfo(proxyHost, port, null); } else { profile.proxy = null; } // Then, save type-specific fields. switch (profile.type) { case VpnProfile.TYPE_PPTP: Loading Loading @@ -482,4 +532,15 @@ class ConfigDialog extends AlertDialog implements TextWatcher, profile.saveLogin = mSaveLogin.isChecked() || (mEditing && hasLogin); return profile; } private boolean validateProxy() { if (!hasProxy()) { return true; } final String host = mProxyHost.getText().toString().trim(); final String port = mProxyPort.getText().toString().trim(); return Proxy.validate(host, port, "") == Proxy.PROXY_VALID; } }