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