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