1package com.android.nfc;
2
3import android.app.Activity;
4import android.app.AlertDialog;
5import android.content.BroadcastReceiver;
6import android.content.Context;
7import android.content.DialogInterface;
8import android.content.Intent;
9import android.content.IntentFilter;
10import android.net.wifi.WifiConfiguration;
11import android.net.wifi.WifiManager;
12import android.os.Bundle;
13import android.os.Handler;
14import android.view.View;
15import android.widget.Toast;
16
17public 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