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