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