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