diff --git a/res/layout/wifi_config_preference.xml b/res/layout/wifi_config_preference.xml
index 665721e0309..9c1844b5e71 100644
--- a/res/layout/wifi_config_preference.xml
+++ b/res/layout/wifi_config_preference.xml
@@ -232,9 +232,9 @@
+ android:text="@string/wifi_network_prefix_length" />
-
+ android:text="@string/wifi_network_prefix_length" />
- Save
Cancel
-
- Please type a valid IP address.
+
+ Please type a valid IP address.
+
+ Please type a valid gateway address.
+
+ Please type a valid dns address.
+
+ Please type a network prefix length between 0 and 32.
DNS 1
DNS 2
Gateway
-
- Netmask
+
+ Network prefix length
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 03d0610c500..597c5a3a6dd 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -20,7 +20,10 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.net.DhcpInfo;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
import android.net.NetworkInfo.DetailedState;
+import android.net.NetworkUtils;
import android.net.Proxy;
import android.net.ProxyProperties;
import android.net.wifi.WifiConfiguration;
@@ -36,6 +39,7 @@ import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.text.format.Formatter;
+import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
@@ -51,6 +55,7 @@ import com.android.settings.R;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
+import java.util.Iterator;
/**
* The class for allowing UIs like {@link WifiDialog} and {@link WifiConfigPreference} to
@@ -93,11 +98,13 @@ public class WifiConfigController implements TextWatcher,
public static final int PROXY_NONE = 0;
public static final int PROXY_STATIC = 1;
+ private static final String TAG = "WifiConfigController";
+
private Spinner mNetworkSetupSpinner;
private Spinner mIpSettingsSpinner;
private TextView mIpAddressView;
private TextView mGatewayView;
- private TextView mNetmaskView;
+ private TextView mNetworkPrefixLengthView;
private TextView mDns1View;
private TextView mDns2View;
@@ -330,17 +337,12 @@ public class WifiConfigController implements TextWatcher,
if (config.ipAssignment == IpAssignment.STATIC) {
//TODO: A better way to do this is to not dismiss the
//dialog as long as one of the fields is invalid
- try {
- config.ipConfig.ipAddress = stringToIpAddr(mIpAddressView.getText().toString());
- config.ipConfig.gateway = stringToIpAddr(mGatewayView.getText().toString());
- config.ipConfig.netmask = stringToIpAddr(mNetmaskView.getText().toString());
- config.ipConfig.dns1 = stringToIpAddr(mDns1View.getText().toString());
- if (mDns2View.getText() != null && mDns2View.getText().length() > 0) {
- config.ipConfig.dns2 = stringToIpAddr(mDns2View.getText().toString());
- }
- } catch (UnknownHostException e) {
- Toast.makeText(mConfigUi.getContext(), R.string.wifi_ip_settings_invalid_ip,
- Toast.LENGTH_LONG).show();
+ LinkProperties linkProperties = new LinkProperties();
+ int result = validateIpConfigFields(linkProperties);
+ if (result == 0) {
+ config.linkProperties = linkProperties;
+ } else {
+ Toast.makeText(mConfigUi.getContext(), result, Toast.LENGTH_LONG).show();
config.ipAssignment = IpAssignment.UNASSIGNED;
}
}
@@ -355,9 +357,11 @@ public class WifiConfigController implements TextWatcher,
String exclusionList = mProxyExclusionListView.getText().toString();
int result = ProxySelector.validate(host, port, exclusionList);
if (result == 0) {
- config.proxyProperties.setSocketAddress(
+ ProxyProperties proxyProperties= new ProxyProperties();
+ proxyProperties.setSocketAddress(
InetSocketAddress.createUnresolved(host, Integer.parseInt(port)));
- config.proxyProperties.setExclusionList(exclusionList);
+ proxyProperties.setExclusionList(exclusionList);
+ config.linkProperties.setHttpProxy(proxyProperties);
} else {
Toast.makeText(mConfigUi.getContext(), result, Toast.LENGTH_LONG).show();
config.proxySettings = ProxySettings.UNASSIGNED;
@@ -367,6 +371,51 @@ public class WifiConfigController implements TextWatcher,
return config;
}
+ private int validateIpConfigFields(LinkProperties linkProperties) {
+ try {
+ String ipAddr = mIpAddressView.getText().toString();
+ if (!NetworkUtils.isIpAddress(ipAddr)) {
+ return R.string.wifi_ip_settings_invalid_ip_address;
+ }
+ InetAddress inetAddr = InetAddress.getByName(ipAddr);
+
+ int networkPrefixLength = Integer.parseInt(mNetworkPrefixLengthView.getText()
+ .toString());
+ if (networkPrefixLength < 0 || networkPrefixLength > 32) {
+ return R.string.wifi_ip_settings_invalid_network_prefix_length;
+ }
+
+ linkProperties.addLinkAddress(new LinkAddress(inetAddr, networkPrefixLength));
+
+ String gateway = mGatewayView.getText().toString();
+ if (!NetworkUtils.isIpAddress(gateway)) {
+ return R.string.wifi_ip_settings_invalid_gateway;
+ }
+ linkProperties.setGateway(InetAddress.getByName(gateway));
+
+ String dns = mDns1View.getText().toString();
+ if (!NetworkUtils.isIpAddress(dns)) {
+ return R.string.wifi_ip_settings_invalid_dns;
+ }
+ linkProperties.addDns(InetAddress.getByName(dns));
+ if (mDns2View.length() > 0) {
+ dns = mDns2View.getText().toString();
+ if (!NetworkUtils.isIpAddress(dns)) {
+ return R.string.wifi_ip_settings_invalid_dns;
+ }
+ linkProperties.addDns(InetAddress.getByName(dns));
+ }
+
+ } catch (NumberFormatException ignore) {
+ return R.string.wifi_ip_settings_invalid_network_prefix_length;
+ } catch (UnknownHostException e) {
+ //Should not happen since we have already validated addresses
+ Log.e(TAG, "Failure to validate IP configuration " + e);
+ return R.string.wifi_ip_settings_invalid_ip_address;
+ }
+ return 0;
+ }
+
int chosenNetworkSetupMethod() {
if (mNetworkSetupSpinner != null) {
return mNetworkSetupSpinner.getSelectedItemPosition();
@@ -471,18 +520,30 @@ public class WifiConfigController implements TextWatcher,
if (mIpAddressView == null) {
mIpAddressView = (TextView) mView.findViewById(R.id.ipaddress);
mGatewayView = (TextView) mView.findViewById(R.id.gateway);
- mNetmaskView = (TextView) mView.findViewById(R.id.netmask);
+ mNetworkPrefixLengthView = (TextView) mView.findViewById(
+ R.id.network_prefix_length);
mDns1View = (TextView) mView.findViewById(R.id.dns1);
mDns2View = (TextView) mView.findViewById(R.id.dns2);
}
if (config != null) {
- DhcpInfo ipConfig = config.ipConfig;
- if (ipConfig != null && ipConfig.ipAddress != 0) {
- mIpAddressView.setText(intToIpString(ipConfig.ipAddress));
- mGatewayView.setText(intToIpString(ipConfig.gateway));
- mNetmaskView.setText(intToIpString(ipConfig.netmask));
- mDns1View.setText(intToIpString(ipConfig.dns1));
- if (ipConfig.dns2 != 0) mDns2View.setText(intToIpString(ipConfig.dns2));
+ LinkProperties linkProperties = config.linkProperties;
+ Iterator iterator = linkProperties.getLinkAddresses().iterator();
+ if (iterator.hasNext()) {
+ LinkAddress linkAddress = iterator.next();
+ mIpAddressView.setText(linkAddress.getAddress().getHostAddress());
+ mNetworkPrefixLengthView.setText(Integer.toString(linkAddress
+ .getNetworkPrefixLength()));
+ }
+ InetAddress gateway = linkProperties.getGateway();
+ if (gateway != null) {
+ mGatewayView.setText(linkProperties.getGateway().getHostAddress());
+ }
+ Iterator dnsIterator = linkProperties.getDnses().iterator();
+ if (dnsIterator.hasNext()) {
+ mDns1View.setText(dnsIterator.next().getHostAddress());
+ }
+ if (dnsIterator.hasNext()) {
+ mDns2View.setText(dnsIterator.next().getHostAddress());
}
}
} else {
@@ -507,7 +568,7 @@ public class WifiConfigController implements TextWatcher,
mProxyExclusionListView = (TextView) mView.findViewById(R.id.proxy_exclusionlist);
}
if (config != null) {
- ProxyProperties proxyProperties = config.proxyProperties;
+ ProxyProperties proxyProperties = config.linkProperties.getHttpProxy();
if (proxyProperties != null) {
InetSocketAddress sockAddr = proxyProperties.getSocketAddress();
if (sockAddr != null) {
@@ -602,29 +663,4 @@ public class WifiConfigController implements TextWatcher,
@Override
public void onNothingSelected(AdapterView> parent) {
}
-
- /* TODO: should go away when we move to IPv6 based config storage */
- private static int stringToIpAddr(String addrString) throws UnknownHostException {
- try {
- String[] parts = addrString.split("\\.");
- if (parts.length != 4) {
- throw new UnknownHostException(addrString);
- }
-
- int a = Integer.parseInt(parts[0]);
- int b = Integer.parseInt(parts[1]) << 8;
- int c = Integer.parseInt(parts[2]) << 16;
- int d = Integer.parseInt(parts[3]) << 24;
-
- return a | b | c | d;
- } catch (NumberFormatException e) {
- throw new UnknownHostException(addrString);
- }
- }
-
- private static String intToIpString(int i) {
- return (i & 0xFF) + "." + ((i >> 8 ) & 0xFF) + "." +((i >> 16 ) & 0xFF) + "." +
- ((i >> 24 ) & 0xFF);
- }
-
}