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