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

Commit d3d17acd authored by lesl's avatar lesl
Browse files

wifi: Add instance identifier in SoftApInfo/WifiClient and infoList callback

1. The framework need to know the instance of the client connected to
know which instance is idled.

2. The framework need to know the instance of the soft AP info.

3. Add infoList callback support for dual APs mode.

AP+AP Part 5 includes:
1. Support forceClientDisconnect in dual AP mode.
2. Support dual SoftApInfo callback
   a. New callback onInfoListChanged
   b. Add instanceIdentifier in SoftApInfo but it is used only in
   framework.
   c. Add instanceIdentifier in WifiClient but it is used only in
   framework.

Bug: 162686273
Test: FrameworksWifiApiTests
Change-Id: I207831ff15a3044316556d61a72542ff35c94e74
parent 62d86208
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -632,6 +632,7 @@ package android.net.wifi {
    method public default void onCapabilityChanged(@NonNull android.net.wifi.SoftApCapability);
    method public default void onConnectedClientsChanged(@NonNull java.util.List<android.net.wifi.WifiClient>);
    method public default void onInfoChanged(@NonNull android.net.wifi.SoftApInfo);
    method public default void onInfoListChanged(@NonNull java.util.List<android.net.wifi.SoftApInfo>);
    method public default void onStateChanged(int, int);
  }

+6 −0
Original line number Diff line number Diff line
@@ -53,6 +53,12 @@ oneway interface ISoftApCallback
     */
    void onInfoChanged(in SoftApInfo softApInfo);

    /**
     * Service to manager callback providing informations of softap.
     *
     * @param softApInfoList is the list of the softap informations. {@link SoftApInfo}
     */
    void onInfoListChanged(in List<SoftApInfo> softApInfoList);

    /**
     * Service to manager callback providing capability of softap.
+33 −2
Original line number Diff line number Diff line
@@ -96,6 +96,10 @@ public final class SoftApInfo implements Parcelable {
    @Nullable
    private MacAddress mBssid;

    /** The identifier of the AP instance which AP resides on with current info. */
    @Nullable
    private String mApInstanceIdentifier;

    /**
     * The operational mode of the AP.
     */
@@ -195,6 +199,28 @@ public final class SoftApInfo implements Parcelable {
        return mWifiStandard;
    }

    /**
     * Set the AP instance identifier.
     * @hide
     */
    public void setApInstanceIdentifier(@NonNull String apInstanceIdentifier) {
        mApInstanceIdentifier = apInstanceIdentifier;
    }

    /**
     * Get the AP instance identifier.
     *
     * The AP instance identifier is a unique identity which can be used to
     * associate the {@link SoftApInfo} to a specific {@link WifiClient}
     * - see {@link WifiClient#getApInstanceIdentifier()}
     *
     * @hide
     */
    @Nullable
    public String getApInstanceIdentifier() {
        return mApInstanceIdentifier;
    }

    /**
     * @hide
     */
@@ -204,6 +230,7 @@ public final class SoftApInfo implements Parcelable {
            mBandwidth = source.mBandwidth;
            mBssid = source.mBssid;
            mWifiStandard = source.mWifiStandard;
            mApInstanceIdentifier = source.mApInstanceIdentifier;
        }
    }

@@ -226,6 +253,7 @@ public final class SoftApInfo implements Parcelable {
        dest.writeInt(mBandwidth);
        dest.writeParcelable(mBssid, flags);
        dest.writeInt(mWifiStandard);
        dest.writeString(mApInstanceIdentifier);
    }

    @NonNull
@@ -237,6 +265,7 @@ public final class SoftApInfo implements Parcelable {
            info.mBandwidth = in.readInt();
            info.mBssid = in.readParcelable(MacAddress.class.getClassLoader());
            info.mWifiStandard = in.readInt();
            info.mApInstanceIdentifier = in.readString();
            return info;
        }

@@ -254,6 +283,7 @@ public final class SoftApInfo implements Parcelable {
        sbuf.append(", frequency= ").append(mFrequency);
        if (mBssid != null) sbuf.append(",bssid=").append(mBssid.toString());
        sbuf.append(", wifiStandard= ").append(mWifiStandard);
        sbuf.append(", mApInstanceIdentifier= ").append(mApInstanceIdentifier);
        sbuf.append("}");
        return sbuf.toString();
    }
