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