Add local serivce for WifiScanner and migrate wifi framework to use
local service.

Migrating the Wifi framework scanning to use the local service introduced for WifiScanner.
The local service serves the same process wifi framework scanner client
without going through the WifiScanner system service, and avoid creating
extra wifi scanner thread in system_server.

Bug: 248062698
Bug: 237211240
Test: atest FrameworksWifiTests

Change-Id: I0cf580f3731fda96ba3cd5b19618c383fe5584b5
diff --git a/service/java/com/android/server/wifi/ScanRequestProxy.java b/service/java/com/android/server/wifi/ScanRequestProxy.java
index 9f1d35d..a9fd9af 100644
--- a/service/java/com/android/server/wifi/ScanRequestProxy.java
+++ b/service/java/com/android/server/wifi/ScanRequestProxy.java
@@ -40,8 +40,8 @@
 import android.util.Pair;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.modules.utils.HandlerExecutor;
 import com.android.modules.utils.build.SdkLevel;
+import com.android.server.wifi.scanner.WifiScannerInternal;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.wifi.resources.R;
 
@@ -97,7 +97,7 @@
     private final WifiMetrics mWifiMetrics;
     private final Clock mClock;
     private final WifiSettingsConfigStore mSettingsConfigStore;
-    private WifiScanner mWifiScanner;
+    private WifiScannerInternal mWifiScanner;
 
     // Verbose logging flag.
     private boolean mVerboseLoggingEnabled = false;
@@ -119,7 +119,6 @@
     private final Map<String, ScanResult> mLastScanResultsMap = new HashMap<>();
     // external ScanResultCallback tracker
     private final RemoteCallbackList<IScanResultsCallback> mRegisteredScanResultsCallbacks;
-    // Global scan listener for listening to all scan requests.
     private class GlobalScanListener implements WifiScanner.ScanListener {
         @Override
         public void onSuccess() {
@@ -230,7 +229,7 @@
      */
     private boolean retrieveWifiScannerIfNecessary() {
         if (mWifiScanner == null) {
-            mWifiScanner = mWifiInjector.getWifiScanner();
+            mWifiScanner = WifiLocalServices.getService(WifiScannerInternal.class);
             // Start listening for throttle settings change after we retrieve scanner instance.
             mThrottleEnabled = mSettingsConfigStore.get(WIFI_SCAN_THROTTLE_ENABLED);
             if (mVerboseLoggingEnabled) {
@@ -239,7 +238,7 @@
             // Register the global scan listener.
             if (mWifiScanner != null) {
                 mWifiScanner.registerScanListener(
-                        new HandlerExecutor(mHandler), new GlobalScanListener());
+                        new WifiScannerInternal.ScanListener(new GlobalScanListener(), mHandler));
             }
         }
         return mWifiScanner != null;
@@ -495,8 +494,9 @@
                     mWifiInjector.getWifiNetworkSuggestionsManager()
                     .retrieveHiddenNetworkList(false));
         }
-        mWifiScanner.startScan(settings, new HandlerExecutor(mHandler),
-                new ScanRequestProxyScanListener(), workSource);
+        mWifiScanner.startScan(settings,
+                new WifiScannerInternal.ScanListener(new ScanRequestProxyScanListener(), mHandler),
+                workSource);
         return true;
     }
 
diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java
index 1e46e3b..926a4db 100644
--- a/service/java/com/android/server/wifi/WifiConnectivityManager.java
+++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java
@@ -60,9 +60,9 @@
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.modules.utils.HandlerExecutor;
 import com.android.modules.utils.build.SdkLevel;
 import com.android.server.wifi.hotspot2.PasspointManager;
+import com.android.server.wifi.scanner.WifiScannerInternal;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.wifi.resources.R;
 
@@ -178,7 +178,7 @@
     private final FrameworkFacade mFrameworkFacade;
     private final WifiPermissionsUtil mWifiPermissionsUtil;
 
-    private WifiScanner mScanner;
+    private WifiScannerInternal mScanner;
     private final MultiInternetManager mMultiInternetManager;
     private boolean mDbg = false;
     private boolean mVerboseLoggingEnabled = false;
@@ -322,8 +322,9 @@
                         settings.channels[index++] = new WifiScanner.ChannelSpec(freq);
                     }
                     SingleScanListener singleScanListener = new SingleScanListener(false);
-                    mScanner.startScan(settings, new HandlerExecutor(mEventHandler),
-                            singleScanListener, WIFI_WORK_SOURCE);
+                    mScanner.startScan(settings,
+                            new WifiScannerInternal.ScanListener(singleScanListener,
+                                    mEventHandler));
                     mWifiMetrics.incrementConnectivityOneshotScanCount();
                 }
             };
@@ -850,7 +851,7 @@
         @Override
         public void onFailure(int reason, String description) {
             localLog("registerScanListener onFailure:"
-                      + " reason: " + reason + " description: " + description);
+                    + " reason: " + reason + " description: " + description);
         }
 
         @Override
@@ -965,7 +966,8 @@
         }
     }
 
-    private final AllSingleScanListener mAllSingleScanListener = new AllSingleScanListener();
+    private final AllSingleScanListener mAllSingleScanListener;
+    private final WifiScannerInternal.ScanListener mInternalAllSingleScanListener;
 
     // Single scan results listener. A single scan is initiated when
     // DisconnectedPNO scan found a valid network and woke up
@@ -1119,7 +1121,8 @@
         }
     }
 
-    private final PnoScanListener mPnoScanListener = new PnoScanListener();
+    private final PnoScanListener mPnoScanListener;
+    private final WifiScannerInternal.ScanListener mInternalPnoScanListener;
 
     private class OnNetworkUpdateListener implements
             WifiConfigManager.OnNetworkUpdateListener {
@@ -1299,6 +1302,12 @@
         mActiveModeWarden.registerModeChangeCallback(new ModeChangeCallback());
         mMultiInternetManager.setConnectionStatusListener(
                 new InternalMultiInternetConnectionStatusListener());
+        mAllSingleScanListener = new AllSingleScanListener();
+        mInternalAllSingleScanListener = new WifiScannerInternal.ScanListener(
+                mAllSingleScanListener, mEventHandler);
+        mPnoScanListener = new PnoScanListener();
+        mInternalPnoScanListener = new WifiScannerInternal.ScanListener(mPnoScanListener,
+                mEventHandler);
     }
 
     @NonNull
@@ -2055,8 +2064,8 @@
 
         SingleScanListener singleScanListener =
                 new SingleScanListener(isFullBandScan);
-        mScanner.startScan(
-                settings, new HandlerExecutor(mEventHandler), singleScanListener, workSource);
+        mScanner.startScan(settings,
+                new WifiScannerInternal.ScanListener(singleScanListener, mEventHandler));
         mWifiMetrics.incrementConnectivityOneshotScanCount();
     }
 
@@ -2196,8 +2205,8 @@
         scanSettings.numBssidsPerScan = 0;
         scanSettings.periodInMs = deviceMobilityStateToPnoScanIntervalMs(mDeviceMobilityState);
 
-        mScanner.startDisconnectedPnoScan(
-                scanSettings, pnoSettings, new HandlerExecutor(mEventHandler), mPnoScanListener);
+        pnoSettings.isConnected = false;
+        mScanner.startPnoScan(scanSettings, pnoSettings, mInternalPnoScanListener);
         mPnoScanStarted = true;
         mWifiMetrics.logPnoScanStart();
     }
@@ -2318,7 +2327,7 @@
     private void stopPnoScan() {
         if (!mPnoScanStarted) return;
 
-        mScanner.stopPnoScan(mPnoScanListener);
+        mScanner.stopPnoScan(mInternalPnoScanListener);
         mPnoScanStarted = false;
         mWifiMetrics.logPnoScanStop();
     }
