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