CdmaCellLocation.java revision 6714030083b1d8ec5b2df6dfef08034d0d30c2fe
1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.telephony.cdma;
18
19import android.os.Bundle;
20import android.telephony.CellLocation;
21
22/**
23 * Represents the cell location on a CDMA phone.
24 */
25public class CdmaCellLocation extends CellLocation {
26    private int mBaseStationId = -1;
27
28    /**
29     * @hide
30     */
31    public final static int INVALID_LAT_LONG = Integer.MAX_VALUE;
32
33    /**
34     * Latitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0.
35     * It is represented in units of 0.25 seconds and ranges from -1296000
36     * to 1296000, both values inclusive (corresponding to a range of -90
37     * to +90 degrees). Integer.MAX_VALUE is considered invalid value.
38     */
39    private int mBaseStationLatitude = INVALID_LAT_LONG;
40
41    /**
42     * Longitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0.
43     * It is represented in units of 0.25 seconds and ranges from -2592000
44     * to 2592000, both values inclusive (corresponding to a range of -180
45     * to +180 degrees). Integer.MAX_VALUE is considered invalid value.
46     */
47    private int mBaseStationLongitude = INVALID_LAT_LONG;
48
49    private int mSystemId = -1;
50    private int mNetworkId = -1;
51
52    /**
53     * Empty constructor.
54     * Initializes the BID, SID, NID and base station latitude and longitude
55     * to invalid values.
56     */
57    public CdmaCellLocation() {
58        this.mBaseStationId = -1;
59        this.mBaseStationLatitude = INVALID_LAT_LONG;
60        this.mBaseStationLongitude = INVALID_LAT_LONG;
61        this.mSystemId = -1;
62        this.mNetworkId = -1;
63    }
64
65    /**
66     * Initialize the object from a bundle.
67     */
68    public CdmaCellLocation(Bundle bundle) {
69        this.mBaseStationId = bundle.getInt("baseStationId", mBaseStationId);
70        this.mBaseStationLatitude = bundle.getInt("baseStationLatitude", mBaseStationLatitude);
71        this.mBaseStationLongitude = bundle.getInt("baseStationLongitude", mBaseStationLongitude);
72        this.mSystemId = bundle.getInt("systemId", mSystemId);
73        this.mNetworkId = bundle.getInt("networkId", mNetworkId);
74    }
75
76    /**
77     * @return cdma base station identification number, -1 if unknown
78     */
79    public int getBaseStationId() {
80        return this.mBaseStationId;
81    }
82
83    /**
84     * Latitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0.
85     * (http://www.3gpp2.org/public_html/specs/C.S0005-A_v6.0.pdf)
86     * It is represented in units of 0.25 seconds and ranges from -1296000
87     * to 1296000, both values inclusive (corresponding to a range of -90
88     * to +90 degrees). Integer.MAX_VALUE is considered invalid value.
89     *
90     * @return cdma base station latitude in units of 0.25 seconds, Integer.MAX_VALUE if unknown
91     */
92    public int getBaseStationLatitude() {
93        return this.mBaseStationLatitude;
94    }
95
96    /**
97     * Longitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0.
98     * (http://www.3gpp2.org/public_html/specs/C.S0005-A_v6.0.pdf)
99     * It is represented in units of 0.25 seconds and ranges from -2592000
100     * to 2592000, both values inclusive (corresponding to a range of -180
101     * to +180 degrees). Integer.MAX_VALUE is considered invalid value.
102     *
103     * @return cdma base station longitude in units of 0.25 seconds, Integer.MAX_VALUE if unknown
104     */
105    public int getBaseStationLongitude() {
106        return this.mBaseStationLongitude;
107    }
108
109    /**
110     * @return cdma system identification number, -1 if unknown
111     */
112    public int getSystemId() {
113        return this.mSystemId;
114    }
115
116    /**
117     * @return cdma network identification number, -1 if unknown
118     */
119    public int getNetworkId() {
120        return this.mNetworkId;
121    }
122
123    /**
124     * Invalidate this object.  The cell location data is set to invalid values.
125     */
126    @Override
127    public void setStateInvalid() {
128        this.mBaseStationId = -1;
129        this.mBaseStationLatitude = INVALID_LAT_LONG;
130        this.mBaseStationLongitude = INVALID_LAT_LONG;
131        this.mSystemId = -1;
132        this.mNetworkId = -1;
133    }
134
135    /**
136     * Set the cell location data.
137     */
138    public void setCellLocationData(int baseStationId, int baseStationLatitude,
139         int baseStationLongitude) {
140         // The following values have to be written in the correct sequence
141         this.mBaseStationId = baseStationId;
142         this.mBaseStationLatitude = baseStationLatitude;   //values[2];
143         this.mBaseStationLongitude = baseStationLongitude; //values[3];
144    }
145
146    /**
147     * Set the cell location data.
148     */
149     public void setCellLocationData(int baseStationId, int baseStationLatitude,
150         int baseStationLongitude, int systemId, int networkId) {
151         // The following values have to be written in the correct sequence
152         this.mBaseStationId = baseStationId;
153         this.mBaseStationLatitude = baseStationLatitude;   //values[2];
154         this.mBaseStationLongitude = baseStationLongitude; //values[3];
155         this.mSystemId = systemId;
156         this.mNetworkId = networkId;
157    }
158
159    @Override
160    public int hashCode() {
161        return this.mBaseStationId ^ this.mBaseStationLatitude ^ this.mBaseStationLongitude
162                ^ this.mSystemId ^ this.mNetworkId;
163    }
164
165    @Override
166    public boolean equals(Object o) {
167        CdmaCellLocation s;
168
169        try {
170            s = (CdmaCellLocation)o;
171        } catch (ClassCastException ex) {
172            return false;
173        }
174
175        if (o == null) {
176            return false;
177        }
178
179        return (equalsHandlesNulls(this.mBaseStationId, s.mBaseStationId) &&
180                equalsHandlesNulls(this.mBaseStationLatitude, s.mBaseStationLatitude) &&
181                equalsHandlesNulls(this.mBaseStationLongitude, s.mBaseStationLongitude) &&
182                equalsHandlesNulls(this.mSystemId, s.mSystemId) &&
183                equalsHandlesNulls(this.mNetworkId, s.mNetworkId)
184        );
185    }
186
187    @Override
188    public String toString() {
189        return "[" + this.mBaseStationId + ","
190                   + this.mBaseStationLatitude + ","
191                   + this.mBaseStationLongitude + ","
192                   + this.mSystemId + ","
193                   + this.mNetworkId + "]";
194    }
195
196    /**
197     * Test whether two objects hold the same data values or both are null
198     *
199     * @param a first obj
200     * @param b second obj
201     * @return true if two objects equal or both are null
202     */
203    private static boolean equalsHandlesNulls(Object a, Object b) {
204        return (a == null) ? (b == null) : a.equals (b);
205    }
206
207    /**
208     * Fill the cell location data into the intent notifier Bundle based on service state
209     *
210     * @param bundleToFill intent notifier Bundle
211     */
212    public void fillInNotifierBundle(Bundle bundleToFill) {
213        bundleToFill.putInt("baseStationId", this.mBaseStationId);
214        bundleToFill.putInt("baseStationLatitude", this.mBaseStationLatitude);
215        bundleToFill.putInt("baseStationLongitude", this.mBaseStationLongitude);
216        bundleToFill.putInt("systemId", this.mSystemId);
217        bundleToFill.putInt("networkId", this.mNetworkId);
218    }
219
220    /**
221     * @hide
222     */
223    public boolean isEmpty() {
224        return (this.mBaseStationId == -1 &&
225                this.mBaseStationLatitude == INVALID_LAT_LONG &&
226                this.mBaseStationLongitude == INVALID_LAT_LONG &&
227                this.mSystemId == -1 &&
228                this.mNetworkId == -1);
229    }
230
231    /**
232     * Converts latitude or longitude from 0.25 seconds (as defined in the
233     * 3GPP2 C.S0005-A v6.0 standard) to decimal degrees
234     *
235     * @param quartSec latitude or longitude in 0.25 seconds units
236     * @return latitude or longitude in decimal degrees units
237     * @throws IllegalArgumentException if value is less than -2592000,
238     *                                  greater than 2592000, or is not a number.
239     */
240    public static double convertQuartSecToDecDegrees(int quartSec) {
241        if(Double.isNaN(quartSec) || quartSec < -2592000 || quartSec > 2592000){
242            // Invalid value
243            throw new IllegalArgumentException("Invalid coordiante value:" + quartSec);
244        }
245        return ((double)quartSec) / (3600 * 4);
246    }
247
248}
249
250
251