Home | History | Annotate | Download | only in wifi
      1 /*
      2  * Copyright (C) 2012 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 package com.android.settings.wifi;
     17 
     18 import android.app.AlertDialog;
     19 import android.content.BroadcastReceiver;
     20 import android.content.Context;
     21 import android.content.Intent;
     22 import android.content.IntentFilter;
     23 import android.net.NetworkInfo;
     24 import android.net.NetworkInfo.DetailedState;
     25 import android.net.wifi.WifiInfo;
     26 import android.net.wifi.WifiManager;
     27 import android.net.wifi.WpsInfo;
     28 import android.os.Bundle;
     29 import android.os.Handler;
     30 import android.os.Message;
     31 import android.view.View;
     32 import android.widget.Button;
     33 import android.widget.ProgressBar;
     34 import android.widget.TextView;
     35 
     36 import java.util.Timer;
     37 import java.util.TimerTask;
     38 
     39 import com.android.settings.R;
     40 
     41 
     42 /**
     43  * Dialog to show WPS progress.
     44  */
     45 public class WpsDialog extends AlertDialog {
     46 
     47     private final static String TAG = "WpsDialog";
     48 
     49     private View mView;
     50     private TextView mTextView;
     51     private ProgressBar mTimeoutBar;
     52     private ProgressBar mProgressBar;
     53     private Button mButton;
     54     private Timer mTimer;
     55 
     56     private static final int WPS_TIMEOUT_S = 120;
     57 
     58     private WifiManager mWifiManager;
     59     private WifiManager.WpsListener mWpsListener;
     60     private int mWpsSetup;
     61 
     62     private final IntentFilter mFilter;
     63     private BroadcastReceiver mReceiver;
     64 
     65     private Context mContext;
     66     private Handler mHandler = new Handler();
     67 
     68     private enum DialogState {
     69         WPS_INIT,
     70         WPS_START,
     71         WPS_COMPLETE,
     72         CONNECTED, //WPS + IP config is done
     73         WPS_FAILED
     74     }
     75     DialogState mDialogState = DialogState.WPS_INIT;
     76 
     77     public WpsDialog(Context context, int wpsSetup) {
     78         super(context);
     79         mContext = context;
     80         mWpsSetup = wpsSetup;
     81 
     82         class WpsListener implements WifiManager.WpsListener {
     83             public void onStartSuccess(String pin) {
     84                 if (pin != null) {
     85                     updateDialog(DialogState.WPS_START, String.format(
     86                             mContext.getString(R.string.wifi_wps_onstart_pin), pin));
     87                 } else {
     88                     updateDialog(DialogState.WPS_START, mContext.getString(
     89                             R.string.wifi_wps_onstart_pbc));
     90                 }
     91             }
     92             public void onCompletion() {
     93                 updateDialog(DialogState.WPS_COMPLETE,
     94                         mContext.getString(R.string.wifi_wps_complete));
     95             }
     96 
     97             public void onFailure(int reason) {
     98                 String msg;
     99                 switch (reason) {
    100                     case WifiManager.WPS_OVERLAP_ERROR:
    101                         msg = mContext.getString(R.string.wifi_wps_failed_overlap);
    102                         break;
    103                     case WifiManager.WPS_WEP_PROHIBITED:
    104                         msg = mContext.getString(R.string.wifi_wps_failed_wep);
    105                         break;
    106                     case WifiManager.WPS_TKIP_ONLY_PROHIBITED:
    107                         msg = mContext.getString(R.string.wifi_wps_failed_tkip);
    108                         break;
    109                     case WifiManager.IN_PROGRESS:
    110                         msg = mContext.getString(R.string.wifi_wps_in_progress);
    111                         break;
    112                     default:
    113                         msg = mContext.getString(R.string.wifi_wps_failed_generic);
    114                         break;
    115                 }
    116                 updateDialog(DialogState.WPS_FAILED, msg);
    117             }
    118         }
    119 
    120         mWpsListener = new WpsListener();
    121 
    122 
    123         mFilter = new IntentFilter();
    124         mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
    125         mReceiver = new BroadcastReceiver() {
    126             @Override
    127             public void onReceive(Context context, Intent intent) {
    128                 handleEvent(context, intent);
    129             }
    130         };
    131     }
    132 
    133     @Override
    134     protected void onCreate(Bundle savedInstanceState) {
    135         mView = getLayoutInflater().inflate(R.layout.wifi_wps_dialog, null);
    136 
    137         mTextView = (TextView) mView.findViewById(R.id.wps_dialog_txt);
    138         mTextView.setText(R.string.wifi_wps_setup_msg);
    139 
    140         mTimeoutBar = ((ProgressBar) mView.findViewById(R.id.wps_timeout_bar));
    141         mTimeoutBar.setMax(WPS_TIMEOUT_S);
    142         mTimeoutBar.setProgress(0);
    143 
    144         mProgressBar = ((ProgressBar) mView.findViewById(R.id.wps_progress_bar));
    145         mProgressBar.setVisibility(View.GONE);
    146 
    147         mButton = ((Button) mView.findViewById(R.id.wps_dialog_btn));
    148         mButton.setText(R.string.wifi_cancel);
    149         mButton.setOnClickListener(new View.OnClickListener() {
    150             @Override
    151             public void onClick(View v) {
    152                 dismiss();
    153             }
    154         });
    155 
    156         mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
    157 
    158         setView(mView);
    159         super.onCreate(savedInstanceState);
    160     }
    161 
    162     @Override
    163     protected void onStart() {
    164         /*
    165          * increment timeout bar per second.
    166          */
    167         mTimer = new Timer(false);
    168         mTimer.schedule(new TimerTask() {
    169             @Override
    170             public void run() {
    171                 mHandler.post(new Runnable() {
    172 
    173                     @Override
    174                     public void run() {
    175                         mTimeoutBar.incrementProgressBy(1);
    176                     }
    177                 });
    178             }
    179         }, 1000, 1000);
    180 
    181         mContext.registerReceiver(mReceiver, mFilter);
    182 
    183         WpsInfo wpsConfig = new WpsInfo();
    184         wpsConfig.setup = mWpsSetup;
    185         mWifiManager.startWps(wpsConfig, mWpsListener);
    186     }
    187 
    188     @Override
    189     protected void onStop() {
    190         if (mDialogState != DialogState.WPS_COMPLETE) {
    191             mWifiManager.cancelWps(null);
    192         }
    193 
    194         if (mReceiver != null) {
    195             mContext.unregisterReceiver(mReceiver);
    196             mReceiver = null;
    197         }
    198 
    199         if (mTimer != null) {
    200             mTimer.cancel();
    201         }
    202     }
    203 
    204     private void updateDialog(final DialogState state, final String msg) {
    205         if (mDialogState.ordinal() >= state.ordinal()) {
    206             //ignore.
    207             return;
    208         }
    209         mDialogState = state;
    210 
    211         mHandler.post(new Runnable() {
    212                 @Override
    213                 public void run() {
    214                     switch(state) {
    215                         case WPS_COMPLETE:
    216                             mTimeoutBar.setVisibility(View.GONE);
    217                             mProgressBar.setVisibility(View.VISIBLE);
    218                             break;
    219                         case CONNECTED:
    220                         case WPS_FAILED:
    221                             mButton.setText(mContext.getString(R.string.dlg_ok));
    222                             mTimeoutBar.setVisibility(View.GONE);
    223                             mProgressBar.setVisibility(View.GONE);
    224                             if (mReceiver != null) {
    225                                 mContext.unregisterReceiver(mReceiver);
    226                                 mReceiver = null;
    227                             }
    228                             break;
    229                     }
    230                     mTextView.setText(msg);
    231                 }
    232             });
    233    }
    234 
    235     private void handleEvent(Context context, Intent intent) {
    236         String action = intent.getAction();
    237         if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
    238             NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
    239                     WifiManager.EXTRA_NETWORK_INFO);
    240             final NetworkInfo.DetailedState state = info.getDetailedState();
    241             if (state == DetailedState.CONNECTED &&
    242                     mDialogState == DialogState.WPS_COMPLETE) {
    243                 WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
    244                 if (wifiInfo != null) {
    245                     String msg = String.format(mContext.getString(
    246                             R.string.wifi_wps_connected), wifiInfo.getSSID());
    247                     updateDialog(DialogState.CONNECTED, msg);
    248                 }
    249             }
    250         }
    251     }
    252 
    253 }
    254