SupplicantP2pIfaceHal: Fix pin sending for connect

Send the pin for all types of WPS connect requests to wpa_supplicant.

Bug: 36475029
Test: Unit tests
Change-Id: I4965d59c88ea976255b141056224fb46570c2e92
diff --git a/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHal.java b/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHal.java
index 6464a4c..117dff6 100644
--- a/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHal.java
+++ b/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHal.java
@@ -640,6 +640,11 @@
                 return null;
             }
 
+            if (config.wps.setup == WpsInfo.PBC && !TextUtils.isEmpty(config.wps.pin)) {
+                Log.e(TAG, "Expected empty pin for PBC.");
+                return null;
+            }
+
             byte[] peerAddress = null;
             try {
                 peerAddress = NativeUtil.macAddressToByteArray(config.deviceAddress);
@@ -653,17 +658,8 @@
                 Log.e(TAG, "Invalid WPS config method: " + config.wps.setup);
                 return null;
             }
-
             // NOTE: preSelectedPin cannot be null, otherwise hal would crash.
-            String preSelectedPin = "";
-            if (provisionMethod == ISupplicantP2pIface.WpsProvisionMethod.DISPLAY) {
-                preSelectedPin = config.wps.pin;
-                if (preSelectedPin == null) {
-                    Log.e(TAG, "PIN must be supplied when provision method is DISPLAY.");
-                    return null;
-                }
-            }
-
+            String preSelectedPin = TextUtils.isEmpty(config.wps.pin) ? "" : config.wps.pin;
             boolean persistent = (config.netId == WifiP2pGroup.PERSISTENT_NET_ID);
 
             int goIntent = 0;
diff --git a/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalTest.java b/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalTest.java
index 8bf5287..da20eaa 100644
--- a/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalTest.java
@@ -44,6 +44,7 @@
 import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
 import android.os.IHwBinder;
 import android.os.RemoteException;
+import android.text.TextUtils;
 
 import com.android.server.wifi.util.NativeUtil;
 
@@ -562,34 +563,47 @@
                     ISupplicantP2pIface.connectCallback cb) throws RemoteException {
                 methods.add(method);
 
-                if (method == ISupplicantP2pIface.WpsProvisionMethod.DISPLAY) {
-                    // PIN is only required for PIN methods.
-                    assertEquals(pin, configPin);
+                if (method == ISupplicantP2pIface.WpsProvisionMethod.DISPLAY
+                        && TextUtils.isEmpty(pin)) {
+                    // Return the configPin for DISPLAY method if the pin was not provided.
+                    cb.onValues(mStatusSuccess, configPin);
+                } else {
+                    if (method != ISupplicantP2pIface.WpsProvisionMethod.PBC) {
+                        // PIN is only required for PIN methods.
+                        assertEquals(pin, configPin);
+                    }
+                    // For all the other cases, there is no generated pin.
+                    cb.onValues(mStatusSuccess, "");
                 }
-
-                // Return same pin as provided for test purposes.
-                cb.onValues(mStatusSuccess, pin);
             }
         })
         .when(mISupplicantP2pIfaceMock).connect(
                 eq(mPeerMacAddressBytes), anyInt(), anyString(), anyBoolean(), anyBoolean(),
                 anyInt(), any(ISupplicantP2pIface.connectCallback.class));
 
-        WifiP2pConfig config = createDummyP2pConfig(mPeerMacAddress, WpsInfo.DISPLAY, configPin);
+        WifiP2pConfig config = createDummyP2pConfig(mPeerMacAddress, WpsInfo.DISPLAY, "");
 
         // Default value when service is not initialized.
         assertNull(mDut.connect(config, false));
 
         executeAndValidateInitializationSequence(false, false, false);
+
         assertEquals(configPin, mDut.connect(config, false));
         assertTrue(methods.contains(ISupplicantP2pIface.WpsProvisionMethod.DISPLAY));
+        methods.clear();
 
-        config.wps.setup = WpsInfo.PBC;
-        assertNotNull(mDut.connect(config, false));
+        config = createDummyP2pConfig(mPeerMacAddress, WpsInfo.DISPLAY, configPin);
+        assertTrue(mDut.connect(config, false).isEmpty());
+        assertTrue(methods.contains(ISupplicantP2pIface.WpsProvisionMethod.DISPLAY));
+        methods.clear();
+
+        config = createDummyP2pConfig(mPeerMacAddress, WpsInfo.PBC, "");
+        assertTrue(mDut.connect(config, false).isEmpty());
         assertTrue(methods.contains(ISupplicantP2pIface.WpsProvisionMethod.PBC));
+        methods.clear();
 
-        config.wps.setup = WpsInfo.KEYPAD;
-        assertNotNull(mDut.connect(config, false));
+        config = createDummyP2pConfig(mPeerMacAddress, WpsInfo.KEYPAD, configPin);
+        assertTrue(mDut.connect(config, false).isEmpty());
         assertTrue(methods.contains(ISupplicantP2pIface.WpsProvisionMethod.KEYPAD));
     }
 
@@ -627,6 +641,11 @@
         config.wps.setup = WpsInfo.DISPLAY;
         config.wps.pin = null;
         assertNull(mDut.connect(config, false));
+
+        // Pin should be empty for PBC.
+        config.wps.setup = WpsInfo.PBC;
+        config.wps.pin = "03455323";
+        assertNull(mDut.connect(config, false));
     }
 
     /**
@@ -2503,9 +2522,7 @@
         config.deviceAddress = peerAddress;
 
         config.wps.setup = wpsProvMethod;
-        if (wpsProvMethod == WpsInfo.DISPLAY) {
-            config.wps.pin = pin;
-        }
+        config.wps.pin = pin;
 
         return config;
     }