1dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson/* 2dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * Copyright (C) 2014 The Android Open Source Project 3dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * 4dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * Licensed under the Apache License, Version 2.0 (the "License"); 5dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * you may not use this file except in compliance with the License. 6dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * You may obtain a copy of the License at 7dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * 8dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * http://www.apache.org/licenses/LICENSE-2.0 9dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * 10dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * Unless required by applicable law or agreed to in writing, software 11dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * distributed under the License is distributed on an "AS IS" BASIS, 12dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * See the License for the specific language governing permissions and 14dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * limitations under the License 15dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson */ 16dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 17dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidsonpackage android.net; 18dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 197be8e9725f4a60f0d1a6cb175a05a320968d7439Jeff Davidsonimport android.annotation.SystemApi; 20dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidsonimport android.os.Parcel; 21dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidsonimport android.os.Parcelable; 22dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 236a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidsonimport java.util.Objects; 246a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson 25dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson/** 26dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * Information which identifies a specific network. 27dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * 28dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * @hide 29dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson */ 307be8e9725f4a60f0d1a6cb175a05a320968d7439Jeff Davidson@SystemApi 316a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson// NOTE: Ideally, we would abstract away the details of what identifies a network of a specific 326a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson// type, so that all networks appear the same and can be scored without concern to the network type 336a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson// itself. However, because no such cross-type identifier currently exists in the Android framework, 346a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson// and because systems might obtain information about networks from sources other than Android 356a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson// devices, we need to provide identifying details about each specific network type (wifi, cell, 366a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson// etc.) so that clients can pull out these details depending on the type of network. 37dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidsonpublic class NetworkKey implements Parcelable { 38dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 39dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson /** A wifi network, for which {@link #wifiKey} will be populated. */ 40dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson public static final int TYPE_WIFI = 1; 41dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 42dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson /** 43dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * The type of this network. 44dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * @see #TYPE_WIFI 45dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson */ 46dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson public final int type; 47dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 48dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson /** 49dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * Information identifying a Wi-Fi network. Only set when {@link #type} equals 50dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * {@link #TYPE_WIFI}. 51dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson */ 52dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson public final WifiKey wifiKey; 53dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 54dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson /** 55dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * Construct a new {@link NetworkKey} for a Wi-Fi network. 56dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * @param wifiKey the {@link WifiKey} identifying this Wi-Fi network. 57dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson */ 58dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson public NetworkKey(WifiKey wifiKey) { 59dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson this.type = TYPE_WIFI; 60dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson this.wifiKey = wifiKey; 61dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson } 62dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 63dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson private NetworkKey(Parcel in) { 64dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson type = in.readInt(); 65dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson switch (type) { 66dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson case TYPE_WIFI: 67dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson wifiKey = WifiKey.CREATOR.createFromParcel(in); 68dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson break; 69dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson default: 70dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson throw new IllegalArgumentException("Parcel has unknown type: " + type); 71dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson } 72dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson } 73dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 74dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson @Override 75dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson public int describeContents() { 76dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson return 0; 77dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson } 78dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 79dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson @Override 80dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson public void writeToParcel(Parcel out, int flags) { 81dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson out.writeInt(type); 82dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson switch (type) { 83dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson case TYPE_WIFI: 84dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson wifiKey.writeToParcel(out, flags); 85dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson break; 86dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson default: 87dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson throw new IllegalStateException("NetworkKey has unknown type " + type); 88dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson } 89dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson } 90dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 91dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson @Override 926a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson public boolean equals(Object o) { 936a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson if (this == o) return true; 946a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson if (o == null || getClass() != o.getClass()) return false; 956a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson 966a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson NetworkKey that = (NetworkKey) o; 976a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson 986a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson return type == that.type && Objects.equals(wifiKey, that.wifiKey); 996a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson } 1006a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson 1016a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson @Override 1026a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson public int hashCode() { 1036a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson return Objects.hash(type, wifiKey); 1046a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson } 1056a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson 1066a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson @Override 107dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson public String toString() { 108dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson switch (type) { 109dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson case TYPE_WIFI: 110dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson return wifiKey.toString(); 111dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson default: 112dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson // Don't throw an exception here in case someone is logging this object in a catch 113dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson // block for debugging purposes. 114dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson return "InvalidKey"; 115dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson } 116dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson } 117dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 118dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson public static final Parcelable.Creator<NetworkKey> CREATOR = 119dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson new Parcelable.Creator<NetworkKey>() { 120dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson @Override 121dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson public NetworkKey createFromParcel(Parcel in) { 122dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson return new NetworkKey(in); 123dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson } 124dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson 125dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson @Override 126dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson public NetworkKey[] newArray(int size) { 127dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson return new NetworkKey[size]; 128dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson } 129dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson }; 130dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson} 131