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

Commit 492e4bd8 authored by lesl's avatar lesl
Browse files

wifi: Add features in SoftApCapability

Caller can get hotspot feature list from SoftApCapability

Bug: 142752869
Test: atest frameworks/base/wifi/tests/
Change-Id: I31fea5c42eab092a838c08b328903d71c720090d
parent 75124194
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -5611,8 +5611,11 @@ package android.net.wifi {
  public final class SoftApCapability implements android.os.Parcelable {
    method public int describeContents();
    method public int getMaxSupportedClients();
    method public boolean isFeatureSupported(int);
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApCapability> CREATOR;
    field public static final int SOFTAP_FEATURE_ACS_OFFLOAD = 1; // 0x1
    field public static final int SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT = 2; // 0x2
  }
  public final class SoftApConfiguration implements android.os.Parcelable {
+63 −4
Original line number Diff line number Diff line
@@ -16,12 +16,15 @@

package android.net.wifi;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;

/**
@@ -33,6 +36,41 @@ import java.util.Objects;
@SystemApi
public final class SoftApCapability implements Parcelable {

    /**
     * Support for automatic channel selection in driver (ACS).
     * Driver will auto select best channel based on interference to optimize performance.
     *
     * flag when {@link R.bool.config_wifi_softap_acs_supported)} is true.
     *
     * <p>
     * Use {@link WifiManager.SoftApCallback#onInfoChanged(SoftApInfo)} and
     * {@link SoftApInfo#getFrequency} and {@link SoftApInfo#getBandwidth} to get
     * driver channel selection result.
     */
    public static final int SOFTAP_FEATURE_ACS_OFFLOAD = 1 << 0;

    /**
     * Support for client force disconnect.
     * flag when {@link R.bool.config_wifi_sofap_client_force_disconnect_supported)} is true
     *
     * <p>
     * Several Soft AP client control features, e.g. specifying the maximum number of
     * Soft AP clients, only work when this feature support is present.
     * Check feature support before invoking
     * {@link SoftApConfiguration.Builder#setMaxNumberOfClients(int)}
     */
    public static final int SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT = 1 << 1;

    /** @hide */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(flag = true, prefix = { "SOFTAP_FEATURE_" }, value = {
            SOFTAP_FEATURE_ACS_OFFLOAD,
            SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT,
    })
    public @interface HotspotFeatures {}

    private @HotspotFeatures int mSupportedFeatures = 0;

    private int mMaximumSupportedClientNumber;

    /**
@@ -44,25 +82,42 @@ public final class SoftApCapability implements Parcelable {

    /**
     * Set the maximum supported client numbers which AP resides on.
     *
     * @param maxClient maximum supported client numbers for the softap.
     * @hide
     */
    public void setMaxSupportedClients(int maxClient) {
        mMaximumSupportedClientNumber = maxClient;
    }

    /**
     * Returns true when feature supported, otherwise false.
     *
     * @param feature one of feature from {@link HotspotFeatures}
     */
    public boolean isFeatureSupported(@HotspotFeatures int feature) {
        return (mSupportedFeatures & feature) == feature;
    }

    /**
     * @hide
     */
    public SoftApCapability(@Nullable SoftApCapability source) {
        if (source != null) {
            mSupportedFeatures = source.mSupportedFeatures;
            mMaximumSupportedClientNumber = source.mMaximumSupportedClientNumber;
        }
    }

    /**
     * Constructor with combination of the feature.
     * Zero to no supported feature.
     *
     * @param features One or combination of the feature from {@link @HotspotFeatures}.
     * @hide
     */
    public SoftApCapability() {
    public SoftApCapability(@HotspotFeatures int features) {
        mSupportedFeatures = features;
    }

    @Override
@@ -74,6 +129,7 @@ public final class SoftApCapability implements Parcelable {
    @Override
    /** Implement the Parcelable interface */
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(mSupportedFeatures);
        dest.writeInt(mMaximumSupportedClientNumber);
    }

@@ -81,7 +137,8 @@ public final class SoftApCapability implements Parcelable {
    /** Implement the Parcelable interface */
    public static final Creator<SoftApCapability> CREATOR = new Creator<SoftApCapability>() {
        public SoftApCapability createFromParcel(Parcel in) {
            SoftApCapability capability = new SoftApCapability();
            int supportedFeatures = in.readInt();
            SoftApCapability capability = new SoftApCapability(supportedFeatures);
            capability.mMaximumSupportedClientNumber = in.readInt();
            return capability;
        }
@@ -95,6 +152,7 @@ public final class SoftApCapability implements Parcelable {
    @Override
    public String toString() {
        StringBuilder sbuf = new StringBuilder();
        sbuf.append("SupportedFeatures=").append(mSupportedFeatures);
        sbuf.append("MaximumSupportedClientNumber=").append(mMaximumSupportedClientNumber);
        return sbuf.toString();
    }
@@ -104,11 +162,12 @@ public final class SoftApCapability implements Parcelable {
        if (this == o) return true;
        if (!(o instanceof SoftApCapability)) return false;
        SoftApCapability capability = (SoftApCapability) o;
        return mMaximumSupportedClientNumber == capability.mMaximumSupportedClientNumber;
        return mSupportedFeatures == capability.mSupportedFeatures
                && mMaximumSupportedClientNumber == capability.mMaximumSupportedClientNumber;
    }

    @Override
    public int hashCode() {
        return Objects.hash(mMaximumSupportedClientNumber);
        return Objects.hash(mSupportedFeatures, mMaximumSupportedClientNumber);
    }
}
+13 −0
Original line number Diff line number Diff line
@@ -523,9 +523,16 @@ public final class SoftApConfiguration implements Parcelable {
         * Specifies the channel and associated band for the AP.
         *
         * The channel which AP resides on. Valid channels are country dependent.
         * <p>
         * The default for the channel is a the special value 0 to have the framework
         * auto-select a valid channel from the band configured with
         * {@link #setBand(@BandType int)}.
         *
         * The channel auto selection will offload to driver when
         * {@link SoftApCapability#isFeatureSupported(SoftApCapability.SOFTAP_FEATURE_ACS_OFFLOAD)}
         * return true. Driver will auto select best channel which based on environment
         * interference to get best performance. Check {@link SoftApCapability} to get more detail.
         *
         * Note, since 6GHz band use the same channel numbering of 2.4GHz and 5GHZ bands,
         * the caller needs to pass the band containing the selected channel.
         *
@@ -565,6 +572,12 @@ public final class SoftApConfiguration implements Parcelable {
         * {@link WifiManager#startTetheredHotspot} will report error code
         * {@link WifiManager#SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION}.
         *
         * <p>
         * Use {@link WifiManager.SoftApCallback#onCapabilityChanged(SoftApCapability)} and
         * {@link SoftApCapability#isFeatureSupported(int)}
         * with {@link SoftApCapability.SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT} to determine whether
         * or not this feature is supported.
         *
         * @param maxNumberOfClients maximum client number of the AP.
         * @return Builder for chaining.
         */
+6 −2
Original line number Diff line number Diff line
@@ -35,7 +35,9 @@ public class SoftApCapabilityTest {
     */
    @Test
    public void testCopyOperator() throws Exception {
        SoftApCapability capability = new SoftApCapability();
        int testSoftApFeature = SoftApCapability.SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT
                | SoftApCapability.SOFTAP_FEATURE_ACS_OFFLOAD;
        SoftApCapability capability = new SoftApCapability(testSoftApFeature);
        capability.setMaxSupportedClients(10);

        SoftApCapability copiedCapability = new SoftApCapability(capability);
@@ -49,7 +51,9 @@ public class SoftApCapabilityTest {
     */
    @Test
    public void testParcelOperation() throws Exception {
        SoftApCapability capability = new SoftApCapability();
        int testSoftApFeature = SoftApCapability.SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT
                | SoftApCapability.SOFTAP_FEATURE_ACS_OFFLOAD;
        SoftApCapability capability = new SoftApCapability(testSoftApFeature);
        capability.setMaxSupportedClients(10);

        Parcel parcelW = Parcel.obtain();
+2 −2
Original line number Diff line number Diff line
@@ -883,7 +883,7 @@ public class WifiManagerTest {
     */
    @Test
    public void softApCallbackProxyCallsOnCapabilityChanged() throws Exception {
        SoftApCapability testSoftApCapability = new SoftApCapability();
        SoftApCapability testSoftApCapability = new SoftApCapability(0);
        testSoftApCapability.setMaxSupportedClients(10);
        ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor =
                ArgumentCaptor.forClass(ISoftApCallback.Stub.class);
@@ -904,7 +904,7 @@ public class WifiManagerTest {
        SoftApInfo testSoftApInfo = new SoftApInfo();
        testSoftApInfo.setFrequency(TEST_AP_FREQUENCY);
        testSoftApInfo.setBandwidth(TEST_AP_BANDWIDTH);
        SoftApCapability testSoftApCapability = new SoftApCapability();
        SoftApCapability testSoftApCapability = new SoftApCapability(0);
        testSoftApCapability.setMaxSupportedClients(10);
        ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor =
                ArgumentCaptor.forClass(ISoftApCallback.Stub.class);