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        int networkId = wifiManager.addNetwork(mCurrentWifiConfiguration);
86
87        if (networkId < 0) {
88            showFailToast();
89        } else {
90
91            wifiManager.connect(networkId,
92                    new WifiManager.ActionListener() {
93                        @Override
94                        public void onSuccess() {
95                            Toast.makeText(ConfirmConnectToWifiNetworkActivity.this,
96                                    R.string.status_wifi_connected, Toast.LENGTH_SHORT).show();
97                        }
98
99                        @Override
100                        public void onFailure(int reason) {
101                            showFailToast();
102                        }
103                    });
104        }
105        finish();
106    }
107
108
109    private void showFailToast() {
110        Toast.makeText(ConfirmConnectToWifiNetworkActivity.this,
111                R.string.status_unable_to_connect, Toast.LENGTH_SHORT).show();
112    }
113
114    @Override
115    public void onDismiss(DialogInterface dialog) {
116        if (!mEnableWifiInProgress) {
117            finish();
118        }
119    }
120
121
122    @Override
123    protected void onDestroy() {
124        ConfirmConnectToWifiNetworkActivity.this.unregisterReceiver(mBroadcastReceiver);
125        super.onDestroy();
126    }
127
128    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
129        @Override
130        public void onReceive(Context context, Intent intent) {
131            String action = intent.getAction();
132            if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
133                int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
134                if (mCurrentWifiConfiguration != null
135                        && wifiState == WifiManager.WIFI_STATE_ENABLED) {
136                    if (getAndClearEnableWifiInProgress()) {
137                        doConnect(
138                                (WifiManager) ConfirmConnectToWifiNetworkActivity.this
139                                        .getSystemService(Context.WIFI_SERVICE));
140                    }
141                }
142            }
143        }
144    };
145
146    private boolean getAndClearEnableWifiInProgress() {
147        boolean enableWifiInProgress;
148
149        synchronized (this)  {
150            enableWifiInProgress = mEnableWifiInProgress;
151            mEnableWifiInProgress = false;
152        }
153
154        return enableWifiInProgress;
155    }
156}
157