120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen/*
220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * Copyright (C) 2016 The Android Open Source Project
320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen *
420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * Licensed under the Apache License, Version 2.0 (the "License");
520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * you may not use this file except in compliance with the License.
620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * You may obtain a copy of the License at
720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen *
820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen *      http://www.apache.org/licenses/LICENSE-2.0
920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen *
1020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * Unless required by applicable law or agreed to in writing, software
1120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * distributed under the License is distributed on an "AS IS" BASIS,
1220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * See the License for the specific language governing permissions and
1420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * limitations under the License.
1520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen */
1620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
1720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohenpackage android.net.wifi.nan;
1820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
1920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohenimport android.os.Parcel;
2020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohenimport android.os.Parcelable;
2120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
2220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen/**
2320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * Defines a request object to configure a Wi-Fi NAN network. Built using
2420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * {@link ConfigRequest.Builder}. Configuration is requested using
2520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * {@link WifiNanManager#requestConfig(ConfigRequest)}. Note that the actual
2620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * achieved configuration may be different from the requested configuration -
2720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * since multiple applications may request different configurations.
2820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen *
2920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen * @hide PROPOSED_NAN_API
3020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen */
3120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohenpublic class ConfigRequest implements Parcelable {
3220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    /**
3320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * Lower range of possible cluster ID.
3420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     *
3520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * @hide
3620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     */
3720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public static final int CLUSTER_ID_MIN = 0;
3820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
3920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    /**
4020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * Upper range of possible cluster ID.
4120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     *
4220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * @hide
4320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     */
4420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public static final int CLUSTER_ID_MAX = 0xFFFF;
4520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
4620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    /**
4720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * Indicates whether 5G band support is requested.
4820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     *
4920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * @hide
5020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     */
5120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public final boolean mSupport5gBand;
5220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
5320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    /**
5420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * Specifies the desired master preference.
5520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     *
5620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * @hide
5720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     */
5820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public final int mMasterPreference;
5920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
6020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    /**
6120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * Specifies the desired lower range of the cluster ID. Must be lower then
6220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * {@link ConfigRequest#mClusterHigh}.
6320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     *
6420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * @hide
6520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     */
6620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public final int mClusterLow;
6720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
6820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    /**
6920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * Specifies the desired higher range of the cluster ID. Must be higher then
7020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * {@link ConfigRequest#mClusterLow}.
7120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     *
7220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * @hide
7320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     */
7420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public final int mClusterHigh;
7520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
7620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    private ConfigRequest(boolean support5gBand, int masterPreference, int clusterLow,
7720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            int clusterHigh) {
7820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        mSupport5gBand = support5gBand;
7920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        mMasterPreference = masterPreference;
8020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        mClusterLow = clusterLow;
8120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        mClusterHigh = clusterHigh;
8220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    }
8320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
8420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    @Override
8520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public String toString() {
8620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        return "ConfigRequest [mSupport5gBand=" + mSupport5gBand + ", mMasterPreference="
8720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                + mMasterPreference + ", mClusterLow=" + mClusterLow + ", mClusterHigh="
8820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                + mClusterHigh + "]";
8920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    }
9020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
9120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    @Override
9220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public int describeContents() {
9320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        return 0;
9420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    }
9520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
9620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    @Override
9720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public void writeToParcel(Parcel dest, int flags) {
9820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        dest.writeInt(mSupport5gBand ? 1 : 0);
9920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        dest.writeInt(mMasterPreference);
10020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        dest.writeInt(mClusterLow);
10120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        dest.writeInt(mClusterHigh);
10220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    }
10320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
10420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public static final Creator<ConfigRequest> CREATOR = new Creator<ConfigRequest>() {
10520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        @Override
10620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        public ConfigRequest[] newArray(int size) {
10720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            return new ConfigRequest[size];
10820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        }
10920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
11020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        @Override
11120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        public ConfigRequest createFromParcel(Parcel in) {
11220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            boolean support5gBand = in.readInt() != 0;
11320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            int masterPreference = in.readInt();
11420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            int clusterLow = in.readInt();
11520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            int clusterHigh = in.readInt();
11620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            return new ConfigRequest(support5gBand, masterPreference, clusterLow, clusterHigh);
11720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        }
11820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    };
11920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
12020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    @Override
12120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public boolean equals(Object o) {
12220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        if (this == o) {
12320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            return true;
12420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        }
12520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
12620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        if (!(o instanceof ConfigRequest)) {
12720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            return false;
12820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        }
12920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
13020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        ConfigRequest lhs = (ConfigRequest) o;
13120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
13220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        return mSupport5gBand == lhs.mSupport5gBand && mMasterPreference == lhs.mMasterPreference
13320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                && mClusterLow == lhs.mClusterLow && mClusterHigh == lhs.mClusterHigh;
13420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    }
13520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
13620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    @Override
13720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public int hashCode() {
13820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        int result = 17;
13920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
14020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        result = 31 * result + (mSupport5gBand ? 1 : 0);
14120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        result = 31 * result + mMasterPreference;
14220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        result = 31 * result + mClusterLow;
14320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        result = 31 * result + mClusterHigh;
14420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
14520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        return result;
14620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    }
14720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
14820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    /**
14920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * Builder used to build {@link ConfigRequest} objects.
15020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     */
15120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    public static final class Builder {
15220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        private boolean mSupport5gBand;
15320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        private int mMasterPreference;
15420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        private int mClusterLow;
15520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        private int mClusterHigh;
15620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
15720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        /**
15820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * Default constructor for the Builder.
15920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         */
16020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        public Builder() {
16120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            mSupport5gBand = false;
16220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            mMasterPreference = 0;
16320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            mClusterLow = 0;
16420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            mClusterHigh = CLUSTER_ID_MAX;
16520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        }
16620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
16720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        /**
16820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * Specify whether 5G band support is required in this request.
16920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         *
17020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * @param support5gBand Support for 5G band is required.
17120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * @return The builder to facilitate chaining
17220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         *         {@code builder.setXXX(..).setXXX(..)}.
17320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         */
17420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        public Builder setSupport5gBand(boolean support5gBand) {
17520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            mSupport5gBand = support5gBand;
17620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            return this;
17720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        }
17820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
17920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        /**
18020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * Specify the Master Preference requested. The permitted range is 0 to
18120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * 255 with 1 and 255 excluded (reserved).
18220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         *
18320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * @param masterPreference The requested master preference
18420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * @return The builder to facilitate chaining
18520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         *         {@code builder.setXXX(..).setXXX(..)}.
18620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         */
18720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        public Builder setMasterPreference(int masterPreference) {
18820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            if (masterPreference < 0) {
18920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                throw new IllegalArgumentException(
19020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                        "Master Preference specification must be non-negative");
19120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            }
19220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            if (masterPreference == 1 || masterPreference == 255 || masterPreference > 255) {
19320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                throw new IllegalArgumentException("Master Preference specification must not "
19420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                        + "exceed 255 or use 1 or 255 (reserved values)");
19520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            }
19620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
19720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            mMasterPreference = masterPreference;
19820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            return this;
19920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        }
20020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
20120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        /**
20220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * The Cluster ID is generated randomly for new NAN networks. Specify
20320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * the lower range of the cluster ID. The upper range is specified using
20420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * the {@link ConfigRequest.Builder#setClusterHigh(int)}. The permitted
20520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * range is 0 to the value specified by
20620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * {@link ConfigRequest.Builder#setClusterHigh(int)}. Equality is
20720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * permitted which restricts the Cluster ID to the specified value.
20820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         *
20920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * @param clusterLow The lower range of the generated cluster ID.
21020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * @return The builder to facilitate chaining
21120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         *         {@code builder.setClusterLow(..).setClusterHigh(..)}.
21220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         */
21320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        public Builder setClusterLow(int clusterLow) {
21420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            if (clusterLow < CLUSTER_ID_MIN) {
21520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                throw new IllegalArgumentException("Cluster specification must be non-negative");
21620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            }
21720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            if (clusterLow > CLUSTER_ID_MAX) {
21820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                throw new IllegalArgumentException("Cluster specification must not exceed 0xFFFF");
21920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            }
22020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
22120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            mClusterLow = clusterLow;
22220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            return this;
22320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        }
22420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
22520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        /**
22620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * The Cluster ID is generated randomly for new NAN networks. Specify
22720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * the lower upper of the cluster ID. The lower range is specified using
22820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * the {@link ConfigRequest.Builder#setClusterLow(int)}. The permitted
22920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * range is the value specified by
23020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * {@link ConfigRequest.Builder#setClusterLow(int)} to 0xFFFF. Equality
23120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * is permitted which restricts the Cluster ID to the specified value.
23220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         *
23320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * @param clusterHigh The upper range of the generated cluster ID.
23420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * @return The builder to facilitate chaining
23520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         *         {@code builder.setClusterLow(..).setClusterHigh(..)}.
23620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         */
23720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        public Builder setClusterHigh(int clusterHigh) {
23820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            if (clusterHigh < CLUSTER_ID_MIN) {
23920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                throw new IllegalArgumentException("Cluster specification must be non-negative");
24020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            }
24120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            if (clusterHigh > CLUSTER_ID_MAX) {
24220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                throw new IllegalArgumentException("Cluster specification must not exceed 0xFFFF");
24320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            }
24420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
24520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            mClusterHigh = clusterHigh;
24620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            return this;
24720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        }
24820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
24920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        /**
25020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * Build {@link ConfigRequest} given the current requests made on the
25120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         * builder.
25220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen         */
25320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        public ConfigRequest build() {
25420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            if (mClusterLow > mClusterHigh) {
25520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                throw new IllegalArgumentException(
25620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                        "Invalid argument combination - must have Cluster Low <= Cluster High");
25720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            }
25820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
25920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            return new ConfigRequest(mSupport5gBand, mMasterPreference, mClusterLow, mClusterHigh);
26020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        }
26120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen    }
26220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen}
263