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 * A network identifier along with a score for the quality of that network.
27dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson *
28dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson * @hide
29dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson */
307be8e9725f4a60f0d1a6cb175a05a320968d7439Jeff Davidson@SystemApi
31dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidsonpublic class ScoredNetwork implements Parcelable {
32dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson
33dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    /** A {@link NetworkKey} uniquely identifying this network. */
34dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    public final NetworkKey networkKey;
35dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson
36dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    /**
37dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     * The {@link RssiCurve} representing the scores for this network based on the RSSI.
38dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     *
39dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     * <p>This field is optional and may be set to null to indicate that no score is available for
40dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     * this network at this time. Such networks, along with networks for which the scorer has not
41dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     * responded, are always prioritized below scored networks, regardless of the score.
42dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     */
43dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    public final RssiCurve rssiCurve;
44dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson
45dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    /**
46dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     * Construct a new {@link ScoredNetwork}.
47dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     *
48dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     * @param networkKey the {@link NetworkKey} uniquely identifying this network.
49dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     * @param rssiCurve the {@link RssiCurve} representing the scores for this network based on the
50dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     *     RSSI. This field is optional, and may be skipped to represent a network which the scorer
51dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     *     has opted not to score at this time. Passing a null value here is strongly preferred to
52dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     *     not returning any {@link ScoredNetwork} for a given {@link NetworkKey} because it
53dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     *     indicates to the system not to request scores for this network in the future, although
54dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     *     the scorer may choose to issue an out-of-band update at any time.
55dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson     */
56dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    public ScoredNetwork(NetworkKey networkKey, RssiCurve rssiCurve) {
57dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        this.networkKey = networkKey;
58dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        this.rssiCurve = rssiCurve;
59dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    }
60dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson
61dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    private ScoredNetwork(Parcel in) {
62dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        networkKey = NetworkKey.CREATOR.createFromParcel(in);
63dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        if (in.readByte() == 1) {
64dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson            rssiCurve = RssiCurve.CREATOR.createFromParcel(in);
65dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        } else {
66dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson            rssiCurve = null;
67dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        }
68dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    }
69dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson
70dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    @Override
71dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    public int describeContents() {
72dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        return 0;
73dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    }
74dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson
75dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    @Override
76dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    public void writeToParcel(Parcel out, int flags) {
77dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        networkKey.writeToParcel(out, flags);
78dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        if (rssiCurve != null) {
79dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson            out.writeByte((byte) 1);
80dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson            rssiCurve.writeToParcel(out, flags);
81dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        } else {
82dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson            out.writeByte((byte) 0);
83dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        }
84dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    }
85dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson
86dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    @Override
876a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson    public boolean equals(Object o) {
886a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson        if (this == o) return true;
896a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson        if (o == null || getClass() != o.getClass()) return false;
906a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson
916a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson        ScoredNetwork that = (ScoredNetwork) o;
926a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson
936a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson        return Objects.equals(networkKey, that.networkKey) &&
946a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson                Objects.equals(rssiCurve, that.rssiCurve);
956a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson    }
966a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson
976a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson    @Override
986a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson    public int hashCode() {
996a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson        return Objects.hash(networkKey, rssiCurve);
1006a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson    }
1016a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson
1026a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson    @Override
103dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    public String toString() {
104dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson        return "ScoredNetwork[key=" + networkKey + ",score=" + rssiCurve + "]";
105dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    }
106dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson
107dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson    public static final Parcelable.Creator<ScoredNetwork> CREATOR =
108dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson            new Parcelable.Creator<ScoredNetwork>() {
109dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson                @Override
110dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson                public ScoredNetwork createFromParcel(Parcel in) {
111dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson                    return new ScoredNetwork(in);
112dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson                }
113dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson
114dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson                @Override
115dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson                public ScoredNetwork[] newArray(int size) {
116dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson                    return new ScoredNetwork[size];
117dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson                }
118dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson            };
119dc960e21ef1005fab5ef145773ddd6f40c802217Jeff Davidson}
120