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