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