Wifi: abort ongoing scan on p2p group join

If P2P connection is requested while STA scan is ongoing, it takes time
to establish connection because of waiting for STA scan completion.

Bug: 131378508
Test: atest FrameworksWifiTests
Change-Id: I0f1ec33236ad75b1300684ee375362a1f6431b8a
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index 080b76d..3fbd58e 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -228,7 +228,7 @@
                 wifiHandler, new Random(), this);
         mWifiP2pMonitor = new WifiP2pMonitor(this);
         mSupplicantP2pIfaceHal = new SupplicantP2pIfaceHal(mWifiP2pMonitor);
-        mWifiP2pNative = new WifiP2pNative(
+        mWifiP2pNative = new WifiP2pNative(this,
                 mWifiVendorHal, mSupplicantP2pIfaceHal, mHalDeviceManager,
                 mPropertyService);
 
@@ -786,4 +786,8 @@
         }
         return mNetdWrapper;
     }
+
+    public WifiCondManager getWifiCondManager() {
+        return mWifiCondManager;
+    }
 }
diff --git a/service/java/com/android/server/wifi/p2p/WifiP2pNative.java b/service/java/com/android/server/wifi/p2p/WifiP2pNative.java
index 7eba9d3..0732510 100644
--- a/service/java/com/android/server/wifi/p2p/WifiP2pNative.java
+++ b/service/java/com/android/server/wifi/p2p/WifiP2pNative.java
@@ -24,14 +24,19 @@
 import android.net.wifi.p2p.WifiP2pGroup;
 import android.net.wifi.p2p.WifiP2pGroupList;
 import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
+import android.net.wifi.wificond.WifiCondManager;
 import android.os.Handler;
 import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.server.wifi.HalDeviceManager;
 import com.android.server.wifi.PropertyService;
+import com.android.server.wifi.WifiInjector;
+import com.android.server.wifi.WifiNative;
 import com.android.server.wifi.WifiVendorHal;
 
+import java.util.Set;
+
 /**
  * Native calls for bring up/shut down of the supplicant daemon and for
  * sending requests to the supplicant daemon
@@ -42,6 +47,7 @@
     private static final String TAG = "WifiP2pNative";
     private boolean mVerboseLoggingEnabled = false;
     private final SupplicantP2pIfaceHal mSupplicantP2pIfaceHal;
+    private final WifiInjector mWifiInjector;
     private final HalDeviceManager mHalDeviceManager;
     private final PropertyService mPropertyService;
     private final WifiVendorHal mWifiVendorHal;
@@ -108,9 +114,10 @@
         }
     }
 
-    public WifiP2pNative(WifiVendorHal wifiVendorHal,
+    public WifiP2pNative(WifiInjector wifiInjector, WifiVendorHal wifiVendorHal,
             SupplicantP2pIfaceHal p2pIfaceHal, HalDeviceManager halDeviceManager,
             PropertyService propertyService) {
+        mWifiInjector = wifiInjector;
         mWifiVendorHal = wifiVendorHal;
         mSupplicantP2pIfaceHal = p2pIfaceHal;
         mHalDeviceManager = halDeviceManager;
@@ -597,6 +604,7 @@
             default:
                 freq = config.groupOwnerBand;
         }
+        abortWifiRunningScanIfNeeded(join);
         return mSupplicantP2pIfaceHal.groupAdd(
                 config.networkName,
                 config.passphrase,
@@ -604,6 +612,18 @@
                 freq, config.deviceAddress, join);
     }
 
+    private void abortWifiRunningScanIfNeeded(boolean isJoin) {
+        if (!isJoin) return;
+
+        WifiCondManager wifiCondManager = mWifiInjector.getWifiCondManager();
+        WifiNative wifiNative = mWifiInjector.getWifiNative();
+        Set<String> wifiClientInterfaces = wifiNative.getClientInterfaceNames();
+
+        for (String interfaceName: wifiClientInterfaces) {
+            wifiCondManager.abortScan(interfaceName);
+        }
+    }
+
     /**
      * Terminate a P2P group. If a new virtual network interface was used for
      * the group, it must also be removed. The network interface name of the
diff --git a/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pNativeInterfaceManagementTest.java b/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pNativeInterfaceManagementTest.java
index eb48b71..48a4334 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pNativeInterfaceManagementTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pNativeInterfaceManagementTest.java
@@ -42,6 +42,7 @@
 import com.android.server.wifi.HalDeviceManager.ManagerStatusListener;
 import com.android.server.wifi.PropertyService;
 import com.android.server.wifi.WifiBaseTest;
+import com.android.server.wifi.WifiInjector;
 import com.android.server.wifi.WifiVendorHal;
 
 import org.junit.Before;
@@ -68,6 +69,7 @@
     @Mock private IWifiP2pIface mIWifiP2pIface;
     @Mock private IWifiIface mIWifiIface;
     @Mock private WifiVendorHal mWifiVendorHal;
+    @Mock private WifiInjector mWifiInjector;
     private WifiP2pNative mWifiP2pNative;
     private WifiStatus mWifiStatusSuccess;
     private ManagerStatusListener mManagerStatusListener;
@@ -98,7 +100,7 @@
         when(mPropertyService.getString(P2P_INTERFACE_PROPERTY, P2P_IFACE_NAME))
               .thenReturn(P2P_IFACE_NAME);
 
-        mWifiP2pNative = new WifiP2pNative(
+        mWifiP2pNative = new WifiP2pNative(mWifiInjector,
                               mWifiVendorHal, mSupplicantP2pIfaceHal, mHalDeviceManager,
                               mPropertyService);
     }
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 045b175..41952d7 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
@@ -37,6 +37,7 @@
 import android.net.wifi.p2p.WifiP2pManager;
 import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo;
 import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
+import android.net.wifi.wificond.WifiCondManager;
 import android.os.Handler;
 
 import androidx.test.filters.SmallTest;
@@ -44,6 +45,8 @@
 import com.android.server.wifi.HalDeviceManager;
 import com.android.server.wifi.PropertyService;
 import com.android.server.wifi.WifiBaseTest;
+import com.android.server.wifi.WifiInjector;
+import com.android.server.wifi.WifiNative;
 import com.android.server.wifi.WifiVendorHal;
 
 import org.junit.Before;
@@ -52,6 +55,9 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * Unit tests for {@link com.android.server.wifi.WifiP2pMonitor}.
  */
