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 the settings (configuration) for a NAN publish session. Built using
24  * {@link PublishSettings.Builder}. Publish is done using
25  * {@link WifiNanManager#publish(PublishData, PublishSettings, WifiNanSessionListener, int)}
26  * or {@link WifiNanPublishSession#publish(PublishData, PublishSettings)}.
27  *
28  * @hide PROPOSED_NAN_API
29  */
30 public class PublishSettings implements Parcelable {
31 
32     /**
33      * Defines an unsolicited publish session - i.e. a publish session where
34      * publish packets are transmitted over-the-air. Configuration is done using
35      * {@link PublishSettings.Builder#setPublishType(int)}.
36      */
37     public static final int PUBLISH_TYPE_UNSOLICITED = 0;
38 
39     /**
40      * Defines a solicited publish session - i.e. a publish session where
41      * publish packets are not transmitted over-the-air and the device listens
42      * and matches to transmitted subscribe packets. Configuration is done using
43      * {@link PublishSettings.Builder#setPublishType(int)}.
44      */
45     public static final int PUBLISH_TYPE_SOLICITED = 1;
46 
47     /**
48      * @hide
49      */
50     public final int mPublishType;
51 
52     /**
53      * @hide
54      */
55     public final int mPublishCount;
56 
57     /**
58      * @hide
59      */
60     public final int mTtlSec;
61 
PublishSettings(int publishType, int publichCount, int ttlSec)62     private PublishSettings(int publishType, int publichCount, int ttlSec) {
63         mPublishType = publishType;
64         mPublishCount = publichCount;
65         mTtlSec = ttlSec;
66     }
67 
68     @Override
toString()69     public String toString() {
70         return "PublishSettings [mPublishType=" + mPublishType + ", mPublishCount=" + mPublishCount
71                 + ", mTtlSec=" + mTtlSec + "]";
72     }
73 
74     @Override
describeContents()75     public int describeContents() {
76         return 0;
77     }
78 
79     @Override
writeToParcel(Parcel dest, int flags)80     public void writeToParcel(Parcel dest, int flags) {
81         dest.writeInt(mPublishType);
82         dest.writeInt(mPublishCount);
83         dest.writeInt(mTtlSec);
84     }
85 
86     public static final Creator<PublishSettings> CREATOR = new Creator<PublishSettings>() {
87         @Override
88         public PublishSettings[] newArray(int size) {
89             return new PublishSettings[size];
90         }
91 
92         @Override
93         public PublishSettings createFromParcel(Parcel in) {
94             int publishType = in.readInt();
95             int publishCount = in.readInt();
96             int ttlSec = in.readInt();
97             return new PublishSettings(publishType, publishCount, ttlSec);
98         }
99     };
100 
101     @Override
equals(Object o)102     public boolean equals(Object o) {
103         if (this == o) {
104             return true;
105         }
106 
107         if (!(o instanceof PublishSettings)) {
108             return false;
109         }
110 
111         PublishSettings lhs = (PublishSettings) o;
112 
113         return mPublishType == lhs.mPublishType && mPublishCount == lhs.mPublishCount
114                 && mTtlSec == lhs.mTtlSec;
115     }
116 
117     @Override
hashCode()118     public int hashCode() {
119         int result = 17;
120 
121         result = 31 * result + mPublishType;
122         result = 31 * result + mPublishCount;
123         result = 31 * result + mTtlSec;
124 
125         return result;
126     }
127 
128     /**
129      * Builder used to build {@link PublishSettings} objects.
130      */
131     public static final class Builder {
132         int mPublishType;
133         int mPublishCount;
134         int mTtlSec;
135 
136         /**
137          * Sets the type of the publish session: solicited (aka active - publish
138          * packets are transmitted over-the-air), or unsolicited (aka passive -
139          * no publish packets are transmitted, a match is made against an active
140          * subscribe session whose packets are transmitted over-the-air).
141          *
142          * @param publishType Publish session type: solicited (
143          *            {@link PublishSettings#PUBLISH_TYPE_SOLICITED}) or
144          *            unsolicited (
145          *            {@link PublishSettings#PUBLISH_TYPE_UNSOLICITED}).
146          * @return The builder to facilitate chaining
147          *         {@code builder.setXXX(..).setXXX(..)}.
148          */
setPublishType(int publishType)149         public Builder setPublishType(int publishType) {
150             if (publishType < PUBLISH_TYPE_UNSOLICITED || publishType > PUBLISH_TYPE_SOLICITED) {
151                 throw new IllegalArgumentException("Invalid publishType - " + publishType);
152             }
153             mPublishType = publishType;
154             return this;
155         }
156 
157         /**
158          * Sets the number of times a solicited (
159          * {@link PublishSettings.Builder#setPublishType(int)}) publish session
160          * will transmit a packet. When the count is reached an event will be
161          * generated for {@link WifiNanSessionListener#onPublishTerminated(int)}
162          * with reason={@link WifiNanSessionListener#TERMINATE_REASON_DONE}.
163          *
164          * @param publishCount Number of publish packets to transmit.
165          * @return The builder to facilitate chaining
166          *         {@code builder.setXXX(..).setXXX(..)}.
167          */
setPublishCount(int publishCount)168         public Builder setPublishCount(int publishCount) {
169             if (publishCount < 0) {
170                 throw new IllegalArgumentException("Invalid publishCount - must be non-negative");
171             }
172             mPublishCount = publishCount;
173             return this;
174         }
175 
176         /**
177          * Sets the time interval (in seconds) a solicited (
178          * {@link PublishSettings.Builder#setPublishCount(int)}) publish session
179          * will be alive - i.e. transmitting a packet. When the TTL is reached
180          * an event will be generated for
181          * {@link WifiNanSessionListener#onPublishTerminated(int)} with reason=
182          * {@link WifiNanSessionListener#TERMINATE_REASON_DONE}.
183          *
184          * @param ttlSec Lifetime of a publish session in seconds.
185          * @return The builder to facilitate chaining
186          *         {@code builder.setXXX(..).setXXX(..)}.
187          */
setTtlSec(int ttlSec)188         public Builder setTtlSec(int ttlSec) {
189             if (ttlSec < 0) {
190                 throw new IllegalArgumentException("Invalid ttlSec - must be non-negative");
191             }
192             mTtlSec = ttlSec;
193             return this;
194         }
195 
196         /**
197          * Build {@link PublishSettings} given the current requests made on the
198          * builder.
199          */
build()200         public PublishSettings build() {
201             return new PublishSettings(mPublishType, mPublishCount, mTtlSec);
202         }
203     }
204 }
205