1 /* 2 * Copyright (C) 2014 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 22 import com.android.internal.telephony.RILConstants; 23 24 /** 25 * Object to indicate the phone radio type and access technology. 26 * 27 * @hide 28 */ 29 public class RadioAccessFamily implements Parcelable { 30 31 // Radio Access Family 32 // 2G 33 public static final int RAF_UNKNOWN = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN); 34 public static final int RAF_GSM = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GSM); 35 public static final int RAF_GPRS = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GPRS); 36 public static final int RAF_EDGE = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EDGE); 37 public static final int RAF_IS95A = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95A); 38 public static final int RAF_IS95B = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95B); 39 public static final int RAF_1xRTT = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT); 40 // 3G 41 public static final int RAF_EVDO_0 = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0); 42 public static final int RAF_EVDO_A = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A); 43 public static final int RAF_EVDO_B = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B); 44 public static final int RAF_EHRPD = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD); 45 public static final int RAF_HSUPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA); 46 public static final int RAF_HSDPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA); 47 public static final int RAF_HSPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPA); 48 public static final int RAF_HSPAP = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP); 49 public static final int RAF_UMTS = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UMTS); 50 public static final int RAF_TD_SCDMA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA); 51 // 4G 52 public static final int RAF_LTE = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE); 53 public static final int RAF_LTE_CA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA); 54 55 // Grouping of RAFs 56 // 2G 57 private static final int GSM = RAF_GSM | RAF_GPRS | RAF_EDGE; 58 private static final int CDMA = RAF_IS95A | RAF_IS95B | RAF_1xRTT; 59 // 3G 60 private static final int EVDO = RAF_EVDO_0 | RAF_EVDO_A | RAF_EVDO_B | RAF_EHRPD; 61 private static final int HS = RAF_HSUPA | RAF_HSDPA | RAF_HSPA | RAF_HSPAP; 62 private static final int WCDMA = HS | RAF_UMTS; 63 // 4G 64 private static final int LTE = RAF_LTE | RAF_LTE_CA; 65 66 /* Phone ID of phone */ 67 private int mPhoneId; 68 69 /* Radio Access Family */ 70 private int mRadioAccessFamily; 71 72 /** 73 * Constructor. 74 * 75 * @param phoneId the phone ID 76 * @param radioAccessFamily the phone radio access family defined 77 * in RadioAccessFamily. It's a bit mask value to represent 78 * the support type. 79 */ RadioAccessFamily(int phoneId, int radioAccessFamily)80 public RadioAccessFamily(int phoneId, int radioAccessFamily) { 81 mPhoneId = phoneId; 82 mRadioAccessFamily = radioAccessFamily; 83 } 84 85 /** 86 * Get phone ID. 87 * 88 * @return phone ID 89 */ getPhoneId()90 public int getPhoneId() { 91 return mPhoneId; 92 } 93 94 /** 95 * get radio access family. 96 * 97 * @return radio access family 98 */ getRadioAccessFamily()99 public int getRadioAccessFamily() { 100 return mRadioAccessFamily; 101 } 102 103 @Override toString()104 public String toString() { 105 String ret = "{ mPhoneId = " + mPhoneId 106 + ", mRadioAccessFamily = " + mRadioAccessFamily 107 + "}"; 108 return ret; 109 } 110 111 /** 112 * Implement the Parcelable interface. 113 * 114 * @return describe content 115 */ 116 @Override describeContents()117 public int describeContents() { 118 return 0; 119 } 120 121 /** 122 * Implement the Parcelable interface. 123 * 124 * @param outParcel The Parcel in which the object should be written. 125 * @param flags Additional flags about how the object should be written. 126 */ 127 @Override writeToParcel(Parcel outParcel, int flags)128 public void writeToParcel(Parcel outParcel, int flags) { 129 outParcel.writeInt(mPhoneId); 130 outParcel.writeInt(mRadioAccessFamily); 131 } 132 133 /** 134 * Implement the Parcelable interface. 135 */ 136 public static final Creator<RadioAccessFamily> CREATOR = 137 new Creator<RadioAccessFamily>() { 138 139 @Override 140 public RadioAccessFamily createFromParcel(Parcel in) { 141 int phoneId = in.readInt(); 142 int radioAccessFamily = in.readInt(); 143 144 return new RadioAccessFamily(phoneId, radioAccessFamily); 145 } 146 147 @Override 148 public RadioAccessFamily[] newArray(int size) { 149 return new RadioAccessFamily[size]; 150 } 151 }; 152 getRafFromNetworkType(int type)153 public static int getRafFromNetworkType(int type) { 154 int raf; 155 156 switch (type) { 157 case RILConstants.NETWORK_MODE_WCDMA_PREF: 158 raf = GSM | WCDMA; 159 break; 160 case RILConstants.NETWORK_MODE_GSM_ONLY: 161 raf = GSM; 162 break; 163 case RILConstants.NETWORK_MODE_WCDMA_ONLY: 164 raf = WCDMA; 165 break; 166 case RILConstants.NETWORK_MODE_GSM_UMTS: 167 raf = GSM | WCDMA; 168 break; 169 case RILConstants.NETWORK_MODE_CDMA: 170 raf = CDMA | EVDO; 171 break; 172 case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO: 173 raf = LTE | CDMA | EVDO; 174 break; 175 case RILConstants.NETWORK_MODE_LTE_GSM_WCDMA: 176 raf = LTE | GSM | WCDMA; 177 break; 178 case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 179 raf = LTE | CDMA | EVDO | GSM | WCDMA; 180 break; 181 case RILConstants.NETWORK_MODE_LTE_ONLY: 182 raf = LTE; 183 break; 184 case RILConstants.NETWORK_MODE_LTE_WCDMA: 185 raf = LTE | WCDMA; 186 break; 187 case RILConstants.NETWORK_MODE_CDMA_NO_EVDO: 188 raf = CDMA; 189 break; 190 case RILConstants.NETWORK_MODE_EVDO_NO_CDMA: 191 raf = EVDO; 192 break; 193 case RILConstants.NETWORK_MODE_GLOBAL: 194 raf = GSM | WCDMA | CDMA | EVDO; 195 break; 196 case RILConstants.NETWORK_MODE_TDSCDMA_ONLY: 197 raf = RAF_TD_SCDMA; 198 break; 199 case RILConstants.NETWORK_MODE_TDSCDMA_WCDMA: 200 raf = RAF_TD_SCDMA | WCDMA; 201 break; 202 case RILConstants.NETWORK_MODE_LTE_TDSCDMA: 203 raf = LTE | RAF_TD_SCDMA; 204 break; 205 case RILConstants.NETWORK_MODE_TDSCDMA_GSM: 206 raf = RAF_TD_SCDMA | GSM; 207 break; 208 case RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM: 209 raf = LTE | RAF_TD_SCDMA | GSM; 210 break; 211 case RILConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA: 212 raf = RAF_TD_SCDMA | GSM | WCDMA; 213 break; 214 case RILConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA: 215 raf = LTE | RAF_TD_SCDMA | WCDMA; 216 break; 217 case RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA: 218 raf = LTE | RAF_TD_SCDMA | GSM | WCDMA; 219 break; 220 case RILConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 221 raf = RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA; 222 break; 223 case RILConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 224 raf = LTE | RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA; 225 break; 226 default: 227 raf = RAF_UNKNOWN; 228 break; 229 } 230 231 return raf; 232 } 233 234 /** 235 * if the raf includes ANY bit set for a group 236 * adjust it to contain ALL the bits for that group 237 */ getAdjustedRaf(int raf)238 private static int getAdjustedRaf(int raf) { 239 raf = ((GSM & raf) > 0) ? (GSM | raf) : raf; 240 raf = ((WCDMA & raf) > 0) ? (WCDMA | raf) : raf; 241 raf = ((CDMA & raf) > 0) ? (CDMA | raf) : raf; 242 raf = ((EVDO & raf) > 0) ? (EVDO | raf) : raf; 243 raf = ((LTE & raf) > 0) ? (LTE | raf) : raf; 244 245 return raf; 246 } 247 248 /** 249 * Returns the highest capability of the RadioAccessFamily (4G > 3G > 2G). 250 * @param raf The RadioAccessFamily that we wish to filter 251 * @return The highest radio capability 252 */ getHighestRafCapability(int raf)253 public static int getHighestRafCapability(int raf) { 254 if ((LTE & raf) > 0) { 255 return TelephonyManager.NETWORK_CLASS_4_G; 256 } 257 if ((EVDO|HS|WCDMA & raf) > 0) { 258 return TelephonyManager.NETWORK_CLASS_3_G; 259 } 260 if((GSM|CDMA & raf) > 0) { 261 return TelephonyManager.NETWORK_CLASS_2_G; 262 } 263 return TelephonyManager.NETWORK_CLASS_UNKNOWN; 264 } 265 getNetworkTypeFromRaf(int raf)266 public static int getNetworkTypeFromRaf(int raf) { 267 int type; 268 269 raf = getAdjustedRaf(raf); 270 271 switch (raf) { 272 case (GSM | WCDMA): 273 type = RILConstants.NETWORK_MODE_WCDMA_PREF; 274 break; 275 case GSM: 276 type = RILConstants.NETWORK_MODE_GSM_ONLY; 277 break; 278 case WCDMA: 279 type = RILConstants.NETWORK_MODE_WCDMA_ONLY; 280 break; 281 case (CDMA | EVDO): 282 type = RILConstants.NETWORK_MODE_CDMA; 283 break; 284 case (LTE | CDMA | EVDO): 285 type = RILConstants.NETWORK_MODE_LTE_CDMA_EVDO; 286 break; 287 case (LTE | GSM | WCDMA): 288 type = RILConstants.NETWORK_MODE_LTE_GSM_WCDMA; 289 break; 290 case (LTE | CDMA | EVDO | GSM | WCDMA): 291 type = RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA; 292 break; 293 case LTE: 294 type = RILConstants.NETWORK_MODE_LTE_ONLY; 295 break; 296 case (LTE | WCDMA): 297 type = RILConstants.NETWORK_MODE_LTE_WCDMA; 298 break; 299 case CDMA: 300 type = RILConstants.NETWORK_MODE_CDMA_NO_EVDO; 301 break; 302 case EVDO: 303 type = RILConstants.NETWORK_MODE_EVDO_NO_CDMA; 304 break; 305 case (GSM | WCDMA | CDMA | EVDO): 306 type = RILConstants.NETWORK_MODE_GLOBAL; 307 break; 308 case RAF_TD_SCDMA: 309 type = RILConstants.NETWORK_MODE_TDSCDMA_ONLY; 310 break; 311 case (RAF_TD_SCDMA | WCDMA): 312 type = RILConstants.NETWORK_MODE_TDSCDMA_WCDMA; 313 break; 314 case (LTE | RAF_TD_SCDMA): 315 type = RILConstants.NETWORK_MODE_LTE_TDSCDMA; 316 break; 317 case (RAF_TD_SCDMA | GSM): 318 type = RILConstants.NETWORK_MODE_TDSCDMA_GSM; 319 break; 320 case (LTE | RAF_TD_SCDMA | GSM): 321 type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM; 322 break; 323 case (RAF_TD_SCDMA | GSM | WCDMA): 324 type = RILConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA; 325 break; 326 case (LTE | RAF_TD_SCDMA | WCDMA): 327 type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA; 328 break; 329 case (LTE | RAF_TD_SCDMA | GSM | WCDMA): 330 type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA; 331 break; 332 case (RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA): 333 type = RILConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA; 334 break; 335 case (LTE | RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA): 336 type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA; 337 break; 338 default: 339 type = RILConstants.PREFERRED_NETWORK_MODE ; 340 break; 341 } 342 343 return type; 344 } 345 singleRafTypeFromString(String rafString)346 public static int singleRafTypeFromString(String rafString) { 347 switch (rafString) { 348 case "GPRS": return RAF_GPRS; 349 case "EDGE": return RAF_EDGE; 350 case "UMTS": return RAF_UMTS; 351 case "IS95A": return RAF_IS95A; 352 case "IS95B": return RAF_IS95B; 353 case "1XRTT": return RAF_1xRTT; 354 case "EVDO_0": return RAF_EVDO_0; 355 case "EVDO_A": return RAF_EVDO_A; 356 case "HSDPA": return RAF_HSDPA; 357 case "HSUPA": return RAF_HSUPA; 358 case "HSPA": return RAF_HSPA; 359 case "EVDO_B": return RAF_EVDO_B; 360 case "EHRPD": return RAF_EHRPD; 361 case "LTE": return RAF_LTE; 362 case "HSPAP": return RAF_HSPAP; 363 case "GSM": return RAF_GSM; 364 case "TD_SCDMA":return RAF_TD_SCDMA; 365 case "HS": return HS; 366 case "CDMA": return CDMA; 367 case "EVDO": return EVDO; 368 case "WCDMA": return WCDMA; 369 case "LTE_CA": return RAF_LTE_CA; 370 default: return RAF_UNKNOWN; 371 } 372 } 373 rafTypeFromString(String rafList)374 public static int rafTypeFromString(String rafList) { 375 rafList = rafList.toUpperCase(); 376 String[] rafs = rafList.split("\\|"); 377 int result = 0; 378 for(String raf : rafs) { 379 int rafType = singleRafTypeFromString(raf.trim()); 380 if (rafType == RAF_UNKNOWN) return rafType; 381 result |= rafType; 382 } 383 return result; 384 } 385 } 386