Home | History | Annotate | Download | only in wifi
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.settings.wifi;
     18 
     19 import com.android.settings.R;
     20 
     21 import android.app.AlertDialog;
     22 import android.content.Context;
     23 import android.content.DialogInterface;
     24 import android.net.wifi.WifiConfiguration;
     25 import android.net.wifi.WifiConfiguration.AuthAlgorithm;
     26 import android.net.wifi.WifiConfiguration.KeyMgmt;
     27 import android.os.Bundle;
     28 import android.text.Editable;
     29 import android.text.InputType;
     30 import android.text.TextWatcher;
     31 import android.util.Log;
     32 import android.view.View;
     33 import android.view.ViewGroup;
     34 import android.widget.AdapterView;
     35 import android.widget.ArrayAdapter;
     36 import android.widget.CheckBox;
     37 import android.widget.EditText;
     38 import android.widget.Spinner;
     39 import android.widget.TextView;
     40 
     41 /**
     42  * Dialog to configure the SSID and security settings
     43  * for Access Point operation
     44  */
     45 class WifiApDialog extends AlertDialog implements View.OnClickListener,
     46         TextWatcher, AdapterView.OnItemSelectedListener {
     47 
     48     static final int BUTTON_SUBMIT = DialogInterface.BUTTON_POSITIVE;
     49 
     50     private final DialogInterface.OnClickListener mListener;
     51 
     52     private static final int OPEN_INDEX = 0;
     53     private static final int WPA_INDEX = 1;
     54 
     55     private View mView;
     56     private TextView mSsid;
     57     private int mSecurityType = AccessPoint.SECURITY_NONE;
     58     private EditText mPassword;
     59 
     60     WifiConfiguration mWifiConfig;
     61 
     62     public WifiApDialog(Context context, DialogInterface.OnClickListener listener,
     63             WifiConfiguration wifiConfig) {
     64         super(context);
     65         mListener = listener;
     66         mWifiConfig = wifiConfig;
     67         if (wifiConfig != null)
     68           mSecurityType = AccessPoint.getSecurity(wifiConfig);
     69     }
     70 
     71     public WifiConfiguration getConfig() {
     72 
     73         WifiConfiguration config = new WifiConfiguration();
     74 
     75         /**
     76          * TODO: SSID in WifiConfiguration for soft ap
     77          * is being stored as a raw string without quotes.
     78          * This is not the case on the client side. We need to
     79          * make things consistent and clean it up
     80          */
     81         config.SSID = mSsid.getText().toString();
     82 
     83         switch (mSecurityType) {
     84             case AccessPoint.SECURITY_NONE:
     85                 config.allowedKeyManagement.set(KeyMgmt.NONE);
     86                 return config;
     87 
     88             case AccessPoint.SECURITY_PSK:
     89                 config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
     90                 config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
     91                 if (mPassword.length() != 0) {
     92                     String password = mPassword.getText().toString();
     93                     config.preSharedKey = password;
     94                 }
     95                 return config;
     96         }
     97         return null;
     98     }
     99 
    100     protected void onCreate(Bundle savedInstanceState) {
    101 
    102         mView = getLayoutInflater().inflate(R.layout.wifi_ap_dialog, null);
    103         Spinner mSecurity = ((Spinner) mView.findViewById(R.id.security));
    104 
    105         setView(mView);
    106         setInverseBackgroundForced(true);
    107 
    108         Context context = getContext();
    109 
    110         setTitle(R.string.wifi_tether_configure_ap_text);
    111         mView.findViewById(R.id.type).setVisibility(View.VISIBLE);
    112         mSsid = (TextView) mView.findViewById(R.id.ssid);
    113         mPassword = (EditText) mView.findViewById(R.id.password);
    114 
    115         setButton(BUTTON_SUBMIT, context.getString(R.string.wifi_save), mListener);
    116         setButton(DialogInterface.BUTTON_NEGATIVE,
    117         context.getString(R.string.wifi_cancel), mListener);
    118 
    119         if (mWifiConfig != null) {
    120             mSsid.setText(mWifiConfig.SSID);
    121             switch (mSecurityType) {
    122               case AccessPoint.SECURITY_NONE:
    123                   mSecurity.setSelection(OPEN_INDEX);
    124                   break;
    125               case AccessPoint.SECURITY_PSK:
    126                   String str = mWifiConfig.preSharedKey;
    127                   mPassword.setText(str);
    128                   mSecurity.setSelection(WPA_INDEX);
    129                   break;
    130             }
    131         }
    132 
    133         mSsid.addTextChangedListener(this);
    134         mPassword.addTextChangedListener(this);
    135         ((CheckBox) mView.findViewById(R.id.show_password)).setOnClickListener(this);
    136         mSecurity.setOnItemSelectedListener(this);
    137 
    138         super.onCreate(savedInstanceState);
    139 
    140         showSecurityFields();
    141         validate();
    142     }
    143 
    144     private void validate() {
    145         if ((mSsid != null && mSsid.length() == 0) ||
    146                    (mSecurityType == AccessPoint.SECURITY_PSK && mPassword.length() < 8)) {
    147             getButton(BUTTON_SUBMIT).setEnabled(false);
    148         } else {
    149             getButton(BUTTON_SUBMIT).setEnabled(true);
    150         }
    151     }
    152 
    153     public void onClick(View view) {
    154         mPassword.setInputType(
    155                 InputType.TYPE_CLASS_TEXT | (((CheckBox) view).isChecked() ?
    156                 InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD :
    157                 InputType.TYPE_TEXT_VARIATION_PASSWORD));
    158     }
    159 
    160     public void onTextChanged(CharSequence s, int start, int before, int count) {
    161     }
    162 
    163     public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    164     }
    165 
    166     public void afterTextChanged(Editable editable) {
    167         validate();
    168     }
    169 
    170     public void onItemSelected(AdapterView parent, View view, int position, long id) {
    171         if(position == OPEN_INDEX)
    172             mSecurityType = AccessPoint.SECURITY_NONE;
    173         else
    174             mSecurityType = AccessPoint.SECURITY_PSK;
    175         showSecurityFields();
    176         validate();
    177     }
    178 
    179     public void onNothingSelected(AdapterView parent) {
    180     }
    181 
    182     private void showSecurityFields() {
    183         if (mSecurityType == AccessPoint.SECURITY_NONE) {
    184             mView.findViewById(R.id.fields).setVisibility(View.GONE);
    185             return;
    186         }
    187         mView.findViewById(R.id.fields).setVisibility(View.VISIBLE);
    188     }
    189 }
    190