1 /*
2  * Copyright (C) 2017 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.companion;
18 
19 import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayNameInternal;
20 
21 import android.annotation.NonNull;
22 import android.annotation.Nullable;
23 import android.bluetooth.BluetoothDevice;
24 import android.bluetooth.le.ScanFilter;
25 import android.net.MacAddress;
26 import android.net.wifi.ScanResult;
27 import android.os.Parcel;
28 import android.os.Parcelable;
29 
30 import com.android.internal.util.DataClass;
31 import com.android.internal.util.Parcelling;
32 
33 import java.util.Objects;
34 import java.util.regex.Pattern;
35 
36 /**
37  * A filter for Wifi devices
38  *
39  * @see ScanFilter
40  */
41 @DataClass(
42         genParcelable = true,
43         genAidl = false,
44         genBuilder = true,
45         genEqualsHashCode = true,
46         genHiddenGetters = true)
47 public final class WifiDeviceFilter implements DeviceFilter<ScanResult> {
48 
49     /**
50      * If set, only devices with {@link BluetoothDevice#getName name} matching the given regular
51      * expression will be shown
52      */
53     @DataClass.ParcelWith(Parcelling.BuiltIn.ForPattern.class)
54     @DataClass.MaySetToNull
55     private @Nullable Pattern mNamePattern = null;
56 
57     /**
58      * If set, only devices with BSSID matching the given one will be shown
59      */
60     private @Nullable MacAddress mBssid = null;
61 
62     /**
63      * If set, only bits at positions set in this mask, will be compared to the given
64      * {@link Builder#setBssid BSSID} filter.
65      */
66     private @NonNull MacAddress mBssidMask = MacAddress.BROADCAST_ADDRESS;
67 
68     /** @hide */
69     @Override
matches(ScanResult device)70     public boolean matches(ScanResult device) {
71         return BluetoothDeviceFilterUtils.matchesName(getNamePattern(), device)
72                 && (mBssid == null
73                         || MacAddress.fromString(device.BSSID).matches(mBssid, mBssidMask));
74     }
75 
76     /** @hide */
77     @Override
getDeviceDisplayName(ScanResult device)78     public String getDeviceDisplayName(ScanResult device) {
79         return getDeviceDisplayNameInternal(device);
80     }
81 
82     /** @hide */
83     @Override
getMediumType()84     public int getMediumType() {
85         return MEDIUM_TYPE_WIFI;
86     }
87 
88 
89 
90     // Code below generated by codegen v1.0.15.
91     //
92     // DO NOT MODIFY!
93     // CHECKSTYLE:OFF Generated code
94     //
95     // To regenerate run:
96     // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/companion/WifiDeviceFilter.java
97     //
98     // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
99     //   Settings > Editor > Code Style > Formatter Control
100     //@formatter:off
101 
102 
103     @DataClass.Generated.Member
WifiDeviceFilter( @ullable Pattern namePattern, @Nullable MacAddress bssid, @NonNull MacAddress bssidMask)104     /* package-private */ WifiDeviceFilter(
105             @Nullable Pattern namePattern,
106             @Nullable MacAddress bssid,
107             @NonNull MacAddress bssidMask) {
108         this.mNamePattern = namePattern;
109         this.mBssid = bssid;
110         this.mBssidMask = bssidMask;
111         com.android.internal.util.AnnotationValidations.validate(
112                 NonNull.class, null, mBssidMask);
113 
114         // onConstructed(); // You can define this method to get a callback
115     }
116 
117     /**
118      * If set, only devices with {@link BluetoothDevice#getName name} matching the given regular
119      * expression will be shown
120      *
121      * @hide
122      */
123     @DataClass.Generated.Member
getNamePattern()124     public @Nullable Pattern getNamePattern() {
125         return mNamePattern;
126     }
127 
128     /**
129      * If set, only devices with BSSID matching the given one will be shown
130      *
131      * @hide
132      */
133     @DataClass.Generated.Member
getBssid()134     public @Nullable MacAddress getBssid() {
135         return mBssid;
136     }
137 
138     /**
139      * If set, only bits at positions set in this mask, will be compared to the given
140      * {@link Builder#setBssid BSSID} filter.
141      *
142      * @hide
143      */
144     @DataClass.Generated.Member
getBssidMask()145     public @NonNull MacAddress getBssidMask() {
146         return mBssidMask;
147     }
148 
149     @Override
150     @DataClass.Generated.Member
equals(@ullable Object o)151     public boolean equals(@Nullable Object o) {
152         // You can override field equality logic by defining either of the methods like:
153         // boolean fieldNameEquals(WifiDeviceFilter other) { ... }
154         // boolean fieldNameEquals(FieldType otherValue) { ... }
155 
156         if (this == o) return true;
157         if (o == null || getClass() != o.getClass()) return false;
158         @SuppressWarnings("unchecked")
159         WifiDeviceFilter that = (WifiDeviceFilter) o;
160         //noinspection PointlessBooleanExpression
161         return true
162                 && Objects.equals(mNamePattern, that.mNamePattern)
163                 && Objects.equals(mBssid, that.mBssid)
164                 && Objects.equals(mBssidMask, that.mBssidMask);
165     }
166 
167     @Override
168     @DataClass.Generated.Member
hashCode()169     public int hashCode() {
170         // You can override field hashCode logic by defining methods like:
171         // int fieldNameHashCode() { ... }
172 
173         int _hash = 1;
174         _hash = 31 * _hash + Objects.hashCode(mNamePattern);
175         _hash = 31 * _hash + Objects.hashCode(mBssid);
176         _hash = 31 * _hash + Objects.hashCode(mBssidMask);
177         return _hash;
178     }
179 
180     @DataClass.Generated.Member
181     static Parcelling<Pattern> sParcellingForNamePattern =
182             Parcelling.Cache.get(
183                     Parcelling.BuiltIn.ForPattern.class);
184     static {
185         if (sParcellingForNamePattern == null) {
186             sParcellingForNamePattern = Parcelling.Cache.put(
187                     new Parcelling.BuiltIn.ForPattern());
188         }
189     }
190 
191     @Override
192     @DataClass.Generated.Member
writeToParcel(@onNull Parcel dest, int flags)193     public void writeToParcel(@NonNull Parcel dest, int flags) {
194         // You can override field parcelling by defining methods like:
195         // void parcelFieldName(Parcel dest, int flags) { ... }
196 
197         byte flg = 0;
198         if (mNamePattern != null) flg |= 0x1;
199         if (mBssid != null) flg |= 0x2;
200         dest.writeByte(flg);
201         sParcellingForNamePattern.parcel(mNamePattern, dest, flags);
202         if (mBssid != null) dest.writeTypedObject(mBssid, flags);
203         dest.writeTypedObject(mBssidMask, flags);
204     }
205 
206     @Override
207     @DataClass.Generated.Member
describeContents()208     public int describeContents() { return 0; }
209 
210     /** @hide */
211     @SuppressWarnings({"unchecked", "RedundantCast"})
212     @DataClass.Generated.Member
WifiDeviceFilter(@onNull Parcel in)213     /* package-private */ WifiDeviceFilter(@NonNull Parcel in) {
214         // You can override field unparcelling by defining methods like:
215         // static FieldType unparcelFieldName(Parcel in) { ... }
216 
217         byte flg = in.readByte();
218         Pattern namePattern = sParcellingForNamePattern.unparcel(in);
219         MacAddress bssid = (flg & 0x2) == 0 ? null : (MacAddress) in.readTypedObject(MacAddress.CREATOR);
220         MacAddress bssidMask = (MacAddress) in.readTypedObject(MacAddress.CREATOR);
221 
222         this.mNamePattern = namePattern;
223         this.mBssid = bssid;
224         this.mBssidMask = bssidMask;
225         com.android.internal.util.AnnotationValidations.validate(
226                 NonNull.class, null, mBssidMask);
227 
228         // onConstructed(); // You can define this method to get a callback
229     }
230 
231     @DataClass.Generated.Member
232     public static final @NonNull Parcelable.Creator<WifiDeviceFilter> CREATOR
233             = new Parcelable.Creator<WifiDeviceFilter>() {
234         @Override
235         public WifiDeviceFilter[] newArray(int size) {
236             return new WifiDeviceFilter[size];
237         }
238 
239         @Override
240         public WifiDeviceFilter createFromParcel(@NonNull Parcel in) {
241             return new WifiDeviceFilter(in);
242         }
243     };
244 
245     /**
246      * A builder for {@link WifiDeviceFilter}
247      */
248     @SuppressWarnings("WeakerAccess")
249     @DataClass.Generated.Member
250     public static final class Builder {
251 
252         private @Nullable Pattern mNamePattern;
253         private @Nullable MacAddress mBssid;
254         private @NonNull MacAddress mBssidMask;
255 
256         private long mBuilderFieldsSet = 0L;
257 
Builder()258         public Builder() {
259         }
260 
261         /**
262          * If set, only devices with {@link BluetoothDevice#getName name} matching the given regular
263          * expression will be shown
264          */
265         @DataClass.Generated.Member
setNamePattern(@ullable Pattern value)266         public @NonNull Builder setNamePattern(@Nullable Pattern value) {
267             checkNotUsed();
268             mBuilderFieldsSet |= 0x1;
269             mNamePattern = value;
270             return this;
271         }
272 
273         /**
274          * If set, only devices with BSSID matching the given one will be shown
275          */
276         @DataClass.Generated.Member
setBssid(@onNull MacAddress value)277         public @NonNull Builder setBssid(@NonNull MacAddress value) {
278             checkNotUsed();
279             mBuilderFieldsSet |= 0x2;
280             mBssid = value;
281             return this;
282         }
283 
284         /**
285          * If set, only bits at positions set in this mask, will be compared to the given
286          * {@link Builder#setBssid BSSID} filter.
287          */
288         @DataClass.Generated.Member
setBssidMask(@onNull MacAddress value)289         public @NonNull Builder setBssidMask(@NonNull MacAddress value) {
290             checkNotUsed();
291             mBuilderFieldsSet |= 0x4;
292             mBssidMask = value;
293             return this;
294         }
295 
296         /** Builds the instance. This builder should not be touched after calling this! */
build()297         public @NonNull WifiDeviceFilter build() {
298             checkNotUsed();
299             mBuilderFieldsSet |= 0x8; // Mark builder used
300 
301             if ((mBuilderFieldsSet & 0x1) == 0) {
302                 mNamePattern = null;
303             }
304             if ((mBuilderFieldsSet & 0x2) == 0) {
305                 mBssid = null;
306             }
307             if ((mBuilderFieldsSet & 0x4) == 0) {
308                 mBssidMask = MacAddress.BROADCAST_ADDRESS;
309             }
310             WifiDeviceFilter o = new WifiDeviceFilter(
311                     mNamePattern,
312                     mBssid,
313                     mBssidMask);
314             return o;
315         }
316 
checkNotUsed()317         private void checkNotUsed() {
318             if ((mBuilderFieldsSet & 0x8) != 0) {
319                 throw new IllegalStateException(
320                         "This Builder should not be reused. Use a new Builder instance instead");
321             }
322         }
323     }
324 
325     @DataClass.Generated(
326             time = 1582688421965L,
327             codegenVersion = "1.0.15",
328             sourceFile = "frameworks/base/core/java/android/companion/WifiDeviceFilter.java",
329             inputSignatures = "private @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForPattern.class) @com.android.internal.util.DataClass.MaySetToNull @android.annotation.Nullable java.util.regex.Pattern mNamePattern\nprivate @android.annotation.Nullable android.net.MacAddress mBssid\nprivate @android.annotation.NonNull android.net.MacAddress mBssidMask\npublic @java.lang.Override boolean matches(android.net.wifi.ScanResult)\npublic @java.lang.Override java.lang.String getDeviceDisplayName(android.net.wifi.ScanResult)\npublic @java.lang.Override int getMediumType()\nclass WifiDeviceFilter extends java.lang.Object implements [android.companion.DeviceFilter<android.net.wifi.ScanResult>]\n@com.android.internal.util.DataClass(genParcelable=true, genAidl=false, genBuilder=true, genEqualsHashCode=true, genHiddenGetters=true)")
330     @Deprecated
__metadata()331     private void __metadata() {}
332 
333 
334     //@formatter:on
335     // End of generated code
336 
337 }
338