UI for wps pin from device

Bug: 3119043
Bug: 3112178
Change-Id: I573146ed0c834cb88d5f42c25fe0be3ed501a321
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index ee44401..8967ff2 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -349,7 +349,9 @@
         <!-- 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>WPS push button</item>
         <!-- WPS pin method based configuration. This requires entering a pin obtained from the access point [CHAR LIMIT=25] -->
-        <item>WPS pin method</item>
+        <item>WPS pin from access point</item>
+        <!-- WPS pin method based configuration. This requires generating a pin from this device [CHAR LIMIT=25] -->
+        <item>WPS pin from this device</item>
     </string-array>
 
     <!-- Wi-Fi IP settings. -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 839d13c..5e46158 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -916,6 +916,10 @@
     <string name="wifi_network_setup">Network Setup</string>
     <!-- Label for the text view for WPS pin input [CHAR LIMIT=50] -->
     <string name="wifi_wps_pin">Enter pin from access point</string>
+    <!-- Title for the WPS pin display dialog [CHAR LIMIT=50] -->
+    <string name="wifi_wps_pin_method_configuration">WPS pin method configuration</string>
+    <!-- Text displayed in the WPS pin display dialog [CHAR LIMIT=50] -->
+    <string name="wifi_wps_pin_output">Enter the pin <xliff:g id="wps_pin">%1$s</xliff:g> on the access point</string>
     <!-- Label for the SSID of the network -->
     <string name="wifi_ssid">Network SSID</string>
     <!-- Label for the security of the connection -->
@@ -956,6 +960,8 @@
     <string name="wifi_disabled">Disabled</string>
     <!-- Summary for the remembered network but currently not in range. -->
     <string name="wifi_not_in_range">Not in range</string>
+    <!-- Summary for an open network with WPS being available [CHAR LIMIT=50]-->
+    <string name="wifi_open_with_wps">WPS available</string>
     <!-- Summary for the secured network. -->
     <string name="wifi_secured">Secured with <xliff:g id="wifi_security">%1$s</xliff:g></string>
     <!-- Summary for the secured network with WPS being available [CHAR LIMIT=50]-->
diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java
index 054c6ff..c932978 100644
--- a/src/com/android/settings/wifi/AccessPoint.java
+++ b/src/com/android/settings/wifi/AccessPoint.java
@@ -119,7 +119,7 @@
         ssid = result.SSID;
         bssid = result.BSSID;
         security = getSecurity(result);
-        wpsAvailable = security != SECURITY_NONE && security != SECURITY_EAP &&
+        wpsAvailable = security != SECURITY_EAP &&
                 result.capabilities.contains("WPS");
         networkId = -1;
         mRssi = result.level;
@@ -222,7 +222,11 @@
             }
 
             if (security == SECURITY_NONE) {
-                setSummary(status);
+                if (wpsAvailable && mConfig == null) {
+                    setSummary(context.getString(R.string.wifi_open_with_wps));
+                } else {
+                    setSummary(status);
+                }
             } else {
                 String format;
                 if (wpsAvailable && mConfig == null) {
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 597c5a3..d1700a6 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -92,7 +92,8 @@
     /* 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_PIN = 2;
+    public static final int WPS_PIN_FROM_ACCESS_POINT = 2;
+    public static final int WPS_PIN_FROM_DEVICE = 3;
 
     /* These values come from "wifi_proxy_settings" resource array */
     public static final int PROXY_NONE = 0;
@@ -491,14 +492,15 @@
         int pos = mNetworkSetupSpinner.getSelectedItemPosition();
 
         /* Show pin text input if needed */
-        if (pos == WPS_PIN) {
+        if (pos == WPS_PIN_FROM_ACCESS_POINT) {
             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_PIN) || (pos == WPS_PBC)) {
+        if ((pos == WPS_PIN_FROM_ACCESS_POINT) || (pos == WPS_PIN_FROM_DEVICE)
+                || (pos == WPS_PBC)) {
             mView.findViewById(R.id.security_fields).setVisibility(View.GONE);
         } else {
             mView.findViewById(R.id.security_fields).setVisibility(View.VISIBLE);
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 30c2a3d..d8d0a60 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -23,6 +23,7 @@
 import com.android.settings.SettingsPreferenceFragment;
 
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -642,9 +643,17 @@
             case WifiConfigController.WPS_PBC:
                 mWifiManager.startWpsPbc(mSelectedAccessPoint.bssid);
                 break;
-            case WifiConfigController.WPS_PIN:
+            case WifiConfigController.WPS_PIN_FROM_ACCESS_POINT:
                 int apPin = configController.getWpsPin();
-                mWifiManager.startWpsPin(mSelectedAccessPoint.bssid, apPin);
+                mWifiManager.startWpsWithPinFromAccessPoint(mSelectedAccessPoint.bssid, apPin);
+                break;
+            case WifiConfigController.WPS_PIN_FROM_DEVICE:
+                int pin = mWifiManager.startWpsWithPinFromDevice(mSelectedAccessPoint.bssid);
+                new AlertDialog.Builder(getActivity())
+                .setTitle(R.string.wifi_wps_pin_method_configuration)
+                .setMessage(getResources().getString(R.string.wifi_wps_pin_output, pin))
+                .setPositiveButton(android.R.string.ok, null)
+                .show();
                 break;
             case WifiConfigController.MANUAL:
                 final WifiConfiguration config = configController.getConfig();