/* * 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; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.net.MacAddress; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import androidx.annotation.RequiresApi; import com.android.internal.util.Preconditions; import com.android.modules.utils.build.SdkLevel; import java.util.Objects; /** * A class representing information about SoftAp. * {@see WifiManager} * * @hide */ @SystemApi public final class SoftApInfo implements Parcelable { /** * AP Channel bandwidth is invalid. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_INVALID = 0; /** * AP Channel bandwidth is 20 MHZ but no HT. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_20MHZ_NOHT = 1; /** * AP Channel bandwidth is 20 MHZ. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_20MHZ = 2; /** * AP Channel bandwidth is 40 MHZ. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_40MHZ = 3; /** * AP Channel bandwidth is 80 MHZ. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_80MHZ = 4; /** * AP Channel bandwidth is 160 MHZ, but 80MHZ + 80MHZ. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 5; /** * AP Channel bandwidth is 160 MHZ. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_160MHZ = 6; /** * AP Channel bandwidth is 2160 MHZ. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_2160MHZ = 7; /** * AP Channel bandwidth is 4320 MHZ. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_4320MHZ = 8; /** * AP Channel bandwidth is 6480 MHZ. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_6480MHZ = 9; /** * AP Channel bandwidth is 8640 MHZ. * * @see #getBandwidth() */ public static final int CHANNEL_WIDTH_8640MHZ = 10; /** The frequency which AP resides on. */ private int mFrequency = 0; @WifiAnnotations.Bandwidth private int mBandwidth = CHANNEL_WIDTH_INVALID; /** The MAC Address which AP resides on. */ @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. */ private @WifiAnnotations.WifiStandard int mWifiStandard = ScanResult.WIFI_STANDARD_UNKNOWN; /** * The current shutdown timeout millis which applied on Soft AP. */ private long mIdleShutdownTimeoutMillis; /** * Get the frequency which AP resides on. */ public int getFrequency() { return mFrequency; } /** * Set the frequency which AP resides on. * @hide */ public void setFrequency(int freq) { mFrequency = freq; } /** * Get AP Channel bandwidth. * * @return One of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ}, * {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ}, * {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ}, {@link #CHANNEL_WIDTH_2160MHZ}, * {@link #CHANNEL_WIDTH_4320MHZ}, {@link #CHANNEL_WIDTH_6480MHZ}, * {@link #CHANNEL_WIDTH_8640MHZ}, or {@link #CHANNEL_WIDTH_INVALID}. */ @WifiAnnotations.Bandwidth public int getBandwidth() { return mBandwidth; } /** * Set AP Channel bandwidth. * @hide */ public void setBandwidth(@WifiAnnotations.Bandwidth int bandwidth) { mBandwidth = bandwidth; } /** * Get the MAC address (BSSID) of the AP. Null when AP disabled. */ @RequiresApi(Build.VERSION_CODES.S) @Nullable public MacAddress getBssid() { if (!SdkLevel.isAtLeastS()) { throw new UnsupportedOperationException(); } return getBssidInternal(); } /** * @hide */ @Nullable public MacAddress getBssidInternal() { return mBssid; } /** * Set the MAC address which AP resides on. *

*

  • If not set, defaults to null.
  • * @param bssid BSSID, The caller is responsible for avoiding collisions. * @throws IllegalArgumentException when the given BSSID is the all-zero or broadcast MAC * address. * * @hide */ public void setBssid(@Nullable MacAddress bssid) { if (bssid != null) { Preconditions.checkArgument(!bssid.equals(WifiManager.ALL_ZEROS_MAC_ADDRESS)); Preconditions.checkArgument(!bssid.equals(MacAddress.BROADCAST_ADDRESS)); } mBssid = bssid; } /** * Set the operational mode of the AP. * * @param wifiStandard values from {@link ScanResult}'s {@code WIFI_STANDARD_} * @hide */ public void setWifiStandard(@WifiAnnotations.WifiStandard int wifiStandard) { mWifiStandard = wifiStandard; } /** * Get the operational mode of the AP. * @return valid values from {@link ScanResult}'s {@code WIFI_STANDARD_} */ @RequiresApi(Build.VERSION_CODES.S) public @WifiAnnotations.WifiStandard int getWifiStandard() { if (!SdkLevel.isAtLeastS()) { throw new UnsupportedOperationException(); } return getWifiStandardInternal(); } /** * @hide */ public @WifiAnnotations.WifiStandard int getWifiStandardInternal() { 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; } /** * Set current shutdown timeout millis which applied on Soft AP. * @hide */ public void setAutoShutdownTimeoutMillis(long idleShutdownTimeoutMillis) { mIdleShutdownTimeoutMillis = idleShutdownTimeoutMillis; } /** * Get auto shutdown timeout in millis. * * The shutdown timeout value is configured by * {@link SoftApConfiguration.Builder#setAutoShutdownEnabled(int)} or * the default timeout setting defined in device overlays. * * A value of 0 means that auto shutdown is disabled. * {@see SoftApConfiguration#isAutoShutdownEnabled()} */ public long getAutoShutdownTimeoutMillis() { return mIdleShutdownTimeoutMillis; } /** * @hide */ public SoftApInfo(@Nullable SoftApInfo source) { if (source != null) { mFrequency = source.mFrequency; mBandwidth = source.mBandwidth; mBssid = source.mBssid; mWifiStandard = source.mWifiStandard; mApInstanceIdentifier = source.mApInstanceIdentifier; mIdleShutdownTimeoutMillis = source.mIdleShutdownTimeoutMillis; } } /** * @hide */ public SoftApInfo() { } @Override /** Implement the Parcelable interface. */ public int describeContents() { return 0; } @Override /** Implement the Parcelable interface */ public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeInt(mFrequency); dest.writeInt(mBandwidth); dest.writeParcelable(mBssid, flags); dest.writeInt(mWifiStandard); dest.writeString(mApInstanceIdentifier); dest.writeLong(mIdleShutdownTimeoutMillis); } @NonNull /** Implement the Parcelable interface */ public static final Creator CREATOR = new Creator() { public SoftApInfo createFromParcel(Parcel in) { SoftApInfo info = new SoftApInfo(); info.mFrequency = in.readInt(); info.mBandwidth = in.readInt(); info.mBssid = in.readParcelable(MacAddress.class.getClassLoader()); info.mWifiStandard = in.readInt(); info.mApInstanceIdentifier = in.readString(); info.mIdleShutdownTimeoutMillis = in.readLong(); return info; } public SoftApInfo[] newArray(int size) { return new SoftApInfo[size]; } }; @NonNull @Override public String toString() { StringBuilder sbuf = new StringBuilder(); sbuf.append("SoftApInfo{"); sbuf.append("bandwidth= ").append(mBandwidth); 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(", mIdleShutdownTimeoutMillis= ").append(mIdleShutdownTimeoutMillis); sbuf.append("}"); return sbuf.toString(); } @Override public boolean equals(@NonNull Object o) { if (this == o) return true; if (!(o instanceof SoftApInfo)) return false; SoftApInfo softApInfo = (SoftApInfo) o; return mFrequency == softApInfo.mFrequency && mBandwidth == softApInfo.mBandwidth && Objects.equals(mBssid, softApInfo.mBssid) && mWifiStandard == softApInfo.mWifiStandard && Objects.equals(mApInstanceIdentifier, softApInfo.mApInstanceIdentifier) && mIdleShutdownTimeoutMillis == softApInfo.mIdleShutdownTimeoutMillis; } @Override public int hashCode() { return Objects.hash(mFrequency, mBandwidth, mBssid, mWifiStandard, mApInstanceIdentifier, mIdleShutdownTimeoutMillis); } }