1963db55d59a170f4b17ff907c96615a19ef6fe17John Wang/* 2b208a24cf521401912cfce16fce550a995cf1250Wink Saville * Copyright (C) 2012 The Android Open Source Project 3963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * 4963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * you may not use this file except in compliance with the License. 6963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * You may obtain a copy of the License at 7963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * 8963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * http://www.apache.org/licenses/LICENSE-2.0 9963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * 10963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * Unless required by applicable law or agreed to in writing, software 11963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * distributed under the License is distributed on an "AS IS" BASIS, 12963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * See the License for the specific language governing permissions and 14963db55d59a170f4b17ff907c96615a19ef6fe17John Wang * limitations under the License. 15963db55d59a170f4b17ff907c96615a19ef6fe17John Wang */ 16963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 17963db55d59a170f4b17ff907c96615a19ef6fe17John Wangpackage android.telephony; 18963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 19963db55d59a170f4b17ff907c96615a19ef6fe17John Wangimport android.os.Parcel; 20963db55d59a170f4b17ff907c96615a19ef6fe17John Wangimport android.os.Parcelable; 21963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 22963db55d59a170f4b17ff907c96615a19ef6fe17John Wang/** 23b208a24cf521401912cfce16fce550a995cf1250Wink Saville * Immutable cell information from a point in time. 24963db55d59a170f4b17ff907c96615a19ef6fe17John Wang */ 25c6e4917adda19beb780386bcc26b652748b8ab13Wink Savillepublic abstract class CellInfo implements Parcelable { 26963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 27b208a24cf521401912cfce16fce550a995cf1250Wink Saville // Type fields for parceling 283caf66d2ea63c75039daf43af30d3727e5ce6b58Wink Saville /** @hide */ 29b208a24cf521401912cfce16fce550a995cf1250Wink Saville protected static final int TYPE_GSM = 1; 303caf66d2ea63c75039daf43af30d3727e5ce6b58Wink Saville /** @hide */ 31b208a24cf521401912cfce16fce550a995cf1250Wink Saville protected static final int TYPE_CDMA = 2; 323caf66d2ea63c75039daf43af30d3727e5ce6b58Wink Saville /** @hide */ 33b208a24cf521401912cfce16fce550a995cf1250Wink Saville protected static final int TYPE_LTE = 3; 34963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 35b208a24cf521401912cfce16fce550a995cf1250Wink Saville // Type to distinguish where time stamp gets recorded. 36963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 37b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 38b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final int TIMESTAMP_TYPE_UNKNOWN = 0; 39b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 40b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final int TIMESTAMP_TYPE_ANTENNA = 1; 41b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 42b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final int TIMESTAMP_TYPE_MODEM = 2; 43b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 44b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final int TIMESTAMP_TYPE_OEM_RIL = 3; 45b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 46b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final int TIMESTAMP_TYPE_JAVA_RIL = 4; 47963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 48b208a24cf521401912cfce16fce550a995cf1250Wink Saville // True if device is mRegistered to the mobile network 49b208a24cf521401912cfce16fce550a995cf1250Wink Saville private boolean mRegistered; 50963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 51b208a24cf521401912cfce16fce550a995cf1250Wink Saville // Observation time stamped as type in nanoseconds since boot 52b208a24cf521401912cfce16fce550a995cf1250Wink Saville private long mTimeStamp; 53963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 54b208a24cf521401912cfce16fce550a995cf1250Wink Saville // Where time stamp gets recorded. 55b208a24cf521401912cfce16fce550a995cf1250Wink Saville // Value of TIMESTAMP_TYPE_XXXX 56b208a24cf521401912cfce16fce550a995cf1250Wink Saville private int mTimeStampType; 57963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 583caf66d2ea63c75039daf43af30d3727e5ce6b58Wink Saville /** @hide */ 59b208a24cf521401912cfce16fce550a995cf1250Wink Saville protected CellInfo() { 60b208a24cf521401912cfce16fce550a995cf1250Wink Saville this.mRegistered = false; 61b208a24cf521401912cfce16fce550a995cf1250Wink Saville this.mTimeStampType = TIMESTAMP_TYPE_UNKNOWN; 62b208a24cf521401912cfce16fce550a995cf1250Wink Saville this.mTimeStamp = Long.MAX_VALUE; 63963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 64963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 653caf66d2ea63c75039daf43af30d3727e5ce6b58Wink Saville /** @hide */ 66b208a24cf521401912cfce16fce550a995cf1250Wink Saville protected CellInfo(CellInfo ci) { 67963db55d59a170f4b17ff907c96615a19ef6fe17John Wang this.mRegistered = ci.mRegistered; 68b208a24cf521401912cfce16fce550a995cf1250Wink Saville this.mTimeStampType = ci.mTimeStampType; 69963db55d59a170f4b17ff907c96615a19ef6fe17John Wang this.mTimeStamp = ci.mTimeStamp; 70963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 71963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 72b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** True if this cell is registered to the mobile network */ 73b208a24cf521401912cfce16fce550a995cf1250Wink Saville public boolean isRegistered() { 74b208a24cf521401912cfce16fce550a995cf1250Wink Saville return mRegistered; 75b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 76b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 77b208a24cf521401912cfce16fce550a995cf1250Wink Saville public void setRegisterd(boolean registered) { 78b208a24cf521401912cfce16fce550a995cf1250Wink Saville mRegistered = registered; 79963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 80963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 81b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** Approximate time of this cell information in nanos since boot */ 82963db55d59a170f4b17ff907c96615a19ef6fe17John Wang public long getTimeStamp() { 83963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return mTimeStamp; 84963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 85b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 86b208a24cf521401912cfce16fce550a995cf1250Wink Saville public void setTimeStamp(long timeStamp) { 87b208a24cf521401912cfce16fce550a995cf1250Wink Saville mTimeStamp = timeStamp; 88b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 89963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 90963db55d59a170f4b17ff907c96615a19ef6fe17John Wang /** 91b208a24cf521401912cfce16fce550a995cf1250Wink Saville * Where time stamp gets recorded. 92b208a24cf521401912cfce16fce550a995cf1250Wink Saville * @return one of TIMESTAMP_TYPE_XXXX 93b208a24cf521401912cfce16fce550a995cf1250Wink Saville * 94b208a24cf521401912cfce16fce550a995cf1250Wink Saville * @hide 95963db55d59a170f4b17ff907c96615a19ef6fe17John Wang */ 96963db55d59a170f4b17ff907c96615a19ef6fe17John Wang public int getTimeStampType() { 97963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return mTimeStampType; 98963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 99b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 100b208a24cf521401912cfce16fce550a995cf1250Wink Saville public void setTimeStampType(int timeStampType) { 101b208a24cf521401912cfce16fce550a995cf1250Wink Saville if (timeStampType < TIMESTAMP_TYPE_UNKNOWN || timeStampType > TIMESTAMP_TYPE_JAVA_RIL) { 102b208a24cf521401912cfce16fce550a995cf1250Wink Saville mTimeStampType = TIMESTAMP_TYPE_UNKNOWN; 103b208a24cf521401912cfce16fce550a995cf1250Wink Saville } else { 104b208a24cf521401912cfce16fce550a995cf1250Wink Saville mTimeStampType = timeStampType; 105b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 106963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 107963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 108b208a24cf521401912cfce16fce550a995cf1250Wink Saville @Override 109b208a24cf521401912cfce16fce550a995cf1250Wink Saville public int hashCode() { 110b208a24cf521401912cfce16fce550a995cf1250Wink Saville int primeNum = 31; 111b208a24cf521401912cfce16fce550a995cf1250Wink Saville return ((mRegistered ? 0 : 1) * primeNum) + ((int)(mTimeStamp / 1000) * primeNum) 112b208a24cf521401912cfce16fce550a995cf1250Wink Saville + (mTimeStampType * primeNum); 113963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 114963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 115963db55d59a170f4b17ff907c96615a19ef6fe17John Wang @Override 116b208a24cf521401912cfce16fce550a995cf1250Wink Saville public boolean equals(Object other) { 117b208a24cf521401912cfce16fce550a995cf1250Wink Saville if (other == null) { 118b208a24cf521401912cfce16fce550a995cf1250Wink Saville return false; 119b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 120b208a24cf521401912cfce16fce550a995cf1250Wink Saville if (this == other) { 121b208a24cf521401912cfce16fce550a995cf1250Wink Saville return true; 122b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 123b208a24cf521401912cfce16fce550a995cf1250Wink Saville try { 124b208a24cf521401912cfce16fce550a995cf1250Wink Saville CellInfo o = (CellInfo) other; 125b208a24cf521401912cfce16fce550a995cf1250Wink Saville return mRegistered == o.mRegistered 126b208a24cf521401912cfce16fce550a995cf1250Wink Saville && mTimeStamp == o.mTimeStamp && mTimeStampType == o.mTimeStampType; 127b208a24cf521401912cfce16fce550a995cf1250Wink Saville } catch (ClassCastException e) { 128b208a24cf521401912cfce16fce550a995cf1250Wink Saville return false; 129b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 130b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 131963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 132b208a24cf521401912cfce16fce550a995cf1250Wink Saville private static String timeStampTypeToString(int type) { 133b208a24cf521401912cfce16fce550a995cf1250Wink Saville switch (type) { 134963db55d59a170f4b17ff907c96615a19ef6fe17John Wang case 1: 135b208a24cf521401912cfce16fce550a995cf1250Wink Saville return "antenna"; 136963db55d59a170f4b17ff907c96615a19ef6fe17John Wang case 2: 137b208a24cf521401912cfce16fce550a995cf1250Wink Saville return "modem"; 138963db55d59a170f4b17ff907c96615a19ef6fe17John Wang case 3: 139b208a24cf521401912cfce16fce550a995cf1250Wink Saville return "oem_ril"; 140963db55d59a170f4b17ff907c96615a19ef6fe17John Wang case 4: 141b208a24cf521401912cfce16fce550a995cf1250Wink Saville return "java_ril"; 142963db55d59a170f4b17ff907c96615a19ef6fe17John Wang default: 143b208a24cf521401912cfce16fce550a995cf1250Wink Saville return "unknown"; 144963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 145b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 146b208a24cf521401912cfce16fce550a995cf1250Wink Saville 147b208a24cf521401912cfce16fce550a995cf1250Wink Saville @Override 148b208a24cf521401912cfce16fce550a995cf1250Wink Saville public String toString() { 149b208a24cf521401912cfce16fce550a995cf1250Wink Saville StringBuffer sb = new StringBuffer(); 150b208a24cf521401912cfce16fce550a995cf1250Wink Saville String timeStampType; 151b208a24cf521401912cfce16fce550a995cf1250Wink Saville 152b208a24cf521401912cfce16fce550a995cf1250Wink Saville sb.append(" mRegistered=").append(mRegistered ? "YES" : "NO"); 153b208a24cf521401912cfce16fce550a995cf1250Wink Saville timeStampType = timeStampTypeToString(mTimeStampType); 154b208a24cf521401912cfce16fce550a995cf1250Wink Saville sb.append(" mTimeStampType=").append(timeStampType); 155b208a24cf521401912cfce16fce550a995cf1250Wink Saville sb.append(" mTimeStamp=").append(mTimeStamp).append("ns"); 156963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 157963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return sb.toString(); 158963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 159963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 160c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville /** 161c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * Implement the Parcelable interface 162c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville */ 163963db55d59a170f4b17ff907c96615a19ef6fe17John Wang @Override 164963db55d59a170f4b17ff907c96615a19ef6fe17John Wang public int describeContents() { 165963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return 0; 166963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 167963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 168b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** Implement the Parcelable interface */ 169963db55d59a170f4b17ff907c96615a19ef6fe17John Wang @Override 170c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville public abstract void writeToParcel(Parcel dest, int flags); 171c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville 172c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville /** 173c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * Used by child classes for parceling. 174c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * 175c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * @hide 176c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville */ 177c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville protected void writeToParcel(Parcel dest, int flags, int type) { 178c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville dest.writeInt(type); 179963db55d59a170f4b17ff907c96615a19ef6fe17John Wang dest.writeInt(mRegistered ? 1 : 0); 180b208a24cf521401912cfce16fce550a995cf1250Wink Saville dest.writeInt(mTimeStampType); 181963db55d59a170f4b17ff907c96615a19ef6fe17John Wang dest.writeLong(mTimeStamp); 182963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 183963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 184c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville /** 185c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * Used by child classes for parceling 186c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * 187c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * @hide 188c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville */ 189b208a24cf521401912cfce16fce550a995cf1250Wink Saville protected CellInfo(Parcel in) { 190b208a24cf521401912cfce16fce550a995cf1250Wink Saville mRegistered = (in.readInt() == 1) ? true : false; 191b208a24cf521401912cfce16fce550a995cf1250Wink Saville mTimeStampType = in.readInt(); 192b208a24cf521401912cfce16fce550a995cf1250Wink Saville mTimeStamp = in.readLong(); 193b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 194b208a24cf521401912cfce16fce550a995cf1250Wink Saville 195b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** Implement the Parcelable interface */ 196b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final Creator<CellInfo> CREATOR = new Creator<CellInfo>() { 197963db55d59a170f4b17ff907c96615a19ef6fe17John Wang @Override 198963db55d59a170f4b17ff907c96615a19ef6fe17John Wang public CellInfo createFromParcel(Parcel in) { 199b208a24cf521401912cfce16fce550a995cf1250Wink Saville int type = in.readInt(); 200b208a24cf521401912cfce16fce550a995cf1250Wink Saville switch (type) { 201b208a24cf521401912cfce16fce550a995cf1250Wink Saville case TYPE_GSM: return CellInfoGsm.createFromParcelBody(in); 202b208a24cf521401912cfce16fce550a995cf1250Wink Saville case TYPE_CDMA: return CellInfoCdma.createFromParcelBody(in); 203b208a24cf521401912cfce16fce550a995cf1250Wink Saville case TYPE_LTE: return CellInfoLte.createFromParcelBody(in); 204b208a24cf521401912cfce16fce550a995cf1250Wink Saville default: throw new RuntimeException("Bad CellInfo Parcel"); 205b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 206963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 207963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 208963db55d59a170f4b17ff907c96615a19ef6fe17John Wang @Override 209963db55d59a170f4b17ff907c96615a19ef6fe17John Wang public CellInfo[] newArray(int size) { 210963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return new CellInfo[size]; 211963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 212963db55d59a170f4b17ff907c96615a19ef6fe17John Wang }; 213963db55d59a170f4b17ff907c96615a19ef6fe17John Wang} 214