@@ -266,11 +296,12 @@ public final class SoftApInfo implements Parcelable {
        return mFrequency == softApInfo.mFrequency
                && mBandwidth == softApInfo.mBandwidth
                && Objects.equals(mBssid, softApInfo.mBssid)
                && mWifiStandard == softApInfo.mWifiStandard;
                && mWifiStandard == softApInfo.mWifiStandard
                && Objects.equals(mApInstanceIdentifier, softApInfo.mApInstanceIdentifier);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mFrequency, mBandwidth, mBssid, mWifiStandard);
        return Objects.hash(mFrequency, mBandwidth, mBssid, mWifiStandard, mApInstanceIdentifier);
    }
}
+24 −5
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@ public final class WifiClient implements Parcelable {

    private final MacAddress mMacAddress;

    /** The identifier of the AP instance which the client connected. */
    private final String mApInstanceIdentifier;

    /**
     * The mac address of this client.
     */
@@ -38,15 +41,30 @@ public final class WifiClient implements Parcelable {
        return mMacAddress;
    }

    /**
     * Get AP instance identifier.
     *
     * The AP instance identifier is a unique identity which can be used to
     * associate the {@link SoftApInfo} to a specific {@link WifiClient}
     * - see {@link SoftApInfo#getApInstanceIdentifier()}
     * @hide
     */
    @NonNull
    public String getApInstanceIdentifier() {
        return mApInstanceIdentifier;
    }

    private WifiClient(Parcel in) {
        mMacAddress = in.readParcelable(null);
        mApInstanceIdentifier = in.readString();
    }

    /** @hide */
    public WifiClient(@NonNull MacAddress macAddress) {
    public WifiClient(@NonNull MacAddress macAddress, @NonNull String apInstanceIdentifier) {
        Objects.requireNonNull(macAddress, "mMacAddress must not be null.");

        this.mMacAddress = macAddress;
        this.mApInstanceIdentifier = apInstanceIdentifier;
    }

    @Override
@@ -57,6 +75,7 @@ public final class WifiClient implements Parcelable {
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeParcelable(mMacAddress, flags);
        dest.writeString(mApInstanceIdentifier);
    }

    @NonNull
@@ -75,6 +94,7 @@ public final class WifiClient implements Parcelable {
    public String toString() {
        return "WifiClient{"
                + "mMacAddress=" + mMacAddress
                + "mApInstanceIdentifier=" + mApInstanceIdentifier
                + '}';
    }

@@ -83,13 +103,12 @@ public final class WifiClient implements Parcelable {
        if (this == o) return true;
        if (!(o instanceof WifiClient)) return false;
        WifiClient client = (WifiClient) o;
        return mMacAddress.equals(client.mMacAddress);
        return Objects.equals(mMacAddress, client.mMacAddress)
                && mApInstanceIdentifier.equals(client.mApInstanceIdentifier);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mMacAddress);
        return Objects.hash(mMacAddress, mApInstanceIdentifier);
    }
}

+36 −0
Original line number Diff line number Diff line
@@ -3985,12 +3985,35 @@ public class WifiManager {
        /**
         * Called when information of softap changes.
         *
         * Note: this API is only valid when the Soft AP is configured as a single AP
         * - not as a bridged AP (2 Soft APs). When the Soft AP is configured as bridged AP
         * this callback will not be triggered -  use the
         * {@link #onInfoListChanged(List<SoftApInfo>)} callback in bridged AP mode.
         *
         * @param softApInfo is the softap information. {@link SoftApInfo}
         */
        default void onInfoChanged(@NonNull SoftApInfo softApInfo) {
            // Do nothing: can be updated to add SoftApInfo details (e.g. channel) to the UI.
        }

        /**
         * Called when information of softap changes.
         *
         * The number of the information elements in the list depends on Soft AP configuration
         * and state.
         * For instance, an empty list will be returned when the Soft AP is disabled.
         * One information element will be returned in the list when the Soft AP is configured
         * as a single AP, and two information elements will be returned in the list
         * when the Soft AP is configured in bridged mode.
         *
         * See {@link #isBridgedApConcurrencySupported()} for the detail of the bridged AP.
         *
         * @param softApInfoList is the list of the softap information elements. {@link SoftApInfo}
         */
        default void onInfoListChanged(@NonNull List<SoftApInfo> softApInfoList) {
            // Do nothing: can be updated to add SoftApInfo details (e.g. channel) to the UI.
        }

        /**
         * Called when capability of softap changes.
         *
@@ -4070,6 +4093,19 @@ public class WifiManager {
            });
        }

        @Override
        public void onInfoListChanged(List<SoftApInfo> softApInfoList) {
            if (mVerboseLoggingEnabled) {
                Log.v(TAG, "SoftApCallbackProxy: onInfoListChange: softApInfoList="
                        + softApInfoList);
            }

            Binder.clearCallingIdentity();
            mExecutor.execute(() -> {
                mCallback.onInfoListChanged(softApInfoList);
            });
        }

        @Override
        public void onCapabilityChanged(SoftApCapability capability) {
            if (mVerboseLoggingEnabled) {
Loading