Home | History | Annotate | Download | only in nfc
      1 package com.android.nfc;
      2 
      3 import android.app.Activity;
      4 import android.app.AlertDialog;
      5 import android.content.BroadcastReceiver;
      6 import android.content.Context;
      7 import android.content.DialogInterface;
      8 import android.content.Intent;
      9 import android.content.IntentFilter;
     10 import android.net.wifi.WifiConfiguration;
     11 import android.net.wifi.WifiManager;
     12 import android.os.Bundle;
     13 import android.os.Handler;
     14 import android.view.View;
     15 import android.widget.Toast;
     16 
     17 public class ConfirmConnectToWifiNetworkActivity extends Activity
     18         implements View.OnClickListener, DialogInterface.OnDismissListener {
     19 
     20     public static final int ENABLE_WIFI_TIMEOUT_MILLIS = 5000;
     21     private WifiConfiguration mCurrentWifiConfiguration;
     22     private AlertDialog mAlertDialog;
     23     private boolean mEnableWifiInProgress;
     24     private Handler mHandler;
     25 
     26     @Override
     27     protected void onCreate(Bundle savedInstanceState) {
     28 
     29         Intent intent = getIntent();
     30         mCurrentWifiConfiguration =
     31                 intent.getParcelableExtra(NfcWifiProtectedSetup.EXTRA_WIFI_CONFIG);
     32 
     33         String printableSsid = mCurrentWifiConfiguration.getPrintableSsid();
     34         mAlertDialog = new AlertDialog.Builder(this,  AlertDialog.THEME_DEVICE_DEFAULT_LIGHT)
     35                 .setTitle(R.string.title_connect_to_network)
     36                 .setMessage(
     37                         String.format(getResources().getString(R.string.prompt_connect_to_network),
     38                         printableSsid))
     39                 .setOnDismissListener(this)
     40                 .setNegativeButton(com.android.internal.R.string.cancel, null)
     41                 .setPositiveButton(R.string.wifi_connect, null)
     42                 .create();
     43 
     44         mEnableWifiInProgress = false;
     45         mHandler = new Handler();
     46 
     47         IntentFilter intentFilter = new IntentFilter();
     48         intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
     49         registerReceiver(mBroadcastReceiver, intentFilter);
     50 
     51         mAlertDialog.show();
     52 
     53         super.onCreate(savedInstanceState);
     54 
     55         mAlertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(this);
     56     }
     57 
     58 
     59     @Override
     60     public void onClick(View v) {
     61         WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
     62 
     63         if (!wifiManager.isWifiEnabled()) {
     64             wifiManager.setWifiEnabled(true);
     65             mEnableWifiInProgress = true;
     66 
     67             mHandler.postDelayed(new Runnable() {
     68                 @Override
     69                 public void run() {
     70                     if (getAndClearEnableWifiInProgress()) {
     71                         showFailToast();
     72                         ConfirmConnectToWifiNetworkActivity.this.finish();
     73                     }
     74                 }
     75             }, ENABLE_WIFI_TIMEOUT_MILLIS);
     76 
     77         } else {
     78             doConnect(wifiManager);
     79         }
     80 
     81         mAlertDialog.dismiss();
     82     }
     83 
     84     private void doConnect(WifiManager wifiManager) {
     85         mCurrentWifiConfiguration.hiddenSSID = true;
     86         int networkId = wifiManager.addNetwork(mCurrentWifiConfiguration);
     87 
     88         if (networkId < 0) {
     89             showFailToast();
     90         } else {
     91 
     92             wifiManager.connect(networkId,
     93                     new WifiManager.ActionListener() {
     94                         @Override
     95                         public void onSuccess() {
     96                             Toast.makeText(ConfirmConnectToWifiNetworkActivity.this,
     97                                     R.string.status_wifi_connected, Toast.LENGTH_SHORT).show();
     98                         }
     99 
    100                         @Override
    101                         public void onFailure(int reason) {
    102                             showFailToast();
    103                         }
    104                     });
    105         }
    106         finish();
    107     }
    108 
    109 
    110     private void showFailToast() {
    111         Toast.makeText(ConfirmConnectToWifiNetworkActivity.this,
    112                 R.string.status_unable_to_connect, Toast.LENGTH_SHORT).show();
    113     }
    114 
    115     @Override
    116     public void onDismiss(DialogInterface dialog) {
    117         if (!mEnableWifiInProgress) {
    118             finish();
    119         }
    120     }
    121 
    122 
    123     @Override
    124     protected void onDestroy() {
    125         mAlertDialog.dismiss();
    126         ConfirmConnectToWifiNetworkActivity.this.unregisterReceiver(mBroadcastReceiver);
    127         super.onDestroy();
    128     }
    129 
    130     private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    131         @Override
    132         public void onReceive(Context context, Intent intent) {
    133             String action = intent.getAction();
    134             if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
    135                 int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
    136                 if (mCurrentWifiConfiguration != null
    137                         && wifiState == WifiManager.WIFI_STATE_ENABLED) {
    138                     if (getAndClearEnableWifiInProgress()) {
    139                         doConnect(
    140                                 (WifiManager) ConfirmConnectToWifiNetworkActivity.this
    141                                         .getSystemService(Context.WIFI_SERVICE));
    142                     }
    143                 }
    144             }
    145         }
    146     };
    147 
    148     private boolean getAndClearEnableWifiInProgress() {
    149         boolean enableWifiInProgress;
    150 
    151         synchronized (this)  {
    152             enableWifiInProgress = mEnableWifiInProgress;
    153             mEnableWifiInProgress = false;
    154         }
    155 
    156         return enableWifiInProgress;
    157     }
    158 }
    159