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 ConfirmConnectToWifiNetworkActivity.this.unregisterReceiver(mBroadcastReceiver); 126 super.onDestroy(); 127 } 128 129 private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 130 @Override 131 public void onReceive(Context context, Intent intent) { 132 String action = intent.getAction(); 133 if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { 134 int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0); 135 if (mCurrentWifiConfiguration != null 136 && wifiState == WifiManager.WIFI_STATE_ENABLED) { 137 if (getAndClearEnableWifiInProgress()) { 138 doConnect( 139 (WifiManager) ConfirmConnectToWifiNetworkActivity.this 140 .getSystemService(Context.WIFI_SERVICE)); 141 } 142 } 143 } 144 } 145 }; 146 147 private boolean getAndClearEnableWifiInProgress() { 148 boolean enableWifiInProgress; 149 150 synchronized (this) { 151 enableWifiInProgress = mEnableWifiInProgress; 152 mEnableWifiInProgress = false; 153 } 154 155 return enableWifiInProgress; 156 } 157 } 158