blob: 66cd473bf074686188439a86ecbda334f97eec60 [file] [log] [blame]
/*
* Copyright (C) 2020 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 static android.net.wifi.WifiScanner.WIFI_BAND_24_GHZ;
import static android.net.wifi.WifiScanner.WIFI_BAND_5_GHZ;
import static android.net.wifi.WifiScanner.WIFI_BAND_6_GHZ;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.RequiresApi;
import com.android.modules.utils.build.SdkLevel;
import java.util.Objects;
/**
* Data structure class representing a Wi-Fi channel that would cause interference to/receive
* interference from the active cellular channels and should be avoided.
*
* @hide
*/
@SystemApi
@RequiresApi(Build.VERSION_CODES.S)
public final class CoexUnsafeChannel implements Parcelable {
public static final int POWER_CAP_NONE = Integer.MAX_VALUE;
private @WifiAnnotations.WifiBandBasic int mBand;
private int mChannel;
private int mPowerCapDbm;
/**
* Constructor for a CoexUnsafeChannel with no power cap specified.
* @param band One of {@link WifiAnnotations.WifiBandBasic}
* @param channel Channel number
*/
public CoexUnsafeChannel(@WifiAnnotations.WifiBandBasic int band, int channel) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
mBand = band;
mChannel = channel;
mPowerCapDbm = POWER_CAP_NONE;
}
/**
* Constructor for a CoexUnsafeChannel with power cap specified.
* @param band One of {@link WifiAnnotations.WifiBandBasic}
* @param channel Channel number
* @param powerCapDbm Power cap in dBm
*/
public CoexUnsafeChannel(@WifiAnnotations.WifiBandBasic int band, int channel,
int powerCapDbm) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
mBand = band;
mChannel = channel;
mPowerCapDbm = powerCapDbm;
}
/** Returns the Wi-Fi band of this channel as one of {@link WifiAnnotations.WifiBandBasic} */
public @WifiAnnotations.WifiBandBasic int getBand() {
return mBand;
}
/** Returns the channel number of this channel. */
public int getChannel() {
return mChannel;
}
/**
* Returns the power cap of this channel in dBm or {@link CoexUnsafeChannel#POWER_CAP_NONE}
* if the power cap is not specified.
*/
public int getPowerCapDbm() {
return mPowerCapDbm;
}
@Override
public boolean equals(@Nullable Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CoexUnsafeChannel that = (CoexUnsafeChannel) o;
return mBand == that.mBand
&& mChannel == that.mChannel
&& mPowerCapDbm == that.mPowerCapDbm;
}
@Override
public int hashCode() {
return Objects.hash(mBand, mChannel, mPowerCapDbm);
}
@Override
public String toString() {
StringBuilder sj = new StringBuilder("CoexUnsafeChannel{");
if (mBand == WIFI_BAND_24_GHZ) {
sj.append("2.4GHz");
} else if (mBand == WIFI_BAND_5_GHZ) {
sj.append("5GHz");
} else if (mBand == WIFI_BAND_6_GHZ) {
sj.append("6GHz");
} else {
sj.append("UNKNOWN BAND");
}
sj.append(", ").append(mChannel);
if (mPowerCapDbm != POWER_CAP_NONE) {
sj.append(", ").append(mPowerCapDbm).append("dBm");
}
sj.append('}');
return sj.toString();
}
/** Implement the Parcelable interface {@hide} */
@Override
public int describeContents() {
return 0;
}
/** Implement the Parcelable interface {@hide} */
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mBand);
dest.writeInt(mChannel);
dest.writeInt(mPowerCapDbm);
}
/** Implement the Parcelable interface */
public static final @NonNull Creator<CoexUnsafeChannel> CREATOR =
new Creator<CoexUnsafeChannel>() {
public CoexUnsafeChannel createFromParcel(Parcel in) {
final int band = in.readInt();
final int channel = in.readInt();
final int powerCapDbm = in.readInt();
return new CoexUnsafeChannel(band, channel, powerCapDbm);
}
public CoexUnsafeChannel[] newArray(int size) {
return new CoexUnsafeChannel[size];
}
};
}