165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff/* 265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * Copyright (C) 2010 The Android Open Source Project 365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * 465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License"); 565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * you may not use this file except in compliance with the License. 665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * You may obtain a copy of the License at 765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * 865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * http://www.apache.org/licenses/LICENSE-2.0 965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * 1065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * Unless required by applicable law or agreed to in writing, software 1165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS, 1265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * See the License for the specific language governing permissions and 1465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * limitations under the License. 1565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff */ 1665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 1765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffpackage com.android.settings.wifi; 1865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 1965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.app.AlertDialog; 2065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.content.Context; 2165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.content.DialogInterface; 2265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.net.wifi.WifiConfiguration; 2365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.net.wifi.WifiConfiguration.AuthAlgorithm; 2465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.net.wifi.WifiConfiguration.KeyMgmt; 2565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.os.Bundle; 2665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.text.Editable; 2765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.text.InputType; 2865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.text.TextWatcher; 2965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.view.View; 3065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.widget.AdapterView; 3165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.widget.CheckBox; 3265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.widget.EditText; 3365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.widget.Spinner; 3465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriffimport android.widget.TextView; 3565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 363f1f0393f87ace0e0ea3a8bc76bdae7cb51514b1Daisuke Miyakawaimport com.android.settings.R; 373f1f0393f87ace0e0ea3a8bc76bdae7cb51514b1Daisuke Miyakawa 3865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff/** 3965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * Dialog to configure the SSID and security settings 4065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff * for Access Point operation 4165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff */ 4284a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasanipublic class WifiApDialog extends AlertDialog implements View.OnClickListener, 4365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff TextWatcher, AdapterView.OnItemSelectedListener { 4465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 4565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff static final int BUTTON_SUBMIT = DialogInterface.BUTTON_POSITIVE; 4665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 4765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff private final DialogInterface.OnClickListener mListener; 4865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 4984a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani public static final int OPEN_INDEX = 0; 5084a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani public static final int WPA_INDEX = 1; 5184a042c6e9ff80d9ddb7b446b0507f6f576bc128Amith Yamasani public static final int WPA2_INDEX = 2; 5247ebb7895457160c88592248a2e9049c14e2b625Irfan Sheriff 5365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff private View mView; 5465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff private TextView mSsid; 55c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff private int mSecurityTypeIndex = OPEN_INDEX; 5665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff private EditText mPassword; 5765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 5865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff WifiConfiguration mWifiConfig; 5965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 6065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff public WifiApDialog(Context context, DialogInterface.OnClickListener listener, 6165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff WifiConfiguration wifiConfig) { 6265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff super(context); 6365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mListener = listener; 6465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mWifiConfig = wifiConfig; 65c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff if (wifiConfig != null) { 66c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff mSecurityTypeIndex = getSecurityTypeIndex(wifiConfig); 67c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff } 68c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff } 69c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff 70c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff public static int getSecurityTypeIndex(WifiConfiguration wifiConfig) { 71c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff if (wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) { 72c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff return WPA_INDEX; 73c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff } else if (wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA2_PSK)) { 74c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff return WPA2_INDEX; 75c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff } 76c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff return OPEN_INDEX; 7765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 7865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 7965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff public WifiConfiguration getConfig() { 8065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 8165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff WifiConfiguration config = new WifiConfiguration(); 8265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 8318dc7ea709bce68b44ed4fd6f8f65308c3b9101bIrfan Sheriff /** 8418dc7ea709bce68b44ed4fd6f8f65308c3b9101bIrfan Sheriff * TODO: SSID in WifiConfiguration for soft ap 8518dc7ea709bce68b44ed4fd6f8f65308c3b9101bIrfan Sheriff * is being stored as a raw string without quotes. 8618dc7ea709bce68b44ed4fd6f8f65308c3b9101bIrfan Sheriff * This is not the case on the client side. We need to 8718dc7ea709bce68b44ed4fd6f8f65308c3b9101bIrfan Sheriff * make things consistent and clean it up 8818dc7ea709bce68b44ed4fd6f8f65308c3b9101bIrfan Sheriff */ 89f3373c99493878f4689a9d4865323c18a2065c3bIrfan Sheriff config.SSID = mSsid.getText().toString(); 9065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 91c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff switch (mSecurityTypeIndex) { 92c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff case OPEN_INDEX: 9365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff config.allowedKeyManagement.set(KeyMgmt.NONE); 9465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff return config; 9565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 96c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff case WPA_INDEX: 9765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); 9865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 9965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff if (mPassword.length() != 0) { 10065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff String password = mPassword.getText().toString(); 101f3373c99493878f4689a9d4865323c18a2065c3bIrfan Sheriff config.preSharedKey = password; 10265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 10365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff return config; 104c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff 105c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff case WPA2_INDEX: 106c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK); 107c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 108c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff if (mPassword.length() != 0) { 109c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff String password = mPassword.getText().toString(); 110c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff config.preSharedKey = password; 111c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff } 112c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff return config; 11365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 11465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff return null; 11565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 11665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 1173f1f0393f87ace0e0ea3a8bc76bdae7cb51514b1Daisuke Miyakawa @Override 11865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff protected void onCreate(Bundle savedInstanceState) { 11965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 12065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mView = getLayoutInflater().inflate(R.layout.wifi_ap_dialog, null); 121cc2ee7fcc6d1b60724d64f85dd3cd8735dc76e79Adam Powell Spinner mSecurity = ((Spinner) mView.findViewById(R.id.security)); 12265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 12365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff setView(mView); 12465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff setInverseBackgroundForced(true); 12565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 12665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff Context context = getContext(); 12765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 1282ae37e8ce0a95f4255ff08c96f610a80430c3d12Irfan Sheriff setTitle(R.string.wifi_tether_configure_ap_text); 12965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mView.findViewById(R.id.type).setVisibility(View.VISIBLE); 13065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mSsid = (TextView) mView.findViewById(R.id.ssid); 13165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mPassword = (EditText) mView.findViewById(R.id.password); 13265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 13365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff setButton(BUTTON_SUBMIT, context.getString(R.string.wifi_save), mListener); 13465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff setButton(DialogInterface.BUTTON_NEGATIVE, 13565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff context.getString(R.string.wifi_cancel), mListener); 13665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 13765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff if (mWifiConfig != null) { 13818dc7ea709bce68b44ed4fd6f8f65308c3b9101bIrfan Sheriff mSsid.setText(mWifiConfig.SSID); 139c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff mSecurity.setSelection(mSecurityTypeIndex); 140c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff if (mSecurityTypeIndex == WPA_INDEX || 141c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff mSecurityTypeIndex == WPA2_INDEX) { 142c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff mPassword.setText(mWifiConfig.preSharedKey); 14365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 14465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 14565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 14665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mSsid.addTextChangedListener(this); 14765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mPassword.addTextChangedListener(this); 14865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff ((CheckBox) mView.findViewById(R.id.show_password)).setOnClickListener(this); 14965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mSecurity.setOnItemSelectedListener(this); 15065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 15165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff super.onCreate(savedInstanceState); 15265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 15365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff showSecurityFields(); 15465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff validate(); 15565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 15665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 15765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff private void validate() { 15865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff if ((mSsid != null && mSsid.length() == 0) || 159c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff (((mSecurityTypeIndex == WPA_INDEX) || (mSecurityTypeIndex == WPA2_INDEX))&& 160c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff mPassword.length() < 8)) { 16165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff getButton(BUTTON_SUBMIT).setEnabled(false); 16265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } else { 16365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff getButton(BUTTON_SUBMIT).setEnabled(true); 16465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 16565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 16665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 16765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff public void onClick(View view) { 16865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mPassword.setInputType( 16965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff InputType.TYPE_CLASS_TEXT | (((CheckBox) view).isChecked() ? 17065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : 17165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff InputType.TYPE_TEXT_VARIATION_PASSWORD)); 17265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 17365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 17465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff public void onTextChanged(CharSequence s, int start, int before, int count) { 17565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 17665cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 17765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff public void beforeTextChanged(CharSequence s, int start, int count, int after) { 17865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 17965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 18065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff public void afterTextChanged(Editable editable) { 18165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff validate(); 18265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 18365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 1843f1f0393f87ace0e0ea3a8bc76bdae7cb51514b1Daisuke Miyakawa @Override 1853f1f0393f87ace0e0ea3a8bc76bdae7cb51514b1Daisuke Miyakawa public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 186c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff mSecurityTypeIndex = position; 18765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff showSecurityFields(); 18865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff validate(); 18965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 19065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 1913f1f0393f87ace0e0ea3a8bc76bdae7cb51514b1Daisuke Miyakawa @Override 1923f1f0393f87ace0e0ea3a8bc76bdae7cb51514b1Daisuke Miyakawa public void onNothingSelected(AdapterView<?> parent) { 19365cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 19465cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff 19565cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff private void showSecurityFields() { 196c1a322854d3de2f65adf3231d6919a13728d4862Irfan Sheriff if (mSecurityTypeIndex == OPEN_INDEX) { 19765cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mView.findViewById(R.id.fields).setVisibility(View.GONE); 19865cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff return; 19965cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 20065cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff mView.findViewById(R.id.fields).setVisibility(View.VISIBLE); 20165cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff } 20265cff177222560f43b7da367c45ec425e86e9eecIrfan Sheriff} 203