WifiConfigController.java revision 9b7edb16d1309dae9b71770d4f44275646b144e4
1d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/*
2d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Copyright (C) 2010 The Android Open Source Project
3d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
4d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
5d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * you may not use this file except in compliance with the License.
6d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * You may obtain a copy of the License at
7d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
8d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
9d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa *
10d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
11d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
12d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * See the License for the specific language governing permissions and
14d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * limitations under the License.
15d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
16d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
17d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawapackage com.android.settings.wifi;
18d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
19d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.content.Context;
20d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.content.DialogInterface;
21d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.content.res.Resources;
22f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriffimport android.net.DhcpInfo;
23d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.net.NetworkInfo.DetailedState;
24d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.net.wifi.WifiConfiguration;
25f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriffimport android.net.wifi.WifiConfiguration.IpAssignment;
26d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.net.wifi.WifiConfiguration.AuthAlgorithm;
27d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.net.wifi.WifiConfiguration.KeyMgmt;
28d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.net.wifi.WifiInfo;
29d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.security.Credentials;
30d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.security.KeyStore;
31d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.text.Editable;
32d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.text.InputType;
33d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.text.TextWatcher;
34d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.text.format.Formatter;
35d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.view.View;
36d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.view.ViewGroup;
37d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.AdapterView;
38d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.ArrayAdapter;
39d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.CheckBox;
40d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.Spinner;
41d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport android.widget.TextView;
42f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriffimport android.widget.Toast;
43d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
44d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawaimport com.android.settings.R;
45f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriffimport java.net.UnknownHostException;
46d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
47d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa/**
48d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * The class for allowing UIs like {@link WifiDialog} and {@link WifiConfigPreference} to
49d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa * share the logic for controlling buttons, text fields, etc.
50d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa */
51d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawapublic class WifiConfigController implements TextWatcher,
52d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        View.OnClickListener, AdapterView.OnItemSelectedListener {
53d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private static final String KEYSTORE_SPACE = "keystore://";
54d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
55d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private final WifiConfigUiBase mConfigUi;
56d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private final View mView;
57d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private final AccessPoint mAccessPoint;
58d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
59d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private boolean mEdit;
60d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
61f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private TextView mSsidView;
62d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
63d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    // e.g. AccessPoint.SECURITY_NONE
64f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private int mAccessPointSecurity;
65d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private TextView mPasswordView;
66d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
67f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private Spinner mSecuritySpinner;
68f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private Spinner mEapMethodSpinner;
69f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private Spinner mEapCaCertSpinner;
70f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private Spinner mPhase2Spinner;
71f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private Spinner mEapUserCertSpinner;
72f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private TextView mEapIdentityView;
73f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private TextView mEapAnonymousView;
74f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
75f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private static final String STATIC_IP = "Static";
76f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private Spinner mIpSettingsSpinner;
77f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private TextView mIpAddressView;
78f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private TextView mGatewayView;
79f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private TextView mNetmaskView;
80f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private TextView mDns1View;
81f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private TextView mDns2View;
82d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
83d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    static boolean requireKeyStore(WifiConfiguration config) {
84d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        String values[] = {config.ca_cert.value(), config.client_cert.value(),
85d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                config.private_key.value()};
86d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        for (String value : values) {
87d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (value != null && value.startsWith(KEYSTORE_SPACE)) {
88d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                return true;
89d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
90d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
91d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        return false;
92d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
93d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
94d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public WifiConfigController(WifiConfigUiBase parent, View view, AccessPoint accessPoint,
95d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            boolean edit, DialogInterface.OnClickListener listener) {
96d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mConfigUi = parent;
97d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
98d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mView = view;
99d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mAccessPoint = accessPoint;
100f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        mAccessPointSecurity = (accessPoint == null) ? AccessPoint.SECURITY_NONE :
101f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                accessPoint.security;
102d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mEdit = edit;
103d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
104d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final Context context = mConfigUi.getContext();
105d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final Resources resources = context.getResources();
106d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
107d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mAccessPoint == null) {
108d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mConfigUi.setTitle(R.string.wifi_add_network);
109d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mView.findViewById(R.id.type).setVisibility(View.VISIBLE);
110f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mSsidView = (TextView) mView.findViewById(R.id.ssid);
111f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mSsidView.addTextChangedListener(this);
112f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mSecuritySpinner = ((Spinner) mView.findViewById(R.id.security));
113f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mSecuritySpinner.setOnItemSelectedListener(this);
114d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mConfigUi.setSubmitButton(context.getString(R.string.wifi_save));
115d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else {
116d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mConfigUi.setTitle(mAccessPoint.ssid);
117d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            ViewGroup group = (ViewGroup) mView.findViewById(R.id.info);
118d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
119d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            DetailedState state = mAccessPoint.getState();
120d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (state != null) {
121d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                addRow(group, R.string.wifi_status, Summary.get(mConfigUi.getContext(), state));
122d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
123d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
124d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            String[] type = resources.getStringArray(R.array.wifi_security);
125d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            addRow(group, R.string.wifi_security, type[mAccessPoint.security]);
126d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
127d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            int level = mAccessPoint.getLevel();
128d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (level != -1) {
129d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                String[] signal = resources.getStringArray(R.array.wifi_signal);
130d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                addRow(group, R.string.wifi_signal, signal[level]);
131d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
132d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
133d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            WifiInfo info = mAccessPoint.getInfo();
134d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (info != null) {
135d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                addRow(group, R.string.wifi_speed, info.getLinkSpeed() + WifiInfo.LINK_SPEED_UNITS);
136d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                // TODO: fix the ip address for IPv6.
137d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                int address = info.getIpAddress();
138d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (address != 0) {
139d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    addRow(group, R.string.wifi_ip_address, Formatter.formatIpAddress(address));
140d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
141d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
142d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
143d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (mAccessPoint.networkId == -1 || mEdit) {
144d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                showSecurityFields();
145f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                showIpConfigFields();
146d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
147d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
148d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (mEdit) {
149d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mConfigUi.setSubmitButton(context.getString(R.string.wifi_save));
150d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            } else {
151d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (state == null && level != -1) {
152d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    mConfigUi.setSubmitButton(context.getString(R.string.wifi_connect));
153f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                } else {
154f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    mView.findViewById(R.id.ipfields).setVisibility(View.GONE);
155d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
156d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mAccessPoint.networkId != -1) {
157d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    mConfigUi.setForgetButton(context.getString(R.string.wifi_forget));
158d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
159d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
160d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
161d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
162f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        mIpSettingsSpinner = ((Spinner) mView.findViewById(R.id.ipsettings));
163f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        if (mAccessPoint != null && mAccessPoint.networkId != -1) {
164f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            WifiConfiguration config = mAccessPoint.getConfig();
165f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            if (config.ipAssignment == IpAssignment.STATIC) {
166f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                setSelection(mIpSettingsSpinner, STATIC_IP);
167f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            }
168f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        }
169f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        mIpSettingsSpinner.setOnItemSelectedListener(this);
170f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
171d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mConfigUi.setCancelButton(context.getString(R.string.wifi_cancel));
172d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mConfigUi.getSubmitButton() != null) {
173d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            enableSubmitIfAppropriate();
174d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
175d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
176d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
177d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private void addRow(ViewGroup group, int name, String value) {
178d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        View row = mConfigUi.getLayoutInflater().inflate(R.layout.wifi_dialog_row, group, false);
179d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        ((TextView) row.findViewById(R.id.name)).setText(name);
180d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        ((TextView) row.findViewById(R.id.value)).setText(value);
181d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        group.addView(row);
182d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
183d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
184f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    /* show submit button if the password is valid */
185d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private void enableSubmitIfAppropriate() {
186f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        if ((mSsidView != null && mSsidView.length() == 0) ||
187f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            ((mAccessPoint == null || mAccessPoint.networkId == -1) &&
188f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            ((mAccessPointSecurity == AccessPoint.SECURITY_WEP && mPasswordView.length() == 0) ||
189f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            (mAccessPointSecurity == AccessPoint.SECURITY_PSK && mPasswordView.length() < 8)))) {
190d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mConfigUi.getSubmitButton().setEnabled(false);
191d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else {
192d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mConfigUi.getSubmitButton().setEnabled(true);
193d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
194d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
195d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
196d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    /* package */ WifiConfiguration getConfig() {
197d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mAccessPoint != null && mAccessPoint.networkId != -1 && !mEdit) {
198d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            return null;
199d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
200d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
201d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        WifiConfiguration config = new WifiConfiguration();
202d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
203d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mAccessPoint == null) {
204d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            config.SSID = AccessPoint.convertToQuotedString(
205f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    mSsidView.getText().toString());
206d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            // If the user adds a network manually, assume that it is hidden.
207d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            config.hiddenSSID = true;
208d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else if (mAccessPoint.networkId == -1) {
209d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            config.SSID = AccessPoint.convertToQuotedString(
210d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    mAccessPoint.ssid);
211d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else {
212d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            config.networkId = mAccessPoint.networkId;
213d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
214d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
215f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        switch (mAccessPointSecurity) {
216d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case AccessPoint.SECURITY_NONE:
217d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                config.allowedKeyManagement.set(KeyMgmt.NONE);
218f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                break;
219d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
220d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case AccessPoint.SECURITY_WEP:
221d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                config.allowedKeyManagement.set(KeyMgmt.NONE);
222d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
223d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
224d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mPasswordView.length() != 0) {
225d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    int length = mPasswordView.length();
226d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    String password = mPasswordView.getText().toString();
227d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    // WEP-40, WEP-104, and 256-bit WEP (WEP-232?)
228d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    if ((length == 10 || length == 26 || length == 58) &&
229d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                            password.matches("[0-9A-Fa-f]*")) {
230d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        config.wepKeys[0] = password;
231d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    } else {
232d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        config.wepKeys[0] = '"' + password + '"';
233d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    }
234d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
235f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                break;
236d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
237d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case AccessPoint.SECURITY_PSK:
238d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
239d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mPasswordView.length() != 0) {
240d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    String password = mPasswordView.getText().toString();
241d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    if (password.matches("[0-9A-Fa-f]{64}")) {
242d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        config.preSharedKey = password;
243d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    } else {
244d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        config.preSharedKey = '"' + password + '"';
245d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    }
246d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
247f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                break;
248d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
249d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            case AccessPoint.SECURITY_EAP:
250d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
251d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
252f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.eap.setValue((String) mEapMethodSpinner.getSelectedItem());
253d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
254f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.phase2.setValue((mPhase2Spinner.getSelectedItemPosition() == 0) ? "" :
255f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                        "auth=" + mPhase2Spinner.getSelectedItem());
256f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.ca_cert.setValue((mEapCaCertSpinner.getSelectedItemPosition() == 0) ? "" :
257d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        KEYSTORE_SPACE + Credentials.CA_CERTIFICATE +
258f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                        (String) mEapCaCertSpinner.getSelectedItem());
259f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.client_cert.setValue((mEapUserCertSpinner.getSelectedItemPosition() == 0) ?
260f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                        "" : KEYSTORE_SPACE + Credentials.USER_CERTIFICATE +
261f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                        (String) mEapUserCertSpinner.getSelectedItem());
262f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.private_key.setValue((mEapUserCertSpinner.getSelectedItemPosition() == 0) ?
263f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                        "" : KEYSTORE_SPACE + Credentials.USER_PRIVATE_KEY +
264f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                        (String) mEapUserCertSpinner.getSelectedItem());
265f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.identity.setValue((mEapIdentityView.length() == 0) ? "" :
266f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                        mEapIdentityView.getText().toString());
267f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.anonymous_identity.setValue((mEapAnonymousView.length() == 0) ? "" :
268f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                        mEapAnonymousView.getText().toString());
269d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (mPasswordView.length() != 0) {
270d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    config.password.setValue(mPasswordView.getText().toString());
271d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
272f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                break;
273f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
274f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            default:
275f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    return null;
276f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        }
277f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
278f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        config.ipAssignment = mIpSettingsSpinner.getSelectedItem().toString().equals(STATIC_IP) ?
279f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                IpAssignment.STATIC : IpAssignment.DHCP;
280f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
281f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        if (config.ipAssignment == IpAssignment.STATIC) {
282f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            //TODO: A better way to do this is to not dismiss the
283f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            //dialog as long as one of the fields is invalid
284f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            try {
285f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.ipConfig.ipAddress = stringToIpAddr(mIpAddressView.getText().toString());
286f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.ipConfig.gateway = stringToIpAddr(mGatewayView.getText().toString());
287f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.ipConfig.netmask = stringToIpAddr(mNetmaskView.getText().toString());
288f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                config.ipConfig.dns1 = stringToIpAddr(mDns1View.getText().toString());
289f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                if (mDns2View.getText() != null && mDns2View.getText().length() > 0) {
290f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    config.ipConfig.dns2 = stringToIpAddr(mDns2View.getText().toString());
291f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                }
292f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            } catch (UnknownHostException e) {
293f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                Toast.makeText(mConfigUi.getContext(), R.string.wifi_ip_settings_invalid_ip,
294f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                        Toast.LENGTH_LONG).show();
295f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                return null;
296f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            }
297d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
298f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
299f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        return config;
300d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
301d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
302d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private void showSecurityFields() {
303f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        if (mAccessPointSecurity == AccessPoint.SECURITY_NONE) {
304d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mView.findViewById(R.id.fields).setVisibility(View.GONE);
305d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            return;
306d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
307d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mView.findViewById(R.id.fields).setVisibility(View.VISIBLE);
308d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
309d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (mPasswordView == null) {
310d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mPasswordView = (TextView) mView.findViewById(R.id.password);
311d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mPasswordView.addTextChangedListener(this);
312d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            ((CheckBox) mView.findViewById(R.id.show_password)).setOnClickListener(this);
313d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
314d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (mAccessPoint != null && mAccessPoint.networkId != -1) {
315d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                mPasswordView.setHint(R.string.wifi_unchanged);
316d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
317d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
318d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
319f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        if (mAccessPointSecurity != AccessPoint.SECURITY_EAP) {
320d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            mView.findViewById(R.id.eap).setVisibility(View.GONE);
321d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            return;
322d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
323d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mView.findViewById(R.id.eap).setVisibility(View.VISIBLE);
324d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
325f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        if (mEapMethodSpinner == null) {
326f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mEapMethodSpinner = (Spinner) mView.findViewById(R.id.method);
327f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mPhase2Spinner = (Spinner) mView.findViewById(R.id.phase2);
328f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mEapCaCertSpinner = (Spinner) mView.findViewById(R.id.ca_cert);
329f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mEapUserCertSpinner = (Spinner) mView.findViewById(R.id.user_cert);
330f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mEapIdentityView = (TextView) mView.findViewById(R.id.identity);
331f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mEapAnonymousView = (TextView) mView.findViewById(R.id.anonymous);
332d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
333f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            loadCertificates(mEapCaCertSpinner, Credentials.CA_CERTIFICATE);
334f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            loadCertificates(mEapUserCertSpinner, Credentials.USER_PRIVATE_KEY);
335d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
336d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            if (mAccessPoint != null && mAccessPoint.networkId != -1) {
337d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                WifiConfiguration config = mAccessPoint.getConfig();
338f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                setSelection(mEapMethodSpinner, config.eap.value());
339f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                setSelection(mPhase2Spinner, config.phase2.value());
340f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                setCertificate(mEapCaCertSpinner, Credentials.CA_CERTIFICATE,
341d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        config.ca_cert.value());
342f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                setCertificate(mEapUserCertSpinner, Credentials.USER_PRIVATE_KEY,
343d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                        config.private_key.value());
344f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                mEapIdentityView.setText(config.identity.value());
345f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                mEapAnonymousView.setText(config.anonymous_identity.value());
346d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
347d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
348d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
349d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
350f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private void showIpConfigFields() {
351f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        WifiConfiguration config = null;
352f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
353f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        mView.findViewById(R.id.ipfields).setVisibility(View.VISIBLE);
354f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
355f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        if (mIpSettingsSpinner == null) {
356f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mIpSettingsSpinner = (Spinner) mView.findViewById(R.id.ipsettings);
357f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        }
358f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
359f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        if (mAccessPoint != null && mAccessPoint.networkId != -1) {
360f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            config = mAccessPoint.getConfig();
361f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        }
362f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
363f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        if (mIpSettingsSpinner.getSelectedItem().equals(STATIC_IP)) {
364f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mView.findViewById(R.id.staticip).setVisibility(View.VISIBLE);
365f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            if (mIpAddressView == null) {
366f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                mIpAddressView = (TextView) mView.findViewById(R.id.ipaddress);
367f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                mGatewayView = (TextView) mView.findViewById(R.id.gateway);
368f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                mNetmaskView = (TextView) mView.findViewById(R.id.netmask);
369f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                mDns1View = (TextView) mView.findViewById(R.id.dns1);
370f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                mDns2View = (TextView) mView.findViewById(R.id.dns2);
371f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            }
372f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            if (config != null) {
373f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                DhcpInfo ipConfig = config.ipConfig;
374f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                if (ipConfig != null && ipConfig.ipAddress != 0) {
375f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    mIpAddressView.setText(intToIpString(ipConfig.ipAddress));
376f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    mGatewayView.setText(intToIpString(ipConfig.gateway));
377f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    mNetmaskView.setText(intToIpString(ipConfig.netmask));
378f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    mDns1View.setText(intToIpString(ipConfig.dns1));
379f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                    mDns2View.setText(intToIpString(ipConfig.dns2));
380f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                }
381f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            }
382f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        } else {
383f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mView.findViewById(R.id.staticip).setVisibility(View.GONE);
384f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        }
385f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    }
386f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
387f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
388d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private void loadCertificates(Spinner spinner, String prefix) {
389d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final Context context = mConfigUi.getContext();
390d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final String unspecified = context.getString(R.string.wifi_unspecified);
391d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
392d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        String[] certs = KeyStore.getInstance().saw(prefix);
393d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (certs == null || certs.length == 0) {
394d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            certs = new String[] {unspecified};
395d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        } else {
396d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            final String[] array = new String[certs.length + 1];
397d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            array[0] = unspecified;
398d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            System.arraycopy(certs, 0, array, 1, certs.length);
399d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            certs = array;
400d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
401d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
402d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
403d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                context, android.R.layout.simple_spinner_item, certs);
404d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
405d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        spinner.setAdapter(adapter);
406d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
407d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
408d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private void setCertificate(Spinner spinner, String prefix, String cert) {
409d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        prefix = KEYSTORE_SPACE + prefix;
410d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (cert != null && cert.startsWith(prefix)) {
411d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            setSelection(spinner, cert.substring(prefix.length()));
412d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
413d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
414d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
415d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    private void setSelection(Spinner spinner, String value) {
416d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        if (value != null) {
417d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinner.getAdapter();
418d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            for (int i = adapter.getCount() - 1; i >= 0; --i) {
419d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                if (value.equals(adapter.getItem(i))) {
420d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    spinner.setSelection(i);
421d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                    break;
422d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                }
423d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa            }
424d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        }
425d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
426d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
427d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
428d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void afterTextChanged(Editable s) {
429d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        enableSubmitIfAppropriate();
430d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
431d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
432d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
433d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
434d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
435d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
436d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
437d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onTextChanged(CharSequence s, int start, int before, int count) {
438d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
439d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
440d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
441d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onClick(View view) {
442d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa        mPasswordView.setInputType(
443d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                InputType.TYPE_CLASS_TEXT | (((CheckBox) view).isChecked() ?
444d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD :
445d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa                InputType.TYPE_TEXT_VARIATION_PASSWORD));
446d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
447d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
448d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
449d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
4509b7edb16d1309dae9b71770d4f44275646b144e4Irfan Sheriff        if (parent == mSecuritySpinner) {
451f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            mAccessPointSecurity = position;
452f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            showSecurityFields();
453f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            enableSubmitIfAppropriate();
454f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        } else {
455f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            showIpConfigFields();
456f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        }
457d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
458d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa
459d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    @Override
460d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    public void onNothingSelected(AdapterView<?> parent) {
461d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa    }
462f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
463f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    /* TODO: should go away when we move to IPv6 based config storage */
464f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private static int stringToIpAddr(String addrString) throws UnknownHostException {
465f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        try {
466f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            String[] parts = addrString.split("\\.");
467f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            if (parts.length != 4) {
468f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff                throw new UnknownHostException(addrString);
469f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            }
470f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
471f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            int a = Integer.parseInt(parts[0]);
472f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            int b = Integer.parseInt(parts[1]) << 8;
473f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            int c = Integer.parseInt(parts[2]) << 16;
474f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            int d = Integer.parseInt(parts[3]) << 24;
475f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
476f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            return a | b | c | d;
477f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        } catch (NumberFormatException e) {
478f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            throw new UnknownHostException(addrString);
479f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        }
480f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    }
481f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
482f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    private static String intToIpString(int i) {
483f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff        return (i & 0xFF) + "." + ((i >>  8 ) & 0xFF) + "." +((i >> 16 ) & 0xFF) + "." +
484f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff            ((i >> 24 ) & 0xFF);
485f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff    }
486f027ce5e0223799f98f6d297b40ab57c8a7a8b5cIrfan Sheriff
487d36699282cbd0a6897f425106081d3f2c0db55d4Daisuke Miyakawa}