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 17 package android.telephony; 18 19 import android.os.Parcel; 20 import android.os.Parcelable; 21 import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN; 22 import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE; 23 import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS; 24 import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS; 25 import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA; 26 import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA; 27 import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA; 28 29 30 31 /** 32 * Represents the neighboring cell information, including 33 * Received Signal Strength and Cell ID location. 34 */ 35 public class NeighboringCellInfo implements Parcelable 36 { 37 /** 38 * Signal strength is not available 39 */ 40 static final public int UNKNOWN_RSSI = 99; 41 /** 42 * Cell location is not available 43 */ 44 static final public int UNKNOWN_CID = -1; 45 46 /** 47 * In GSM, mRssi is the Received RSSI; 48 * In UMTS, mRssi is the Level index of CPICH Received Signal Code Power 49 */ 50 private int mRssi; 51 /** 52 * CID in 16 bits format in GSM. Return UNKNOWN_CID in UMTS and CMDA. 53 */ 54 private int mCid; 55 /** 56 * LAC in 16 bits format in GSM. Return UNKNOWN_CID in UMTS and CMDA. 57 */ 58 private int mLac; 59 /** 60 * Primary Scrambling Code in 9 bits format in UMTS 61 * Return UNKNOWN_CID in GSM and CMDA. 62 */ 63 private int mPsc; 64 /** 65 * Radio network type, value is one of following 66 * TelephonyManager.NETWORK_TYPE_XXXXXX. 67 */ 68 private int mNetworkType; 69 70 /** 71 * Empty constructor. Initializes the RSSI and CID. 72 * 73 * NeighboringCellInfo is one time shot for the neighboring cells based on 74 * the radio network type at that moment. Its constructor needs radio network 75 * type. 76 * 77 * @deprecated by {@link #NeighboringCellInfo(int, String, int)} 78 */ 79 @Deprecated 80 public NeighboringCellInfo() { 81 mRssi = UNKNOWN_RSSI; 82 mLac = UNKNOWN_CID; 83 mCid = UNKNOWN_CID; 84 mPsc = UNKNOWN_CID; 85 mNetworkType = NETWORK_TYPE_UNKNOWN; 86 } 87 88 /** 89 * Initialize the object from rssi and cid. 90 * 91 * NeighboringCellInfo is one time shot for the neighboring cells based on 92 * the radio network type at that moment. Its constructor needs radio network 93 * type. 94 * 95 * @deprecated by {@link #NeighboringCellInfo(int, String, int)} 96 */ 97 @Deprecated 98 public NeighboringCellInfo(int rssi, int cid) { 99 mRssi = rssi; 100 mCid = cid; 101 } 102 103 /** 104 * Initialize the object from rssi, location string, and radioType 105 * radioType is one of following 106 * {@link TelephonyManager#NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_GPRS}, 107 * {@link TelephonyManager#NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_EDGE}, 108 * {@link TelephonyManager#NETWORK_TYPE_UMTS TelephonyManager.NETWORK_TYPE_UMTS}, 109 * {@link TelephonyManager#NETWORK_TYPE_HSDPA TelephonyManager.NETWORK_TYPE_HSDPA}, 110 * {@link TelephonyManager#NETWORK_TYPE_HSUPA TelephonyManager.NETWORK_TYPE_HSUPA}, 111 * and {@link TelephonyManager#NETWORK_TYPE_HSPA TelephonyManager.NETWORK_TYPE_HSPA}. 112 */ 113 public NeighboringCellInfo(int rssi, String location, int radioType) { 114 // set default value 115 mRssi = rssi; 116 mNetworkType = NETWORK_TYPE_UNKNOWN; 117 mPsc = UNKNOWN_CID; 118 mLac = UNKNOWN_CID; 119 mCid = UNKNOWN_CID; 120 121 122 // pad location string with leading "0" 123 int l = location.length(); 124 if (l > 8) return; 125 if (l < 8) { 126 for (int i = 0; i < (8-l); i++) { 127 location = "0" + location; 128 } 129 } 130 // TODO - handle LTE and eHRPD (or find they can't be supported) 131 try {// set LAC/CID or PSC based on radioType 132 switch (radioType) { 133 case NETWORK_TYPE_GPRS: 134 case NETWORK_TYPE_EDGE: 135 mNetworkType = radioType; 136 // check if 0xFFFFFFFF for UNKNOWN_CID 137 if (!location.equalsIgnoreCase("FFFFFFFF")) { 138 mCid = Integer.parseInt(location.substring(4), 16); 139 mLac = Integer.parseInt(location.substring(0, 4), 16); 140 } 141 break; 142 case NETWORK_TYPE_UMTS: 143 case NETWORK_TYPE_HSDPA: 144 case NETWORK_TYPE_HSUPA: 145 case NETWORK_TYPE_HSPA: 146 mNetworkType = radioType; 147 mPsc = Integer.parseInt(location, 16); 148 break; 149 } 150 } catch (NumberFormatException e) { 151 // parsing location error 152 mPsc = UNKNOWN_CID; 153 mLac = UNKNOWN_CID; 154 mCid = UNKNOWN_CID; 155 mNetworkType = NETWORK_TYPE_UNKNOWN; 156 } 157 } 158 159 /** 160 * Initialize the object from a parcel. 161 */ 162 public NeighboringCellInfo(Parcel in) { 163 mRssi = in.readInt(); 164 mLac = in.readInt(); 165 mCid = in.readInt(); 166 mPsc = in.readInt(); 167 mNetworkType = in.readInt(); 168 } 169 170 /** 171 * @return received signal strength or UNKNOWN_RSSI if unknown 172 * 173 * For GSM, it is in "asu" ranging from 0 to 31 (dBm = -113 + 2*asu) 174 * 0 means "-113 dBm or less" and 31 means "-51 dBm or greater" 175 * For UMTS, it is the Level index of CPICH RSCP defined in TS 25.125 176 */ 177 public int getRssi() { 178 return mRssi; 179 } 180 181 /** 182 * @return LAC in GSM, 0xffff max legal value 183 * UNKNOWN_CID if in UMTS or CMDA or unknown 184 */ 185 public int getLac() { 186 return mLac; 187 } 188 189 /** 190 * @return cell id in GSM, 0xffff max legal value 191 * UNKNOWN_CID if in UMTS or CDMA or unknown 192 */ 193 public int getCid() { 194 return mCid; 195 } 196 197 /** 198 * @return Primary Scrambling Code in 9 bits format in UMTS, 0x1ff max value 199 * UNKNOWN_CID if in GSM or CMDA or unknown 200 */ 201 public int getPsc() { 202 return mPsc; 203 } 204 205 /** 206 * @return Radio network type while neighboring cell location is stored. 207 * 208 * Return {@link TelephonyManager#NETWORK_TYPE_UNKNOWN TelephonyManager.NETWORK_TYPE_UNKNOWN} 209 * means that the location information is unavailable. 210 * 211 * Return {@link TelephonyManager#NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_GPRS} or 212 * {@link TelephonyManager#NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_EDGE} 213 * means that Neighboring Cell information is stored for GSM network, in 214 * which {@link NeighboringCellInfo#getLac NeighboringCellInfo.getLac} and 215 * {@link NeighboringCellInfo#getCid NeighboringCellInfo.getCid} should be 216 * called to access location. 217 * 218 * Return {@link TelephonyManager#NETWORK_TYPE_UMTS TelephonyManager.NETWORK_TYPE_UMTS}, 219 * {@link TelephonyManager#NETWORK_TYPE_HSDPA TelephonyManager.NETWORK_TYPE_HSDPA}, 220 * {@link TelephonyManager#NETWORK_TYPE_HSUPA TelephonyManager.NETWORK_TYPE_HSUPA}, 221 * or {@link TelephonyManager#NETWORK_TYPE_HSPA TelephonyManager.NETWORK_TYPE_HSPA} 222 * means that Neighboring Cell information is stored for UMTS network, in 223 * which {@link NeighboringCellInfo#getPsc NeighboringCellInfo.getPsc} 224 * should be called to access location. 225 */ 226 public int getNetworkType() { 227 return mNetworkType; 228 } 229 /** 230 * Set the cell id. 231 * 232 * NeighboringCellInfo is a one time shot for the neighboring cells based on 233 * the radio network type at that moment. It shouldn't be changed after 234 * creation. 235 * 236 * @deprecated cid value passed as in location parameter passed to constructor 237 * {@link #NeighboringCellInfo(int, String, int)} 238 */ 239 @Deprecated 240 public void setCid(int cid) { 241 mCid = cid; 242 } 243 244 /** 245 * Set the signal strength of the cell. 246 * 247 * NeighboringCellInfo is a one time shot for the neighboring cells based on 248 * the radio network type at that moment. It shouldn't be changed after 249 * creation. 250 * 251 * @deprecated initial rssi value passed as parameter to constructor 252 * {@link #NeighboringCellInfo(int, String, int)} 253 */ 254 @Deprecated 255 public void setRssi(int rssi) { 256 mRssi = rssi; 257 } 258 259 @Override 260 public String toString() { 261 StringBuilder sb = new StringBuilder(); 262 263 sb.append("["); 264 if (mPsc != UNKNOWN_CID) { 265 sb.append(Integer.toHexString(mPsc)) 266 .append("@").append(((mRssi == UNKNOWN_RSSI)? "-" : mRssi)); 267 } else if(mLac != UNKNOWN_CID && mCid != UNKNOWN_CID) { 268 sb.append(Integer.toHexString(mLac)) 269 .append(Integer.toHexString(mCid)) 270 .append("@").append(((mRssi == UNKNOWN_RSSI)? "-" : mRssi)); 271 } 272 sb.append("]"); 273 274 return sb.toString(); 275 } 276 277 public int describeContents() { 278 return 0; 279 } 280 281 public void writeToParcel(Parcel dest, int flags) { 282 dest.writeInt(mRssi); 283 dest.writeInt(mLac); 284 dest.writeInt(mCid); 285 dest.writeInt(mPsc); 286 dest.writeInt(mNetworkType); 287 } 288 289 public static final Parcelable.Creator<NeighboringCellInfo> CREATOR 290 = new Parcelable.Creator<NeighboringCellInfo>() { 291 public NeighboringCellInfo createFromParcel(Parcel in) { 292 return new NeighboringCellInfo(in); 293 } 294 295 public NeighboringCellInfo[] newArray(int size) { 296 return new NeighboringCellInfo[size]; 297 } 298 }; 299 } 300