@@ -77,6 +83,9 @@
     private static final String TEST_NFC_SELECT_MSG = "select";
     private static final String TEST_CLIENT_LIST = "aa:bb:cc:dd:ee:ff 11:22:33:44:55:66";
 
+    @Mock private WifiInjector mWifiInjector;
+    @Mock private WifiCondManager mWifiCondManager;
+    @Mock private WifiNative mWifiNative;
     @Mock private WifiVendorHal mWifiVendorHalMock;
     @Mock private SupplicantP2pIfaceHal mSupplicantP2pIfaceHalMock;
     @Mock private HalDeviceManager mHalDeviceManagerMock;
@@ -85,6 +94,7 @@
 
     private WifiP2pNative mWifiP2pNative;
     private WifiP2pGroupList mWifiP2pGroupList = new WifiP2pGroupList();
+    private Set<String> mWifiClientInterfaceNames = new HashSet<String>();
 
     private WifiP2pGroup createP2pGroup(
             int networkId, String networkName, String passphrase, boolean isGo, String goAddr) {
@@ -100,12 +110,22 @@
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
+
+        mWifiClientInterfaceNames.add("wlan0");
+        mWifiClientInterfaceNames.add("wlan1");
+
         mWifiP2pNative = new WifiP2pNative(
+                mWifiInjector,
                 mWifiVendorHalMock,
                 mSupplicantP2pIfaceHalMock,
                 mHalDeviceManagerMock,
                 mPropertyServiceMock);
 
+        when(mWifiInjector.getWifiCondManager()).thenReturn(mWifiCondManager);
+        when(mWifiInjector.getWifiNative()).thenReturn(mWifiNative);
+
+        when(mWifiNative.getClientInterfaceNames()).thenReturn(mWifiClientInterfaceNames);
+
         mWifiP2pGroupList.add(
                 createP2pGroup(1, "testGroup1", "passphrase", true, "aa:bb:cc:dd:ee:f0"));
         mWifiP2pGroupList.add(
@@ -423,6 +443,10 @@
                 .build();
         assertTrue(mWifiP2pNative.p2pGroupAdd(config, true));
 
+        for (String intf: mWifiClientInterfaceNames) {
+            verify(mWifiCondManager).abortScan(eq(intf));
+        }
+
         verify(mSupplicantP2pIfaceHalMock).groupAdd(
                 eq(TEST_NETWORK_NAME),
                 eq(TEST_PASSPHRASE),