Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ee434e81 authored by Nate(Qiang) Jiang's avatar Nate(Qiang) Jiang
Browse files

[WifiManager] add public API to register callback on scan result

Bug: 142680108
Test: atest android.net.wifi
Test: atest com.android.server.wifi

Change-Id: I370a972c166242d31d21672c9d8023258664968a
parent 1e3af319
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -29936,6 +29936,7 @@ package android.net.wifi {
    method @Deprecated public int addNetwork(android.net.wifi.WifiConfiguration);
    method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public int addNetworkSuggestions(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>);
    method public void addOrUpdatePasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void addScanResultsListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.ScanResultsListener);
    method public static int calculateSignalLevel(int, int);
    method @Deprecated public void cancelWps(android.net.wifi.WifiManager.WpsCallback);
    method public static int compareSignalLevel(int, int);
@@ -29971,6 +29972,7 @@ package android.net.wifi {
    method @Deprecated public boolean removeNetwork(int);
    method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public int removeNetworkSuggestions(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>);
    method @Deprecated @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", "android.permission.NETWORK_CARRIER_PROVISIONING"}) public void removePasspointConfiguration(String);
    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void removeScanResultsListener(@NonNull android.net.wifi.WifiManager.ScanResultsListener);
    method @Deprecated public boolean saveConfiguration();
    method public void setTdlsEnabled(java.net.InetAddress, boolean);
    method public void setTdlsEnabledWithMacAddress(String, boolean);
@@ -30046,6 +30048,10 @@ package android.net.wifi {
    method public void setReferenceCounted(boolean);
  }
  public static interface WifiManager.ScanResultsListener {
    method public void onScanResultsAvailable();
  }
  public class WifiManager.WifiLock {
    method public void acquire();
    method public boolean isHeld();
+27 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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 android.net.wifi;

/**
 * Interface for Wi-Fi scan result available callback.
 *
 * @hide
 */
oneway interface IScanResultsListener
{
    void onScanResultsAvailable();
}
+5 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.net.wifi.IActionListener;
import android.net.wifi.IDppCallback;
import android.net.wifi.ILocalOnlyHotspotCallback;
import android.net.wifi.INetworkRequestMatchCallback;
import android.net.wifi.IScanResultsListener;
import android.net.wifi.ISoftApCallback;
import android.net.wifi.ITrafficStateCallback;
import android.net.wifi.ITxPacketCountListener;
@@ -227,4 +228,8 @@ interface IWifiManager
    oneway void forget(int netId, in IBinder binder, in IActionListener listener, int callbackIdentifier);

    oneway void getTxPacketCount(String packageName, in IBinder binder, in ITxPacketCountListener listener, int callbackIdentifier);

    void registerScanResultsListener(in IBinder binder, in IScanResultsListener Listener, int listenerIdentifier);

    void unregisterScanResultsListener(int listenerIdentifier);
}
+86 −0
Original line number Diff line number Diff line
@@ -5104,4 +5104,90 @@ public class WifiManager {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Base class for scan results listener. Should be implemented by applications and set when
     * calling {@link WifiManager#addScanResultsListener(Executor, ScanResultsListener)}.
     */
    public interface ScanResultsListener {

        /**
         * Called when new scan results available.
         * Caller should use {@link WifiManager#getScanResults()} to get the scan results.
         */
        void onScanResultsAvailable();
    }

    private class ScanResultsListenerProxy extends IScanResultsListener.Stub {
        private final Executor mExecutor;
        private final ScanResultsListener mListener;

        ScanResultsListenerProxy(Executor executor, ScanResultsListener listener) {
            mExecutor = executor;
            mListener = listener;
        }

        @Override
        public void onScanResultsAvailable() {
            mExecutor.execute(mListener::onScanResultsAvailable);
        }
    }

    /**
     * Add a listener for Scan Results. See {@link ScanResultsListener}.
     * Caller will receive the event when scan results are available.
     * Caller should use {@link WifiManager#getScanResults()} to get the scan results.
     * Caller can remove a previously registered listener using
     * {@link WifiManager#removeScanResultsListener(ScanResultsListener)}
     * <p>
     * Applications should have the
     * {@link android.Manifest.permission#ACCESS_WIFI_STATE} permission. Callers
     * without the permission will trigger a {@link java.lang.SecurityException}.
     * <p>
     *
     * @param executor  The executor to execute the listener of the {@code listener} object.
     * @param listener listener for Scan Results events
     */

    @RequiresPermission(ACCESS_WIFI_STATE)
    public void addScanResultsListener(@NonNull @CallbackExecutor Executor executor,
            @NonNull ScanResultsListener listener) {
        if (listener == null) throw new IllegalArgumentException("listener cannot be null");
        if (executor == null) throw new IllegalArgumentException("executor cannot be null");
        Log.v(TAG, "addScanResultsListener: listener=" + listener + ", executor=" + executor);
        try {
            IWifiManager iWifiManager = getIWifiManager();
            if (iWifiManager == null) {
                throw new RemoteException("Wifi service is not running");
            }
            iWifiManager.registerScanResultsListener(
                    new Binder(),
                    new ScanResultsListenerProxy(executor, listener),
                    mContext.getOpPackageName().hashCode());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Allow callers to remove a previously added listener. After calling this method,
     * applications will no longer receive Scan Results events.
     *
     * @param listener listener to remove for Scan Results events
     */
    @RequiresPermission(ACCESS_WIFI_STATE)
    public void removeScanResultsListener(@NonNull ScanResultsListener listener) {
        if (listener == null) throw new IllegalArgumentException("listener cannot be null");
        Log.v(TAG, "removeScanResultsListener: listener=" + listener);

        try {
            IWifiManager iWifiManager = getIWifiManager();
            if (iWifiManager == null) {
                throw new RemoteException("Wifi service is not running");
            }
            iWifiManager.unregisterScanResultsListener(mContext.getOpPackageName().hashCode());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
}
+12 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.net.wifi.IDppCallback;
import android.net.wifi.ILocalOnlyHotspotCallback;
import android.net.wifi.INetworkRequestMatchCallback;
import android.net.wifi.IOnWifiUsabilityStatsListener;
import android.net.wifi.IScanResultsListener;
import android.net.wifi.ISoftApCallback;
import android.net.wifi.ITrafficStateCallback;
import android.net.wifi.ITxPacketCountListener;
@@ -515,4 +516,15 @@ public class BaseWifiService extends IWifiManager.Stub {
            ITxPacketCountListener callback, int callbackIdentifier) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void registerScanResultsListener(
            IBinder binder, IScanResultsListener listener, int listenerIdentifier) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void unregisterScanResultsListener(int listenerIdentifier) {
        throw new UnsupportedOperationException();
    }
}
Loading