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