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}