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

Commit 0037dde2 authored by Mehdi Alizadeh's avatar Mehdi Alizadeh
Browse files

Adds API to register callback for soft AP event

Bug: 68712383
Test: frameworks/opt/net/wifi/tests/wifitests/runtests.sh
Change-Id: I270366494500251858fe2ddf6209c7b4bfb5f546
parent 5170831d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -547,6 +547,7 @@ java_library {
        "telephony/java/com/android/internal/telephony/euicc/ISetDefaultSmdpAddressCallback.aidl",
        "telephony/java/com/android/internal/telephony/euicc/ISetNicknameCallback.aidl",
        "telephony/java/com/android/internal/telephony/euicc/ISwitchToProfileCallback.aidl",
        "wifi/java/android/net/wifi/ISoftApCallback.aidl",
        "wifi/java/android/net/wifi/IWifiManager.aidl",
        "wifi/java/android/net/wifi/aware/IWifiAwareDiscoverySessionCallback.aidl",
        "wifi/java/android/net/wifi/aware/IWifiAwareEventCallback.aidl",
+44 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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 Soft AP callback.
 *
 * @hide
 */
oneway interface ISoftApCallback
{
    /**
     * Service to manager callback providing current soft AP state. The possible
     * parameter values listed are defined in WifiManager.java
     *
     * @param state new AP state. One of WIFI_AP_STATE_DISABLED,
     *        WIFI_AP_STATE_DISABLING, WIFI_AP_STATE_ENABLED,
     *        WIFI_AP_STATE_ENABLING, WIFI_AP_STATE_FAILED
     * @param failureReason reason when in failed state. One of
     *        SAP_START_FAILURE_GENERAL, SAP_START_FAILURE_NO_CHANNEL
     */
    void onStateChanged(int state, int failureReason);

    /**
     * Service to manager callback providing number of connected clients.
     *
     * @param numClients number of connected clients
     */
    void onNumClientsChanged(int numClients);
}
+9 −7
Original line number Diff line number Diff line
@@ -23,15 +23,15 @@ import android.net.wifi.hotspot2.OsuProvider;
import android.net.wifi.hotspot2.PasspointConfiguration;
import android.net.wifi.hotspot2.IProvisioningCallback;

import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.ScanSettings;
import android.net.wifi.ScanResult;
import android.net.DhcpInfo;
import android.net.Network;
import android.net.wifi.ISoftApCallback;
import android.net.wifi.PasspointManagementObjectDefinition;
import android.net.wifi.ScanResult;
import android.net.wifi.ScanSettings;
import android.net.wifi.WifiActivityEnergyInfo;
import android.net.Network;

import android.net.DhcpInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;

import android.os.Messenger;
import android.os.ResultReceiver;
@@ -178,5 +178,7 @@ interface IWifiManager
    void restoreSupplicantBackupData(in byte[] supplicantData, in byte[] ipConfigData);

    void startSubscriptionProvisioning(in OsuProvider provider, in IProvisioningCallback callback);

    void registerSoftApCallback(in IBinder binder, in ISoftApCallback callback);
}
+112 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.net.wifi;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -55,6 +56,8 @@ import com.android.server.net.NetworkPinner;

