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