@@ -2997,10 +3006,10 @@
      */
     private void retrieveWifiScanner() {
         if (mScanner != null) return;
-        mScanner = Objects.requireNonNull(mContext.getSystemService(WifiScanner.class),
+        mScanner = Objects.requireNonNull(WifiLocalServices.getService(WifiScannerInternal.class),
                 "Got a null instance of WifiScanner!");
         // Register for all single scan results
-        mScanner.registerScanListener(new HandlerExecutor(mEventHandler), mAllSingleScanListener);
+        mScanner.registerScanListener(mInternalAllSingleScanListener);
     }
 
     /**
diff --git a/service/java/com/android/server/wifi/WifiHealthMonitor.java b/service/java/com/android/server/wifi/WifiHealthMonitor.java
index b8eb075..7c26902 100644
--- a/service/java/com/android/server/wifi/WifiHealthMonitor.java
+++ b/service/java/com/android/server/wifi/WifiHealthMonitor.java
@@ -44,6 +44,7 @@
 import com.android.server.wifi.proto.WifiStatsLog;
 import com.android.server.wifi.proto.nano.WifiMetricsProto.HealthMonitorFailureStats;
 import com.android.server.wifi.proto.nano.WifiMetricsProto.HealthMonitorMetrics;
+import com.android.server.wifi.scanner.WifiScannerInternal;
 
 import com.google.protobuf.InvalidProtocolBufferException;
 
@@ -110,7 +111,7 @@
     private final WifiInjector mWifiInjector;
     private final DeviceConfigFacade mDeviceConfigFacade;
     private final ActiveModeWarden mActiveModeWarden;
-    private WifiScanner mScanner;
+    private WifiScannerInternal mScanner;
     private MemoryStore mMemoryStore;
     private boolean mWifiEnabled;
     private WifiSystemInfoStats mWifiSystemInfoStats;
@@ -266,10 +267,11 @@
      */
     private void retrieveWifiScanner() {
         if (mScanner != null) return;
-        mScanner = mWifiInjector.getWifiScanner();
+        mScanner = WifiLocalServices.getService(WifiScannerInternal.class);
         if (mScanner == null) return;
         // Register for all single scan results
-        mScanner.registerScanListener(new ScanListener());
+        mScanner.registerScanListener(
+                new WifiScannerInternal.ScanListener(new ScanListener(), mHandler));
     }
 
     /**
diff --git a/service/java/com/android/server/wifi/WifiLocalServices.java b/service/java/com/android/server/wifi/WifiLocalServices.java
new file mode 100644
index 0000000..6702269
--- /dev/null
+++ b/service/java/com/android/server/wifi/WifiLocalServices.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wifi;
+
+import android.util.ArrayMap;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * This class is used in a similar way as ServiceManager, except the services registered here
+ * are not Binder objects and are only available in the same process.
+ *
+ * Once all services are converted to the SystemService interface, this class can be absorbed
+ * into SystemServiceManager.
+ *
+ */
+public final class WifiLocalServices {
+    private WifiLocalServices() {}
+
+    private static final ArrayMap<Class<?>, Object> sLocalServiceObjects =
+            new ArrayMap<Class<?>, Object>();
+
+    /**
+     * Returns a local service instance that implements the specified interface.
+     *
+     * @param type The type of service.
+     * @return The service object.
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getService(Class<T> type) {
+        synchronized (sLocalServiceObjects) {
+            return (T) sLocalServiceObjects.get(type);
+        }
+    }
+
+    /**
+     * Adds a service instance of the specified interface to the global registry of local services.
+     */
+    public static <T> void addService(Class<T> type, T service) {
+        synchronized (sLocalServiceObjects) {
+            if (sLocalServiceObjects.containsKey(type)) {
+                throw new IllegalStateException("Overriding service registration");
+            }
+            sLocalServiceObjects.put(type, service);
+        }
+    }
+
+    /**
+     * Remove a service instance, must be only used in tests.
+     */
+    @VisibleForTesting
+    public static <T> void removeServiceForTest(Class<T> type) {
+        synchronized (sLocalServiceObjects) {
+            sLocalServiceObjects.remove(type);
+        }
+    }
+}
diff --git a/service/java/com/android/server/wifi/scanner/WifiScannerInternal.java b/service/java/com/android/server/wifi/scanner/WifiScannerInternal.java
new file mode 100644
index 0000000..148f15e
--- /dev/null
+++ b/service/java/com/android/server/wifi/scanner/WifiScannerInternal.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wifi.scanner;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.net.wifi.IWifiScannerListener;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiScanner;
+import android.os.Handler;
+import android.os.Process;
+import android.os.WorkSource;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * WifiScanner manager local system service interface.
+ *
+ * @hide Only for use within the system server.
+ */
+public abstract class WifiScannerInternal {
+
+    /**
+     * Local scan listener
+     */
+    public static class ScanListener extends IWifiScannerListener.Stub {
+        private static final String TAG = "WifiScannerInternal";
+        private final WifiScanner.ScanListener mScanListener;
+        private final Handler mHandler;
+
+        /**
+         * Local scan listener constructor
+         * @param scanListener WifiScanner listener
+         * @param handler handler for the listener
+         */
+        public ScanListener(WifiScanner.ScanListener scanListener, Handler handler) {
+            mScanListener = scanListener;
+            mHandler = handler;
+        }
+
+        /**
+         * Get the WifiScanner listener
+         * @hide
+         */
+        @VisibleForTesting
+        public WifiScanner.ScanListener getWifiScannerListener() {
+            return mScanListener;
+        }
+
+        @Override
+        public void onSuccess() {
+            mHandler.post(() -> {
+                mScanListener.onSuccess();
+            });
+        }
+
+        @Override
+        public void onFailure(int reason, String description) {
+            mHandler.post(() -> {
+                mScanListener.onFailure(reason, description);
+            });
+        }
+
+        @Override
+        public void onResults(WifiScanner.ScanData[] scanDatas) {
+            mHandler.post(() -> {
+                mScanListener.onResults(scanDatas);
+            });
+        }
+
+        @Override
+        public void onFullResult(ScanResult fullScanResult) {
+            mHandler.post(() -> {
+                mScanListener.onFullResult(fullScanResult);
+            });
+        }
+
+        @Override
+        public void onSingleScanCompleted() {
+            // Internal scan listener doesn't need to handle this.
+        }
+
+        @Override
+        public void onPnoNetworkFound(ScanResult[] scanResult) {
+            if (!(mScanListener instanceof WifiScanner.PnoScanListener)) {
+                Log.wtf(TAG, "Listener is not a PnoScanListener!");
+                return;
+            }
+            WifiScanner.PnoScanListener pnoScanListener =
+                    (WifiScanner.PnoScanListener) mScanListener;
+            mHandler.post(() -> {
+                pnoScanListener.onPnoNetworkFound(scanResult);
+            });
+        }
+    }
+
+    /**
+     * Enable/Disable wifi scanning.
+     *
+     * @param enable set true to enable scanning, false to disable all types of scanning.
+     */
+    public void setScanningEnabled(boolean enable) {
+    }
+
+    /**
+     * Register a listener that will receive results from all single scans.
+     * @param listener specifies the object to report events to.
+     */
+    public void registerScanListener(@NonNull ScanListener listener) {
+    }
+
+    /**
+     * Start a single scan.
+     * @param settings Wifi single scan setting
+     * @param listener listener to the scan
+     */
+    public void startScan(WifiScanner.ScanSettings settings, ScanListener listener) {
+        startScan(settings, listener, new WorkSource(Process.WIFI_UID));
+    }
+
+    /**
+     * Start a single scan.
+     * @param settings Wifi single scan setting
+     * @param listener listener to the scan
+     * @param workSource WorkSource to blame for power usage
+     */
+    public void startScan(WifiScanner.ScanSettings settings, ScanListener listener,
+            @Nullable WorkSource workSource) {
+    }
+
+    /**
+     * Stop a single scan.
+     * @param listener listener to the scan
+     */
+    public void stopScan(ScanListener listener) {
+    }
+
+    /**
+     * Start a PNO scan.
+     * @param scanSettings Wifi single scan setting
+     * @param pnoSettings Wifi pno scan setting
+     * @param listener listener to the scan
+     */
+    public void startPnoScan(WifiScanner.ScanSettings scanSettings,
+            WifiScanner.PnoSettings pnoSettings,
+            ScanListener listener) {
+    }
+
+    /**
+     * Stop a pno scan.
+     * @param listener listener to the scan
+     */
+    public void stopPnoScan(ScanListener listener) {
+    }
+
+    /**
+     * Get single scan results.
+     * @return the list of scan results
+     */
+    public List<ScanResult> getSingleScanResults() {
+        return Collections.emptyList();
+    }
+
+}
diff --git a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
index 52ba00b..cd1bae1 100644
--- a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
+++ b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
@@ -59,6 +59,7 @@
 import com.android.server.wifi.ClientModeImpl;
 import com.android.server.wifi.Clock;
 import com.android.server.wifi.WifiInjector;
+import com.android.server.wifi.WifiLocalServices;
 import com.android.server.wifi.WifiLog;
 import com.android.server.wifi.WifiMetrics;
 import com.android.server.wifi.WifiNative;
@@ -602,6 +603,7 @@
 
     public void startService() {
         mWifiThreadRunner.post(() -> {
+            WifiLocalServices.addService(WifiScannerInternal.class, new LocalService());
             mBackgroundScanStateMachine = new WifiBackgroundScanStateMachine(mLooper);
             mSingleScanStateMachine = new WifiSingleScanStateMachine(mLooper);
             mPnoScanStateMachine = new WifiPnoScanStateMachine(mLooper);
@@ -2766,6 +2768,54 @@
         }
     }
 
+    private class LocalService extends WifiScannerInternal {
+        @Override
+        public void setScanningEnabled(boolean enable) {
+            WifiScanningServiceImpl.this.setScanningEnabled(enable, Process.myTid(),
+                    mContext.getOpPackageName());
+        }
+
+        @Override
+        public void registerScanListener(@NonNull WifiScannerInternal.ScanListener listener) {
+            WifiScanningServiceImpl.this.registerScanListener(listener,
+                    mContext.getOpPackageName(), mContext.getAttributionTag());
+        }
+
+        @Override
+        public void startScan(WifiScanner.ScanSettings settings,
+                WifiScannerInternal.ScanListener listener,
+                @Nullable WorkSource workSource) {
+            WifiScanningServiceImpl.this.startScan(listener, settings, workSource,
+                    workSource.getPackageName(0), mContext.getAttributionTag());
+        }
+
+        @Override
+        public void stopScan(WifiScannerInternal.ScanListener listener) {
+            WifiScanningServiceImpl.this.stopScan(listener,
+                    mContext.getOpPackageName(), mContext.getAttributionTag());
+        }
+
+        @Override
+        public void startPnoScan(WifiScanner.ScanSettings scanSettings,
+                WifiScanner.PnoSettings pnoSettings,
+                WifiScannerInternal.ScanListener listener) {
+            WifiScanningServiceImpl.this.startPnoScan(listener,
+                    scanSettings, pnoSettings, mContext.getOpPackageName(),
+                    mContext.getAttributionTag());
+        }
+
+        @Override
+        public void stopPnoScan(WifiScannerInternal.ScanListener listener) {
+            WifiScanningServiceImpl.this.stopPnoScan(listener, mContext.getOpPackageName(),
+                    mContext.getAttributionTag());
+        }
+
+        @Override
+        public List<ScanResult> getSingleScanResults() {
+            return mSingleScanStateMachine.filterCachedScanResultsByAge();
+        }
+    }
+
     private static String toString(int uid, ScanSettings settings) {
         StringBuilder sb = new StringBuilder();
         sb.append("ScanSettings[uid=").append(uid);
diff --git a/service/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java b/service/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java
index 3c616d1..4302c4a 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java
@@ -39,12 +39,12 @@
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.UserHandle;
-import android.os.WorkSource;
 import android.os.test.TestLooper;
 
 import androidx.test.filters.SmallTest;
 
 import com.android.modules.utils.build.SdkLevel;
+import com.android.server.wifi.scanner.WifiScannerInternal;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.wifi.resources.R;
 
@@ -85,7 +85,7 @@
     @Mock private ActivityManager mActivityManager;
     @Mock private WifiInjector mWifiInjector;
     @Mock private WifiConfigManager mWifiConfigManager;
-    @Mock private WifiScanner mWifiScanner;
+    @Mock private WifiScannerInternal mWifiScanner;
     @Mock private WifiPermissionsUtil mWifiPermissionsUtil;
     @Mock private WifiMetrics mWifiMetrics;
     @Mock private WifiMetrics.ScanMetrics mScanMetrics;
@@ -94,22 +94,19 @@
     @Mock private WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager;
     @Mock private IScanResultsCallback mScanResultsCallback;
     @Mock private IScanResultsCallback mAnotherScanResultsCallback;
-    @Mock private TestLooper mLooper;
     @Mock private IBinder mBinder;
     @Mock private IBinder mAnotherBinder;
 
-    private ArgumentCaptor<WorkSource> mWorkSourceArgumentCaptor =
-            ArgumentCaptor.forClass(WorkSource.class);
     private ArgumentCaptor<WifiScanner.ScanSettings> mScanSettingsArgumentCaptor =
             ArgumentCaptor.forClass(WifiScanner.ScanSettings.class);
-    private ArgumentCaptor<WifiScanner.ScanListener> mScanRequestListenerArgumentCaptor =
-            ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
-    private ArgumentCaptor<WifiScanner.ScanListener> mGlobalScanListenerArgumentCaptor =
-            ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
+    private ArgumentCaptor<WifiScannerInternal.ScanListener> mScanRequestListenerArgumentCaptor =
+            ArgumentCaptor.forClass(WifiScannerInternal.ScanListener.class);
+    private ArgumentCaptor<WifiScannerInternal.ScanListener> mGlobalScanListenerArgumentCaptor =
+            ArgumentCaptor.forClass(WifiScannerInternal.ScanListener.class);
     private WifiScanner.ScanData[] mTestScanDatas1;
     private WifiScanner.ScanData[] mTestScanDatas2;
     private InOrder mInOrder;
-
+    private TestLooper mLooper;
     private ScanRequestProxy mScanRequestProxy;
     private MockResources mResources;
 
@@ -121,10 +118,11 @@
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-
+        mLooper = new TestLooper();
         mResources = getMockResources();
         when(mContext.getResources()).thenReturn(mResources);
-        when(mWifiInjector.getWifiScanner()).thenReturn(mWifiScanner);
+        WifiLocalServices.removeServiceForTest(WifiScannerInternal.class);
+        WifiLocalServices.addService(WifiScannerInternal.class, mWifiScanner);
         when(mWifiInjector.getWifiNetworkSuggestionsManager())
                 .thenReturn(mWifiNetworkSuggestionsManager);
         when(mWifiConfigManager.retrieveHiddenNetworkList(false /* autoJoinOnly */))
@@ -133,13 +131,10 @@
                 .thenReturn(TEST_HIDDEN_NETWORKS_LIST_NS);
         when(mWifiMetrics.getScanMetrics()).thenReturn(mScanMetrics);
         doNothing().when(mWifiScanner).registerScanListener(
-                any(),
                 mGlobalScanListenerArgumentCaptor.capture());
         doNothing().when(mWifiScanner).startScan(
                 mScanSettingsArgumentCaptor.capture(),
-                any(),
-                mScanRequestListenerArgumentCaptor.capture(),
-                mWorkSourceArgumentCaptor.capture());
+                mScanRequestListenerArgumentCaptor.capture(), any());
 
         mInOrder = inOrder(mWifiScanner, mWifiConfigManager,
                 mContext, mWifiNetworkSuggestionsManager);
@@ -154,7 +149,6 @@
 
         // Scan throttling is enabled by default.
         when(mWifiSettingsConfigStore.get(eq(WIFI_SCAN_THROTTLE_ENABLED))).thenReturn(true);
-        mLooper = new TestLooper();
         mScanRequestProxy =
             new ScanRequestProxy(mContext, mAppOps, mActivityManager, mWifiInjector,
                     mWifiConfigManager, mWifiPermissionsUtil, mWifiMetrics, mClock,
@@ -172,7 +166,7 @@
     private void enableScanning() {
         // Enable scanning
         mScanRequestProxy.enableScanning(true, false);
-        mInOrder.verify(mWifiScanner).registerScanListener(any(), any());
+        mInOrder.verify(mWifiScanner).registerScanListener(any());
         mInOrder.verify(mWifiScanner).setScanningEnabled(true);
         validateScanAvailableBroadcastSent(true);
 
@@ -201,7 +195,7 @@
     @Test
     public void testEnableScanning() {
         mScanRequestProxy.enableScanning(true, false);
-        mInOrder.verify(mWifiScanner).registerScanListener(any(), any());
+        mInOrder.verify(mWifiScanner).registerScanListener(any());
         mInOrder.verify(mWifiScanner).setScanningEnabled(true);
         validateScanAvailableBroadcastSent(true);
     }
@@ -212,7 +206,7 @@
     @Test
     public void testDisableScanning() {
         mScanRequestProxy.enableScanning(false, false);
-        mInOrder.verify(mWifiScanner).registerScanListener(any(), any());
+        mInOrder.verify(mWifiScanner).registerScanListener(any());
         mInOrder.verify(mWifiScanner).setScanningEnabled(false);
         validateScanAvailableBroadcastSent(false);
     }
@@ -234,10 +228,8 @@
     public void testStartScanSuccess() {
         enableScanning();
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
-        assertTrue(mWorkSourceArgumentCaptor.getValue().equals(
-                new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1)));
         validateScanSettings(mScanSettingsArgumentCaptor.getValue(), false);
 
         verifyScanMetricsDataWasSet();
@@ -251,10 +243,8 @@
         enableScanning();
         when(mWifiPermissionsUtil.checkNetworkSettingsPermission(TEST_UID)).thenReturn(true);
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
-        assertTrue(mWorkSourceArgumentCaptor.getValue().equals(
-                new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1)));
         validateScanSettings(mScanSettingsArgumentCaptor.getValue(), false, true);
         verifyScanMetricsDataWasSet(0, 1);
         if (SdkLevel.isAtLeastS()) {
@@ -271,10 +261,8 @@
         enableScanning();
         when(mWifiPermissionsUtil.checkNetworkSetupWizardPermission(TEST_UID)).thenReturn(true);
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
-        assertEquals(mWorkSourceArgumentCaptor.getValue(),
-                new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1));
         validateScanSettings(mScanSettingsArgumentCaptor.getValue(), false, true);
         verifyScanMetricsDataWasSet(0, 1);
     }
@@ -285,7 +273,7 @@
     @Test
     public void testStartScanWithHiddenNetworkScanningDisabled() {
         mScanRequestProxy.enableScanning(true, false);
-        mInOrder.verify(mWifiScanner).registerScanListener(any(), any());
+        mInOrder.verify(mWifiScanner).registerScanListener(any());
         mInOrder.verify(mWifiScanner).setScanningEnabled(true);
         validateScanAvailableBroadcastSent(true);
 
@@ -294,10 +282,8 @@
                 .retrieveHiddenNetworkList(false /* autoJoinOnly */);
         mInOrder.verify(mWifiNetworkSuggestionsManager, never())
                 .retrieveHiddenNetworkList(false /* autoJoinOnly */);
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
-        assertEquals(mWorkSourceArgumentCaptor.getValue(),
-                new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1));
         validateScanSettings(mScanSettingsArgumentCaptor.getValue(), false);
 
         verifyScanMetricsDataWasSet();
@@ -309,7 +295,7 @@
     @Test
     public void testStartScanWithHiddenNetworkScanningEnabled() {
         mScanRequestProxy.enableScanning(true, true);
-        mInOrder.verify(mWifiScanner).registerScanListener(any(), any());
+        mInOrder.verify(mWifiScanner).registerScanListener(any());
         mInOrder.verify(mWifiScanner).setScanningEnabled(true);
         validateScanAvailableBroadcastSent(true);
 
@@ -319,10 +305,8 @@
                 .retrieveHiddenNetworkList(false /* autoJoinOnly */);
         mInOrder.verify(mWifiNetworkSuggestionsManager)
                 .retrieveHiddenNetworkList(false /* autoJoinOnly */);
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
-        assertEquals(mWorkSourceArgumentCaptor.getValue(),
-                new WorkSource(TEST_UID, TEST_PACKAGE_NAME_1));
         validateScanSettings(mScanSettingsArgumentCaptor.getValue(), true);
 
         verifyScanMetricsDataWasSet();
@@ -332,12 +316,13 @@
      * Verify a successful scan request and processing of scan results.
      */
     @Test
-    public void testScanSuccess() {
+    public void testScanSuccess() throws Exception {
         // Make a scan request.
         testStartScanSuccess();
 
         // Verify the scan results processing.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
 
         // Validate the scan results in the cache.
@@ -354,12 +339,13 @@
      * Verify a successful scan request and processing of scan failure.
      */
     @Test
-    public void testScanFailure() {
+    public void testScanFailure() throws Exception {
         // Make a scan request.
         testStartScanSuccess();
 
         // Verify the scan failure processing.
         mScanRequestListenerArgumentCaptor.getValue().onFailure(0, "failed");
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(false);
 
         // Ensure scan results in the cache is empty.
@@ -373,13 +359,14 @@
      * Verify processing of successive successful scans.
      */
     @Test
-    public void testScanSuccessOverwritesPreviousResults() {
+    public void testScanSuccessOverwritesPreviousResults() throws Exception {
         enableScanning();
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Verify the scan results processing for request 1.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -390,9 +377,10 @@
 
         // Make scan request 2.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Verify the scan results processing for request 2.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas2);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -408,13 +396,14 @@
      * Verify processing of a successful scan followed by a failure.
      */
     @Test
-    public void testScanFailureDoesNotOverwritePreviousResults() {
+    public void testScanFailureDoesNotOverwritePreviousResults() throws Exception {
         enableScanning();
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Verify the scan results processing for request 1.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -425,9 +414,10 @@
 
         // Make scan request 2.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Verify the scan failure processing.
         mScanRequestListenerArgumentCaptor.getValue().onFailure(0, "failed");
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(false);
         // Validate the scan results from a previous successful scan in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -444,13 +434,14 @@
      * Verify that we send out two broadcasts (two successes).
      */
     @Test
-    public void testNewScanRequestAfterPreviousScanSucceeds() {
+    public void testNewScanRequestAfterPreviousScanSucceeds() throws Exception {
         enableScanning();
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Now send the scan results for request 1.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -462,9 +453,10 @@
         // Make scan request 2.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
         // Ensure that we did send a second scan request to scanner.
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Now send the scan results for request 2.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas2);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -482,15 +474,16 @@
      * Verify that we send out two broadcasts (one failure & one success).
      */
     @Test
-    public void testNewScanRequestAfterPreviousScanSucceedsWithInvalidScanDatas() {
+    public void testNewScanRequestAfterPreviousScanSucceedsWithInvalidScanDatas() throws Exception {
         enableScanning();
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         // Now send scan success for request 1, but with invalid scan datas.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(
                 new WifiScanner.ScanData[] {mTestScanDatas1[0], mTestScanDatas2[0]});
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(false);
         // Validate the scan results in the cache.
         assertTrue(mScanRequestProxy.getScanResults().isEmpty());
@@ -499,9 +492,10 @@
         // Make scan request 2.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
         // Ensure that we did send a second scan request to scanner.
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Now send the scan results for request 2.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas2);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -519,14 +513,15 @@
      * Verify that we send out two broadcasts (one failure & one success).
      */
     @Test
-    public void testNewScanRequestAfterPreviousScanFailure() {
+    public void testNewScanRequestAfterPreviousScanFailure() throws Exception {
         enableScanning();
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         // Now send scan failure for request 1.
         mScanRequestListenerArgumentCaptor.getValue().onFailure(0, "failed");
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(false);
         // Validate the scan results in the cache.
         assertTrue(mScanRequestProxy.getScanResults().isEmpty());
@@ -535,9 +530,10 @@
         // Make scan request 2.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
         // Ensure that we did send a second scan request to scanner.
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Now send the scan results for request 2.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas2);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -553,18 +549,19 @@
      * Verify that we clear scan results when scan state is toggled.
      */
     @Test
-    public void testToggleScanStateClearsScanResults() {
+    public void testToggleScanStateClearsScanResults() throws Exception {
         // Enable scanning
         mScanRequestProxy.enableScanning(true, false);
-        mInOrder.verify(mWifiScanner).registerScanListener(any(), any());
+        mInOrder.verify(mWifiScanner).registerScanListener(any());
         mInOrder.verify(mWifiScanner).setScanningEnabled(true);
         validateScanAvailableBroadcastSent(true);
 
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Verify the scan results processing for request 1.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -602,17 +599,17 @@
     @Test
     public void testSuccessiveScanRequestsDontUseSameListener() {
         enableScanning();
-        WifiScanner.ScanListener listener1;
-        WifiScanner.ScanListener listener2;
+        WifiScannerInternal.ScanListener listener1;
+        WifiScannerInternal.ScanListener listener2;
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         listener1 = mScanRequestListenerArgumentCaptor.getValue();
 
         // Make scan request 2.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
         // Ensure that we did send a second scan request to scanner.
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         listener2 = mScanRequestListenerArgumentCaptor.getValue();
 
         assertNotEquals(listener1, listener2);
@@ -634,11 +631,11 @@
         for (int i = 0; i < SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS; i++) {
             when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs + i);
             assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-            mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+            mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         }
         // Make next scan request from the same package name & ensure that it is not throttled.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         verifyScanMetricsDataWasSet(SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS + 1);
         if (SdkLevel.isAtLeastS()) {
             assertTrue("6Ghz PSC should be enabled for scan requests from normal apps.",
@@ -659,7 +656,7 @@
         for (int i = 0; i < SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS; i++) {
             when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs + i);
             assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-            mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+            mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         }
         // Make next scan request from the same package name & ensure that it is throttled.
         assertFalse(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
@@ -683,13 +680,13 @@
         for (int i = 0; i < SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS; i++) {
             when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs + i);
             assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-            mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+            mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         }
         long lastRequestMs = firstRequestMs + SCAN_REQUEST_THROTTLE_TIME_WINDOW_FG_APPS_MS + 1;
         when(mClock.getElapsedSinceBootMillis()).thenReturn(lastRequestMs);
         // Make next scan request from the same package name & ensure that it is not throttled.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         verifyScanMetricsDataWasSet(SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS + 1);
     }
@@ -708,11 +705,11 @@
         for (int i = 0; i < SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS; i++) {
             when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs + i);
             assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-            mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+            mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         }
         // Make next scan request from the same package name & ensure that it is not throttled.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         verifyScanMetricsDataWasSet(0, SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS + 1);
     }
@@ -731,11 +728,11 @@
         for (int i = 0; i < SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS; i++) {
             when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs + i);
             assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-            mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+            mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         }
         // Make next scan request from the same package name & ensure that it is not throttled.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         verifyScanMetricsDataWasSet(0, SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS + 1);
     }
@@ -756,11 +753,11 @@
         for (int i = 0; i < SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS; i++) {
             when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs + i);
             assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-            mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+            mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         }
         // Make next scan request from the same package name & ensure that it is not throttled.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         verifyScanMetricsDataWasSet(0, SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS + 1);
     }
@@ -776,18 +773,18 @@
         for (int i = 0; i < SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS / 2; i++) {
             when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs + i);
             assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-            mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+            mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         }
         for (int i = 0; i < SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS / 2; i++) {
             when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs + i);
             assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
-            mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+            mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         }
         // Make next scan request from both the package name & ensure that it is not throttled.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         verifyScanMetricsDataWasSet(SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS + 2);
     }
@@ -805,7 +802,7 @@
         for (int i = 0; i < SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS; i++) {
             when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs + i);
             assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-            mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+            mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         }
         // Now simulate removing the app.
         mScanRequestProxy.clearScanRequestTimestampsForApp(TEST_PACKAGE_NAME_1, TEST_UID);
@@ -813,7 +810,7 @@
         // Make next scan request from the same package name (simulating a reinstall) & ensure that
         // it is not throttled.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         verifyScanMetricsDataWasSet(SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS + 1);
     }
@@ -831,7 +828,7 @@
         for (int i = 0; i < SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS; i++) {
             when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs + i);
             assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-            mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+            mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         }
         // Now simulate removing the app for another user (User 1).
         mScanRequestProxy.clearScanRequestTimestampsForApp(
@@ -871,11 +868,11 @@
         when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs);
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         // Make scan request 2 from the different package name & ensure that it is not throttled.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         verifyScanMetricsDataWasSet(2);
     }
 
@@ -895,7 +892,7 @@
         when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs);
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         // Make scan request 2 from the different package name & ensure that it is throttled.
         assertFalse(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
@@ -921,14 +918,14 @@
         when(mClock.getElapsedSinceBootMillis()).thenReturn(firstRequestMs);
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         long secondRequestMs =
                 firstRequestMs + ScanRequestProxy.SCAN_REQUEST_THROTTLE_INTERVAL_BG_APPS_MS + 1;
         when(mClock.getElapsedSinceBootMillis()).thenReturn(secondRequestMs);
         // Make scan request 2 from the different package name & ensure that it is throttled.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_2));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
 
         verifyScanMetricsDataWasSet(2);
     }
@@ -938,13 +935,14 @@
      * internal scans.
      */
     @Test
-    public void testFullInternalScanResultsOverwritesPreviousResults() {
+    public void testFullInternalScanResultsOverwritesPreviousResults() throws Exception {
         enableScanning();
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Verify the scan results processing for request 1.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -954,6 +952,7 @@
         // Now send results from an internal full scan request.
         // Verify the scan failure processing.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas2);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -968,13 +967,14 @@
      * internal scans.
      */
     @Test
-    public void testPartialInternalScanResultsDoesNotOverwritePreviousResults() {
+    public void testPartialInternalScanResultsDoesNotOverwritePreviousResults() throws Exception {
         enableScanning();
         // Make scan request 1.
         assertTrue(mScanRequestProxy.startScan(TEST_UID, TEST_PACKAGE_NAME_1));
-        mInOrder.verify(mWifiScanner).startScan(any(), any(), any(), any());
+        mInOrder.verify(mWifiScanner).startScan(any(), any(), any());
         // Verify the scan results processing for request 1.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
+        mLooper.dispatchAll();
         validateScanResultsAvailableBroadcastSent(true);
         // Validate the scan results in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
@@ -987,6 +987,7 @@
                 new int[]{WifiScanner.WIFI_BAND_24_GHZ});
         // Verify the scan failure processing.
         mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas2);
+        mLooper.dispatchAll();
         // Validate the scan results from a previous successful scan in the cache.
         ScanTestUtil.assertScanResultsEqualsAnyOrder(
                 mTestScanDatas1[0].getResults(),
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
index c1f1d77..cf23cf2 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
@@ -78,10 +78,8 @@
 import android.net.wifi.WifiManager;
 import android.net.wifi.WifiNetworkSuggestion;
 import android.net.wifi.WifiScanner;
-import android.net.wifi.WifiScanner.PnoScanListener;
 import android.net.wifi.WifiScanner.PnoSettings;
 import android.net.wifi.WifiScanner.ScanData;
-import android.net.wifi.WifiScanner.ScanListener;
 import android.net.wifi.WifiScanner.ScanSettings;
 import android.net.wifi.WifiSsid;
 import android.net.wifi.hotspot2.PasspointConfiguration;
@@ -107,6 +105,7 @@
 import com.android.server.wifi.ActiveModeWarden.ExternalClientModeManagerRequestListener;
 import com.android.server.wifi.hotspot2.PasspointManager;
 import com.android.server.wifi.proto.nano.WifiMetricsProto;
+import com.android.server.wifi.scanner.WifiScannerInternal;
 import com.android.server.wifi.util.LruConnectionTracker;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 import com.android.wifi.resources.R;
@@ -137,7 +136,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.Executor;
 import java.util.stream.Collectors;
 
 /**
@@ -160,12 +158,13 @@
         mWifiConfigManager = mockWifiConfigManager();
         mWifiInfo = getWifiInfo();
         mScanData = mockScanData();
-        mWifiScanner = mockWifiScanner();
+        mockWifiScanner();
         mWifiConnectivityHelper = mockWifiConnectivityHelper();
         mWifiNS = mockWifiNetworkSelector();
         mLooper = new TestLooper(mClock::getElapsedSinceBootMillis);
         mTestHandler = new TestHandler(mLooper.getLooper());
-        when(mContext.getSystemService(WifiScanner.class)).thenReturn(mWifiScanner);
+        WifiLocalServices.removeServiceForTest(WifiScannerInternal.class);
+        WifiLocalServices.addService(WifiScannerInternal.class, mWifiScanner);
         when(mWifiNetworkSuggestionsManager.retrieveHiddenNetworkList(anyBoolean()))
                 .thenReturn(new ArrayList<>());
         when(mWifiNetworkSuggestionsManager.getAllApprovedNetworkSuggestions())
@@ -282,13 +281,13 @@
     private TestHandler mTestHandler;
     private WifiConnectivityManager mWifiConnectivityManager;
     private WifiNetworkSelector mWifiNS;
-    private WifiScanner mWifiScanner;
     private WifiConnectivityHelper mWifiConnectivityHelper;
     private ScanData mScanData;
     private WifiConfigManager mWifiConfigManager;
     private WifiInfo mWifiInfo;
     private LocalLog mLocalLog;
     private LruConnectionTracker mLruConnectionTracker;
+    @Mock private WifiScannerInternal mWifiScanner;
     @Mock private Clock mClock;
     @Mock private WifiLastResortWatchdog mWifiLastResortWatchdog;
     @Mock private OpenNetworkNotifier mOpenNetworkNotifier;
@@ -452,38 +451,30 @@
         return scanData;
     }
 
-    WifiScanner mockWifiScanner() {
-        WifiScanner scanner = mock(WifiScanner.class);
-        ArgumentCaptor<ScanListener> allSingleScanListenerCaptor =
-                ArgumentCaptor.forClass(ScanListener.class);
+    void mockWifiScanner() {
+        ArgumentCaptor<WifiScannerInternal.ScanListener> allSingleScanListenerCaptor =
+                ArgumentCaptor.forClass(WifiScannerInternal.ScanListener.class);
 
-        doNothing().when(scanner).registerScanListener(
-                any(), allSingleScanListenerCaptor.capture());
+        doNothing().when(mWifiScanner).registerScanListener(allSingleScanListenerCaptor.capture());
 
         ScanData[] scanDatas = new ScanData[1];
         scanDatas[0] = mScanData;
 
-        // do a synchronous answer for the ScanListener callbacks
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, ScanListener listener,
-                    WorkSource workSource) throws Exception {
-                listener.onResults(scanDatas);
-            }}).when(scanner).startBackgroundScan(anyObject(), anyObject(), anyObject());
-
-        doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, Executor executor, ScanListener listener,
-                    WorkSource workSource) throws Exception {
-                listener.onResults(scanDatas);
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
+                listener.getWifiScannerListener().onResults(scanDatas);
                 // WCM processes scan results received via onFullResult (even though they're the
                 // same as onResult for single scans).
                 if (mScanData != null && mScanData.getResults() != null) {
                     for (int i = 0; i < mScanData.getResults().length; i++) {
-                        allSingleScanListenerCaptor.getValue().onFullResult(
-                                mScanData.getResults()[i]);
+                        allSingleScanListenerCaptor.getValue().getWifiScannerListener()
+                                .onFullResult(mScanData.getResults()[i]);
                     }
                 }
-                allSingleScanListenerCaptor.getValue().onResults(scanDatas);
-            }}).when(scanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+                allSingleScanListenerCaptor.getValue().getWifiScannerListener().onResults(
+                        scanDatas);
+            }}).when(mWifiScanner).startScan(anyObject(), anyObject());
 
         // This unfortunately needs to be a somewhat valid scan result, otherwise
         // |ScanDetailUtil.toScanDetail| raises exceptions.
@@ -499,12 +490,13 @@
 
         doAnswer(new AnswerWithArguments() {
             public void answer(ScanSettings settings, PnoSettings pnoSettings,
-                    Executor executor, PnoScanListener listener) throws Exception {
-                listener.onPnoNetworkFound(scanResults);
-            }}).when(scanner).startDisconnectedPnoScan(
-                    anyObject(), anyObject(), anyObject(), anyObject());
+                    WifiScannerInternal.ScanListener listener) throws Exception {
+                WifiScanner.PnoScanListener l =
+                        (WifiScanner.PnoScanListener) listener.getWifiScannerListener();
+                l.onPnoNetworkFound(scanResults);
+            }}).when(mWifiScanner).startPnoScan(
+                    anyObject(), anyObject(), anyObject());
 
-        return scanner;
     }
 
     WifiConnectivityHelper mockWifiConnectivityHelper() {
@@ -631,6 +623,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_CONNECTED);
+        mLooper.dispatchAll();
     }
 
     /**
@@ -680,7 +673,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mActiveModeWarden, never()).requestSecondaryTransientClientModeManager(
                 any(), any(), any(), any());
         verify(mPrimaryClientModeManager, never()).startConnectToNetwork(
@@ -701,7 +694,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, "any");
         verify(mPrimaryClientModeManager).enableRoaming(true);
@@ -734,7 +727,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mActiveModeWarden).requestSecondaryTransientClientModeManager(
                 any(),
                 eq(ActiveModeWarden.INTERNAL_REQUESTOR_WS),
@@ -778,7 +771,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mActiveModeWarden).requestSecondaryTransientClientModeManager(
                 any(),
                 eq(ActiveModeWarden.INTERNAL_REQUESTOR_WS),
@@ -817,7 +810,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_CONNECTED);
-
+        mLooper.dispatchAll();
         // Request secondary STA and connect using it.
         verify(mActiveModeWarden).requestSecondaryTransientClientModeManager(
                 any(),
@@ -858,7 +851,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_CONNECTED);
-
+        mLooper.dispatchAll();
         // Don't request secondary STA, fallback to primary STA.
         verify(mActiveModeWarden, never()).requestSecondaryTransientClientModeManager(
                 any(), any(), any(), any());
@@ -911,7 +904,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, "any");
         verify(mActiveModeWarden, never()).requestSecondaryLongLivedClientModeManager(
@@ -938,7 +931,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, "any");
         verify(mActiveModeWarden, never()).requestSecondaryLongLivedClientModeManager(
@@ -965,7 +958,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, "any");
         verify(mActiveModeWarden, never()).requestSecondaryLongLivedClientModeManager(
@@ -992,7 +985,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, "any");
         verify(mActiveModeWarden, never()).requestSecondaryLongLivedClientModeManager(
@@ -1020,7 +1013,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, "any");
         verify(mActiveModeWarden, never()).requestSecondaryLongLivedClientModeManager(
@@ -1050,7 +1043,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // No connection triggered (even on primary since wifi is off).
         verify(mPrimaryClientModeManager, never()).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, "any");
@@ -1081,7 +1074,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // connection triggered on primary
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, "any");
@@ -1109,7 +1102,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // connection triggered on secondary
         verify(mPrimaryClientModeManager, never()).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, "any");
@@ -1154,7 +1147,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // connection triggered on secondary
         verify(mPrimaryClientModeManager, never()).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, "any");
@@ -1195,7 +1188,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // connection triggered on primary & secondary
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID_2, Process.WIFI_UID, "any");
@@ -1244,7 +1237,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // connection triggered on only on primary to CANDIDATE_NETWORK_ID_2.
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID_2, Process.WIFI_UID, "any");
@@ -1440,6 +1433,7 @@
                 MultiInternetManager.MULTI_INTERNET_STATE_CONNECTION_REQUESTED,
                 new WorkSource());
         mMultiInternetConnectionStatusListenerCaptor.getValue().onStartScan(new WorkSource());
+        mLooper.dispatchAll();
         if (!success) {
             verify(mSecondaryClientModeManager, never()).startConnectToNetwork(
                     targetConfig.networkId, Process.WIFI_UID, targetBssid);
@@ -1504,7 +1498,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, CANDIDATE_BSSID);
     }
@@ -1526,7 +1520,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_CONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, CANDIDATE_BSSID);
     }
@@ -1544,7 +1538,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // Set screen to on
         setScreenState(true);
 
@@ -1566,7 +1560,7 @@
 
         // Set screen to on
         setScreenState(true);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager, atLeastOnce()).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, CANDIDATE_BSSID);
     }
@@ -1622,6 +1616,7 @@
             mWifiConnectivityManager.handleConnectionStateChanged(
                     mPrimaryClientModeManager,
                     WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+            mLooper.dispatchAll();
             numAttempts++;
         }
         // Now trigger another connection attempt before the rate interval, this should be
@@ -1631,7 +1626,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // Verify that we attempt to connect upto the rate.
         verify(mPrimaryClientModeManager, times(numAttempts)).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, CANDIDATE_BSSID);
@@ -1663,6 +1658,7 @@
             mWifiConnectivityManager.handleConnectionStateChanged(
                     mPrimaryClientModeManager,
                     WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+            mLooper.dispatchAll();
             numAttempts++;
         }
         // Now trigger another connection attempt after the rate interval, this should not be
@@ -1673,6 +1669,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+        mLooper.dispatchAll();
         numAttempts++;
 
         // Verify that all the connection attempts went through
@@ -1706,6 +1703,7 @@
             mWifiConnectivityManager.handleConnectionStateChanged(
                     mPrimaryClientModeManager,
                     WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+            mLooper.dispatchAll();
             numAttempts++;
         }
 
@@ -1718,6 +1716,7 @@
             mWifiConnectivityManager.handleConnectionStateChanged(
                     mPrimaryClientModeManager,
                     WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+            mLooper.dispatchAll();
             numAttempts++;
         }
 
@@ -1751,6 +1750,7 @@
             mWifiConnectivityManager.handleConnectionStateChanged(
                     mPrimaryClientModeManager,
                     WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+            mLooper.dispatchAll();
             numAttempts++;
         }
 
@@ -1763,6 +1763,7 @@
             mWifiConnectivityManager.handleConnectionStateChanged(
                     mPrimaryClientModeManager,
                     WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+            mLooper.dispatchAll();
             numAttempts++;
         }
 
@@ -1796,6 +1797,7 @@
             mWifiConnectivityManager.handleConnectionStateChanged(
                     mPrimaryClientModeManager,
                     WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+            mLooper.dispatchAll();
             numAttempts++;
         }
 
@@ -1809,6 +1811,7 @@
             mWifiConnectivityManager.handleConnectionStateChanged(
                     mPrimaryClientModeManager,
                     WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+            mLooper.dispatchAll();
             numAttempts++;
         }
 
@@ -1835,7 +1838,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mWifiMetrics).noteFirstNetworkSelectionAfterBoot(false);
 
         // Get the retry delay value after QNS didn't select a
@@ -1851,6 +1854,7 @@
             mWifiConnectivityManager.handleConnectionStateChanged(
                     mPrimaryClientModeManager,
                     WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+            mLooper.dispatchAll();
         }
         int lowRssiNetworkRetryDelayAfterThreePnoMs = mWifiConnectivityManager
                 .getLowRssiNetworkRetryDelay();
@@ -1873,7 +1877,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // Now fire the watchdog alarm and verify the metrics were incremented.
         mAlarmManager.dispatch(WifiConnectivityManager.WATCHDOG_TIMER_TAG);
         mLooper.dispatchAll();
@@ -1900,7 +1904,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // Now fire the watchdog alarm and verify the metrics were incremented.
         mAlarmManager.dispatch(WifiConnectivityManager.WATCHDOG_TIMER_TAG);
         mLooper.dispatchAll();
@@ -1918,7 +1922,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // Verify the watchdog alarm has been set
         assertTrue(mAlarmManager.isPending(WifiConnectivityManager.WATCHDOG_TIMER_TAG));
 
@@ -2008,7 +2012,7 @@
         mLooper.dispatchAll();
 
         verify(mWifiScanner).startScan((ScanSettings) argThat(new WifiPartialScanSettingMatcher()),
-                any(), any(), any());
+                any());
     }
 
     private class WifiPartialScanSettingMatcher implements ArgumentMatcher<ScanSettings> {
@@ -2654,8 +2658,7 @@
             int[] intervalSchedule, int[] scheduleScanType) {
         // Verify the scans actually happened for expected times, one scan for state change and
         // each for scan timer triggered.
-        verify(mWifiScanner, times(scanTimes)).startScan(anyObject(), anyObject(), anyObject(),
-                anyObject());
+        verify(mWifiScanner, times(scanTimes)).startScan(anyObject(), anyObject());
 
         // Verify scans are happening using the expected scan type.
         Map<Integer, Integer> scanTypeToTimesMap = new HashMap<>();
@@ -2670,7 +2673,7 @@
                         public boolean matches(ScanSettings scanSettings) {
                             return scanSettings.type == entry.getKey();
                         }
-                    }), any(), any(), any());
+                    }), any());
         }
 
         // Verify the scan intervals are same as expected interval schedule.
@@ -2679,8 +2682,9 @@
             // TestHandler#sendMessageAtTime is not perfectly mocked and uses
             // SystemClock.uptimeMillis() to generate |intervals|. This sometimes results in error
             // margins of ~1ms and cause flaky test failures.
-            assertTrue("Interval " + i + " not in 1ms error margin",
-                    Math.abs(expected - intervals.get(i).longValue()) < 2);
+            final long delta = Math.abs(expected - intervals.get(i).longValue());
+            assertTrue("Interval " + i + " (" + delta + ") not in 1ms error margin",
+                    delta < 2);
         }
     }
 
@@ -2688,8 +2692,7 @@
             int expectedInterval) {
         // Verify the scans actually happened for expected times, one scan for state change and
         // each for scan timer triggered.
-        verify(mWifiScanner, times(scanTimes)).startScan(anyObject(), anyObject(), anyObject(),
-                anyObject());
+        verify(mWifiScanner, times(scanTimes)).startScan(anyObject(), anyObject());
 
         // The actual interval should be same as scheduled.
         assertEquals(expectedInterval * 1000, intervals.get(0).longValue());
@@ -3260,8 +3263,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-        verify(mWifiScanner, times(1)).startScan(
-                anyObject(), anyObject(), anyObject(), anyObject());
+        verify(mWifiScanner, times(1)).startScan(anyObject(), anyObject());
 
         // Set up time stamp for when entering CONNECTED state
         currentTimeStamp += 2000;
@@ -3303,8 +3305,7 @@
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
 
-        verify(mWifiScanner, never()).startScan(anyObject(), anyObject(), anyObject(),
-                anyObject());
+        verify(mWifiScanner, never()).startScan(anyObject(), anyObject());
     }
 
     /**
@@ -3333,8 +3334,7 @@
         // Set WiFi to connected state to trigger the periodic scan
         setWifiStateConnected();
 
-        verify(mWifiScanner, times(1)).startScan(
-                anyObject(), anyObject(), anyObject(), anyObject());
+        verify(mWifiScanner, times(1)).startScan(anyObject(), anyObject());
 
         // Set up the time stamp for when entering DISCONNECTED state
         currentTimeStamp += 2000;
@@ -3428,11 +3428,19 @@
         when(mPerNetwork.getFrequencies(anyLong())).thenReturn(new ArrayList<>());
 
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, ScanListener listener,
-                    WorkSource workSource) throws Exception {
-                assertEquals(settings.band, WifiScanner.WIFI_BAND_ALL);
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
+                if (SdkLevel.isAtLeastS()) {
+                    assertEquals(WifiScanner.WIFI_BAND_24_5_WITH_DFS_6_GHZ, settings.band);
+                    assertEquals("RNR should be enabled for full scans",
+                            WifiScanner.WIFI_RNR_ENABLED, settings.getRnrSetting());
+                    assertTrue("PSC should be enabled for full scans",
+                            settings.is6GhzPscOnlyEnabled());
+                } else {
+                    assertEquals(WifiScanner.WIFI_BAND_ALL, settings.band);
+                }
                 assertNull(settings.channels);
-            }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject());
+            }}).when(mWifiScanner).startScan(anyObject(), anyObject());
 
         when(mClock.getElapsedSinceBootMillis()).thenReturn(0L);
         // Set screen to ON
@@ -3442,8 +3450,8 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_CONNECTED);
-
-        verify(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+        mLooper.dispatchAll();
+        verify(mWifiScanner).startScan(anyObject(), anyObject());
 
         // Verify case 2
         when(mWifiNS.isNetworkSufficient(eq(mWifiInfo))).thenReturn(true);
@@ -3456,8 +3464,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_CONNECTED);
-        verify(mWifiScanner, times(2)).startScan(anyObject(), anyObject(), anyObject(),
-                anyObject());
+        verify(mWifiScanner, times(2)).startScan(anyObject(), anyObject());
 
         // Verify case 3
         when(mWifiNS.isNetworkSufficient(eq(mWifiInfo))).thenReturn(false);
@@ -3470,8 +3477,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_CONNECTED);
-        verify(mWifiScanner, times(2)).startScan(anyObject(), anyObject(), anyObject(),
-                anyObject());
+        verify(mWifiScanner, times(2)).startScan(anyObject(), anyObject());
     }
 
     /**
@@ -3504,8 +3510,8 @@
         when(mWifiConnectivityHelper.isFirmwareRoamingSupported()).thenReturn(false);
 
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, Executor executor, ScanListener listener,
-                    WorkSource workSource) throws Exception {
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
                 assertEquals(settings.band, WifiScanner.WIFI_BAND_UNSPECIFIED);
                 assertEquals(settings.channels.length, channelList.size());
                 if (SdkLevel.isAtLeastS()) {
@@ -3517,7 +3523,8 @@
                 for (int chanIdx = 0; chanIdx < settings.channels.length; chanIdx++) {
                     assertTrue(channelList.contains(settings.channels[chanIdx].frequency));
                 }
-            }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+                mLooper.dispatchAll();
+            }}).when(mWifiScanner).startScan(anyObject(), anyObject());
 
         // Set screen to ON
         setScreenState(true);
@@ -3527,7 +3534,7 @@
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_CONNECTED);
 
-        verify(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+        verify(mWifiScanner).startScan(anyObject(), anyObject());
     }
 
     /**
@@ -3560,14 +3567,15 @@
         when(mWifiConnectivityHelper.isFirmwareRoamingSupported()).thenReturn(false);
 
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, Executor executor, ScanListener listener,
-                               WorkSource workSource) throws Exception {
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
                 assertEquals(settings.band, WifiScanner.WIFI_BAND_UNSPECIFIED);
                 assertEquals(settings.channels.length, channelList.size());
                 for (int chanIdx = 0; chanIdx < settings.channels.length; chanIdx++) {
                     assertTrue(channelList.contains(settings.channels[chanIdx].frequency));
                 }
-            }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+                mLooper.dispatchAll();
+            }}).when(mWifiScanner).startScan(anyObject(), anyObject());
 
         // Set screen to ON
         setScreenState(true);
@@ -3577,7 +3585,7 @@
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_CONNECTED);
 
-        verify(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+        verify(mWifiScanner).startScan(anyObject(), anyObject());
     }
 
 
@@ -3606,8 +3614,8 @@
                 .thenReturn(new WifiConfiguration());
 
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, Executor executor, ScanListener listener,
-                    WorkSource workSource) throws Exception {
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
                 assertNull(settings.channels);
                 if (SdkLevel.isAtLeastS()) {
                     assertEquals(WifiScanner.WIFI_BAND_24_5_WITH_DFS_6_GHZ, settings.band);
@@ -3618,7 +3626,8 @@
                 } else {
                     assertEquals(WifiScanner.WIFI_BAND_ALL, settings.band);
                 }
-            }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+                mLooper.dispatchAll();
+            }}).when(mWifiScanner).startScan(anyObject(), anyObject());
 
         // Set screen to ON
         setScreenState(true);
@@ -3628,7 +3637,7 @@
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_CONNECTED);
 
-        verify(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+        verify(mWifiScanner).startScan(anyObject(), anyObject());
     }
 
     /**
@@ -3644,10 +3653,11 @@
         setScreenState(true);
 
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, Executor executor, ScanListener listener,
-                    WorkSource workSource) throws Exception {
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
                 listener.onFailure(-1, "ScanFailure");
-            }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+                mLooper.dispatchAll();
+            }}).when(mWifiScanner).startScan(anyObject(), anyObject());
 
         // Set WiFi to disconnected state to trigger the single scan based periodic scan
         mWifiConnectivityManager.handleConnectionStateChanged(
@@ -3665,7 +3675,7 @@
         // The very first scan is the initial one, and the other MAX_SCAN_RESTART_ALLOWED
         // are the retrial ones.
         verify(mWifiScanner, times(WifiConnectivityManager.MAX_SCAN_RESTART_ALLOWED + 1)).startScan(
-                anyObject(), anyObject(), anyObject(), anyObject());
+                anyObject(), anyObject());
     }
 
     @Test
@@ -3674,10 +3684,11 @@
         setScreenState(true);
 
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, Executor executor, ScanListener listener,
-                    WorkSource workSource) throws Exception {
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
                 listener.onFailure(-1, "ScanFailure");
-            }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+                mLooper.dispatchAll();
+            }}).when(mWifiScanner).startScan(anyObject(), anyObject());
 
         // Set WiFi to disconnected state to trigger the single scan based periodic scan
         mWifiConnectivityManager.handleConnectionStateChanged(
@@ -3696,8 +3707,7 @@
         // Verify that the connectivity scan has happened 2 times. Note, the first scan is due
         // to the initial request, and the second scan is the first retry after failure.
         // There are no more retries afterwards because the screen is off.
-        verify(mWifiScanner, times(2)).startScan(
-                anyObject(), anyObject(), anyObject(), anyObject());
+        verify(mWifiScanner, times(2)).startScan(anyObject(), anyObject());
     }
 
     /**
@@ -3715,32 +3725,35 @@
         setScreenState(true);
         // Setup WifiScanner to fail
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, Executor executor, ScanListener listener,
-                    WorkSource workSource) throws Exception {
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
                 listener.onFailure(-1, "ScanFailure");
-            }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+                mLooper.dispatchAll();
+            }}).when(mWifiScanner).startScan(anyObject(), anyObject());
 
         mWifiConnectivityManager.forceConnectivityScan(null);
         // make the retry succeed
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, Executor executor, ScanListener listener,
-                    WorkSource workSource) throws Exception {
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
                 listener.onResults(null);
-            }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+                mLooper.dispatchAll();
+            }}).when(mWifiScanner).startScan(anyObject(), anyObject());
         mAlarmManager.dispatch(WifiConnectivityManager.RESTART_SINGLE_SCAN_TIMER_TAG);
         mLooper.dispatchAll();
 
         // Verify that startScan is called once for the original scan, plus once for the retry.
         // The successful retry should have now cleared the restart count
         verify(mWifiScanner, times(2)).startScan(
-                anyObject(), anyObject(), anyObject(), anyObject());
+                anyObject(), anyObject());
 
         // Now force a new scan and verify we retry MAX_SCAN_RESTART_ALLOWED times
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, Executor executor, ScanListener listener,
-                    WorkSource workSource) throws Exception {
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
                 listener.onFailure(-1, "ScanFailure");
-            }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject(), anyObject());
+                mLooper.dispatchAll();
+            }}).when(mWifiScanner).startScan(anyObject(), anyObject());
         mWifiConnectivityManager.forceConnectivityScan(null);
         // Fire the alarm timer 2x timers
         for (int i = 0; i < (WifiConnectivityManager.MAX_SCAN_RESTART_ALLOWED * 2); i++) {
@@ -3753,7 +3766,7 @@
         // and additionally MAX_SCAN_RESTART_ALLOWED + 1 times from forceConnectivityScan and
         // subsequent retries.
         verify(mWifiScanner, times(WifiConnectivityManager.MAX_SCAN_RESTART_ALLOWED + 3)).startScan(
-                anyObject(), anyObject(), anyObject(), anyObject());
+                anyObject(), anyObject());
     }
 
     /**
@@ -3767,11 +3780,12 @@
     @Test
     public void listenToAllSingleScanResults() {
         ScanSettings settings = new ScanSettings();
-        ScanListener scanListener = mock(ScanListener.class);
+        WifiScannerInternal.ScanListener scanListener = new WifiScannerInternal.ScanListener(mock(
+                WifiScanner.ScanListener.class), mTestHandler);
 
         // Request a single scan outside of WifiConnectivityManager.
-        mWifiScanner.startScan(settings, mock(Executor.class), scanListener, WIFI_WORK_SOURCE);
-
+        mWifiScanner.startScan(settings, scanListener);
+        mLooper.dispatchAll();
         // Verify that WCM receives the scan results and initiates a connection
         // to the network.
         verify(mPrimaryClientModeManager).startConnectToNetwork(
@@ -3797,7 +3811,7 @@
         // Force a connectivity scan which enables WifiConnectivityManager
         // to wait for full band scan results.
         mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
-
+        mLooper.dispatchAll();
         // No roaming because no full band scan results.
         verify(mPrimaryClientModeManager, times(0)).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, CANDIDATE_BSSID);
@@ -3808,7 +3822,7 @@
         // Force a connectivity scan which enables WifiConnectivityManager
         // to wait for full band scan results.
         mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
-
+        mLooper.dispatchAll();
         // Roaming attempt because full band scan results are available.
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, CANDIDATE_BSSID);
@@ -3839,6 +3853,7 @@
                 .thenReturn(passpointNetworks);
 
         mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
+        mLooper.dispatchAll();
         ArgumentCaptor<ArrayList<String>> listArgumentCaptor =
                 ArgumentCaptor.forClass(ArrayList.class);
         verify(mWifiConfigManager).updateUserDisabledList(listArgumentCaptor.capture());
@@ -3852,6 +3867,7 @@
     public void verifyClearExpiredRecentFailureStatusAfterScan() {
         // mWifiScanner is mocked to directly return scan results when a scan is triggered.
         mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
+        mLooper.dispatchAll();
         verify(mWifiConfigManager).cleanupExpiredRecentFailureReasons();
     }
 
@@ -3875,7 +3891,7 @@
         inOrder.verify(mWifiBlocklistMonitor, never())
                 .updateAndGetBssidBlocklistForSsids(anySet());
         mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
-
+        mLooper.dispatchAll();
         inOrder.verify(mWifiBlocklistMonitor).tryEnablingBlockedBssids(any());
         inOrder.verify(mWifiConfigManager).updateNetworkSelectionStatus(disabledConfig.networkId,
                 WifiConfiguration.NetworkSelectionStatus.DISABLED_NONE);
@@ -4018,7 +4034,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, ClientModeImpl.SUPPLICANT_BSSID_ANY);
     }
@@ -4055,7 +4071,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, CANDIDATE_BSSID);
         verify(mPrimaryClientModeManager).enableRoaming(false);
@@ -4080,7 +4096,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, CANDIDATE_BSSID);
     }
@@ -4108,12 +4124,12 @@
 
         // Set screen to on
         setScreenState(true);
-
+        mLooper.dispatchAll();
         // Set WiFi to disconnected state
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, CANDIDATE_BSSID);
     }
@@ -4132,7 +4148,7 @@
 
         // Set screen to on
         setScreenState(true);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager).startRoamToNetwork(eq(CANDIDATE_NETWORK_ID),
                 mCandidateBssidCaptor.capture());
         assertEquals(mCandidateBssidCaptor.getValue(), CANDIDATE_BSSID);
@@ -4158,7 +4174,7 @@
 
         // Set screen to on
         setScreenState(true);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager, never()).startRoamToNetwork(anyInt(), anyObject());
         verify(mPrimaryClientModeManager, never()).startConnectToNetwork(
                 anyInt(), anyInt(), anyObject());
@@ -4193,7 +4209,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         verify(mPrimaryClientModeManager, times(0)).startConnectToNetwork(
                 CANDIDATE_NETWORK_ID, Process.WIFI_UID, CANDIDATE_BSSID);
     }
@@ -4338,7 +4354,6 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
         // We should have filtered out the 3rd scan result.
         assertEquals(3, capturedScanDetails.size());
         List<ScanResult> capturedScanResults =
@@ -4398,7 +4413,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 mPrimaryClientModeManager,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         // We should not filter any of the scan results.
         assertEquals(4, capturedScanDetails.size());
         List<ScanResult> capturedScanResults =
@@ -4439,16 +4454,16 @@
 
         // Enable trusted connection. This should NOT trigger a pno scan for auto-join.
         mWifiConnectivityManager.setTrustedConnectionAllowed(true);
-        verify(mWifiScanner, never()).startDisconnectedPnoScan(any(), any(), any(), any());
+        verify(mWifiScanner, never()).startPnoScan(any(), any(), any());
 
         // End of processing a specific request. This should NOT trigger a new pno scan for
         // auto-join.
         mWifiConnectivityManager.setSpecificNetworkRequestInProgress(false);
-        verify(mWifiScanner, never()).startDisconnectedPnoScan(any(), any(), any(), any());
+        verify(mWifiScanner, never()).startPnoScan(any(), any(), any());
 
         // Enable untrusted connection. This should NOT trigger a pno scan for auto-join.
         mWifiConnectivityManager.setUntrustedConnectionAllowed(true);
-        verify(mWifiScanner, never()).startDisconnectedPnoScan(any(), any(), any(), any());
+        verify(mWifiScanner, never()).startPnoScan(any(), any(), any());
     }
 
     /**
@@ -4475,7 +4490,7 @@
 
         // Enable trusted connection. This should trigger a pno scan for auto-join.
         mWifiConnectivityManager.setTrustedConnectionAllowed(true);
-        verify(mWifiScanner).startDisconnectedPnoScan(any(), any(), any(), any());
+        verify(mWifiScanner).startPnoScan(any(), any(), any());
 
         // Start of processing a specific request. This should stop any pno scan for auto-join.
         mWifiConnectivityManager.setSpecificNetworkRequestInProgress(true);
@@ -4484,7 +4499,7 @@
         // End of processing a specific request. This should now trigger a new pno scan for
         // auto-join.
         mWifiConnectivityManager.setSpecificNetworkRequestInProgress(false);
-        verify(mWifiScanner, times(2)).startDisconnectedPnoScan(any(), any(), any(), any());
+        verify(mWifiScanner, times(2)).startPnoScan(any(), any(), any());
 
         // Disable trusted connection. This should stop any pno scan for auto-join.
         mWifiConnectivityManager.setTrustedConnectionAllowed(false);
@@ -4492,7 +4507,7 @@
 
         // Enable untrusted connection. This should trigger a pno scan for auto-join.
         mWifiConnectivityManager.setUntrustedConnectionAllowed(true);
-        verify(mWifiScanner, times(3)).startDisconnectedPnoScan(any(), any(), any(), any());
+        verify(mWifiScanner, times(3)).startPnoScan(any(), any(), any());
     }
 
     /**
@@ -4542,8 +4557,7 @@
                 ScanSettings.class);
         InOrder inOrder = inOrder(mWifiScanner);
 
-        inOrder.verify(mWifiScanner).startDisconnectedPnoScan(
-                scanSettingsCaptor.capture(), any(), any(), any());
+        inOrder.verify(mWifiScanner).startPnoScan(scanSettingsCaptor.capture(), any(), any());
         assertEquals(interval, scanSettingsCaptor.getValue().periodInMs);
     }
 
@@ -4565,8 +4579,7 @@
                 ScanSettings.class);
         InOrder inOrder = inOrder(mWifiScanner);
 
-        inOrder.verify(mWifiScanner).startDisconnectedPnoScan(
-                scanSettingsCaptor.capture(), any(), any(), any());
+        inOrder.verify(mWifiScanner).startPnoScan(scanSettingsCaptor.capture(), any(), any());
         assertEquals(scanSettingsCaptor.getValue().periodInMs, MOVING_PNO_SCAN_INTERVAL_MILLIS);
 
         // initial connectivity state uses moving PNO scan interval, now set it to stationary
@@ -4574,8 +4587,7 @@
                 WifiManager.DEVICE_MOBILITY_STATE_STATIONARY);
 
         inOrder.verify(mWifiScanner).stopPnoScan(any());
-        inOrder.verify(mWifiScanner).startDisconnectedPnoScan(
-                scanSettingsCaptor.capture(), any(), any(), any());
+        inOrder.verify(mWifiScanner).startPnoScan(scanSettingsCaptor.capture(), any(), any());
         assertEquals(scanSettingsCaptor.getValue().periodInMs, STATIONARY_PNO_SCAN_INTERVAL_MILLIS);
         verify(mScoringParams, times(2)).getEntryRssi(ScanResult.BAND_6_GHZ_START_FREQ_MHZ);
         verify(mScoringParams, times(2)).getEntryRssi(ScanResult.BAND_5_GHZ_START_FREQ_MHZ);
@@ -4600,8 +4612,7 @@
                 ScanSettings.class);
         InOrder inOrder = inOrder(mWifiScanner);
         inOrder.verify(mWifiScanner, never()).stopPnoScan(any());
-        inOrder.verify(mWifiScanner).startDisconnectedPnoScan(
-                scanSettingsCaptor.capture(), any(), any(), any());
+        inOrder.verify(mWifiScanner).startPnoScan(scanSettingsCaptor.capture(), any(), any());
         assertEquals(scanSettingsCaptor.getValue().periodInMs, MOVING_PNO_SCAN_INTERVAL_MILLIS);
 
         mWifiConnectivityManager.setDeviceMobilityState(
@@ -4625,7 +4636,7 @@
                 WifiManager.DEVICE_MOBILITY_STATE_STATIONARY);
 
         // no scans should start or stop because no PNO scan is running
-        verify(mWifiScanner, never()).startDisconnectedPnoScan(any(), any(), any(), any());
+        verify(mWifiScanner, never()).startPnoScan(any(), any(), any());
         verify(mWifiScanner, never()).stopPnoScan(any());
 
         // starts a PNO scan
@@ -4637,8 +4648,7 @@
         ArgumentCaptor<ScanSettings> scanSettingsCaptor = ArgumentCaptor.forClass(
                 ScanSettings.class);
 
-        verify(mWifiScanner).startDisconnectedPnoScan(
-                scanSettingsCaptor.capture(), any(), any(), any());
+        verify(mWifiScanner).startPnoScan(scanSettingsCaptor.capture(), any(), any());
         // check that now the PNO scan uses the stationary interval, even though it was set before
         // the PNO scan started
         assertEquals(scanSettingsCaptor.getValue().periodInMs, STATIONARY_PNO_SCAN_INTERVAL_MILLIS);
@@ -4707,7 +4717,7 @@
 
         // Force a connectivity scan
         mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
-
+        mLooper.dispatchAll();
         verify(mWifiChannelUtilization).refreshChannelStatsAndChannelUtilization(
                 llstats, WifiChannelUtilization.UNKNOWN_FREQ);
     }
@@ -4752,17 +4762,17 @@
         // Auto-join enabled
         mWifiConnectivityManager.setAutoJoinEnabledExternal(true, false);
         mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
-        verify(mWifiScanner).startScan(any(), any(), any(), any());
+        verify(mWifiScanner).startScan(any(), any());
 
         // Auto-join disabled, no new scans
         mWifiConnectivityManager.setAutoJoinEnabledExternal(false, false);
         mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
-        verify(mWifiScanner, times(1)).startScan(any(), any(), any(), any());
+        verify(mWifiScanner, times(1)).startScan(any(), any());
 
         // Wifi disabled, no new scans
         setWifiEnabled(false);
         mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
-        verify(mWifiScanner, times(1)).startScan(any(), any(), any(), any());
+        verify(mWifiScanner, times(1)).startScan(any(), any());
     }
 
     @Test
@@ -4877,11 +4887,12 @@
 
         InOrder inOrder = inOrder(mWifiScanner, mExternalPnoScanRequestManager);
 
-        inOrder.verify(mWifiScanner).startDisconnectedPnoScan(any(), any(), any(), any());
+        inOrder.verify(mWifiScanner).startPnoScan(any(), any(), any());
         inOrder.verify(mExternalPnoScanRequestManager).onScanResultsAvailable(any());
 
         // mock connectivity scan
         mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
+        mLooper.dispatchAll();
         // verify mExternalPnoScanRequestManager is notified again
         inOrder.verify(mExternalPnoScanRequestManager).onScanResultsAvailable(any());
     }
@@ -5160,7 +5171,7 @@
 
         InOrder inOrder = inOrder(mWifiScanner);
 
-        inOrder.verify(mWifiScanner).startDisconnectedPnoScan(any(), any(), any(), any());
+        inOrder.verify(mWifiScanner).startPnoScan(any(), any(), any());
 
         // Add or update suggestions.
         mSuggestionUpdateListenerCaptor.getValue().onSuggestionsAddedOrUpdated(
@@ -5169,7 +5180,7 @@
         mNetworkUpdateListenerCaptor.getValue().onNetworkAdded(new WifiConfiguration());
         // Ensure that we don't immediately restarted PNO.
         inOrder.verify(mWifiScanner, never()).stopPnoScan(any());
-        inOrder.verify(mWifiScanner, never()).startDisconnectedPnoScan(any(), any(), any(), any());
+        inOrder.verify(mWifiScanner, never()).startPnoScan(any(), any(), any());
 
         // Verify there is only 1 delayed scan scheduled
         assertEquals(1, mTestHandler.getIntervals().size());
@@ -5181,7 +5192,7 @@
 
         // Ensure that we restarted PNO.
         inOrder.verify(mWifiScanner).stopPnoScan(any());
-        inOrder.verify(mWifiScanner).startDisconnectedPnoScan(any(), any(), any(), any());
+        inOrder.verify(mWifiScanner).startPnoScan(any(), any(), any());
     }
 
     @Test
@@ -5212,7 +5223,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 primaryCmm,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         List<WifiNetworkSelector.ClientModeManagerState> expectedCmmStates =
                 Arrays.asList(new WifiNetworkSelector.ClientModeManagerState(
                                 "wlan0", false, true, wifiInfo1),
@@ -5249,7 +5260,7 @@
         mWifiConnectivityManager.handleConnectionStateChanged(
                 primaryCmm,
                 WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
-
+        mLooper.dispatchAll();
         List<WifiNetworkSelector.ClientModeManagerState> expectedCmmStates =
                 Arrays.asList(new WifiNetworkSelector.ClientModeManagerState(
                         "wlan0", false, true, wifiInfo1),
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java
index 824b02e..5509711 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java
@@ -37,7 +37,6 @@
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiScanner;
 import android.net.wifi.WifiScanner.ScanData;
-import android.net.wifi.WifiScanner.ScanListener;
 import android.net.wifi.WifiScanner.ScanSettings;
 import android.net.wifi.WifiSsid;
 import android.os.Build;
@@ -56,6 +55,7 @@
 import com.android.server.wifi.proto.WifiScoreCardProto.SystemInfoStats;
 import com.android.server.wifi.proto.WifiStatsLog;
 import com.android.server.wifi.proto.nano.WifiMetricsProto.HealthMonitorMetrics;
+import com.android.server.wifi.scanner.WifiScannerInternal;
 import com.android.wifi.resources.R;
 
 import org.junit.Before;
@@ -127,9 +127,10 @@
     private TestAlarmManager mAlarmManager;
     private TestLooper mLooper = new TestLooper();
     private List<WifiConfiguration> mConfiguredNetworks;
-    private WifiScanner mWifiScanner;
+    private WifiScannerInternal mWifiScanner;
     private ScanData mScanData;
-    private ScanListener mScanListener;
+    private ArgumentCaptor<WifiScannerInternal.ScanListener> mScanListenerArgumentCaptor =
+            ArgumentCaptor.forClass(WifiScannerInternal.ScanListener.class);
     private OnNetworkUpdateListener mOnNetworkUpdateListener;
     private ModeChangeCallback mModeChangeCallback;
 
@@ -183,7 +184,6 @@
 
         mScanData = mockScanData();
         mWifiScanner = mockWifiScanner(WifiScanner.WIFI_BAND_ALL);
-        when(mWifiInjector.getWifiScanner()).thenReturn(mWifiScanner);
         when(mWifiNative.getDriverVersion()).thenReturn(mDriverVersion);
         when(mWifiNative.getFirmwareVersion()).thenReturn(mFirmwareVersion);
         when(mDeviceConfigFacade.getConnectionFailureHighThrPercent()).thenReturn(
@@ -300,20 +300,16 @@
         return scanDatas[0];
     }
 
-    WifiScanner mockWifiScanner(@WifiScanner.WifiBand int wifiBand) {
-        WifiScanner scanner = mock(WifiScanner.class);
+    WifiScannerInternal mockWifiScanner(@WifiScanner.WifiBand int wifiBand) {
+        WifiScannerInternal scanner = mock(WifiScannerInternal.class);
 
-        doAnswer(new AnswerWithArguments() {
-            public void answer(ScanListener listener) throws Exception {
-                mScanListener = listener;
-            }
-        }).when(scanner).registerScanListener(anyObject());
-
+        doNothing().when(scanner).registerScanListener(mScanListenerArgumentCaptor.capture());
         ScanData[] scanDatas = new ScanData[1];
         scanDatas[0] = mock(ScanData.class);
         when(scanDatas[0].getScannedBandsInternal()).thenReturn(wifiBand);
         doAnswer(new AnswerWithArguments() {
-            public void answer(ScanSettings settings, ScanListener listener) throws Exception {
+            public void answer(ScanSettings settings, WifiScannerInternal.ScanListener listener)
+                    throws Exception {
                 if (mScanData != null && mScanData.getResults() != null) {
                     for (int i = 0; i < mScanData.getResults().length; i++) {
                         listener.onFullResult(
@@ -323,7 +319,8 @@
                 listener.onResults(scanDatas);
             }
         }).when(scanner).startScan(anyObject(), anyObject());
-
+        WifiLocalServices.removeServiceForTest(WifiScannerInternal.class);
+        WifiLocalServices.addService(WifiScannerInternal.class, scanner);
         return scanner;
     }
 
@@ -368,7 +365,7 @@
 
         assertEquals(MODULE_VERSION, mWifiHealthMonitor.getWifiStackVersion());
         millisecondsPass(5000);
-        mWifiScanner.startScan(mScanSettings, mScanListener);
+        mWifiScanner.startScan(mScanSettings, mScanListenerArgumentCaptor.getValue());
         mAlarmManager.dispatch(WifiHealthMonitor.POST_BOOT_DETECTION_TIMER_TAG);
         mLooper.dispatchAll();
         // serialized now has currSoftwareBuildInfo and scan results
@@ -444,7 +441,7 @@
         mWifiHealthMonitor.installMemoryStoreSetUpDetectionAlarm(mMemoryStore);
         setWifiEnabled(true);
         millisecondsPass(5000);
-        mWifiScanner.startScan(mScanSettings, mScanListener);
+        mWifiScanner.startScan(mScanSettings, mScanListenerArgumentCaptor.getValue());
         mAlarmManager.dispatch(WifiHealthMonitor.POST_BOOT_DETECTION_TIMER_TAG);
         mLooper.dispatchAll();
         WifiSystemInfoStats wifiSystemInfoStats = mWifiHealthMonitor.getWifiSystemInfoStats();
@@ -708,7 +705,8 @@
     public void testFullBandScan() throws Exception {
         millisecondsPass(5000);
         setWifiEnabled(true);
-        mWifiScanner.startScan(mScanSettings, mScanListener);
+        mWifiScanner.startScan(mScanSettings, mScanListenerArgumentCaptor.getValue());
+        mLooper.dispatchAll();
         ScanStats scanStats = mWifiHealthMonitor.getWifiSystemInfoStats().getCurrScanStats();
         assertEquals(1_500_000_005_000L, scanStats.getLastScanTimeMs());
         assertEquals(2, scanStats.getNumBssidLastScanAbove2g());
@@ -721,10 +719,9 @@
     @Test
     public void test2GScan() throws Exception {
         mWifiScanner = mockWifiScanner(WifiScanner.WIFI_BAND_24_GHZ);
-        when(mWifiInjector.getWifiScanner()).thenReturn(mWifiScanner);
         millisecondsPass(5000);
         setWifiEnabled(true);
-        mWifiScanner.startScan(mScanSettings, mScanListener);
+        mWifiScanner.startScan(mScanSettings, mScanListenerArgumentCaptor.getValue());
         ScanStats scanStats = mWifiHealthMonitor.getWifiSystemInfoStats().getCurrScanStats();
         assertEquals(TS_NONE, scanStats.getLastScanTimeMs());
         assertEquals(0, scanStats.getNumBssidLastScanAbove2g());
@@ -780,10 +777,10 @@
         // Add Above2G only scan data
         mScanData = mockScanDataAbove2GOnly();
         mWifiScanner = mockWifiScanner(WifiScanner.WIFI_BAND_ALL);
-        when(mWifiInjector.getWifiScanner()).thenReturn(mWifiScanner);
+
         millisecondsPass(5000);
         setWifiEnabled(true);
-        mWifiScanner.startScan(mScanSettings, mScanListener);
+        mWifiScanner.startScan(mScanSettings, mScanListenerArgumentCaptor.getValue());
 
         mAlarmManager.dispatch(WifiHealthMonitor.POST_BOOT_DETECTION_TIMER_TAG);
         mLooper.dispatchAll();
diff --git a/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java b/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
index 5a514d6..f7fce1b 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
@@ -86,6 +86,7 @@
 import com.android.server.wifi.ScanResults;
 import com.android.server.wifi.WifiBaseTest;
 import com.android.server.wifi.WifiInjector;
+import com.android.server.wifi.WifiLocalServices;
 import com.android.server.wifi.WifiMetrics;
 import com.android.server.wifi.WifiNative;
 import com.android.server.wifi.proto.nano.WifiMetricsProto;
@@ -195,6 +196,7 @@
                 anyInt(), eq(Binder.getCallingUid())))
                 .thenReturn(PERMISSION_GRANTED);
         when(mWifiInjector.getLastCallerInfoManager()).thenReturn(mLastCallerInfoManager);
+        WifiLocalServices.removeServiceForTest(WifiScannerInternal.class);
         mWifiScanningServiceImpl = new WifiScanningServiceImpl(mContext, mLooper.getLooper(),
                 mWifiScannerImplFactory, mBatteryStats, mWifiInjector);
     }