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; 34e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** @hide */ 35e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville protected static final int TYPE_WCDMA = 4; 36963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 37b208a24cf521401912cfce16fce550a995cf1250Wink Saville // Type to distinguish where time stamp gets recorded. 38963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 39b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 40b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final int TIMESTAMP_TYPE_UNKNOWN = 0; 41b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 42b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final int TIMESTAMP_TYPE_ANTENNA = 1; 43b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 44b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final int TIMESTAMP_TYPE_MODEM = 2; 45b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 46b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final int TIMESTAMP_TYPE_OEM_RIL = 3; 47b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 48b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final int TIMESTAMP_TYPE_JAVA_RIL = 4; 49963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 50b208a24cf521401912cfce16fce550a995cf1250Wink Saville // True if device is mRegistered to the mobile network 51b208a24cf521401912cfce16fce550a995cf1250Wink Saville private boolean mRegistered; 52963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 53b208a24cf521401912cfce16fce550a995cf1250Wink Saville // Observation time stamped as type in nanoseconds since boot 54b208a24cf521401912cfce16fce550a995cf1250Wink Saville private long mTimeStamp; 55963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 56b208a24cf521401912cfce16fce550a995cf1250Wink Saville // Where time stamp gets recorded. 57b208a24cf521401912cfce16fce550a995cf1250Wink Saville // Value of TIMESTAMP_TYPE_XXXX 58b208a24cf521401912cfce16fce550a995cf1250Wink Saville private int mTimeStampType; 59963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 603caf66d2ea63c75039daf43af30d3727e5ce6b58Wink Saville /** @hide */ 61b208a24cf521401912cfce16fce550a995cf1250Wink Saville protected CellInfo() { 62b208a24cf521401912cfce16fce550a995cf1250Wink Saville this.mRegistered = false; 63b208a24cf521401912cfce16fce550a995cf1250Wink Saville this.mTimeStampType = TIMESTAMP_TYPE_UNKNOWN; 64b208a24cf521401912cfce16fce550a995cf1250Wink Saville this.mTimeStamp = Long.MAX_VALUE; 65963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 66963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 673caf66d2ea63c75039daf43af30d3727e5ce6b58Wink Saville /** @hide */ 68b208a24cf521401912cfce16fce550a995cf1250Wink Saville protected CellInfo(CellInfo ci) { 69963db55d59a170f4b17ff907c96615a19ef6fe17John Wang this.mRegistered = ci.mRegistered; 70b208a24cf521401912cfce16fce550a995cf1250Wink Saville this.mTimeStampType = ci.mTimeStampType; 71963db55d59a170f4b17ff907c96615a19ef6fe17John Wang this.mTimeStamp = ci.mTimeStamp; 72963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 73963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 74b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** True if this cell is registered to the mobile network */ 75b208a24cf521401912cfce16fce550a995cf1250Wink Saville public boolean isRegistered() { 76b208a24cf521401912cfce16fce550a995cf1250Wink Saville return mRegistered; 77b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 78b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 79b208a24cf521401912cfce16fce550a995cf1250Wink Saville public void setRegisterd(boolean registered) { 80b208a24cf521401912cfce16fce550a995cf1250Wink Saville mRegistered = registered; 81963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 82963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 83b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** Approximate time of this cell information in nanos since boot */ 84963db55d59a170f4b17ff907c96615a19ef6fe17John Wang public long getTimeStamp() { 85963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return mTimeStamp; 86963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 87b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 88b208a24cf521401912cfce16fce550a995cf1250Wink Saville public void setTimeStamp(long timeStamp) { 89b208a24cf521401912cfce16fce550a995cf1250Wink Saville mTimeStamp = timeStamp; 90b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 91963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 92963db55d59a170f4b17ff907c96615a19ef6fe17John Wang /** 93b208a24cf521401912cfce16fce550a995cf1250Wink Saville * Where time stamp gets recorded. 94b208a24cf521401912cfce16fce550a995cf1250Wink Saville * @return one of TIMESTAMP_TYPE_XXXX 95b208a24cf521401912cfce16fce550a995cf1250Wink Saville * 96b208a24cf521401912cfce16fce550a995cf1250Wink Saville * @hide 97963db55d59a170f4b17ff907c96615a19ef6fe17John Wang */ 98963db55d59a170f4b17ff907c96615a19ef6fe17John Wang public int getTimeStampType() { 99963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return mTimeStampType; 100963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 101b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** @hide */ 102b208a24cf521401912cfce16fce550a995cf1250Wink Saville public void setTimeStampType(int timeStampType) { 103b208a24cf521401912cfce16fce550a995cf1250Wink Saville if (timeStampType < TIMESTAMP_TYPE_UNKNOWN || timeStampType > TIMESTAMP_TYPE_JAVA_RIL) { 104b208a24cf521401912cfce16fce550a995cf1250Wink Saville mTimeStampType = TIMESTAMP_TYPE_UNKNOWN; 105b208a24cf521401912cfce16fce550a995cf1250Wink Saville } else { 106b208a24cf521401912cfce16fce550a995cf1250Wink Saville mTimeStampType = timeStampType; 107b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 108963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 109963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 110b208a24cf521401912cfce16fce550a995cf1250Wink Saville @Override 111b208a24cf521401912cfce16fce550a995cf1250Wink Saville public int hashCode() { 112b208a24cf521401912cfce16fce550a995cf1250Wink Saville int primeNum = 31; 113b208a24cf521401912cfce16fce550a995cf1250Wink Saville return ((mRegistered ? 0 : 1) * primeNum) + ((int)(mTimeStamp / 1000) * primeNum) 114b208a24cf521401912cfce16fce550a995cf1250Wink Saville + (mTimeStampType * primeNum); 115963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 116963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 117963db55d59a170f4b17ff907c96615a19ef6fe17John Wang @Override 118b208a24cf521401912cfce16fce550a995cf1250Wink Saville public boolean equals(Object other) { 119b208a24cf521401912cfce16fce550a995cf1250Wink Saville if (other == null) { 120b208a24cf521401912cfce16fce550a995cf1250Wink Saville return false; 121b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 122b208a24cf521401912cfce16fce550a995cf1250Wink Saville if (this == other) { 123b208a24cf521401912cfce16fce550a995cf1250Wink Saville return true; 124b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 125b208a24cf521401912cfce16fce550a995cf1250Wink Saville try { 126b208a24cf521401912cfce16fce550a995cf1250Wink Saville CellInfo o = (CellInfo) other; 127b208a24cf521401912cfce16fce550a995cf1250Wink Saville return mRegistered == o.mRegistered 128b208a24cf521401912cfce16fce550a995cf1250Wink Saville && mTimeStamp == o.mTimeStamp && mTimeStampType == o.mTimeStampType; 129b208a24cf521401912cfce16fce550a995cf1250Wink Saville } catch (ClassCastException e) { 130b208a24cf521401912cfce16fce550a995cf1250Wink Saville return false; 131b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 132b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 133963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 134b208a24cf521401912cfce16fce550a995cf1250Wink Saville private static String timeStampTypeToString(int type) { 135b208a24cf521401912cfce16fce550a995cf1250Wink Saville switch (type) { 136963db55d59a170f4b17ff907c96615a19ef6fe17John Wang case 1: 137b208a24cf521401912cfce16fce550a995cf1250Wink Saville return "antenna"; 138963db55d59a170f4b17ff907c96615a19ef6fe17John Wang case 2: 139b208a24cf521401912cfce16fce550a995cf1250Wink Saville return "modem"; 140963db55d59a170f4b17ff907c96615a19ef6fe17John Wang case 3: 141b208a24cf521401912cfce16fce550a995cf1250Wink Saville return "oem_ril"; 142963db55d59a170f4b17ff907c96615a19ef6fe17John Wang case 4: 143b208a24cf521401912cfce16fce550a995cf1250Wink Saville return "java_ril"; 144963db55d59a170f4b17ff907c96615a19ef6fe17John Wang default: 145b208a24cf521401912cfce16fce550a995cf1250Wink Saville return "unknown"; 146963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 147b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 148b208a24cf521401912cfce16fce550a995cf1250Wink Saville 149b208a24cf521401912cfce16fce550a995cf1250Wink Saville @Override 150b208a24cf521401912cfce16fce550a995cf1250Wink Saville public String toString() { 151b208a24cf521401912cfce16fce550a995cf1250Wink Saville StringBuffer sb = new StringBuffer(); 152b208a24cf521401912cfce16fce550a995cf1250Wink Saville String timeStampType; 153b208a24cf521401912cfce16fce550a995cf1250Wink Saville 154094beeccf5bf6e68d73f94a1aeaeda6690f4bf06Wink Saville sb.append("mRegistered=").append(mRegistered ? "YES" : "NO"); 155b208a24cf521401912cfce16fce550a995cf1250Wink Saville timeStampType = timeStampTypeToString(mTimeStampType); 156b208a24cf521401912cfce16fce550a995cf1250Wink Saville sb.append(" mTimeStampType=").append(timeStampType); 157b208a24cf521401912cfce16fce550a995cf1250Wink Saville sb.append(" mTimeStamp=").append(mTimeStamp).append("ns"); 158963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 159963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return sb.toString(); 160963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 161963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 162c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville /** 163c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * Implement the Parcelable interface 164c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville */ 165963db55d59a170f4b17ff907c96615a19ef6fe17John Wang @Override 166963db55d59a170f4b17ff907c96615a19ef6fe17John Wang public int describeContents() { 167963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return 0; 168963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 169963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 170b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** Implement the Parcelable interface */ 171963db55d59a170f4b17ff907c96615a19ef6fe17John Wang @Override 172c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville public abstract void writeToParcel(Parcel dest, int flags); 173c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville 174c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville /** 175c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * Used by child classes for parceling. 176c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * 177c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * @hide 178c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville */ 179c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville protected void writeToParcel(Parcel dest, int flags, int type) { 180c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville dest.writeInt(type); 181963db55d59a170f4b17ff907c96615a19ef6fe17John Wang dest.writeInt(mRegistered ? 1 : 0); 182b208a24cf521401912cfce16fce550a995cf1250Wink Saville dest.writeInt(mTimeStampType); 183963db55d59a170f4b17ff907c96615a19ef6fe17John Wang dest.writeLong(mTimeStamp); 184963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 185963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 186c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville /** 187c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * Used by child classes for parceling 188c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * 189c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville * @hide 190c6e4917adda19beb780386bcc26b652748b8ab13Wink Saville */ 191b208a24cf521401912cfce16fce550a995cf1250Wink Saville protected CellInfo(Parcel in) { 192b208a24cf521401912cfce16fce550a995cf1250Wink Saville mRegistered = (in.readInt() == 1) ? true : false; 193b208a24cf521401912cfce16fce550a995cf1250Wink Saville mTimeStampType = in.readInt(); 194b208a24cf521401912cfce16fce550a995cf1250Wink Saville mTimeStamp = in.readLong(); 195b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 196b208a24cf521401912cfce16fce550a995cf1250Wink Saville 197b208a24cf521401912cfce16fce550a995cf1250Wink Saville /** Implement the Parcelable interface */ 198b208a24cf521401912cfce16fce550a995cf1250Wink Saville public static final Creator<CellInfo> CREATOR = new Creator<CellInfo>() { 199963db55d59a170f4b17ff907c96615a19ef6fe17John Wang @Override 200963db55d59a170f4b17ff907c96615a19ef6fe17John Wang public CellInfo createFromParcel(Parcel in) { 201b208a24cf521401912cfce16fce550a995cf1250Wink Saville int type = in.readInt(); 202b208a24cf521401912cfce16fce550a995cf1250Wink Saville switch (type) { 203b208a24cf521401912cfce16fce550a995cf1250Wink Saville case TYPE_GSM: return CellInfoGsm.createFromParcelBody(in); 204b208a24cf521401912cfce16fce550a995cf1250Wink Saville case TYPE_CDMA: return CellInfoCdma.createFromParcelBody(in); 205b208a24cf521401912cfce16fce550a995cf1250Wink Saville case TYPE_LTE: return CellInfoLte.createFromParcelBody(in); 206e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville case TYPE_WCDMA: return CellInfoWcdma.createFromParcelBody(in); 207b208a24cf521401912cfce16fce550a995cf1250Wink Saville default: throw new RuntimeException("Bad CellInfo Parcel"); 208b208a24cf521401912cfce16fce550a995cf1250Wink Saville } 209963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 210963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 211963db55d59a170f4b17ff907c96615a19ef6fe17John Wang @Override 212963db55d59a170f4b17ff907c96615a19ef6fe17John Wang public CellInfo[] newArray(int size) { 213963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return new CellInfo[size]; 214963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 215963db55d59a170f4b17ff907c96615a19ef6fe17John Wang }; 216963db55d59a170f4b17ff907c96615a19ef6fe17John Wang} 217