1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.net.wifi.nan;
18 
19 import android.os.Parcel;
20 import android.os.Parcelable;
21 
22 /**
23  * Defines a request object to configure a Wi-Fi NAN network. Built using
24  * {@link ConfigRequest.Builder}. Configuration is requested using
25  * {@link WifiNanManager#requestConfig(ConfigRequest)}. Note that the actual
26  * achieved configuration may be different from the requested configuration -
27  * since multiple applications may request different configurations.
28  *
29  * @hide PROPOSED_NAN_API
30  */
31 public class ConfigRequest implements Parcelable {
32     /**
33      * Lower range of possible cluster ID.
34      *
35      * @hide
36      */
37     public static final int CLUSTER_ID_MIN = 0;
38 
39     /**
40      * Upper range of possible cluster ID.
41      *
42      * @hide
43      */
44     public static final int CLUSTER_ID_MAX = 0xFFFF;
45 
46     /**
47      * Indicates whether 5G band support is requested.
48      *
49      * @hide
50      */
51     public final boolean mSupport5gBand;
52 
53     /**
54      * Specifies the desired master preference.
55      *
56      * @hide
57      */
58     public final int mMasterPreference;
59 
60     /**
61      * Specifies the desired lower range of the cluster ID. Must be lower then
62      * {@link ConfigRequest#mClusterHigh}.
63      *
64      * @hide
65      */
66     public final int mClusterLow;
67 
68     /**
69      * Specifies the desired higher range of the cluster ID. Must be higher then
70      * {@link ConfigRequest#mClusterLow}.
71      *
72      * @hide
73      */
74     public final int mClusterHigh;
75 
ConfigRequest(boolean support5gBand, int masterPreference, int clusterLow, int clusterHigh)76     private ConfigRequest(boolean support5gBand, int masterPreference, int clusterLow,
77             int clusterHigh) {
78         mSupport5gBand = support5gBand;
79         mMasterPreference = masterPreference;
80         mClusterLow = clusterLow;
81         mClusterHigh = clusterHigh;
82     }
83 
84     @Override
toString()85     public String toString() {
86         return "ConfigRequest [mSupport5gBand=" + mSupport5gBand + ", mMasterPreference="
87                 + mMasterPreference + ", mClusterLow=" + mClusterLow + ", mClusterHigh="
88                 + mClusterHigh + "]";
89     }
90 
91     @Override
describeContents()92     public int describeContents() {
93         return 0;
94     }
95 
96     @Override
writeToParcel(Parcel dest, int flags)97     public void writeToParcel(Parcel dest, int flags) {
98         dest.writeInt(mSupport5gBand ? 1 : 0);
99         dest.writeInt(mMasterPreference);
100         dest.writeInt(mClusterLow);
101         dest.writeInt(mClusterHigh);
102     }
103 
104     public static final Creator<ConfigRequest> CREATOR = new Creator<ConfigRequest>() {
105         @Override
106         public ConfigRequest[] newArray(int size) {
107             return new ConfigRequest[size];
108         }
109 
110         @Override
111         public ConfigRequest createFromParcel(Parcel in) {
112             boolean support5gBand = in.readInt() != 0;
113             int masterPreference = in.readInt();
114             int clusterLow = in.readInt();
115             int clusterHigh = in.readInt();
116             return new ConfigRequest(support5gBand, masterPreference, clusterLow, clusterHigh);
117         }
118     };
119 
120     @Override
equals(Object o)121     public boolean equals(Object o) {
122         if (this == o) {
123             return true;
124         }
125 
126         if (!(o instanceof ConfigRequest)) {
127             return false;
128         }
129 
130         ConfigRequest lhs = (ConfigRequest) o;
131 
132         return mSupport5gBand == lhs.mSupport5gBand && mMasterPreference == lhs.mMasterPreference
133                 && mClusterLow == lhs.mClusterLow && mClusterHigh == lhs.mClusterHigh;
134     }
135 
136     @Override
hashCode()137     public int hashCode() {
138         int result = 17;
139 
140         result = 31 * result + (mSupport5gBand ? 1 : 0);
141         result = 31 * result + mMasterPreference;
142         result = 31 * result + mClusterLow;
143         result = 31 * result + mClusterHigh;
144 
145         return result;
146     }
147 
148     /**
149      * Builder used to build {@link ConfigRequest} objects.
150      */
151     public static final class Builder {
152         private boolean mSupport5gBand;
153         private int mMasterPreference;
154         private int mClusterLow;
155         private int mClusterHigh;
156 
157         /**
158          * Default constructor for the Builder.
159          */
Builder()160         public Builder() {
161             mSupport5gBand = false;
162             mMasterPreference = 0;
163             mClusterLow = 0;
164             mClusterHigh = CLUSTER_ID_MAX;
165         }
166 
167         /**
168          * Specify whether 5G band support is required in this request.
169          *
170          * @param support5gBand Support for 5G band is required.
171          * @return The builder to facilitate chaining
172          *         {@code builder.setXXX(..).setXXX(..)}.
173          */
setSupport5gBand(boolean support5gBand)174         public Builder setSupport5gBand(boolean support5gBand) {
175             mSupport5gBand = support5gBand;
176             return this;
177         }
178 
179         /**
180          * Specify the Master Preference requested. The permitted range is 0 to
181          * 255 with 1 and 255 excluded (reserved).
182          *
183          * @param masterPreference The requested master preference
184          * @return The builder to facilitate chaining
185          *         {@code builder.setXXX(..).setXXX(..)}.
186          */
setMasterPreference(int masterPreference)187         public Builder setMasterPreference(int masterPreference) {
188             if (masterPreference < 0) {
189                 throw new IllegalArgumentException(
190                         "Master Preference specification must be non-negative");
191             }
192             if (masterPreference == 1 || masterPreference == 255 || masterPreference > 255) {
193                 throw new IllegalArgumentException("Master Preference specification must not "
194                         + "exceed 255 or use 1 or 255 (reserved values)");
195             }
196 
197             mMasterPreference = masterPreference;
198             return this;
199         }
200 
201         /**
202          * The Cluster ID is generated randomly for new NAN networks. Specify
203          * the lower range of the cluster ID. The upper range is specified using
204          * the {@link ConfigRequest.Builder#setClusterHigh(int)}. The permitted
205          * range is 0 to the value specified by
206          * {@link ConfigRequest.Builder#setClusterHigh(int)}. Equality is
207          * permitted which restricts the Cluster ID to the specified value.
208          *
209          * @param clusterLow The lower range of the generated cluster ID.
210          * @return The builder to facilitate chaining
211          *         {@code builder.setClusterLow(..).setClusterHigh(..)}.
212          */
setClusterLow(int clusterLow)213         public Builder setClusterLow(int clusterLow) {
214             if (clusterLow < CLUSTER_ID_MIN) {
215                 throw new IllegalArgumentException("Cluster specification must be non-negative");
216             }
217             if (clusterLow > CLUSTER_ID_MAX) {
218                 throw new IllegalArgumentException("Cluster specification must not exceed 0xFFFF");
219             }
220 
221             mClusterLow = clusterLow;
222             return this;
223         }
224 
225         /**
226          * The Cluster ID is generated randomly for new NAN networks. Specify
227          * the lower upper of the cluster ID. The lower range is specified using
228          * the {@link ConfigRequest.Builder#setClusterLow(int)}. The permitted
229          * range is the value specified by
230          * {@link ConfigRequest.Builder#setClusterLow(int)} to 0xFFFF. Equality
231          * is permitted which restricts the Cluster ID to the specified value.
232          *
233          * @param clusterHigh The upper range of the generated cluster ID.
234          * @return The builder to facilitate chaining
235          *         {@code builder.setClusterLow(..).setClusterHigh(..)}.
236          */
setClusterHigh(int clusterHigh)237         public Builder setClusterHigh(int clusterHigh) {
238             if (clusterHigh < CLUSTER_ID_MIN) {
239                 throw new IllegalArgumentException("Cluster specification must be non-negative");
240             }
241             if (clusterHigh > CLUSTER_ID_MAX) {
242                 throw new IllegalArgumentException("Cluster specification must not exceed 0xFFFF");
243             }
244 
245             mClusterHigh = clusterHigh;
246             return this;
247         }
248 
249         /**
250          * Build {@link ConfigRequest} given the current requests made on the
251          * builder.
252          */
build()253         public ConfigRequest build() {
254             if (mClusterLow > mClusterHigh) {
255                 throw new IllegalArgumentException(
256                         "Invalid argument combination - must have Cluster Low <= Cluster High");
257             }
258 
259             return new ConfigRequest(mSupport5gBand, mMasterPreference, mClusterLow, mClusterHigh);
260         }
261     }
262 }
263