Abort ongoing STA scan to prioritize P2P scan

When P2P scan is requested while STA scan is ongoing, it takes time to
get P2P scan result. STA scan should be stopped when P2P scan is
requested.

Bug: 37227357
Test: Manual test

Depends-On: Ifc4b81de8ec1d75467edf497abfe348c4ce1b283

Change-Id: I2fdb8307ae5b79dd205b3c2169f4e3ef579920a1
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index 8173853..edf3969 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -161,7 +161,7 @@
         mWifiP2pMonitor = new WifiP2pMonitor(this);
         mSupplicantP2pIfaceHal = new SupplicantP2pIfaceHal(mWifiP2pMonitor);
         mWifiP2pNative = new WifiP2pNative(SystemProperties.get("wifi.direct.interface", "p2p0"),
-                mSupplicantP2pIfaceHal);
+                mSupplicantP2pIfaceHal, mWificondControl);
 
         // Now get instances of all the objects that depend on the HandlerThreads
         mTrafficPoller =  new WifiTrafficPoller(mContext, mWifiServiceHandlerThread.getLooper(),
diff --git a/service/java/com/android/server/wifi/WificondControl.java b/service/java/com/android/server/wifi/WificondControl.java
index fdd0faf..8be7478 100644
--- a/service/java/com/android/server/wifi/WificondControl.java
+++ b/service/java/com/android/server/wifi/WificondControl.java
@@ -465,4 +465,22 @@
         return false;
     }
 
+    /**
+     * Abort ongoing single scan triggered by wificond.
+     * @return Returns true on success.
+     */
+    public boolean abortScan() {
+        if (mWificondScanner == null) {
+            Log.e(TAG, "No valid wificond scanner interface handler");
+            return false;
+        }
+
+        try {
+            return mWificondScanner.abortScan();
+        } catch (RemoteException e1) {
+            Log.e(TAG, "Failed to request abortScan due to remote exception");
+        }
+        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 bae3faa..5de6585 100644
--- a/service/java/com/android/server/wifi/p2p/WifiP2pNative.java
+++ b/service/java/com/android/server/wifi/p2p/WifiP2pNative.java
@@ -21,6 +21,8 @@
 import android.net.wifi.p2p.WifiP2pGroupList;
 import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
 
+import com.android.server.wifi.WificondControl;
+
 /**
  * Native calls for bring up/shut down of the supplicant daemon and for
  * sending requests to the supplicant daemon
@@ -31,11 +33,14 @@
     private final String mTAG;
     private final String mInterfaceName;
     private final SupplicantP2pIfaceHal mSupplicantP2pIfaceHal;
+    private final WificondControl mWificondControl;
 
-    public WifiP2pNative(String interfaceName, SupplicantP2pIfaceHal p2pIfaceHal) {
+    public WifiP2pNative(String interfaceName, SupplicantP2pIfaceHal p2pIfaceHal,
+            WificondControl wificondcontrol) {
         mTAG = "WifiP2pNative-" + interfaceName;
         mInterfaceName = interfaceName;
         mSupplicantP2pIfaceHal = p2pIfaceHal;
+        mWificondControl = wificondcontrol;
     }
 
     public String getInterfaceName() {
@@ -247,6 +252,7 @@
      * @return boolean value indicating whether operation was successful.
      */
     public boolean p2pFind(int timeout) {
+        abortScan();
         return mSupplicantP2pIfaceHal.find(timeout);
     }
 
@@ -597,4 +603,13 @@
     public boolean saveConfig() {
         return mSupplicantP2pIfaceHal.saveConfig();
     }
+
+    /**
+     * Abort ongoing single scan triggered by wificond.
+     *
+     * @return true on success, false otherwise.
+     */
+    private boolean abortScan() {
+        return mWificondControl.abortScan();
+    }
 }