import dalvik.system.CloseGuard;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
import java.net.InetAddress;
import java.util.Collections;
@@ -432,6 +435,17 @@ public class WifiManager {
     */
    public static final String EXTRA_WIFI_AP_MODE = "wifi_ap_mode";

    /** @hide */
    @IntDef(flag = false, prefix = { "WIFI_AP_STATE_" }, value = {
        WIFI_AP_STATE_DISABLING,
        WIFI_AP_STATE_DISABLED,
        WIFI_AP_STATE_ENABLING,
        WIFI_AP_STATE_ENABLED,
        WIFI_AP_STATE_FAILED,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface WifiApState {}

    /**
     * Wi-Fi AP is currently being disabled. The state will change to
     * {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully.
@@ -486,6 +500,14 @@ public class WifiManager {
    @SystemApi
    public static final int WIFI_AP_STATE_FAILED = 14;

    /** @hide */
    @IntDef(flag = false, prefix = { "SAP_START_FAILURE_" }, value = {
        SAP_START_FAILURE_GENERAL,
        SAP_START_FAILURE_NO_CHANNEL,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface SapStartFailure {}

    /**
     *  If WIFI AP start failed, this reason code means there is no legal channel exists on
     *  user selected band by regulatory
@@ -2323,6 +2345,96 @@ public class WifiManager {
        public void onFailure(int reason);
    }

    /**
     * Base class for soft AP callback. Should be extended by applications and set when calling
     * {@link WifiManager#registerSoftApCallback(SoftApCallback, Handler)}.
     *
     * @hide
     */
    public interface SoftApCallback {
        /**
         * Called when soft AP state changes.
         *
         * @param state new new AP state. One of {@link #WIFI_AP_STATE_DISABLED},
         *        {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED},
         *        {@link #WIFI_AP_STATE_ENABLING}, {@link #WIFI_AP_STATE_FAILED}
         * @param failureReason reason when in failed state. One of
         *        {@link #SAP_START_FAILURE_GENERAL}, {@link #SAP_START_FAILURE_NO_CHANNEL}
         */
        public abstract void onStateChanged(@WifiApState int state,
                @SapStartFailure int failureReason);

        /**
         * Called when number of connected clients to soft AP changes.
         *
         * @param numClients number of connected clients
         */
        public abstract void onNumClientsChanged(int numClients);
    }

    /**
     * Callback proxy for SoftApCallback objects.
     *
     * @hide
     */
    private static class SoftApCallbackProxy extends ISoftApCallback.Stub {
        private final Handler mHandler;
        private final SoftApCallback mCallback;

        SoftApCallbackProxy(Looper looper, SoftApCallback callback) {
            mHandler = new Handler(looper);
            mCallback = callback;
        }

        @Override
        public void onStateChanged(int state, int failureReason) throws RemoteException {
            Log.v(TAG, "SoftApCallbackProxy: onStateChanged: state=" + state + ", failureReason=" +
                    failureReason);
            mHandler.post(() -> {
                mCallback.onStateChanged(state, failureReason);
            });
        }

        @Override
        public void onNumClientsChanged(int numClients) throws RemoteException {
            Log.v(TAG, "SoftApCallbackProxy: onNumClientsChanged: numClients=" + numClients);
            mHandler.post(() -> {
                mCallback.onNumClientsChanged(numClients);
            });
        }
    }

    /**
     * Registers a callback for Soft AP. See {@link SoftApCallback}. Caller will receive the current
     * soft AP state and number of connected devices immediately after a successful call to this API
     * via callback. Note that receiving an immediate WIFI_AP_STATE_FAILED value for soft AP state
     * indicates that the latest attempt to start soft AP has failed. Only one registered callback
     * is allowed for each process, and multiple calls to this API from the same process will simply
     * replace the previously registered callback with the new one.
     *
     * @param callback A callback for the number of connected clients.
     * @param handler  The Handler on whose thread to execute the callbacks of the {@code
     *                 callback} object. If a null is provided then the application's main thread
     *                 will be used.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
    public void registerSoftApCallback(@NonNull SoftApCallback callback,
                                       @Nullable Handler handler) {
        if (callback == null) throw new IllegalArgumentException("callback cannot be null");

        Log.v(TAG, "registerSoftApCallback: callback=" + callback + ", handler=" + handler);

        Looper looper = (handler == null) ? mContext.getMainLooper() : handler.getLooper();
        Binder binder = new Binder();
        try {
            mService.registerSoftApCallback(binder, new SoftApCallbackProxy(looper, callback));
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * LocalOnlyHotspotReservation that contains the {@link WifiConfiguration} for the active
     * LocalOnlyHotspot request.