p2p: add new discoverPeers APIs

Added APIs to run p2p scan on a specific frequency or social channels.

Bug: 159094739
Test: atest FrameworksWifiApiTests
Change-Id: I35c47bf3725bfe93ec8d79c9609847775911b6b2
diff --git a/framework/api/current.txt b/framework/api/current.txt
index d107f58..7d7d0d5 100644
--- a/framework/api/current.txt
+++ b/framework/api/current.txt
@@ -1156,6 +1156,8 @@
     method @RequiresPermission(allOf={android.Manifest.permission.NEARBY_WIFI_DEVICES, android.Manifest.permission.ACCESS_FINE_LOCATION}, conditional=true) public void createGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
     method @RequiresPermission(allOf={android.Manifest.permission.NEARBY_WIFI_DEVICES, android.Manifest.permission.ACCESS_FINE_LOCATION}, conditional=true) public void createGroup(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pConfig, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
     method @RequiresPermission(allOf={android.Manifest.permission.NEARBY_WIFI_DEVICES, android.Manifest.permission.ACCESS_FINE_LOCATION}, conditional=true) public void discoverPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+    method @RequiresPermission(allOf={android.Manifest.permission.NEARBY_WIFI_DEVICES, android.Manifest.permission.ACCESS_FINE_LOCATION}, conditional=true) public void discoverPeersOnSocialChannels(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
+    method @RequiresPermission(allOf={android.Manifest.permission.NEARBY_WIFI_DEVICES, android.Manifest.permission.ACCESS_FINE_LOCATION}, conditional=true) public void discoverPeersOnSpecificFrequency(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, int, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
     method @RequiresPermission(allOf={android.Manifest.permission.NEARBY_WIFI_DEVICES, android.Manifest.permission.ACCESS_FINE_LOCATION}, conditional=true) public void discoverServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
     method public android.net.wifi.p2p.WifiP2pManager.Channel initialize(android.content.Context, android.os.Looper, android.net.wifi.p2p.WifiP2pManager.ChannelListener);
     method public void removeClient(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.MacAddress, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
diff --git a/framework/java/android/net/wifi/p2p/WifiP2pManager.java b/framework/java/android/net/wifi/p2p/WifiP2pManager.java
index 9a12c7d..579cf5e 100644
--- a/framework/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/framework/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -392,6 +392,26 @@
     public static final String CALLING_BINDER =
             "android.net.wifi.p2p.CALLING_BINDER";
 
+    /**
+     * Run P2P scan on all channels.
+     * @hide
+     */
+    public static final int WIFI_P2P_SCAN_FULL = 0;
+
+    /**
+     * Run P2P scan only on social channels.
+     * @hide
+     */
+    public static final int WIFI_P2P_SCAN_SOCIAL = -1;
+
+    /** @hide */
+    @IntDef(prefix = {"WIFI_P2P_SCAN_"}, value = {
+            WIFI_P2P_SCAN_FULL,
+            WIFI_P2P_SCAN_SOCIAL})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface WifiP2pScanType {
+    }
+
     IWifiP2pManager mService;
 
     private static final int BASE = Protocol.BASE_WIFI_P2P_MANAGER;
@@ -1249,7 +1269,7 @@
      * determine when the framework notifies of a change as peers are discovered.
      *
      * <p> Upon receiving a {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent, an application
-     * can request for the list of peers using {@link #requestPeers}.
+     * can request the list of peers using {@link #requestPeers}.
      * <p>
      * If targeting {@link android.os.Build.VERSION_CODES#TIRAMISU} or later, the application must
      * have {@link android.Manifest.permission#NEARBY_WIFI_DEVICES} with
@@ -1270,7 +1290,96 @@
     public void discoverPeers(Channel c, ActionListener listener) {
         checkChannel(c);
         Bundle extras = prepareExtrasBundle(c);
-        c.mAsyncChannel.sendMessage(DISCOVER_PEERS, 0, c.putListener(listener), extras);
+        // TODO(b/216723991): Revise to scan type + freq form to avoid overlaying the same field.
+        c.mAsyncChannel.sendMessage(DISCOVER_PEERS, WIFI_P2P_SCAN_FULL,
+                c.putListener(listener), extras);
+    }
+
+    /**
+     * Scan only the social channels.
+     *
+     * A discovery process involves scanning for available Wi-Fi peers
+     * for the purpose of establishing a connection.
+     *
+     * <p> The function call immediately returns after sending a discovery request
+     * to the framework. The application is notified of a success or failure to initiate
+     * discovery through listener callbacks {@link ActionListener#onSuccess} or
+     * {@link ActionListener#onFailure}.
+     *
+     * <p> The discovery remains active until a connection is initiated or
+     * a p2p group is formed. Register for {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent to
+     * determine when the framework notifies of a change as peers are discovered.
+     *
+     * <p> Upon receiving a {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent, an application
+     * can request the list of peers using {@link #requestPeers}.
+     * <p>
+     * The application must have {@link android.Manifest.permission#NEARBY_WIFI_DEVICES} with
+     * android:usesPermissionFlags="neverForLocation". If the application does not declare
+     * android:usesPermissionFlags="neverForLocation", then it must also have
+     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION}.
+     *
+     * @param c is the channel created at {@link #initialize}
+     * @param listener for callbacks on success or failure.
+     */
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.NEARBY_WIFI_DEVICES,
+            android.Manifest.permission.ACCESS_FINE_LOCATION
+            }, conditional = true)
+    public void discoverPeersOnSocialChannels(@NonNull Channel c,
+            @Nullable ActionListener listener) {
+        if (!SdkLevel.isAtLeastT()) {
+            throw new UnsupportedOperationException();
+        }
+        checkChannel(c);
+        Bundle extras = prepareExtrasBundle(c);
+        // TODO(b/216723991): Revise to scan type + freq form to avoid overlaying the same field.
+        c.mAsyncChannel.sendMessage(DISCOVER_PEERS, WIFI_P2P_SCAN_SOCIAL,
+                c.putListener(listener), extras);
+    }
+
+    /**
+     * Scan only a single channel specified by frequency.
+     *
+     * A discovery process involves scanning for available Wi-Fi peers
+     * for the purpose of establishing a connection.
+     *
+     * <p> The function call immediately returns after sending a discovery request
+     * to the framework. The application is notified of a success or failure to initiate
+     * discovery through listener callbacks {@link ActionListener#onSuccess} or
+     * {@link ActionListener#onFailure}.
+     *
+     * <p> The discovery remains active until a connection is initiated or
+     * a p2p group is formed. Register for {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent to
+     * determine when the framework notifies of a change as peers are discovered.
+     *
+     * <p> Upon receiving a {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent, an application
+     * can request the list of peers using {@link #requestPeers}.
+     * <p>
+     * The application must have {@link android.Manifest.permission#NEARBY_WIFI_DEVICES} with
+     * android:usesPermissionFlags="neverForLocation". If the application does not declare
+     * android:usesPermissionFlags="neverForLocation", then it must also have
+     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION}.
+     *
+     * @param c is the channel created at {@link #initialize}
+     * @param frequencyMhz is the frequency of the channel to use for peer discovery.
+     * @param listener for callbacks on success or failure.
+     */
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.NEARBY_WIFI_DEVICES,
+            android.Manifest.permission.ACCESS_FINE_LOCATION
+            }, conditional = true)
+    public void discoverPeersOnSpecificFrequency(
+            @NonNull Channel c, int frequencyMhz, @Nullable ActionListener listener) {
+        if (!SdkLevel.isAtLeastT()) {
+            throw new UnsupportedOperationException();
+        }
+        checkChannel(c);
+        if (frequencyMhz <= 0) {
+            throw new IllegalArgumentException("This frequency must be a positive value.");
+        }
+        Bundle extras = prepareExtrasBundle(c);
+        // TODO(b/216723991): Revise to scan type + freq form to avoid overlaying the same field.
+        c.mAsyncChannel.sendMessage(DISCOVER_PEERS, frequencyMhz, c.putListener(listener), extras);
     }
 
     /**
@@ -2155,7 +2264,7 @@
      * broadcast event with extra {@link #EXTRA_WIFI_STATE}.
      *
      * @param c is the channel created at {@link #initialize}.
-     * @param listener for callback when p2p state is available..
+     * @param listener for callback when p2p state is available.
      */
     public void requestP2pState(@NonNull Channel c,
             @NonNull P2pStateListener listener) {
@@ -2176,7 +2285,7 @@
      * broadcast event with extra {@link #EXTRA_DISCOVERY_STATE}.
      *
      * @param c is the channel created at {@link #initialize}.
-     * @param listener for callback when discovery state is available..
+     * @param listener for callback when discovery state is available.
      */
     public void requestDiscoveryState(@NonNull Channel c,
             @NonNull DiscoveryStateListener listener) {
@@ -2198,7 +2307,7 @@
      * broadcast event with extra {@link #EXTRA_NETWORK_INFO}.
      *
      * @param c is the channel created at {@link #initialize}.
-     * @param listener for callback when network info is available..
+     * @param listener for callback when network info is available.
      */
     public void requestNetworkInfo(@NonNull Channel c,
             @NonNull NetworkInfoListener listener) {
diff --git a/service/java/com/android/server/wifi/p2p/ISupplicantP2pIfaceHal.java b/service/java/com/android/server/wifi/p2p/ISupplicantP2pIfaceHal.java
index 11c7875..65e0344 100644
--- a/service/java/com/android/server/wifi/p2p/ISupplicantP2pIfaceHal.java
+++ b/service/java/com/android/server/wifi/p2p/ISupplicantP2pIfaceHal.java
@@ -72,14 +72,18 @@
     boolean isInitializationComplete();
 
     /**
-     * Initiate a P2P service discovery with a (optional) timeout.
+     * Initiate a P2P device discovery with a (optional) frequency and a (optional) timeout.
      *
+     * @param freq is the frequency to be scanned,
+     *        Valid values are {@link WifiP2pManager#WIFI_P2P_SCAN_FULL} for doing full P2P scan,
+     *        {@link WifiP2pManager#WIFI_P2P_SCAN_SOCIAL} for scanning social channels,
+     *        a non zero valid frequency for scanning a specified frequency.
      * @param timeout Max time to be spent is performing discovery.
      *        Set to 0 to indefinitely continue discovery until an explicit
      *        |stopFind| is sent.
      * @return boolean value indicating whether operation was successful.
      */
-    boolean find(int timeout);
+    boolean find(int freq, int timeout);
 
     /**
      * Stop an ongoing P2P service discovery.
diff --git a/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHal.java b/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHal.java
index db6a28b..c798626 100644
--- a/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHal.java
+++ b/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHal.java
@@ -183,21 +183,14 @@
         }
     }
 
-    /**
-     * Initiate a P2P service discovery with a (optional) timeout.
-     *
-     * @param timeout Max time to be spent is performing discovery.
-     *        Set to 0 to indefinitely continue discovery until an explicit
-     *        |stopFind| is sent.
-     * @return boolean value indicating whether operation was successful.
-     */
-    public boolean find(int timeout) {
+    /** See {@link ISupplicantStaNetwork#find(int, int)} for documentation. */
+    public boolean find(int freq, int timeout) {
         synchronized (mLock) {
             String methodStr = "find";
             if (mP2pIfaceHal == null) {
                 return handleNullHal(methodStr);
             }
-            return mP2pIfaceHal.find(timeout);
+            return mP2pIfaceHal.find(freq, timeout);
         }
     }
 
diff --git a/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHalAidlImpl.java b/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHalAidlImpl.java
index b2cbd75..3302100 100644
--- a/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHalAidlImpl.java
+++ b/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHalAidlImpl.java
@@ -429,15 +429,8 @@
         }
     }
 
-    /**
-     * Initiate a P2P service discovery with a (optional) timeout.
-     *
-     * @param timeout Max time to be spent is performing discovery.
-     *        Set to 0 to indefinitely continue discovery until an explicit
-     *        |stopFind| is sent.
-     * @return boolean value indicating whether operation was successful.
-     */
-    public boolean find(int timeout) {
+    /** See {@link ISupplicantStaNetwork#find(int, int)} for documentation. */
+    public boolean find(int freq, int timeout) {
         synchronized (mLock) {
             String methodStr = "find";
             if (!checkP2pIfaceAndLogFailure(methodStr)) {
@@ -447,8 +440,22 @@
                 Log.e(TAG, "Invalid timeout value: " + timeout);
                 return false;
             }
+            if (freq < 0 && freq != WifiP2pManager.WIFI_P2P_SCAN_SOCIAL) {
+                Log.e(TAG, "Invalid freq value: " + freq);
+                return false;
+            }
             try {
-                mISupplicantP2pIface.find(timeout);
+                switch (freq) {
+                    case WifiP2pManager.WIFI_P2P_SCAN_FULL:
+                        mISupplicantP2pIface.find(timeout);
+                        break;
+                    case WifiP2pManager.WIFI_P2P_SCAN_SOCIAL:
+                        mISupplicantP2pIface.findOnSocialChannels(timeout);
+                        break;
+                    default:
+                        mISupplicantP2pIface.findOnSpecificFrequency(freq, timeout);
+                        break;
+                }
                 return true;
             } catch (RemoteException e) {
                 handleRemoteException(e, methodStr);
diff --git a/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHalHidlImpl.java b/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHalHidlImpl.java
index 92cf5bd..8a85dcf 100644
--- a/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHalHidlImpl.java
+++ b/service/java/com/android/server/wifi/p2p/SupplicantP2pIfaceHalHidlImpl.java
@@ -748,16 +748,8 @@
         }
     }
 
-
-    /**
-     * Initiate a P2P service discovery with a (optional) timeout.
-     *
-     * @param timeout Max time to be spent is performing discovery.
-     *        Set to 0 to indefinitely continue discovery until an explicit
-     *        |stopFind| is sent.
-     * @return boolean value indicating whether operation was successful.
-     */
-    public boolean find(int timeout) {
+    /** See {@link ISupplicantStaNetwork#find(int, int)} for documentation. */
+    public boolean find(int freq, int timeout) {
         synchronized (mLock) {
             if (!checkSupplicantP2pIfaceAndLogFailure("find")) return false;
 
diff --git a/service/java/com/android/server/wifi/p2p/WifiP2pNative.java b/service/java/com/android/server/wifi/p2p/WifiP2pNative.java
index b727b47..ec55070 100644
--- a/service/java/com/android/server/wifi/p2p/WifiP2pNative.java
+++ b/service/java/com/android/server/wifi/p2p/WifiP2pNative.java
@@ -24,6 +24,7 @@
 import android.net.wifi.p2p.WifiP2pConfig;
 import android.net.wifi.p2p.WifiP2pGroup;
 import android.net.wifi.p2p.WifiP2pGroupList;
+import android.net.wifi.p2p.WifiP2pManager;
 import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
 import android.os.Handler;
 import android.os.WorkSource;
@@ -406,13 +407,26 @@
     /**
      * Initiate a P2P service discovery with a (optional) timeout.
      *
-     * @param timeout Max time to be spent is peforming discovery.
-     *        Set to 0 to indefinely continue discovery untill and explicit
+     * @param timeout The maximum amount of time to be spent in performing discovery.
+     *        Set to 0 to indefinitely continue discovery until an explicit
      *        |stopFind| is sent.
      * @return boolean value indicating whether operation was successful.
      */
     public boolean p2pFind(int timeout) {
-        return mSupplicantP2pIfaceHal.find(timeout);
+        return mSupplicantP2pIfaceHal.find(WifiP2pManager.WIFI_P2P_SCAN_FULL, timeout);
+    }
+
+    /**
+     * Initiate a P2P device discovery with a (optional) frequency and a (optional) timeout.
+     *
+     * @param freq is the frequency to be scanned.
+     * @param timeout The maximum amount of time to be spent in performing discovery.
+     *        Set to 0 to indefinitely continue discovery until an explicit
+     *        |stopFind| is sent.
+     * @return boolean value indicating whether operation was successful.
+     */
+    public boolean p2pFind(int freq, int timeout) {
+        return mSupplicantP2pIfaceHal.find(freq, timeout);
     }
 
     /**
diff --git a/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java b/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java
index 3a0d55d..97d734f 100644
--- a/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java
+++ b/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java
@@ -2119,6 +2119,8 @@
                                     WifiP2pManager.ERROR);
                             break;
                         }
+                        int freq = SdkLevel.isAtLeastT()
+                                ? message.arg1 : WifiP2pManager.WIFI_P2P_SCAN_FULL;
                         int uid = message.sendingUid;
                         Bundle extras = (Bundle) message.obj;
                         boolean hasPermission = false;
@@ -2146,7 +2148,7 @@
                         // do not send service discovery request while normal find operation.
                         clearSupplicantServiceRequest();
                         Log.e(TAG, "-------discover_peers before p2pFind");
-                        if (mWifiNative.p2pFind(DISCOVER_TIMEOUT_S)) {
+                        if (mWifiNative.p2pFind(freq, DISCOVER_TIMEOUT_S)) {
                             mWifiP2pMetrics.incrementPeerScans();
                             replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_SUCCEEDED);
                             sendP2pDiscoveryChangedBroadcast(true);
diff --git a/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalAidlImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalAidlImplTest.java
index faf97ac..b316544 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalAidlImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalAidlImplTest.java
@@ -279,11 +279,11 @@
     public void testFind_success() throws Exception {
         doNothing().when(mISupplicantP2pIfaceMock).find(anyInt());
         // Default value when service is not yet initialized.
-        assertFalse(mDut.find(1));
+        assertFalse(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_FULL, 1));
 
         executeAndValidateInitializationSequence(false, false);
-        assertTrue(mDut.find(1));
-        assertFalse(mDut.find(-1));
+        assertTrue(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_FULL, 1));
+        assertFalse(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_FULL, -1));
     }
 
     /**
@@ -294,21 +294,64 @@
         executeAndValidateInitializationSequence(false, false);
         doThrow(new ServiceSpecificException(SupplicantStatusCode.FAILURE_UNKNOWN))
             .when(mISupplicantP2pIfaceMock).find(anyInt());
-        assertFalse(mDut.find(1));
+        assertFalse(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_FULL, 1));
         // Check that service is still alive.
         assertTrue(mDut.isInitializationComplete());
     }
 
     /**
-     * Verify that find disconnects and returns false, if HAL throws a remote exception.
+     * Sunny day scenario for findOnSocialChannels()
      */
     @Test
-    public void testFind_exception() throws Exception {
+    public void testFindSocialOnly_success() throws Exception {
+        doNothing().when(mISupplicantP2pIfaceMock).findOnSocialChannels(anyInt());
+        // Default value when service is not yet initialized.
+        assertFalse(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_SOCIAL, 1));
+
         executeAndValidateInitializationSequence(false, false);
-        doThrow(new RemoteException()).when(mISupplicantP2pIfaceMock).find(anyInt());
-        assertFalse(mDut.find(0));
-        // Check service is dead.
-        assertFalse(mDut.isInitializationComplete());
+        assertTrue(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_SOCIAL, 1));
+        assertFalse(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_SOCIAL, -1));
+    }
+
+    /**
+     * Verify that find returns false, if HAL call did not succeed.
+     */
+    @Test
+    public void testFindSocialOnly_failure() throws Exception {
+        executeAndValidateInitializationSequence(false, false);
+        doThrow(new ServiceSpecificException(SupplicantStatusCode.FAILURE_UNKNOWN))
+            .when(mISupplicantP2pIfaceMock).findOnSocialChannels(anyInt());
+        assertFalse(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_SOCIAL, 1));
+        // Check that service is still alive.
+        assertTrue(mDut.isInitializationComplete());
+    }
+
+    /**
+     * Sunny day scenario for findOnSpecificFrequency()
+     */
+    @Test
+    public void testFindSpecificFrequency_success() throws Exception {
+        int freq = 2412;
+        doNothing().when(mISupplicantP2pIfaceMock).findOnSpecificFrequency(anyInt(), anyInt());
+        // Default value when service is not yet initialized.
+        assertFalse(mDut.find(freq, 1));
+
+        executeAndValidateInitializationSequence(false, false);
+        assertTrue(mDut.find(freq, 1));
+        assertFalse(mDut.find(freq, -1));
+    }
+
+    /**
+     * Verify that find returns false, if HAL call did not succeed.
+     */
+    @Test
+    public void testFindSpecificFrequency_failure() throws Exception {
+        executeAndValidateInitializationSequence(false, false);
+        doThrow(new ServiceSpecificException(SupplicantStatusCode.FAILURE_UNKNOWN))
+            .when(mISupplicantP2pIfaceMock).findOnSpecificFrequency(anyInt(), anyInt());
+        assertFalse(mDut.find(2412, 1));
+        // Check that service is still alive.
+        assertTrue(mDut.isInitializationComplete());
     }
 
     /**
diff --git a/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalHidlImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalHidlImplTest.java
index 3a9cd03..662da17 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalHidlImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalHidlImplTest.java
@@ -410,11 +410,11 @@
     public void testFind_success() throws Exception {
         when(mISupplicantP2pIfaceMock.find(anyInt())).thenReturn(mStatusSuccess);
         // Default value when service is not yet initialized.
-        assertFalse(mDut.find(1));
+        assertFalse(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_FULL, 1));
 
         executeAndValidateInitializationSequence(false, false, false);
-        assertTrue(mDut.find(1));
-        assertFalse(mDut.find(-1));
+        assertTrue(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_FULL, 1));
+        assertFalse(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_FULL, -1));
     }
 
     /**
@@ -424,7 +424,7 @@
     public void testFind_failure() throws Exception {
         executeAndValidateInitializationSequence(false, false, false);
         when(mISupplicantP2pIfaceMock.find(anyInt())).thenReturn(mStatusFailure);
-        assertFalse(mDut.find(1));
+        assertFalse(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_FULL, 1));
         // Check that service is still alive.
         assertTrue(mDut.isInitializationComplete());
     }
@@ -436,7 +436,7 @@
     public void testFind_exception() throws Exception {
         executeAndValidateInitializationSequence(false, false, false);
         when(mISupplicantP2pIfaceMock.find(anyInt())).thenThrow(mRemoteException);
-        assertFalse(mDut.find(0));
+        assertFalse(mDut.find(WifiP2pManager.WIFI_P2P_SCAN_FULL, 0));
         // Check service is dead.
         assertFalse(mDut.isInitializationComplete());
     }
diff --git a/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalTest.java b/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalTest.java
index 6258cea..da0557e 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/p2p/SupplicantP2pIfaceHalTest.java
@@ -33,6 +33,7 @@
 import android.net.wifi.p2p.WifiP2pConfig;
 import android.net.wifi.p2p.WifiP2pGroup;
 import android.net.wifi.p2p.WifiP2pGroupList;
+import android.net.wifi.p2p.WifiP2pManager;
 import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
 
 import com.android.server.wifi.WifiGlobals;
@@ -232,9 +233,10 @@
     public void testFind() {
         initializeWithAidlImpl(true);
         int timeout = 5;
-        when(mP2pIfaceHalAidlMock.find(anyInt())).thenReturn(true);
-        assertTrue(mDut.find(timeout));
-        verify(mP2pIfaceHalAidlMock).find(eq(timeout));
+        int freq = WifiP2pManager.WIFI_P2P_SCAN_FULL;
+        when(mP2pIfaceHalAidlMock.find(anyInt(), anyInt())).thenReturn(true);
+        assertTrue(mDut.find(freq, timeout));
+        verify(mP2pIfaceHalAidlMock).find(eq(freq), eq(timeout));
     }
 
     /**
diff --git a/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pNativeTest.java b/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pNativeTest.java
index 0b133a4..2f93b7c 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pNativeTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pNativeTest.java
@@ -296,9 +296,10 @@
      */
     @Test
     public void testP2pFindIndefinitely() {
-        when(mSupplicantP2pIfaceHalMock.find(anyInt())).thenReturn(true);
+        when(mSupplicantP2pIfaceHalMock.find(anyInt(), anyInt())).thenReturn(true);
         assertTrue(mWifiP2pNative.p2pFind());
-        verify(mSupplicantP2pIfaceHalMock).find(eq(0));
+        verify(mSupplicantP2pIfaceHalMock).find(eq(
+                WifiP2pManager.WIFI_P2P_SCAN_FULL), eq(0));
     }
 
     /**
@@ -306,9 +307,10 @@
      */
     @Test
     public void testP2pFindWithTimeout() {
-        when(mSupplicantP2pIfaceHalMock.find(anyInt())).thenReturn(true);
+        when(mSupplicantP2pIfaceHalMock.find(anyInt(), anyInt())).thenReturn(true);
         assertTrue(mWifiP2pNative.p2pFind(TEST_P2P_FIND_TIMEOUT));
-        verify(mSupplicantP2pIfaceHalMock).find(eq(TEST_P2P_FIND_TIMEOUT));
+        verify(mSupplicantP2pIfaceHalMock).find(
+                eq(WifiP2pManager.WIFI_P2P_SCAN_FULL), eq(TEST_P2P_FIND_TIMEOUT));
     }
 
     /**
diff --git a/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java
index 62ba6fb..ae5e11a 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java
@@ -1513,7 +1513,7 @@
     public void testDiscoverPeersFailureWhenNoChannelUpdated() throws Exception {
         forceP2pEnabled(mClient1);
         sendDiscoverPeersMsg(mClientMessenger);
-        verify(mWifiNative, never()).p2pFind(anyInt());
+        verify(mWifiNative, never()).p2pFind(anyInt(), anyInt());
         assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_FAILED));
     }
 
@@ -1528,7 +1528,7 @@
                 .when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
         sendChannelInfoUpdateMsg("testPkg1", "testFeature", mClient1, mClientMessenger);
         sendDiscoverPeersMsg(mClientMessenger);
-        verify(mWifiNative, never()).p2pFind(anyInt());
+        verify(mWifiNative, never()).p2pFind(anyInt(), anyInt());
         assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_FAILED));
     }
 
@@ -1550,7 +1550,7 @@
         }
         sendChannelInfoUpdateMsg("testPkg1", "testFeature", mClient1, mClientMessenger);
         sendDiscoverPeersMsg(mClientMessenger);
-        verify(mWifiNative, never()).p2pFind(anyInt());
+        verify(mWifiNative, never()).p2pFind(anyInt(), anyInt());
         if (SdkLevel.isAtLeastT()) {
             verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
                     any(), eq(true), any());
@@ -1577,7 +1577,7 @@
                 eq(true))).thenReturn(false);
         sendChannelInfoUpdateMsg("testPkg1", "testFeature", mClient1, mClientMessenger);
         sendDiscoverPeersMsg(mClientMessenger);
-        verify(mWifiNative, never()).p2pFind(anyInt());
+        verify(mWifiNative, never()).p2pFind(anyInt(), anyInt());
         verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq("testPkg1"),
                 eq("testFeature"), anyInt(), eq(true));
         assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_FAILED));
@@ -1590,10 +1590,10 @@
     public void testDiscoverPeersSuccess() throws Exception {
         setTargetSdkGreaterThanT();
         forceP2pEnabled(mClient1);
-        when(mWifiNative.p2pFind(anyInt())).thenReturn(true);
+        when(mWifiNative.p2pFind(anyInt(), anyInt())).thenReturn(true);
         sendChannelInfoUpdateMsg("testPkg1", "testFeature", mClient1, mClientMessenger);
         sendDiscoverPeersMsg(mClientMessenger);
-        verify(mWifiNative).p2pFind(anyInt());
+        verify(mWifiNative).p2pFind(anyInt(), anyInt());
         if (SdkLevel.isAtLeastT()) {
             verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
                     any(), eq(true), any());
@@ -1613,10 +1613,10 @@
     public void testDiscoverPeersFailureWhenNativeCallFailure() throws Exception {
         setTargetSdkGreaterThanT();
         forceP2pEnabled(mClient1);
-        when(mWifiNative.p2pFind(anyInt())).thenReturn(false);
+        when(mWifiNative.p2pFind(anyInt(), anyInt())).thenReturn(false);
         sendChannelInfoUpdateMsg("testPkg1", "testFeature", mClient1, mClientMessenger);
         sendDiscoverPeersMsg(mClientMessenger);
-        verify(mWifiNative).p2pFind(anyInt());
+        verify(mWifiNative).p2pFind(anyInt(), anyInt());
         if (SdkLevel.isAtLeastT()) {
             verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
                     any(), eq(true), any());
@@ -1685,7 +1685,7 @@
         sendAddServiceRequestMsg(mClientMessenger);
         sendDiscoverServiceMsg(mClientMessenger);
         verify(mWifiNative, never()).p2pServDiscReq(anyString(), anyString());
-        verify(mWifiNative, never()).p2pFind(anyInt());
+        verify(mWifiNative, never()).p2pFind(anyInt(), anyInt());
         if (SdkLevel.isAtLeastT()) {
             verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
                     any(), eq(true), any());
@@ -1716,7 +1716,7 @@
         sendAddServiceRequestMsg(mClientMessenger);
         sendDiscoverServiceMsg(mClientMessenger);
         verify(mWifiNative, never()).p2pServDiscReq(anyString(), anyString());
-        verify(mWifiNative, never()).p2pFind(anyInt());
+        verify(mWifiNative, never()).p2pFind(anyInt(), anyInt());
         verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq("testPkg1"),
                 eq("testFeature"), anyInt(), eq(true));
         assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_SERVICES_FAILED));
@@ -1761,7 +1761,7 @@
         sendAddServiceRequestMsg(mClientMessenger);
         sendDiscoverServiceMsg(mClientMessenger);
         verify(mWifiNative).p2pServDiscReq(anyString(), anyString());
-        verify(mWifiNative, never()).p2pFind(anyInt());
+        verify(mWifiNative, never()).p2pFind(anyInt(), anyInt());
         if (SdkLevel.isAtLeastT()) {
             verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
                     any(), eq(true), any());
@@ -2227,7 +2227,7 @@
     public void testPeerScanMetricWhenSendDiscoverPeers() throws Exception {
         setTargetSdkGreaterThanT();
         forceP2pEnabled(mClient1);
-        when(mWifiNative.p2pFind(anyInt())).thenReturn(true);
+        when(mWifiNative.p2pFind(anyInt(), anyInt())).thenReturn(true);
         sendChannelInfoUpdateMsg("testPkg1", "testFeature", mClient1, mClientMessenger);
         sendDiscoverPeersMsg(mClientMessenger);
         verify(mWifiP2pMetrics).incrementPeerScans();
@@ -4262,10 +4262,10 @@
                 anyInt(), anyBoolean())).thenReturn(false);
         when(mWifiPermissionsUtil.checkCanAccessWifiDirect(eq("testPkg1"), eq("testFeature"),
                 anyInt(), anyBoolean())).thenReturn(true);
-        when(mWifiNative.p2pFind(anyInt())).thenReturn(true);
+        when(mWifiNative.p2pFind(anyInt(), anyInt())).thenReturn(true);
         sendChannelInfoUpdateMsg("testPkg1", "testFeature", mClient1, mClientMessenger);
         sendDiscoverPeersMsg(mClientMessenger);
-        verify(mWifiNative).p2pFind(anyInt());
+        verify(mWifiNative).p2pFind(anyInt(), anyInt());
         verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
                 eq("testPkg1"), eq("testFeature"), anyInt(), eq(true));