android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
- <LinearLayout android:id="@+id/setup_fields"
- style="@style/wifi_item"
- android:visibility="gone">
-
- <TextView
- style="@style/wifi_item_label"
- android:text="@string/wifi_network_setup" />
-
- <Spinner android:id="@+id/network_setup"
- style="@style/wifi_item_content"
- android:prompt="@string/wifi_network_setup"
- android:entries="@array/wifi_network_setup" />
-
- </LinearLayout>
-
- <LinearLayout android:id="@+id/wps_fields"
- style="@style/wifi_item"
- android:visibility="gone">
-
- <TextView
- style="@style/wifi_item_label"
- android:text="@string/wifi_wps_pin" />
-
- <EditText android:id="@+id/wps_pin"
- style="@style/wifi_item_content"
- android:singleLine="true"
- android:inputType="textPassword" />
-
- </LinearLayout>
<LinearLayout android:id="@+id/proxy_settings_fields"
style="@style/wifi_item"
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="300sp"
+ android:layout_height="wrap_content">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="8dip"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/wps_dialog_txt"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip" />
+
+ <ProgressBar
+ android:id="@+id/wps_timeout_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dip"
+ style="?android:attr/progressBarStyleHorizontal" />
+
+ <ProgressBar
+ android:id="@+id/wps_progress_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dip"
+ style="?android:attr/progressBarStyle" />
+
+ <RelativeLayout
+ android:gravity="center"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:id="@+id/wps_dialog_btn"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/cancel" />
+ </RelativeLayout>
+ </LinearLayout>
+</ScrollView>
<item>GTC</item>
</string-array>
- <!-- Wi-Fi set up options -->
- <!-- Note that adding/removing/moving items will need wifi settings code change. -->
- <string-array name="wifi_network_setup">
- <!-- Manual wifi configuration [CHAR LIMIT=25]-->
- <item>Off</item>
- <!-- WPS is a new standard that allowes secure connection establishment to a home wireless network using a simplified process. WPS push button based configuration involves pushing a button on the router and the device [CHAR LIMIT=25]-->
- <item>Push button</item>
- <!-- WPS pin method based configuration. This requires entering a pin obtained from the access point [CHAR LIMIT=25] -->
- <item>PIN from access point</item>
- <!-- WPS pin method based configuration. This requires generating a pin from this device [CHAR LIMIT=25] -->
- <item>PIN from this device</item>
- </string-array>
-
<!-- Wi-Fi IP settings. -->
<!-- Note that adding/removing/moving the items will need wifi settings code change. -->
<string-array name="wifi_ip_settings">
<string name="wifi_add_network">Add network</string>
<!-- Header for the list of wifi networks-->
<string name="wifi_access_points">Wi-Fi networks</string>
+ <!-- Menu option to do WPS Push Button [CHAR LIMIT=20]-->
+ <string name="wifi_menu_wps_pbc">WPS Push Button</string>
+ <!-- Menu option to do WPS Pin Entry [CHAR LIMIT=20]-->
+ <string name="wifi_menu_wps_pin">WPS Pin Entry</string>
<!-- Menu option to scan Wi-Fi networks -->
<string name="wifi_menu_scan">Scan</string>
<!-- Menu option to Wi-Fi advanced settings -->
<!-- Dialog for Access Points --> <skip />
<!-- Label to show/hide advanced options -->
<string name="wifi_show_advanced">Show advanced options</string>
- <!-- Label for network setup [CHAR LIMIT=50] -->
- <string name="wifi_network_setup">WPS</string>
- <!-- Label for the text view for WPS pin input [CHAR LIMIT=50] -->
- <string name="wifi_wps_pin">Type PIN from access point</string>
<!-- Title for the WPS setup dialog [CHAR LIMIT=50] -->
- <string name="wifi_wps_setup_title">WPS setup</string>
- <!-- Text displayed in the WPS pin display dialog [CHAR LIMIT=75] -->
- <string name="wifi_wps_pin_output">Type the PIN <xliff:g id="wps_pin">%1$s</xliff:g> on the access point</string>
- <!-- Text displayed when WPS setup is in progress [CHAR LIMIT=75] -->
- <string name="wifi_wps_in_progress">WPS is already in progress and can take tens of seconds to complete</string>
- <!-- Text displayed when WPS fails to start [CHAR LIMIT=75] -->
- <string name="wifi_wps_failed">Couldn\'t start WPS. Try again.</string>
+ <string name="wifi_wps_setup_title">Wi-Fi Protected Setup</string>
+ <!-- Message in WPS dialog at start up [CHAR LIMIT=150] -->
+ <string name="wifi_wps_setup_msg">Starting WPS\u2026</string>
+ <!-- Message in WPS dialog for PBC after start up [CHAR LIMIT=150] -->
+ <string name="wifi_wps_onstart_pbc">Push the WPS button on your Wi-Fi router. The setup can take upto two minutes to complete.</string>
+ <!-- Message in WPS dialog for PIN after start up [CHAR LIMIT=150] -->
+ <string name="wifi_wps_onstart_pin">Enter pin <xliff:g id="pin">%1$s</xliff:g> on your Wi-Fi router. The setup can take upto two minutes to complete.</string>
+ <!-- Text displayed when WPS succeeds [CHAR LIMIT=150] -->
+ <string name="wifi_wps_complete">WPS succeeded. Connecting to the network\u2026</string>
+ <!-- Text displayed when Wi-Fi is connected through WPS [CHAR LIMIT=150] -->
+ <string name="wifi_wps_connected">Connected to Wi-Fi network <xliff:g id="network_name">%s</xliff:g></string>
+ <!-- Text displayed when WPS setup is in progress [CHAR LIMIT=150] -->
+ <string name="wifi_wps_in_progress">WPS is already in progress and can take upto two minutes to complete</string>
+ <!-- Text displayed when WPS fails to start [CHAR LIMIT=150] -->
+ <string name="wifi_wps_failed_generic">WPS failed. Please try again in a few minutes.</string>
+ <!-- Text displayed when WPS fails due to WEP [CHAR LIMIT=150] -->
+ <string name="wifi_wps_failed_wep">The wireless router security setting (WEP) is not supported</string>
+ <!-- Text displayed when WPS fails to TKIP [CHAR LIMIT=150] -->
+ <string name="wifi_wps_failed_tkip">The wireless router security setting (TKIP) is not supported</string>
+ <!-- Text displayed when WPS fails due to authentication issues [CHAR LIMIT=150] -->
+ <string name="wifi_wps_failed_auth">Authentication failure. Please try again.</string>
+ <!-- Text displayed when WPS fails due to another session [CHAR LIMIT=150] -->
+ <string name="wifi_wps_failed_overlap">Another WPS session was detected. Please try again in a few minutes.</string>
<!-- Label for the SSID of the network -->
<string name="wifi_ssid">Network SSID</string>
<!-- Label for the security of the connection -->
<!-- Summary for the remembered network but currently not in range. -->
<string name="wifi_not_in_range">Not in range</string>
<!-- Substring of status line when Wi-Fi Protected Setup (WPS) is available and
- string is listed first -->
- <string name="wifi_wps_available_first_item">Protected network available</string>
+ string is listed first [CHAR LIMIT=20]-->
+ <string name="wifi_wps_available_first_item">WPS available</string>
<!-- Substring of wifi status when Wi-Fi Protected Setup (WPS) is available and
string is listed after a wifi_secured_* string-->
<string name="wifi_wps_available_second_item">\u0020(protected network available)</string>
<!-- Button label to dismiss the dialog -->
<string name="wifi_cancel">Cancel</string>
- <!-- Errors reported on wifi settings page -->
- <!-- Toast message indicating WPS overlap detection [CHAR LIMIT=75] -->
- <string name="wifi_wps_overlap_error">Another Wi-Fi protected session was detected. Try again in a few minutes.</string>
-
<!-- Wi-Fi Advanced Settings --> <skip />
<!-- Wi-Fi settings screen, advanced, settings section. This is a header shown above advanced wifi settings. -->
<string name="wifi_advanced_titlebar">Advanced Wi-Fi</string>
import android.net.wifi.WifiConfiguration.ProxySettings;
import android.net.wifi.WifiConfiguration.Status;
import android.net.wifi.WifiInfo;
-import android.net.wifi.WpsInfo;
import android.security.Credentials;
import android.security.KeyStore;
import android.text.Editable;
private static final int DHCP = 0;
private static final int STATIC_IP = 1;
- /* These values come from "wifi_network_setup" resource array */
- public static final int MANUAL = 0;
- public static final int WPS_PBC = 1;
- public static final int WPS_KEYPAD = 2;
- public static final int WPS_DISPLAY = 3;
-
/* These values come from "wifi_proxy_settings" resource array */
public static final int PROXY_NONE = 0;
public static final int PROXY_STATIC = 1;
private static final String TAG = "WifiConfigController";
- private Spinner mNetworkSetupSpinner;
private Spinner mIpSettingsSpinner;
private TextView mIpAddressView;
private TextView mGatewayView;
}
- /* Show network setup options only for a new network */
- if (mAccessPoint.networkId == INVALID_NETWORK_ID && mAccessPoint.wpsAvailable) {
- showNetworkSetupFields();
- }
-
if (mAccessPoint.networkId == INVALID_NETWORK_ID || mEdit) {
showSecurityFields();
showIpConfigFields();
boolean enabled = false;
boolean passwordInvalid = false;
- /* Check password invalidity for manual network set up alone */
- if (chosenNetworkSetupMethod() == MANUAL &&
- ((mAccessPointSecurity == AccessPoint.SECURITY_WEP && mPasswordView.length() == 0) ||
- (mAccessPointSecurity == AccessPoint.SECURITY_PSK && mPasswordView.length() < 8))) {
+ if ((mAccessPointSecurity == AccessPoint.SECURITY_WEP && mPasswordView.length() == 0) ||
+ (mAccessPointSecurity == AccessPoint.SECURITY_PSK && mPasswordView.length() < 8)) {
passwordInvalid = true;
}
return 0;
}
- int chosenNetworkSetupMethod() {
- if (mNetworkSetupSpinner != null) {
- return mNetworkSetupSpinner.getSelectedItemPosition();
- }
- return MANUAL;
- }
-
- WpsInfo getWpsConfig() {
- WpsInfo config = new WpsInfo();
- switch (mNetworkSetupSpinner.getSelectedItemPosition()) {
- case WPS_PBC:
- config.setup = WpsInfo.PBC;
- break;
- case WPS_KEYPAD:
- config.setup = WpsInfo.KEYPAD;
- break;
- case WPS_DISPLAY:
- config.setup = WpsInfo.DISPLAY;
- break;
- default:
- config.setup = WpsInfo.INVALID;
- Log.e(TAG, "WPS not selected type");
- return config;
- }
- config.pin = ((TextView) mView.findViewById(R.id.wps_pin)).getText().toString();
- config.BSSID = (mAccessPoint != null) ? mAccessPoint.bssid : null;
- return config;
- }
-
private void showSecurityFields() {
if (mInXlSetupWizard) {
// Note: XL SetupWizard won't hide "EAP" settings here.
mView.findViewById(R.id.l_anonymous).setVisibility(View.VISIBLE);
}
}
-
- private void showNetworkSetupFields() {
- mView.findViewById(R.id.setup_fields).setVisibility(View.VISIBLE);
-
- if (mNetworkSetupSpinner == null) {
- mNetworkSetupSpinner = (Spinner) mView.findViewById(R.id.network_setup);
- mNetworkSetupSpinner.setOnItemSelectedListener(this);
- }
-
- int pos = mNetworkSetupSpinner.getSelectedItemPosition();
-
- /* Show pin text input if needed */
- if (pos == WPS_KEYPAD) {
- mView.findViewById(R.id.wps_fields).setVisibility(View.VISIBLE);
- } else {
- mView.findViewById(R.id.wps_fields).setVisibility(View.GONE);
- }
-
- /* show/hide manual security fields appropriately */
- if ((pos == WPS_DISPLAY) || (pos == WPS_KEYPAD)
- || (pos == WPS_PBC)) {
- mView.findViewById(R.id.security_fields).setVisibility(View.GONE);
- } else {
- mView.findViewById(R.id.security_fields).setVisibility(View.VISIBLE);
- }
-
- }
private void showIpConfigFields() {
WifiConfiguration config = null;
showSecurityFields();
} else if (parent == mEapMethodSpinner) {
showSecurityFields();
- } else if (parent == mNetworkSetupSpinner) {
- showNetworkSetupFields();
} else if (parent == mProxySettingsSpinner) {
showProxyFields();
} else {
import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
-import android.net.wifi.WpsResult;
+import android.net.wifi.WpsInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class WifiSettings extends SettingsPreferenceFragment
implements DialogInterface.OnClickListener {
private static final String TAG = "WifiSettings";
- private static final int MENU_ID_SCAN = Menu.FIRST;
- private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 1;
- private static final int MENU_ID_ADVANCED = Menu.FIRST + 2;
- private static final int MENU_ID_CONNECT = Menu.FIRST + 3;
- private static final int MENU_ID_FORGET = Menu.FIRST + 4;
- private static final int MENU_ID_MODIFY = Menu.FIRST + 5;
+ private static final int MENU_ID_WPS_PBC = Menu.FIRST;
+ private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
+ private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 2;
+ private static final int MENU_ID_ADVANCED = Menu.FIRST + 3;
+ private static final int MENU_ID_SCAN = Menu.FIRST + 4;
+ private static final int MENU_ID_CONNECT = Menu.FIRST + 5;
+ private static final int MENU_ID_FORGET = Menu.FIRST + 6;
+ private static final int MENU_ID_MODIFY = Menu.FIRST + 7;
private static final int WIFI_DIALOG_ID = 1;
+ private static final int WPS_PBC_DIALOG_ID = 2;
+ private static final int WPS_PIN_DIALOG_ID = 3;
// Combo scans can take 5-6s to complete - set to 10s.
private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
private WifiManager.ActionListener mConnectListener;
private WifiManager.ActionListener mSaveListener;
private WifiManager.ActionListener mForgetListener;
- private WifiManager.WpsListener mWpsListener;
+
private WifiEnabler mWifiEnabler;
// An access point being editted is stored here.
}
};
- class WpsListener implements WifiManager.WpsListener {
- public void onStartSuccess(String pin) {
- //TODO: Add progress bar instead
- if (pin != null) {
- AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity())
- .setTitle(R.string.wifi_wps_setup_title)
- .setPositiveButton(android.R.string.ok, null);
- dialog.setMessage(getResources().getString(
- R.string.wifi_wps_pin_output, pin));
- dialog.show();
- }
- }
- public void onCompletion() {
- //TODO: Dismiss progress bar
- }
- public void onFailure(int reason) {
- AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity())
- .setTitle(R.string.wifi_wps_setup_title)
- .setPositiveButton(android.R.string.ok, null);
- switch (reason) {
- case WifiManager.IN_PROGRESS:
- dialog.setMessage(R.string.wifi_wps_in_progress);
- dialog.show();
- break;
- case WifiManager.WPS_OVERLAP_ERROR:
- Toast.makeText(getActivity(), R.string.wifi_wps_overlap_error,
- Toast.LENGTH_SHORT).show();
- break;
- default:
- dialog.setMessage(R.string.wifi_wps_failed);
- dialog.show();
- break;
- }
- }
- }
-
- mWpsListener = new WpsListener();
-
if (savedInstanceState != null
&& savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE);
// We don't want menus in Setup Wizard XL.
if (!mInXlSetupWizard) {
final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
- menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
- //.setIcon(R.drawable.ic_menu_scan_network)
+ menu.add(Menu.NONE, MENU_ID_WPS_PBC, 0, R.string.wifi_menu_wps_pbc)
.setEnabled(wifiIsEnabled)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
.setEnabled(wifiIsEnabled)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)
+ //.setIcon(R.drawable.ic_menu_scan_network)
+ .setEnabled(wifiIsEnabled)
+ .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ menu.add(Menu.NONE, MENU_ID_WPS_PIN, 0, R.string.wifi_menu_wps_pin)
+ .setEnabled(wifiIsEnabled)
+ .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
//.setIcon(android.R.drawable.ic_menu_manage)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
- }
+ }
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
+ case MENU_ID_WPS_PBC:
+ showDialog(WPS_PBC_DIALOG_ID);
+ return true;
+ case MENU_ID_WPS_PIN:
+ showDialog(WPS_PIN_DIALOG_ID);
+ return true;
case MENU_ID_SCAN:
if (mWifiManager.isWifiEnabled()) {
mScanner.forceScan();
@Override
public Dialog onCreateDialog(int dialogId) {
- AccessPoint ap = mDlgAccessPoint; // For manual launch
- if (ap == null) { // For re-launch from saved state
- if (mAccessPointSavedState != null) {
- ap = new AccessPoint(getActivity(), mAccessPointSavedState);
- // For repeated orientation changes
- mDlgAccessPoint = ap;
- }
+ switch (dialogId) {
+ case WIFI_DIALOG_ID:
+ AccessPoint ap = mDlgAccessPoint; // For manual launch
+ if (ap == null) { // For re-launch from saved state
+ if (mAccessPointSavedState != null) {
+ ap = new AccessPoint(getActivity(), mAccessPointSavedState);
+ // For repeated orientation changes
+ mDlgAccessPoint = ap;
+ }
+ }
+ // If it's still null, fine, it's for Add Network
+ mSelectedAccessPoint = ap;
+ mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit);
+ return mDialog;
+ case WPS_PBC_DIALOG_ID:
+ return new WpsDialog(getActivity(), WpsInfo.PBC);
+ case WPS_PIN_DIALOG_ID:
+ return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
}
- // If it's still null, fine, it's for Add Network
- mSelectedAccessPoint = ap;
- mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit);
- return mDialog;
+ return super.onCreateDialog(dialogId);
}
private boolean requireKeyStore(WifiConfiguration config) {
}
/* package */ void submit(WifiConfigController configController) {
- int networkSetup = configController.chosenNetworkSetupMethod();
- switch(networkSetup) {
- case WifiConfigController.WPS_PBC:
- case WifiConfigController.WPS_DISPLAY:
- case WifiConfigController.WPS_KEYPAD:
- mWifiManager.startWps(mChannel, configController.getWpsConfig(), mWpsListener);
- break;
- case WifiConfigController.MANUAL:
- final WifiConfiguration config = configController.getConfig();
- if (config == null) {
- if (mSelectedAccessPoint != null
- && !requireKeyStore(mSelectedAccessPoint.getConfig())
- && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
- mWifiManager.connect(mChannel, mSelectedAccessPoint.networkId,
- mConnectListener);
- }
- } else if (config.networkId != INVALID_NETWORK_ID) {
- if (mSelectedAccessPoint != null) {
- saveNetwork(config);
- }
- } else {
- if (configController.isEdit() || requireKeyStore(config)) {
- saveNetwork(config);
- } else {
- mWifiManager.connect(mChannel, config, mConnectListener);
- }
- }
- break;
+ final WifiConfiguration config = configController.getConfig();
+
+ if (config == null) {
+ if (mSelectedAccessPoint != null
+ && !requireKeyStore(mSelectedAccessPoint.getConfig())
+ && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
+ mWifiManager.connect(mChannel, mSelectedAccessPoint.networkId,
+ mConnectListener);
+ }
+ } else if (config.networkId != INVALID_NETWORK_ID) {
+ if (mSelectedAccessPoint != null) {
+ saveNetwork(config);
+ }
+ } else {
+ if (configController.isEdit() || requireKeyStore(config)) {
+ saveNetwork(config);
+ } else {
+ mWifiManager.connect(mChannel, config, mConnectListener);
+ }
}
if (mWifiManager.isWifiEnabled()) {
--- /dev/null
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.wifi;
+
+import android.app.AlertDialog;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.NetworkInfo;
+import android.net.NetworkInfo.DetailedState;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.net.wifi.WpsInfo;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import com.android.settings.R;
+
+
+/**
+ * Dialog to show WPS progress.
+ */
+public class WpsDialog extends AlertDialog {
+
+ private final static String TAG = "WpsDialog";
+
+ private View mView;
+ private TextView mTextView;
+ private ProgressBar mTimeoutBar;
+ private ProgressBar mProgressBar;
+ private Button mButton;
+ private Timer mTimer;
+
+ private static final int WPS_TIMEOUT_S = 120;
+
+ private WifiManager mWifiManager;
+ private WifiManager.Channel mChannel;
+ private WifiManager.WpsListener mWpsListener;
+ private int mWpsSetup;
+
+ private final IntentFilter mFilter;
+ private BroadcastReceiver mReceiver;
+
+ private Context mContext;
+ private Handler mHandler = new Handler();
+
+ private enum DialogState {
+ WPS_INIT,
+ WPS_START,
+ WPS_COMPLETE,
+ CONNECTED, //WPS + IP config is done
+ WPS_FAILED
+ }
+ DialogState mDialogState = DialogState.WPS_INIT;
+
+ public WpsDialog(Context context, int wpsSetup) {
+ super(context);
+ mContext = context;
+ mWpsSetup = wpsSetup;
+
+ class WpsListener implements WifiManager.WpsListener {
+ public void onStartSuccess(String pin) {
+ if (pin != null) {
+ updateDialog(DialogState.WPS_START, String.format(
+ mContext.getString(R.string.wifi_wps_onstart_pin), pin));
+ } else {
+ updateDialog(DialogState.WPS_START, mContext.getString(
+ R.string.wifi_wps_onstart_pbc));
+ }
+ }
+ public void onCompletion() {
+ updateDialog(DialogState.WPS_COMPLETE,
+ mContext.getString(R.string.wifi_wps_complete));
+ }
+
+ public void onFailure(int reason) {
+ String msg;
+ switch (reason) {
+ case WifiManager.WPS_OVERLAP_ERROR:
+ msg = mContext.getString(R.string.wifi_wps_failed_overlap);
+ break;
+ case WifiManager.WPS_WEP_PROHIBITED:
+ msg = mContext.getString(R.string.wifi_wps_failed_wep);
+ break;
+ case WifiManager.WPS_TKIP_ONLY_PROHIBITED:
+ msg = mContext.getString(R.string.wifi_wps_failed_tkip);
+ break;
+ case WifiManager.IN_PROGRESS:
+ msg = mContext.getString(R.string.wifi_wps_in_progress);
+ break;
+ default:
+ msg = mContext.getString(R.string.wifi_wps_failed_generic);
+ break;
+ }
+ updateDialog(DialogState.WPS_FAILED, msg);
+ }
+ }
+
+ mWpsListener = new WpsListener();
+
+
+ mFilter = new IntentFilter();
+ mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ handleEvent(context, intent);
+ }
+ };
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ setTitle(R.string.wifi_wps_setup_title);
+ mView = getLayoutInflater().inflate(R.layout.wifi_wps_dialog, null);
+
+ mTextView = (TextView) mView.findViewById(R.id.wps_dialog_txt);
+ mTextView.setText(R.string.wifi_wps_setup_msg);
+
+ mTimeoutBar = ((ProgressBar) mView.findViewById(R.id.wps_timeout_bar));
+ mTimeoutBar.setMax(WPS_TIMEOUT_S);
+ mTimeoutBar.setProgress(0);
+
+ mProgressBar = ((ProgressBar) mView.findViewById(R.id.wps_progress_bar));
+ mProgressBar.setVisibility(View.GONE);
+
+ mButton = ((Button) mView.findViewById(R.id.wps_dialog_btn));
+ mButton.setText(R.string.wifi_cancel);
+ mButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dismiss();
+ }
+ });
+
+ mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
+ mChannel = mWifiManager.initialize(mContext, mContext.getMainLooper(), null);
+
+ setView(mView);
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ protected void onStart() {
+ /*
+ * increment timeout bar per second.
+ */
+ mTimer = new Timer(false);
+ mTimer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ mHandler.post(new Runnable() {
+
+ @Override
+ public void run() {
+ mTimeoutBar.incrementProgressBy(1);
+ }
+ });
+ }
+ }, 1000, 1000);
+
+ mContext.registerReceiver(mReceiver, mFilter);
+
+ WpsInfo wpsConfig = new WpsInfo();
+ wpsConfig.setup = mWpsSetup;
+ mWifiManager.startWps(mChannel, wpsConfig, mWpsListener);
+ }
+
+ @Override
+ protected void onStop() {
+ if (mDialogState != DialogState.WPS_COMPLETE) {
+ mWifiManager.cancelWps(mChannel, null);
+ }
+
+ if (mReceiver != null) {
+ mContext.unregisterReceiver(mReceiver);
+ mReceiver = null;
+ }
+
+ if (mTimer != null) {
+ mTimer.cancel();
+ }
+ }
+
+ private void updateDialog(DialogState state, String msg) {
+ if (mDialogState.ordinal() >= state.ordinal()) {
+ //ignore.
+ return;
+ }
+ mDialogState = state;
+
+ switch(state) {
+ case WPS_COMPLETE:
+ mTimeoutBar.setVisibility(View.GONE);
+ mProgressBar.setVisibility(View.VISIBLE);
+ break;
+ case CONNECTED:
+ case WPS_FAILED:
+ mButton.setText(mContext.getString(R.string.dlg_ok));
+ mTimeoutBar.setVisibility(View.GONE);
+ mProgressBar.setVisibility(View.GONE);
+ if (mReceiver != null) {
+ mContext.unregisterReceiver(mReceiver);
+ mReceiver = null;
+ }
+ break;
+ }
+ mTextView.setText(msg);
+ }
+
+ private void handleEvent(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
+ NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
+ WifiManager.EXTRA_NETWORK_INFO);
+ final NetworkInfo.DetailedState state = info.getDetailedState();
+ if (state == DetailedState.CONNECTED &&
+ mDialogState == DialogState.WPS_COMPLETE) {
+ WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+ if (wifiInfo != null) {
+ String msg = String.format(mContext.getString(
+ R.string.wifi_wps_connected), wifiInfo.getSSID());
+ updateDialog(DialogState.CONNECTED, msg);
+ }
+ }
+ }
+ }
+
+}