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