/* * Copyright (C) 2016 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.nan; import android.os.Parcel; import android.os.Parcelable; /** * Defines a request object to configure a Wi-Fi NAN network. Built using * {@link ConfigRequest.Builder}. Configuration is requested using * {@link WifiNanManager#requestConfig(ConfigRequest)}. Note that the actual * achieved configuration may be different from the requested configuration - * since multiple applications may request different configurations. * * @hide PROPOSED_NAN_API */ public class ConfigRequest implements Parcelable { /** * Lower range of possible cluster ID. * * @hide */ public static final int CLUSTER_ID_MIN = 0; /** * Upper range of possible cluster ID. * * @hide */ public static final int CLUSTER_ID_MAX = 0xFFFF; /** * Indicates whether 5G band support is requested. * * @hide */ public final boolean mSupport5gBand; /** * Specifies the desired master preference. * * @hide */ public final int mMasterPreference; /** * Specifies the desired lower range of the cluster ID. Must be lower then * {@link ConfigRequest#mClusterHigh}. * * @hide */ public final int mClusterLow; /** * Specifies the desired higher range of the cluster ID. Must be higher then * {@link ConfigRequest#mClusterLow}. * * @hide */ public final int mClusterHigh; private ConfigRequest(boolean support5gBand, int masterPreference, int clusterLow, int clusterHigh) { mSupport5gBand = support5gBand; mMasterPreference = masterPreference; mClusterLow = clusterLow; mClusterHigh = clusterHigh; } @Override public String toString() { return "ConfigRequest [mSupport5gBand=" + mSupport5gBand + ", mMasterPreference=" + mMasterPreference + ", mClusterLow=" + mClusterLow + ", mClusterHigh=" + mClusterHigh + "]"; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mSupport5gBand ? 1 : 0); dest.writeInt(mMasterPreference); dest.writeInt(mClusterLow); dest.writeInt(mClusterHigh); } public static final Creator CREATOR = new Creator() { @Override public ConfigRequest[] newArray(int size) { return new ConfigRequest[size]; } @Override public ConfigRequest createFromParcel(Parcel in) { boolean support5gBand = in.readInt() != 0; int masterPreference = in.readInt(); int clusterLow = in.readInt(); int clusterHigh = in.readInt(); return new ConfigRequest(support5gBand, masterPreference, clusterLow, clusterHigh); } }; @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof ConfigRequest)) { return false; } ConfigRequest lhs = (ConfigRequest) o; return mSupport5gBand == lhs.mSupport5gBand && mMasterPreference == lhs.mMasterPreference && mClusterLow == lhs.mClusterLow && mClusterHigh == lhs.mClusterHigh; } @Override public int hashCode() { int result = 17; result = 31 * result + (mSupport5gBand ? 1 : 0); result = 31 * result + mMasterPreference; result = 31 * result + mClusterLow; result = 31 * result + mClusterHigh; return result; } /** * Builder used to build {@link ConfigRequest} objects. */ public static final class Builder { private boolean mSupport5gBand; private int mMasterPreference; private int mClusterLow; private int mClusterHigh; /** * Default constructor for the Builder. */ public Builder() { mSupport5gBand = false; mMasterPreference = 0; mClusterLow = 0; mClusterHigh = CLUSTER_ID_MAX; } /** * Specify whether 5G band support is required in this request. * * @param support5gBand Support for 5G band is required. * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. */ public Builder setSupport5gBand(boolean support5gBand) { mSupport5gBand = support5gBand; return this; } /** * Specify the Master Preference requested. The permitted range is 0 to * 255 with 1 and 255 excluded (reserved). * * @param masterPreference The requested master preference * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. */ public Builder setMasterPreference(int masterPreference) { if (masterPreference < 0) { throw new IllegalArgumentException( "Master Preference specification must be non-negative"); } if (masterPreference == 1 || masterPreference == 255 || masterPreference > 255) { throw new IllegalArgumentException("Master Preference specification must not " + "exceed 255 or use 1 or 255 (reserved values)"); } mMasterPreference = masterPreference; return this; } /** * The Cluster ID is generated randomly for new NAN networks. Specify * the lower range of the cluster ID. The upper range is specified using * the {@link ConfigRequest.Builder#setClusterHigh(int)}. The permitted * range is 0 to the value specified by * {@link ConfigRequest.Builder#setClusterHigh(int)}. Equality is * permitted which restricts the Cluster ID to the specified value. * * @param clusterLow The lower range of the generated cluster ID. * @return The builder to facilitate chaining * {@code builder.setClusterLow(..).setClusterHigh(..)}. */ public Builder setClusterLow(int clusterLow) { if (clusterLow < CLUSTER_ID_MIN) { throw new IllegalArgumentException("Cluster specification must be non-negative"); } if (clusterLow > CLUSTER_ID_MAX) { throw new IllegalArgumentException("Cluster specification must not exceed 0xFFFF"); } mClusterLow = clusterLow; return this; } /** * The Cluster ID is generated randomly for new NAN networks. Specify * the lower upper of the cluster ID. The lower range is specified using * the {@link ConfigRequest.Builder#setClusterLow(int)}. The permitted * range is the value specified by * {@link ConfigRequest.Builder#setClusterLow(int)} to 0xFFFF. Equality * is permitted which restricts the Cluster ID to the specified value. * * @param clusterHigh The upper range of the generated cluster ID. * @return The builder to facilitate chaining * {@code builder.setClusterLow(..).setClusterHigh(..)}. */ public Builder setClusterHigh(int clusterHigh) { if (clusterHigh < CLUSTER_ID_MIN) { throw new IllegalArgumentException("Cluster specification must be non-negative"); } if (clusterHigh > CLUSTER_ID_MAX) { throw new IllegalArgumentException("Cluster specification must not exceed 0xFFFF"); } mClusterHigh = clusterHigh; return this; } /** * Build {@link ConfigRequest} given the current requests made on the * builder. */ public ConfigRequest build() { if (mClusterLow > mClusterHigh) { throw new IllegalArgumentException( "Invalid argument combination - must have Cluster Low <= Cluster High"); } return new ConfigRequest(mSupport5gBand, mMasterPreference, mClusterLow, mClusterHigh); } } }