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.Bundle; 20 import android.os.Parcel; 21 import android.os.Parcelable; 22 import android.telephony.Rlog; 23 24 /** 25 * Contains phone state and service related information. 26 * 27 * The following phone information is included in returned ServiceState: 28 * 29 * <ul> 30 * <li>Service state: IN_SERVICE, OUT_OF_SERVICE, EMERGENCY_ONLY, POWER_OFF 31 * <li>Roaming indicator 32 * <li>Operator name, short name and numeric id 33 * <li>Network selection mode 34 * </ul> 35 */ 36 public class ServiceState implements Parcelable { 37 38 static final String LOG_TAG = "PHONE"; 39 static final boolean DBG = false; 40 static final boolean VDBG = false; // STOPSHIP if true 41 42 /** 43 * Normal operation condition, the phone is registered 44 * with an operator either in home network or in roaming. 45 */ 46 public static final int STATE_IN_SERVICE = 0; 47 48 /** 49 * Phone is not registered with any operator, the phone 50 * can be currently searching a new operator to register to, or not 51 * searching to registration at all, or registration is denied, or radio 52 * signal is not available. 53 */ 54 public static final int STATE_OUT_OF_SERVICE = 1; 55 56 /** 57 * The phone is registered and locked. Only emergency numbers are allowed. {@more} 58 */ 59 public static final int STATE_EMERGENCY_ONLY = 2; 60 61 /** 62 * Radio of telephony is explicitly powered off. 63 */ 64 public static final int STATE_POWER_OFF = 3; 65 66 /** 67 * RIL level registration state values from ril.h 68 * ((const char **)response)[0] is registration state 0-6, 69 * 0 - Not registered, MT is not currently searching 70 * a new operator to register 71 * 1 - Registered, home network 72 * 2 - Not registered, but MT is currently searching 73 * a new operator to register 74 * 3 - Registration denied 75 * 4 - Unknown 76 * 5 - Registered, roaming 77 * 10 - Same as 0, but indicates that emergency calls 78 * are enabled. 79 * 12 - Same as 2, but indicates that emergency calls 80 * are enabled. 81 * 13 - Same as 3, but indicates that emergency calls 82 * are enabled. 83 * 14 - Same as 4, but indicates that emergency calls 84 * are enabled. 85 * @hide 86 */ 87 public static final int RIL_REG_STATE_NOT_REG = 0; 88 /** @hide */ 89 public static final int RIL_REG_STATE_HOME = 1; 90 /** @hide */ 91 public static final int RIL_REG_STATE_SEARCHING = 2; 92 /** @hide */ 93 public static final int RIL_REG_STATE_DENIED = 3; 94 /** @hide */ 95 public static final int RIL_REG_STATE_UNKNOWN = 4; 96 /** @hide */ 97 public static final int RIL_REG_STATE_ROAMING = 5; 98 /** @hide */ 99 public static final int RIL_REG_STATE_NOT_REG_EMERGENCY_CALL_ENABLED = 10; 100 /** @hide */ 101 public static final int RIL_REG_STATE_SEARCHING_EMERGENCY_CALL_ENABLED = 12; 102 /** @hide */ 103 public static final int RIL_REG_STATE_DENIED_EMERGENCY_CALL_ENABLED = 13; 104 /** @hide */ 105 public static final int RIL_REG_STATE_UNKNOWN_EMERGENCY_CALL_ENABLED = 14; 106 107 /** 108 * Available radio technologies for GSM, UMTS and CDMA. 109 * Duplicates the constants from hardware/radio/include/ril.h 110 * This should only be used by agents working with the ril. Others 111 * should use the equivalent TelephonyManager.NETWORK_TYPE_* 112 */ 113 /** @hide */ 114 public static final int RIL_RADIO_TECHNOLOGY_UNKNOWN = 0; 115 /** @hide */ 116 public static final int RIL_RADIO_TECHNOLOGY_GPRS = 1; 117 /** @hide */ 118 public static final int RIL_RADIO_TECHNOLOGY_EDGE = 2; 119 /** @hide */ 120 public static final int RIL_RADIO_TECHNOLOGY_UMTS = 3; 121 /** @hide */ 122 public static final int RIL_RADIO_TECHNOLOGY_IS95A = 4; 123 /** @hide */ 124 public static final int RIL_RADIO_TECHNOLOGY_IS95B = 5; 125 /** @hide */ 126 public static final int RIL_RADIO_TECHNOLOGY_1xRTT = 6; 127 /** @hide */ 128 public static final int RIL_RADIO_TECHNOLOGY_EVDO_0 = 7; 129 /** @hide */ 130 public static final int RIL_RADIO_TECHNOLOGY_EVDO_A = 8; 131 /** @hide */ 132 public static final int RIL_RADIO_TECHNOLOGY_HSDPA = 9; 133 /** @hide */ 134 public static final int RIL_RADIO_TECHNOLOGY_HSUPA = 10; 135 /** @hide */ 136 public static final int RIL_RADIO_TECHNOLOGY_HSPA = 11; 137 /** @hide */ 138 public static final int RIL_RADIO_TECHNOLOGY_EVDO_B = 12; 139 /** @hide */ 140 public static final int RIL_RADIO_TECHNOLOGY_EHRPD = 13; 141 /** @hide */ 142 public static final int RIL_RADIO_TECHNOLOGY_LTE = 14; 143 /** @hide */ 144 public static final int RIL_RADIO_TECHNOLOGY_HSPAP = 15; 145 /** 146 * GSM radio technology only supports voice. It does not support data. 147 * @hide 148 */ 149 public static final int RIL_RADIO_TECHNOLOGY_GSM = 16; 150 /** @hide */ 151 public static final int RIL_RADIO_TECHNOLOGY_TD_SCDMA = 17; 152 /** 153 * IWLAN 154 * @hide 155 */ 156 public static final int RIL_RADIO_TECHNOLOGY_IWLAN = 18; 157 158 /** 159 * LTE_CA 160 * @hide 161 */ 162 public static final int RIL_RADIO_TECHNOLOGY_LTE_CA = 19; 163 164 /** @hide */ 165 public static final int RIL_RADIO_CDMA_TECHNOLOGY_BITMASK = 166 (1 << (RIL_RADIO_TECHNOLOGY_IS95A - 1)) 167 | (1 << (RIL_RADIO_TECHNOLOGY_IS95B - 1)) 168 | (1 << (RIL_RADIO_TECHNOLOGY_1xRTT - 1)) 169 | (1 << (RIL_RADIO_TECHNOLOGY_EVDO_0 - 1)) 170 | (1 << (RIL_RADIO_TECHNOLOGY_EVDO_A - 1)) 171 | (1 << (RIL_RADIO_TECHNOLOGY_EVDO_B - 1)) 172 | (1 << (RIL_RADIO_TECHNOLOGY_EHRPD - 1)); 173 174 /** 175 * Available registration states for GSM, UMTS and CDMA. 176 */ 177 /** @hide */ 178 public static final int REGISTRATION_STATE_NOT_REGISTERED_AND_NOT_SEARCHING = 0; 179 /** @hide */ 180 public static final int REGISTRATION_STATE_HOME_NETWORK = 1; 181 /** @hide */ 182 public static final int REGISTRATION_STATE_NOT_REGISTERED_AND_SEARCHING = 2; 183 /** @hide */ 184 public static final int REGISTRATION_STATE_REGISTRATION_DENIED = 3; 185 /** @hide */ 186 public static final int REGISTRATION_STATE_UNKNOWN = 4; 187 /** @hide */ 188 public static final int REGISTRATION_STATE_ROAMING = 5; 189 190 private int mVoiceRegState = STATE_OUT_OF_SERVICE; 191 private int mDataRegState = STATE_OUT_OF_SERVICE; 192 193 /** 194 * Roaming type 195 * HOME : in home network 196 * @hide 197 */ 198 public static final int ROAMING_TYPE_NOT_ROAMING = 0; 199 /** 200 * Roaming type 201 * UNKNOWN : in a roaming network, but we can not tell if it's domestic or international 202 * @hide 203 */ 204 public static final int ROAMING_TYPE_UNKNOWN = 1; 205 /** 206 * Roaming type 207 * DOMESTIC : in domestic roaming network 208 * @hide 209 */ 210 public static final int ROAMING_TYPE_DOMESTIC = 2; 211 /** 212 * Roaming type 213 * INTERNATIONAL : in international roaming network 214 * @hide 215 */ 216 public static final int ROAMING_TYPE_INTERNATIONAL = 3; 217 218 private int mVoiceRoamingType; 219 private int mDataRoamingType; 220 private String mVoiceOperatorAlphaLong; 221 private String mVoiceOperatorAlphaShort; 222 private String mVoiceOperatorNumeric; 223 private String mDataOperatorAlphaLong; 224 private String mDataOperatorAlphaShort; 225 private String mDataOperatorNumeric; 226 private boolean mIsManualNetworkSelection; 227 228 private boolean mIsEmergencyOnly; 229 230 private int mRilVoiceRadioTechnology; 231 private int mRilDataRadioTechnology; 232 233 private boolean mCssIndicator; 234 private int mNetworkId; 235 private int mSystemId; 236 private int mCdmaRoamingIndicator; 237 private int mCdmaDefaultRoamingIndicator; 238 private int mCdmaEriIconIndex; 239 private int mCdmaEriIconMode; 240 241 private boolean mIsDataRoamingFromRegistration; 242 243 private boolean mIsUsingCarrierAggregation; 244 245 /** 246 * get String description of roaming type 247 * @hide 248 */ 249 public static final String getRoamingLogString(int roamingType) { 250 switch (roamingType) { 251 case ROAMING_TYPE_NOT_ROAMING: 252 return "home"; 253 254 case ROAMING_TYPE_UNKNOWN: 255 return "roaming"; 256 257 case ROAMING_TYPE_DOMESTIC: 258 return "Domestic Roaming"; 259 260 case ROAMING_TYPE_INTERNATIONAL: 261 return "International Roaming"; 262 263 default: 264 return "UNKNOWN"; 265 } 266 } 267 268 /** 269 * Create a new ServiceState from a intent notifier Bundle 270 * 271 * This method is used by PhoneStateIntentReceiver and maybe by 272 * external applications. 273 * 274 * @param m Bundle from intent notifier 275 * @return newly created ServiceState 276 * @hide 277 */ 278 public static ServiceState newFromBundle(Bundle m) { 279 ServiceState ret; 280 ret = new ServiceState(); 281 ret.setFromNotifierBundle(m); 282 return ret; 283 } 284 285 /** 286 * Empty constructor 287 */ 288 public ServiceState() { 289 } 290 291 /** 292 * Copy constructors 293 * 294 * @param s Source service state 295 */ 296 public ServiceState(ServiceState s) { 297 copyFrom(s); 298 } 299 300 protected void copyFrom(ServiceState s) { 301 mVoiceRegState = s.mVoiceRegState; 302 mDataRegState = s.mDataRegState; 303 mVoiceRoamingType = s.mVoiceRoamingType; 304 mDataRoamingType = s.mDataRoamingType; 305 mVoiceOperatorAlphaLong = s.mVoiceOperatorAlphaLong; 306 mVoiceOperatorAlphaShort = s.mVoiceOperatorAlphaShort; 307 mVoiceOperatorNumeric = s.mVoiceOperatorNumeric; 308 mDataOperatorAlphaLong = s.mDataOperatorAlphaLong; 309 mDataOperatorAlphaShort = s.mDataOperatorAlphaShort; 310 mDataOperatorNumeric = s.mDataOperatorNumeric; 311 mIsManualNetworkSelection = s.mIsManualNetworkSelection; 312 mRilVoiceRadioTechnology = s.mRilVoiceRadioTechnology; 313 mRilDataRadioTechnology = s.mRilDataRadioTechnology; 314 mCssIndicator = s.mCssIndicator; 315 mNetworkId = s.mNetworkId; 316 mSystemId = s.mSystemId; 317 mCdmaRoamingIndicator = s.mCdmaRoamingIndicator; 318 mCdmaDefaultRoamingIndicator = s.mCdmaDefaultRoamingIndicator; 319 mCdmaEriIconIndex = s.mCdmaEriIconIndex; 320 mCdmaEriIconMode = s.mCdmaEriIconMode; 321 mIsEmergencyOnly = s.mIsEmergencyOnly; 322 mIsDataRoamingFromRegistration = s.mIsDataRoamingFromRegistration; 323 mIsUsingCarrierAggregation = s.mIsUsingCarrierAggregation; 324 } 325 326 /** 327 * Construct a ServiceState object from the given parcel. 328 */ 329 public ServiceState(Parcel in) { 330 mVoiceRegState = in.readInt(); 331 mDataRegState = in.readInt(); 332 mVoiceRoamingType = in.readInt(); 333 mDataRoamingType = in.readInt(); 334 mVoiceOperatorAlphaLong = in.readString(); 335 mVoiceOperatorAlphaShort = in.readString(); 336 mVoiceOperatorNumeric = in.readString(); 337 mDataOperatorAlphaLong = in.readString(); 338 mDataOperatorAlphaShort = in.readString(); 339 mDataOperatorNumeric = in.readString(); 340 mIsManualNetworkSelection = in.readInt() != 0; 341 mRilVoiceRadioTechnology = in.readInt(); 342 mRilDataRadioTechnology = in.readInt(); 343 mCssIndicator = (in.readInt() != 0); 344 mNetworkId = in.readInt(); 345 mSystemId = in.readInt(); 346 mCdmaRoamingIndicator = in.readInt(); 347 mCdmaDefaultRoamingIndicator = in.readInt(); 348 mCdmaEriIconIndex = in.readInt(); 349 mCdmaEriIconMode = in.readInt(); 350 mIsEmergencyOnly = in.readInt() != 0; 351 mIsDataRoamingFromRegistration = in.readInt() != 0; 352 mIsUsingCarrierAggregation = in.readInt() != 0; 353 } 354 355 public void writeToParcel(Parcel out, int flags) { 356 out.writeInt(mVoiceRegState); 357 out.writeInt(mDataRegState); 358 out.writeInt(mVoiceRoamingType); 359 out.writeInt(mDataRoamingType); 360 out.writeString(mVoiceOperatorAlphaLong); 361 out.writeString(mVoiceOperatorAlphaShort); 362 out.writeString(mVoiceOperatorNumeric); 363 out.writeString(mDataOperatorAlphaLong); 364 out.writeString(mDataOperatorAlphaShort); 365 out.writeString(mDataOperatorNumeric); 366 out.writeInt(mIsManualNetworkSelection ? 1 : 0); 367 out.writeInt(mRilVoiceRadioTechnology); 368 out.writeInt(mRilDataRadioTechnology); 369 out.writeInt(mCssIndicator ? 1 : 0); 370 out.writeInt(mNetworkId); 371 out.writeInt(mSystemId); 372 out.writeInt(mCdmaRoamingIndicator); 373 out.writeInt(mCdmaDefaultRoamingIndicator); 374 out.writeInt(mCdmaEriIconIndex); 375 out.writeInt(mCdmaEriIconMode); 376 out.writeInt(mIsEmergencyOnly ? 1 : 0); 377 out.writeInt(mIsDataRoamingFromRegistration ? 1 : 0); 378 out.writeInt(mIsUsingCarrierAggregation ? 1 : 0); 379 } 380 381 public int describeContents() { 382 return 0; 383 } 384 385 public static final Parcelable.Creator<ServiceState> CREATOR = 386 new Parcelable.Creator<ServiceState>() { 387 public ServiceState createFromParcel(Parcel in) { 388 return new ServiceState(in); 389 } 390 391 public ServiceState[] newArray(int size) { 392 return new ServiceState[size]; 393 } 394 }; 395 396 /** 397 * Get current voice service state 398 */ 399 public int getState() { 400 return getVoiceRegState(); 401 } 402 403 /** 404 * Get current voice service state 405 * 406 * @see #STATE_IN_SERVICE 407 * @see #STATE_OUT_OF_SERVICE 408 * @see #STATE_EMERGENCY_ONLY 409 * @see #STATE_POWER_OFF 410 * 411 * @hide 412 */ 413 public int getVoiceRegState() { 414 return mVoiceRegState; 415 } 416 417 /** 418 * Get current data service state 419 * 420 * @see #STATE_IN_SERVICE 421 * @see #STATE_OUT_OF_SERVICE 422 * @see #STATE_EMERGENCY_ONLY 423 * @see #STATE_POWER_OFF 424 * 425 * @hide 426 */ 427 public int getDataRegState() { 428 return mDataRegState; 429 } 430 431 /** 432 * Get current roaming indicator of phone 433 * (note: not just decoding from TS 27.007 7.2) 434 * 435 * @return true if TS 27.007 7.2 roaming is true 436 * and ONS is different from SPN 437 */ 438 public boolean getRoaming() { 439 return getVoiceRoaming() || getDataRoaming(); 440 } 441 442 /** 443 * Get current voice network roaming status 444 * @return roaming status 445 * @hide 446 */ 447 public boolean getVoiceRoaming() { 448 return mVoiceRoamingType != ROAMING_TYPE_NOT_ROAMING; 449 } 450 451 /** 452 * Get current voice network roaming type 453 * @return roaming type 454 * @hide 455 */ 456 public int getVoiceRoamingType() { 457 return mVoiceRoamingType; 458 } 459 460 /** 461 * Get current data network roaming type 462 * @return roaming type 463 * @hide 464 */ 465 public boolean getDataRoaming() { 466 return mDataRoamingType != ROAMING_TYPE_NOT_ROAMING; 467 } 468 469 /** 470 * Set whether data network registration state is roaming 471 * 472 * This should only be set to the roaming value received 473 * once the data registration phase has completed. 474 * @hide 475 */ 476 public void setDataRoamingFromRegistration(boolean dataRoaming) { 477 mIsDataRoamingFromRegistration = dataRoaming; 478 } 479 480 /** 481 * Get whether data network registration state is roaming 482 * @return true if registration indicates roaming, false otherwise 483 * @hide 484 */ 485 public boolean getDataRoamingFromRegistration() { 486 return mIsDataRoamingFromRegistration; 487 } 488 489 /** 490 * Get current data network roaming type 491 * @return roaming type 492 * @hide 493 */ 494 public int getDataRoamingType() { 495 return mDataRoamingType; 496 } 497 498 /** 499 * @hide 500 */ 501 public boolean isEmergencyOnly() { 502 return mIsEmergencyOnly; 503 } 504 505 /** 506 * @hide 507 */ 508 public int getCdmaRoamingIndicator(){ 509 return this.mCdmaRoamingIndicator; 510 } 511 512 /** 513 * @hide 514 */ 515 public int getCdmaDefaultRoamingIndicator(){ 516 return this.mCdmaDefaultRoamingIndicator; 517 } 518 519 /** 520 * @hide 521 */ 522 public int getCdmaEriIconIndex() { 523 return this.mCdmaEriIconIndex; 524 } 525 526 /** 527 * @hide 528 */ 529 public int getCdmaEriIconMode() { 530 return this.mCdmaEriIconMode; 531 } 532 533 /** 534 * Get current registered operator name in long alphanumeric format. 535 * 536 * In GSM/UMTS, long format can be up to 16 characters long. 537 * In CDMA, returns the ERI text, if set. Otherwise, returns the ONS. 538 * 539 * @return long name of operator, null if unregistered or unknown 540 */ 541 public String getOperatorAlphaLong() { 542 return mVoiceOperatorAlphaLong; 543 } 544 545 /** 546 * Get current registered voice network operator name in long alphanumeric format. 547 * @return long name of operator 548 * @hide 549 */ 550 public String getVoiceOperatorAlphaLong() { 551 return mVoiceOperatorAlphaLong; 552 } 553 554 /** 555 * Get current registered data network operator name in long alphanumeric format. 556 * @return long name of voice operator 557 * @hide 558 */ 559 public String getDataOperatorAlphaLong() { 560 return mDataOperatorAlphaLong; 561 } 562 563 /** 564 * Get current registered operator name in short alphanumeric format. 565 * 566 * In GSM/UMTS, short format can be up to 8 characters long. 567 * 568 * @return short name of operator, null if unregistered or unknown 569 */ 570 public String getOperatorAlphaShort() { 571 return mVoiceOperatorAlphaShort; 572 } 573 574 /** 575 * Get current registered voice network operator name in short alphanumeric format. 576 * @return short name of operator, null if unregistered or unknown 577 * @hide 578 */ 579 public String getVoiceOperatorAlphaShort() { 580 return mVoiceOperatorAlphaShort; 581 } 582 583 /** 584 * Get current registered data network operator name in short alphanumeric format. 585 * @return short name of operator, null if unregistered or unknown 586 * @hide 587 */ 588 public String getDataOperatorAlphaShort() { 589 return mDataOperatorAlphaShort; 590 } 591 592 /** 593 * Get current registered operator numeric id. 594 * 595 * In GSM/UMTS, numeric format is 3 digit country code plus 2 or 3 digit 596 * network code. 597 * 598 * @return numeric format of operator, null if unregistered or unknown 599 */ 600 /* 601 * The country code can be decoded using 602 * {@link com.android.internal.telephony.MccTable#countryCodeForMcc(int)}. 603 */ 604 public String getOperatorNumeric() { 605 return mVoiceOperatorNumeric; 606 } 607 608 /** 609 * Get current registered voice network operator numeric id. 610 * @return numeric format of operator, null if unregistered or unknown 611 * @hide 612 */ 613 public String getVoiceOperatorNumeric() { 614 return mVoiceOperatorNumeric; 615 } 616 617 /** 618 * Get current registered data network operator numeric id. 619 * @return numeric format of operator, null if unregistered or unknown 620 * @hide 621 */ 622 public String getDataOperatorNumeric() { 623 return mDataOperatorNumeric; 624 } 625 626 /** 627 * Get current network selection mode. 628 * 629 * @return true if manual mode, false if automatic mode 630 */ 631 public boolean getIsManualSelection() { 632 return mIsManualNetworkSelection; 633 } 634 635 @Override 636 public int hashCode() { 637 return ((mVoiceRegState * 31) 638 + (mDataRegState * 37) 639 + mVoiceRoamingType 640 + mDataRoamingType 641 + (mIsManualNetworkSelection ? 1 : 0) 642 + ((null == mVoiceOperatorAlphaLong) ? 0 : mVoiceOperatorAlphaLong.hashCode()) 643 + ((null == mVoiceOperatorAlphaShort) ? 0 : mVoiceOperatorAlphaShort.hashCode()) 644 + ((null == mVoiceOperatorNumeric) ? 0 : mVoiceOperatorNumeric.hashCode()) 645 + ((null == mDataOperatorAlphaLong) ? 0 : mDataOperatorAlphaLong.hashCode()) 646 + ((null == mDataOperatorAlphaShort) ? 0 : mDataOperatorAlphaShort.hashCode()) 647 + ((null == mDataOperatorNumeric) ? 0 : mDataOperatorNumeric.hashCode()) 648 + mCdmaRoamingIndicator 649 + mCdmaDefaultRoamingIndicator 650 + (mIsEmergencyOnly ? 1 : 0) 651 + (mIsDataRoamingFromRegistration ? 1 : 0)); 652 } 653 654 @Override 655 public boolean equals (Object o) { 656 ServiceState s; 657 658 try { 659 s = (ServiceState) o; 660 } catch (ClassCastException ex) { 661 return false; 662 } 663 664 if (o == null) { 665 return false; 666 } 667 668 return (mVoiceRegState == s.mVoiceRegState 669 && mDataRegState == s.mDataRegState 670 && mIsManualNetworkSelection == s.mIsManualNetworkSelection 671 && mVoiceRoamingType == s.mVoiceRoamingType 672 && mDataRoamingType == s.mDataRoamingType 673 && equalsHandlesNulls(mVoiceOperatorAlphaLong, s.mVoiceOperatorAlphaLong) 674 && equalsHandlesNulls(mVoiceOperatorAlphaShort, s.mVoiceOperatorAlphaShort) 675 && equalsHandlesNulls(mVoiceOperatorNumeric, s.mVoiceOperatorNumeric) 676 && equalsHandlesNulls(mDataOperatorAlphaLong, s.mDataOperatorAlphaLong) 677 && equalsHandlesNulls(mDataOperatorAlphaShort, s.mDataOperatorAlphaShort) 678 && equalsHandlesNulls(mDataOperatorNumeric, s.mDataOperatorNumeric) 679 && equalsHandlesNulls(mRilVoiceRadioTechnology, s.mRilVoiceRadioTechnology) 680 && equalsHandlesNulls(mRilDataRadioTechnology, s.mRilDataRadioTechnology) 681 && equalsHandlesNulls(mCssIndicator, s.mCssIndicator) 682 && equalsHandlesNulls(mNetworkId, s.mNetworkId) 683 && equalsHandlesNulls(mSystemId, s.mSystemId) 684 && equalsHandlesNulls(mCdmaRoamingIndicator, s.mCdmaRoamingIndicator) 685 && equalsHandlesNulls(mCdmaDefaultRoamingIndicator, 686 s.mCdmaDefaultRoamingIndicator) 687 && mIsEmergencyOnly == s.mIsEmergencyOnly 688 && mIsDataRoamingFromRegistration == s.mIsDataRoamingFromRegistration 689 && mIsUsingCarrierAggregation == s.mIsUsingCarrierAggregation); 690 } 691 692 /** 693 * Convert radio technology to String 694 * 695 * @param radioTechnology 696 * @return String representation of the RAT 697 * 698 * @hide 699 */ 700 public static String rilRadioTechnologyToString(int rt) { 701 String rtString; 702 703 switch(rt) { 704 case RIL_RADIO_TECHNOLOGY_UNKNOWN: 705 rtString = "Unknown"; 706 break; 707 case RIL_RADIO_TECHNOLOGY_GPRS: 708 rtString = "GPRS"; 709 break; 710 case RIL_RADIO_TECHNOLOGY_EDGE: 711 rtString = "EDGE"; 712 break; 713 case RIL_RADIO_TECHNOLOGY_UMTS: 714 rtString = "UMTS"; 715 break; 716 case RIL_RADIO_TECHNOLOGY_IS95A: 717 rtString = "CDMA-IS95A"; 718 break; 719 case RIL_RADIO_TECHNOLOGY_IS95B: 720 rtString = "CDMA-IS95B"; 721 break; 722 case RIL_RADIO_TECHNOLOGY_1xRTT: 723 rtString = "1xRTT"; 724 break; 725 case RIL_RADIO_TECHNOLOGY_EVDO_0: 726 rtString = "EvDo-rev.0"; 727 break; 728 case RIL_RADIO_TECHNOLOGY_EVDO_A: 729 rtString = "EvDo-rev.A"; 730 break; 731 case RIL_RADIO_TECHNOLOGY_HSDPA: 732 rtString = "HSDPA"; 733 break; 734 case RIL_RADIO_TECHNOLOGY_HSUPA: 735 rtString = "HSUPA"; 736 break; 737 case RIL_RADIO_TECHNOLOGY_HSPA: 738 rtString = "HSPA"; 739 break; 740 case RIL_RADIO_TECHNOLOGY_EVDO_B: 741 rtString = "EvDo-rev.B"; 742 break; 743 case RIL_RADIO_TECHNOLOGY_EHRPD: 744 rtString = "eHRPD"; 745 break; 746 case RIL_RADIO_TECHNOLOGY_LTE: 747 rtString = "LTE"; 748 break; 749 case RIL_RADIO_TECHNOLOGY_HSPAP: 750 rtString = "HSPAP"; 751 break; 752 case RIL_RADIO_TECHNOLOGY_GSM: 753 rtString = "GSM"; 754 break; 755 case RIL_RADIO_TECHNOLOGY_IWLAN: 756 rtString = "IWLAN"; 757 break; 758 case RIL_RADIO_TECHNOLOGY_TD_SCDMA: 759 rtString = "TD-SCDMA"; 760 break; 761 case RIL_RADIO_TECHNOLOGY_LTE_CA: 762 rtString = "LTE_CA"; 763 break; 764 default: 765 rtString = "Unexpected"; 766 Rlog.w(LOG_TAG, "Unexpected radioTechnology=" + rt); 767 break; 768 } 769 return rtString; 770 } 771 772 @Override 773 public String toString() { 774 String radioTechnology = rilRadioTechnologyToString(mRilVoiceRadioTechnology); 775 String dataRadioTechnology = rilRadioTechnologyToString(mRilDataRadioTechnology); 776 777 return (mVoiceRegState + " " + mDataRegState 778 + " " 779 + "voice " + getRoamingLogString(mVoiceRoamingType) 780 + " " 781 + "data " + getRoamingLogString(mDataRoamingType) 782 + " " + mVoiceOperatorAlphaLong 783 + " " + mVoiceOperatorAlphaShort 784 + " " + mVoiceOperatorNumeric 785 + " " + mDataOperatorAlphaLong 786 + " " + mDataOperatorAlphaShort 787 + " " + mDataOperatorNumeric 788 + " " + (mIsManualNetworkSelection ? "(manual)" : "") 789 + " " + radioTechnology 790 + " " + dataRadioTechnology 791 + " " + (mCssIndicator ? "CSS supported" : "CSS not supported") 792 + " " + mNetworkId 793 + " " + mSystemId 794 + " RoamInd=" + mCdmaRoamingIndicator 795 + " DefRoamInd=" + mCdmaDefaultRoamingIndicator 796 + " EmergOnly=" + mIsEmergencyOnly 797 + " IsDataRoamingFromRegistration=" + mIsDataRoamingFromRegistration 798 + " IsUsingCarrierAggregation=" + mIsUsingCarrierAggregation); 799 } 800 801 private void setNullState(int state) { 802 if (DBG) Rlog.d(LOG_TAG, "[ServiceState] setNullState=" + state); 803 mVoiceRegState = state; 804 mDataRegState = state; 805 mVoiceRoamingType = ROAMING_TYPE_NOT_ROAMING; 806 mDataRoamingType = ROAMING_TYPE_NOT_ROAMING; 807 mVoiceOperatorAlphaLong = null; 808 mVoiceOperatorAlphaShort = null; 809 mVoiceOperatorNumeric = null; 810 mDataOperatorAlphaLong = null; 811 mDataOperatorAlphaShort = null; 812 mDataOperatorNumeric = null; 813 mIsManualNetworkSelection = false; 814 mRilVoiceRadioTechnology = 0; 815 mRilDataRadioTechnology = 0; 816 mCssIndicator = false; 817 mNetworkId = -1; 818 mSystemId = -1; 819 mCdmaRoamingIndicator = -1; 820 mCdmaDefaultRoamingIndicator = -1; 821 mCdmaEriIconIndex = -1; 822 mCdmaEriIconMode = -1; 823 mIsEmergencyOnly = false; 824 mIsDataRoamingFromRegistration = false; 825 mIsUsingCarrierAggregation = false; 826 } 827 828 public void setStateOutOfService() { 829 setNullState(STATE_OUT_OF_SERVICE); 830 } 831 832 public void setStateOff() { 833 setNullState(STATE_POWER_OFF); 834 } 835 836 public void setState(int state) { 837 setVoiceRegState(state); 838 if (DBG) Rlog.e(LOG_TAG, "[ServiceState] setState deprecated use setVoiceRegState()"); 839 } 840 841 /** @hide */ 842 public void setVoiceRegState(int state) { 843 mVoiceRegState = state; 844 if (DBG) Rlog.d(LOG_TAG, "[ServiceState] setVoiceRegState=" + mVoiceRegState); 845 } 846 847 /** @hide */ 848 public void setDataRegState(int state) { 849 mDataRegState = state; 850 if (VDBG) Rlog.d(LOG_TAG, "[ServiceState] setDataRegState=" + mDataRegState); 851 } 852 853 public void setRoaming(boolean roaming) { 854 mVoiceRoamingType = (roaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); 855 mDataRoamingType = mVoiceRoamingType; 856 } 857 858 /** @hide */ 859 public void setVoiceRoaming(boolean roaming) { 860 mVoiceRoamingType = (roaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); 861 } 862 863 /** @hide */ 864 public void setVoiceRoamingType(int type) { 865 mVoiceRoamingType = type; 866 } 867 868 /** @hide */ 869 public void setDataRoaming(boolean dataRoaming) { 870 mDataRoamingType = (dataRoaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); 871 } 872 873 /** @hide */ 874 public void setDataRoamingType(int type) { 875 mDataRoamingType = type; 876 } 877 878 /** 879 * @hide 880 */ 881 public void setEmergencyOnly(boolean emergencyOnly) { 882 mIsEmergencyOnly = emergencyOnly; 883 } 884 885 /** 886 * @hide 887 */ 888 public void setCdmaRoamingIndicator(int roaming) { 889 this.mCdmaRoamingIndicator = roaming; 890 } 891 892 /** 893 * @hide 894 */ 895 public void setCdmaDefaultRoamingIndicator (int roaming) { 896 this.mCdmaDefaultRoamingIndicator = roaming; 897 } 898 899 /** 900 * @hide 901 */ 902 public void setCdmaEriIconIndex(int index) { 903 this.mCdmaEriIconIndex = index; 904 } 905 906 /** 907 * @hide 908 */ 909 public void setCdmaEriIconMode(int mode) { 910 this.mCdmaEriIconMode = mode; 911 } 912 913 public void setOperatorName(String longName, String shortName, String numeric) { 914 mVoiceOperatorAlphaLong = longName; 915 mVoiceOperatorAlphaShort = shortName; 916 mVoiceOperatorNumeric = numeric; 917 mDataOperatorAlphaLong = longName; 918 mDataOperatorAlphaShort = shortName; 919 mDataOperatorNumeric = numeric; 920 } 921 922 /** @hide */ 923 public void setVoiceOperatorName(String longName, String shortName, String numeric) { 924 mVoiceOperatorAlphaLong = longName; 925 mVoiceOperatorAlphaShort = shortName; 926 mVoiceOperatorNumeric = numeric; 927 } 928 929 /** @hide */ 930 public void setDataOperatorName(String longName, String shortName, String numeric) { 931 mDataOperatorAlphaLong = longName; 932 mDataOperatorAlphaShort = shortName; 933 mDataOperatorNumeric = numeric; 934 } 935 936 /** 937 * In CDMA, mOperatorAlphaLong can be set from the ERI text. 938 * This is done from the GsmCdmaPhone and not from the ServiceStateTracker. 939 * 940 * @hide 941 */ 942 public void setOperatorAlphaLong(String longName) { 943 mVoiceOperatorAlphaLong = longName; 944 mDataOperatorAlphaLong = longName; 945 } 946 947 /** @hide */ 948 public void setVoiceOperatorAlphaLong(String longName) { 949 mVoiceOperatorAlphaLong = longName; 950 } 951 952 /** @hide */ 953 public void setDataOperatorAlphaLong(String longName) { 954 mDataOperatorAlphaLong = longName; 955 } 956 957 public void setIsManualSelection(boolean isManual) { 958 mIsManualNetworkSelection = isManual; 959 } 960 961 /** 962 * Test whether two objects hold the same data values or both are null. 963 * 964 * @param a first obj 965 * @param b second obj 966 * @return true if two objects equal or both are null 967 */ 968 private static boolean equalsHandlesNulls (Object a, Object b) { 969 return (a == null) ? (b == null) : a.equals (b); 970 } 971 972 /** 973 * Set ServiceState based on intent notifier map. 974 * 975 * @param m intent notifier map 976 * @hide 977 */ 978 private void setFromNotifierBundle(Bundle m) { 979 mVoiceRegState = m.getInt("voiceRegState"); 980 mDataRegState = m.getInt("dataRegState"); 981 mVoiceRoamingType = m.getInt("voiceRoamingType"); 982 mDataRoamingType = m.getInt("dataRoamingType"); 983 mVoiceOperatorAlphaLong = m.getString("operator-alpha-long"); 984 mVoiceOperatorAlphaShort = m.getString("operator-alpha-short"); 985 mVoiceOperatorNumeric = m.getString("operator-numeric"); 986 mDataOperatorAlphaLong = m.getString("data-operator-alpha-long"); 987 mDataOperatorAlphaShort = m.getString("data-operator-alpha-short"); 988 mDataOperatorNumeric = m.getString("data-operator-numeric"); 989 mIsManualNetworkSelection = m.getBoolean("manual"); 990 mRilVoiceRadioTechnology = m.getInt("radioTechnology"); 991 mRilDataRadioTechnology = m.getInt("dataRadioTechnology"); 992 mCssIndicator = m.getBoolean("cssIndicator"); 993 mNetworkId = m.getInt("networkId"); 994 mSystemId = m.getInt("systemId"); 995 mCdmaRoamingIndicator = m.getInt("cdmaRoamingIndicator"); 996 mCdmaDefaultRoamingIndicator = m.getInt("cdmaDefaultRoamingIndicator"); 997 mIsEmergencyOnly = m.getBoolean("emergencyOnly"); 998 mIsDataRoamingFromRegistration = m.getBoolean("isDataRoamingFromRegistration"); 999 mIsUsingCarrierAggregation = m.getBoolean("isUsingCarrierAggregation"); 1000 } 1001 1002 /** 1003 * Set intent notifier Bundle based on service state. 1004 * 1005 * @param m intent notifier Bundle 1006 * @hide 1007 */ 1008 public void fillInNotifierBundle(Bundle m) { 1009 m.putInt("voiceRegState", mVoiceRegState); 1010 m.putInt("dataRegState", mDataRegState); 1011 m.putInt("voiceRoamingType", mVoiceRoamingType); 1012 m.putInt("dataRoamingType", mDataRoamingType); 1013 m.putString("operator-alpha-long", mVoiceOperatorAlphaLong); 1014 m.putString("operator-alpha-short", mVoiceOperatorAlphaShort); 1015 m.putString("operator-numeric", mVoiceOperatorNumeric); 1016 m.putString("data-operator-alpha-long", mDataOperatorAlphaLong); 1017 m.putString("data-operator-alpha-short", mDataOperatorAlphaShort); 1018 m.putString("data-operator-numeric", mDataOperatorNumeric); 1019 m.putBoolean("manual", Boolean.valueOf(mIsManualNetworkSelection)); 1020 m.putInt("radioTechnology", mRilVoiceRadioTechnology); 1021 m.putInt("dataRadioTechnology", mRilDataRadioTechnology); 1022 m.putBoolean("cssIndicator", mCssIndicator); 1023 m.putInt("networkId", mNetworkId); 1024 m.putInt("systemId", mSystemId); 1025 m.putInt("cdmaRoamingIndicator", mCdmaRoamingIndicator); 1026 m.putInt("cdmaDefaultRoamingIndicator", mCdmaDefaultRoamingIndicator); 1027 m.putBoolean("emergencyOnly", Boolean.valueOf(mIsEmergencyOnly)); 1028 m.putBoolean("isDataRoamingFromRegistration", Boolean.valueOf(mIsDataRoamingFromRegistration)); 1029 m.putBoolean("isUsingCarrierAggregation", Boolean.valueOf(mIsUsingCarrierAggregation)); 1030 } 1031 1032 /** @hide */ 1033 public void setRilVoiceRadioTechnology(int rt) { 1034 if (rt == RIL_RADIO_TECHNOLOGY_LTE_CA) { 1035 rt = RIL_RADIO_TECHNOLOGY_LTE; 1036 } 1037 1038 this.mRilVoiceRadioTechnology = rt; 1039 } 1040 1041 /** @hide */ 1042 public void setRilDataRadioTechnology(int rt) { 1043 if (rt == RIL_RADIO_TECHNOLOGY_LTE_CA) { 1044 rt = RIL_RADIO_TECHNOLOGY_LTE; 1045 this.mIsUsingCarrierAggregation = true; 1046 } else { 1047 this.mIsUsingCarrierAggregation = false; 1048 } 1049 this.mRilDataRadioTechnology = rt; 1050 if (VDBG) Rlog.d(LOG_TAG, "[ServiceState] setRilDataRadioTechnology=" + 1051 mRilDataRadioTechnology); 1052 } 1053 1054 /** @hide */ 1055 public boolean isUsingCarrierAggregation() { 1056 return mIsUsingCarrierAggregation; 1057 } 1058 1059 /** @hide */ 1060 public void setIsUsingCarrierAggregation(boolean ca) { 1061 mIsUsingCarrierAggregation = ca; 1062 } 1063 1064 /** @hide */ 1065 public void setCssIndicator(int css) { 1066 this.mCssIndicator = (css != 0); 1067 } 1068 1069 /** @hide */ 1070 public void setSystemAndNetworkId(int systemId, int networkId) { 1071 this.mSystemId = systemId; 1072 this.mNetworkId = networkId; 1073 } 1074 1075 /** @hide */ 1076 public int getRilVoiceRadioTechnology() { 1077 return this.mRilVoiceRadioTechnology; 1078 } 1079 /** @hide */ 1080 public int getRilDataRadioTechnology() { 1081 return this.mRilDataRadioTechnology; 1082 } 1083 /** 1084 * @hide 1085 * @Deprecated to be removed Q3 2013 use {@link #getRilDataRadioTechnology} or 1086 * {@link #getRilVoiceRadioTechnology} 1087 */ 1088 public int getRadioTechnology() { 1089 Rlog.e(LOG_TAG, "ServiceState.getRadioTechnology() DEPRECATED will be removed *******"); 1090 return getRilDataRadioTechnology(); 1091 } 1092 1093 private int rilRadioTechnologyToNetworkType(int rt) { 1094 switch(rt) { 1095 case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: 1096 return TelephonyManager.NETWORK_TYPE_GPRS; 1097 case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: 1098 return TelephonyManager.NETWORK_TYPE_EDGE; 1099 case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: 1100 return TelephonyManager.NETWORK_TYPE_UMTS; 1101 case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: 1102 return TelephonyManager.NETWORK_TYPE_HSDPA; 1103 case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: 1104 return TelephonyManager.NETWORK_TYPE_HSUPA; 1105 case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: 1106 return TelephonyManager.NETWORK_TYPE_HSPA; 1107 case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A: 1108 case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B: 1109 return TelephonyManager.NETWORK_TYPE_CDMA; 1110 case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: 1111 return TelephonyManager.NETWORK_TYPE_1xRTT; 1112 case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: 1113 return TelephonyManager.NETWORK_TYPE_EVDO_0; 1114 case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: 1115 return TelephonyManager.NETWORK_TYPE_EVDO_A; 1116 case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: 1117 return TelephonyManager.NETWORK_TYPE_EVDO_B; 1118 case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: 1119 return TelephonyManager.NETWORK_TYPE_EHRPD; 1120 case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: 1121 return TelephonyManager.NETWORK_TYPE_LTE; 1122 case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: 1123 return TelephonyManager.NETWORK_TYPE_HSPAP; 1124 case ServiceState.RIL_RADIO_TECHNOLOGY_GSM: 1125 return TelephonyManager.NETWORK_TYPE_GSM; 1126 case ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA: 1127 return TelephonyManager.NETWORK_TYPE_TD_SCDMA; 1128 case ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN: 1129 return TelephonyManager.NETWORK_TYPE_IWLAN; 1130 case ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA: 1131 return TelephonyManager.NETWORK_TYPE_LTE_CA; 1132 default: 1133 return TelephonyManager.NETWORK_TYPE_UNKNOWN; 1134 } 1135 } 1136 1137 /** 1138 * @Deprecated to be removed Q3 2013 use {@link #getVoiceNetworkType} 1139 * @hide 1140 */ 1141 public int getNetworkType() { 1142 Rlog.e(LOG_TAG, "ServiceState.getNetworkType() DEPRECATED will be removed *******"); 1143 return rilRadioTechnologyToNetworkType(mRilVoiceRadioTechnology); 1144 } 1145 1146 /** @hide */ 1147 public int getDataNetworkType() { 1148 return rilRadioTechnologyToNetworkType(mRilDataRadioTechnology); 1149 } 1150 1151 /** @hide */ 1152 public int getVoiceNetworkType() { 1153 return rilRadioTechnologyToNetworkType(mRilVoiceRadioTechnology); 1154 } 1155 1156 /** @hide */ 1157 public int getCssIndicator() { 1158 return this.mCssIndicator ? 1 : 0; 1159 } 1160 1161 /** @hide */ 1162 public int getNetworkId() { 1163 return this.mNetworkId; 1164 } 1165 1166 /** @hide */ 1167 public int getSystemId() { 1168 return this.mSystemId; 1169 } 1170 1171 /** @hide */ 1172 public static boolean isGsm(int radioTechnology) { 1173 return radioTechnology == RIL_RADIO_TECHNOLOGY_GPRS 1174 || radioTechnology == RIL_RADIO_TECHNOLOGY_EDGE 1175 || radioTechnology == RIL_RADIO_TECHNOLOGY_UMTS 1176 || radioTechnology == RIL_RADIO_TECHNOLOGY_HSDPA 1177 || radioTechnology == RIL_RADIO_TECHNOLOGY_HSUPA 1178 || radioTechnology == RIL_RADIO_TECHNOLOGY_HSPA 1179 || radioTechnology == RIL_RADIO_TECHNOLOGY_LTE 1180 || radioTechnology == RIL_RADIO_TECHNOLOGY_HSPAP 1181 || radioTechnology == RIL_RADIO_TECHNOLOGY_GSM 1182 || radioTechnology == RIL_RADIO_TECHNOLOGY_TD_SCDMA 1183 || radioTechnology == RIL_RADIO_TECHNOLOGY_IWLAN 1184 || radioTechnology == RIL_RADIO_TECHNOLOGY_LTE_CA; 1185 1186 } 1187 1188 /** @hide */ 1189 public static boolean isCdma(int radioTechnology) { 1190 return radioTechnology == RIL_RADIO_TECHNOLOGY_IS95A 1191 || radioTechnology == RIL_RADIO_TECHNOLOGY_IS95B 1192 || radioTechnology == RIL_RADIO_TECHNOLOGY_1xRTT 1193 || radioTechnology == RIL_RADIO_TECHNOLOGY_EVDO_0 1194 || radioTechnology == RIL_RADIO_TECHNOLOGY_EVDO_A 1195 || radioTechnology == RIL_RADIO_TECHNOLOGY_EVDO_B 1196 || radioTechnology == RIL_RADIO_TECHNOLOGY_EHRPD; 1197 } 1198 1199 /** @hide */ 1200 public static boolean isLte(int radioTechnology) { 1201 return radioTechnology == RIL_RADIO_TECHNOLOGY_LTE || 1202 radioTechnology == RIL_RADIO_TECHNOLOGY_LTE_CA; 1203 } 1204 1205 /** @hide */ 1206 public static boolean bearerBitmapHasCdma(int radioTechnologyBitmap) { 1207 return (RIL_RADIO_CDMA_TECHNOLOGY_BITMASK & radioTechnologyBitmap) != 0; 1208 } 1209 1210 /** @hide */ 1211 public static boolean bitmaskHasTech(int bearerBitmask, int radioTech) { 1212 if (bearerBitmask == 0) { 1213 return true; 1214 } else if (radioTech >= 1) { 1215 return ((bearerBitmask & (1 << (radioTech - 1))) != 0); 1216 } 1217 return false; 1218 } 1219 1220 /** @hide */ 1221 public static int getBitmaskForTech(int radioTech) { 1222 if (radioTech >= 1) { 1223 return (1 << (radioTech - 1)); 1224 } 1225 return 0; 1226 } 1227 1228 /** @hide */ 1229 public static int getBitmaskFromString(String bearerList) { 1230 String[] bearers = bearerList.split("\\|"); 1231 int bearerBitmask = 0; 1232 for (String bearer : bearers) { 1233 int bearerInt = 0; 1234 try { 1235 bearerInt = Integer.parseInt(bearer.trim()); 1236 } catch (NumberFormatException nfe) { 1237 return 0; 1238 } 1239 1240 if (bearerInt == 0) { 1241 return 0; 1242 } 1243 1244 bearerBitmask |= getBitmaskForTech(bearerInt); 1245 } 1246 return bearerBitmask; 1247 } 1248 1249 /** 1250 * Returns a merged ServiceState consisting of the base SS with voice settings from the 1251 * voice SS. The voice SS is only used if it is IN_SERVICE (otherwise the base SS is returned). 1252 * @hide 1253 * */ 1254 public static ServiceState mergeServiceStates(ServiceState baseSs, ServiceState voiceSs) { 1255 if (voiceSs.mVoiceRegState != STATE_IN_SERVICE) { 1256 return baseSs; 1257 } 1258 1259 ServiceState newSs = new ServiceState(baseSs); 1260 1261 // voice overrides 1262 newSs.mVoiceRegState = voiceSs.mVoiceRegState; 1263 newSs.mIsEmergencyOnly = false; // only get here if voice is IN_SERVICE 1264 1265 return newSs; 1266 } 1267 } 1268