CdmaServiceStateTracker.java revision 5b81adc82a53b3064f4baa3acfeabef31586588a
1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*
2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2008 The Android Open Source Project
3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License.
6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at
7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software
11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and
14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License.
15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
17c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepackage com.android.internal.telephony.cdma;
18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
19c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandException;
20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface;
21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.DataConnectionTracker;
22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.EventLogTags;
23c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.IccCard;
24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.IccCardConstants;
25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.MccTable;
26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.PhoneConstants;
27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.RILConstants;
28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.Phone;
29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.ServiceStateTracker;
30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.TelephonyIntents;
31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.TelephonyProperties;
32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface.RadioState;
33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.app.AlarmManager;
35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.ContentResolver;
36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context;
37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Intent;
38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.database.ContentObserver;
39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult;
40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Handler;
41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message;
42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.PowerManager;
43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Registrant;
44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.RegistrantList;
45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemClock;
46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemProperties;
47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.provider.Settings;
48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.provider.Settings.Secure;
49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.provider.Settings.SettingNotFoundException;
50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.ServiceState;
51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.SignalStrength;
52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.cdma.CdmaCellLocation;
53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.text.TextUtils;
54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.EventLog;
55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.Log;
56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.TimeUtils;
57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.FileDescriptor;
59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.PrintWriter;
60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.Arrays;
61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.Calendar;
62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.Date;
63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.TimeZone;
64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/**
66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide}
67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class CdmaServiceStateTracker extends ServiceStateTracker {
69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final String LOG_TAG = "CDMA";
70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    CDMAPhone phone;
72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    CdmaCellLocation cellLoc;
73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    CdmaCellLocation newCellLoc;
74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Min values used to by getOtasp()
76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final String UNACTIVATED_MIN2_VALUE = "000000";
77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final String UNACTIVATED_MIN_VALUE = "1111110111";
78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Current Otasp value
80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    int mCurrentOtaspMode = OTASP_UNINITIALIZED;
81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     /** if time between NITZ updates is less than mNitzUpdateSpacing the update may be ignored. */
83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int NITZ_UPDATE_SPACING_DEFAULT = 1000 * 60 * 10;
84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private int mNitzUpdateSpacing = SystemProperties.getInt("ro.nitz_update_spacing",
85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            NITZ_UPDATE_SPACING_DEFAULT);
86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** If mNitzUpdateSpacing hasn't been exceeded but update is > mNitzUpdate do the update */
88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int NITZ_UPDATE_DIFF_DEFAULT = 2000;
89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private int mNitzUpdateDiff = SystemProperties.getInt("ro.nitz_update_diff",
90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            NITZ_UPDATE_DIFF_DEFAULT);
91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean mCdmaRoaming = false;
93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private int mRoamingIndicator;
94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean mIsInPrl;
95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private int mDefaultRoamingIndicator;
96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Initially assume no data connection.
99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected int mDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE;
101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected int mNewDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE;
102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected int mRegistrationState = -1;
103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected RegistrantList cdmaForSubscriptionInfoReadyRegistrants = new RegistrantList();
104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Sometimes we get the NITZ time before we know what country we
107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * are in. Keep the time zone information from the NITZ string so
108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * we can fix the time zone once know the country.
109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected boolean mNeedFixZone = false;
111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private int mZoneOffset;
112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean mZoneDst;
113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private long mZoneTime;
114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected boolean mGotCountryCode = false;
115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    String mSavedTimeZone;
116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    long mSavedTime;
117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    long mSavedAtTime;
118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * We can't register for SIM_RECORDS_LOADED immediately because the
121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * SIMRecords object may not be instantiated yet.
122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean mNeedToRegForRuimLoaded = false;
124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** Wake lock used while setting time of day. */
126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private PowerManager.WakeLock mWakeLock;
127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final String WAKELOCK_TAG = "ServiceStateTracker";
128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** Contains the name of the registered network in CDMA (either ONS or ERI text). */
130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected String mCurPlmn = null;
131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected String mMdn;
133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected int mHomeSystemId[] = null;
134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected int mHomeNetworkId[] = null;
135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected String mMin;
136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected String mPrlVersion;
137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected boolean mIsMinInfoReady = false;
138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean isEriTextLoaded = false;
140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected boolean isSubscriptionFromRuim = false;
141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private CdmaSubscriptionSourceManager mCdmaSSM;
142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /* Used only for debugging purposes. */
144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private String mRegistrationDeniedReason;
145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private ContentResolver cr;
147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private String currentCarrier = null;
148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private ContentObserver mAutoTimeObserver = new ContentObserver(new Handler()) {
150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        @Override
151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        public void onChange(boolean selfChange) {
152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("Auto time state changed");
153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            revertToNitzTime();
154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    };
156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private ContentObserver mAutoTimeZoneObserver = new ContentObserver(new Handler()) {
158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        @Override
159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        public void onChange(boolean selfChange) {
160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("Auto time zone state changed");
161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            revertToNitzTimeZone();
162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    };
164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public CdmaServiceStateTracker(CDMAPhone phone) {
166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super();
167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        this.phone = phone;
169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cr = phone.getContext().getContentResolver();
170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm = phone.mCM;
171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        ss = new ServiceState();
172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        newSS = new ServiceState();
173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cellLoc = new CdmaCellLocation();
174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        newCellLoc = new CdmaCellLocation();
175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mSignalStrength = new SignalStrength();
176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaSSM = CdmaSubscriptionSourceManager.getInstance(phone.getContext(), cm, this,
178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null);
179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        isSubscriptionFromRuim = (mCdmaSSM.getCdmaSubscriptionSource() ==
180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                          CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM);
181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        PowerManager powerManager =
183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                (PowerManager)phone.getContext().getSystemService(Context.POWER_SERVICE);
184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_TAG);
185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.registerForRadioStateChanged(this, EVENT_RADIO_STATE_CHANGED, null);
187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.registerForVoiceNetworkStateChanged(this, EVENT_NETWORK_STATE_CHANGED_CDMA, null);
189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.setOnNITZTime(this, EVENT_NITZ_TIME, null);
190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.setOnSignalStrengthUpdate(this, EVENT_SIGNAL_STRENGTH_UPDATE, null);
191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.registerForCdmaPrlChanged(this, EVENT_CDMA_PRL_VERSION_CHANGED, null);
193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        phone.registerForEriFileLoaded(this, EVENT_ERI_FILE_LOADED, null);
194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.registerForCdmaOtaProvision(this,EVENT_OTA_PROVISION_STATUS_CHANGE, null);
195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // System setting property AIRPLANE_MODE_ON is set in Settings.
197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int airplaneMode = Settings.System.getInt(cr, Settings.System.AIRPLANE_MODE_ON, 0);
198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mDesiredPowerState = ! (airplaneMode > 0);
199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cr.registerContentObserver(
201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                Settings.System.getUriFor(Settings.System.AUTO_TIME), true,
202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mAutoTimeObserver);
203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cr.registerContentObserver(
204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Settings.System.getUriFor(Settings.System.AUTO_TIME_ZONE), true,
205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mAutoTimeZoneObserver);
206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setSignalStrengthDefaultValues();
207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNeedToRegForRuimLoaded = true;
209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void dispose() {
212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Unregister for all events.
213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.unregisterForRadioStateChanged(this);
214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.unregisterForVoiceNetworkStateChanged(this);
215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        phone.getIccCard().unregisterForReady(this);
216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.unregisterForCdmaOtaProvision(this);
217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        phone.unregisterForEriFileLoaded(this);
218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        phone.mIccRecords.unregisterForRecordsLoaded(this);
219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.unSetOnSignalStrengthUpdate(this);
220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.unSetOnNITZTime(this);
221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cr.unregisterContentObserver(mAutoTimeObserver);
222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cr.unregisterContentObserver(mAutoTimeZoneObserver);
223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaSSM.dispose(this);
224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.unregisterForCdmaPrlChanged(this);
225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void finalize() {
229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("CdmaServiceStateTracker finalized");
230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Registration point for subscription info ready
234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param h handler to notify
235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param what what code of message when delivered
236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param obj placed in Message.obj
237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) {
239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Registrant r = new Registrant(h, what, obj);
240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cdmaForSubscriptionInfoReadyRegistrants.add(r);
241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (isMinInfoReady()) {
243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            r.notifyRegistrant();
244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void unregisterForSubscriptionInfoReady(Handler h) {
248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cdmaForSubscriptionInfoReadyRegistrants.remove(h);
249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Save current source of cdma subscription
253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param source - 1 for NV, 0 for RUIM
254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void saveCdmaSubscriptionSource(int source) {
256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("Storing cdma subscription source: " + source);
257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Secure.putInt(phone.getContext().getContentResolver(),
258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                Secure.CDMA_SUBSCRIPTION_MODE,
259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                source );
260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void getSubscriptionInfoAndStartPollingThreads() {
263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.getCDMASubscription(obtainMessage(EVENT_POLL_STATE_CDMA_SUBSCRIPTION));
264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Get Registration Information
266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pollState();
267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void handleMessage (Message msg) {
271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        AsyncResult ar;
272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int[] ints;
273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String[] strings;
274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (!phone.mIsTheCurrentActivePhone) {
276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("Received message " + msg + "[" + msg.what + "]" +
277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    " while being destroyed. Ignoring.");
278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch (msg.what) {
282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED:
283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource());
284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_RUIM_READY:
287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // TODO: Consider calling setCurrentPreferredNetworkType as we do in GsmSST.
288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // cm.setCurrentPreferredNetworkType();
289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // The RUIM is now ready i.e if it was locked it has been
291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // unlocked. At this stage, the radio is already powered on.
292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (mNeedToRegForRuimLoaded) {
293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                phone.mIccRecords.registerForRecordsLoaded(this,
294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        EVENT_RUIM_RECORDS_LOADED, null);
295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mNeedToRegForRuimLoaded = false;
296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (phone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE) {
299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Subscription will be read from SIM I/O
300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("Receive EVENT_RUIM_READY");
301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                pollState();
302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("Receive EVENT_RUIM_READY and Send Request getCDMASubscription.");
304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                getSubscriptionInfoAndStartPollingThreads();
305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.prepareEri();
307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_NV_READY:
310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // For Non-RUIM phones, the subscription information is stored in
311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Non Volatile. Here when Non-Volatile is ready, we can poll the CDMA
312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // subscription info.
313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            getSubscriptionInfoAndStartPollingThreads();
314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_RADIO_STATE_CHANGED:
317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if(cm.getRadioState() == RadioState.RADIO_ON) {
318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource());
319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Signal strength polling stops when radio is off.
321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                queueNextSignalStrengthPoll();
322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // This will do nothing in the 'radio not available' case.
324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            setPowerStateToDesired();
325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            pollState();
326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_NETWORK_STATE_CHANGED_CDMA:
329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            pollState();
330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_GET_SIGNAL_STRENGTH:
333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // This callback is called when signal strength is polled
334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // all by itself.
335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!(cm.getRadioState().isOn())) {
337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Polling will continue when radio turns back on.
338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return;
339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ar = (AsyncResult) msg.obj;
3415b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingam            onSignalStrengthResult(ar, phone, false);
342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            queueNextSignalStrengthPoll();
343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_GET_LOC_DONE_CDMA:
347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ar = (AsyncResult) msg.obj;
348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ar.exception == null) {
350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                String states[] = (String[])ar.result;
351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int baseStationId = -1;
352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG;
353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int systemId = -1;
355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int networkId = -1;
356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (states.length > 9) {
358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    try {
359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (states[4] != null) {
360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            baseStationId = Integer.parseInt(states[4]);
361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (states[5] != null) {
363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            baseStationLatitude = Integer.parseInt(states[5]);
364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (states[6] != null) {
366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            baseStationLongitude = Integer.parseInt(states[6]);
367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // Some carriers only return lat-lngs of 0,0
369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (baseStationLatitude == 0 && baseStationLongitude == 0) {
370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            baseStationLatitude  = CdmaCellLocation.INVALID_LAT_LONG;
371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (states[8] != null) {
374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            systemId = Integer.parseInt(states[8]);
375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (states[9] != null) {
377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            networkId = Integer.parseInt(states[9]);
378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } catch (NumberFormatException ex) {
380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        loge("error parsing cell location data: " + ex);
381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                cellLoc.setCellLocationData(baseStationId, baseStationLatitude,
385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        baseStationLongitude, systemId, networkId);
386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                phone.notifyLocationChanged();
387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Release any temporary cell lock, which could have been
390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // acquired to allow a single-shot location update.
391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            disableSingleLocationUpdate();
392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_POLL_STATE_REGISTRATION_CDMA:
395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_POLL_STATE_OPERATOR_CDMA:
396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ar = (AsyncResult) msg.obj;
397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            handlePollStateResult(msg.what, ar);
398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_POLL_STATE_CDMA_SUBSCRIPTION: // Handle RIL_CDMA_SUBSCRIPTION
401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ar = (AsyncResult) msg.obj;
402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ar.exception == null) {
404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                String cdmaSubscription[] = (String[])ar.result;
405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (cdmaSubscription != null && cdmaSubscription.length >= 5) {
406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mMdn = cdmaSubscription[0];
407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    parseSidNid(cdmaSubscription[1], cdmaSubscription[2]);
408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mMin = cdmaSubscription[3];
410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mPrlVersion = cdmaSubscription[4];
411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("GET_CDMA_SUBSCRIPTION: MDN=" + mMdn);
412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mIsMinInfoReady = true;
414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    updateOtaspState();
416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    phone.getIccCard().broadcastIccStateChangedIntent(
417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            IccCardConstants.INTENT_VALUE_ICC_IMSI, null);
418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) {
420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("GET_CDMA_SUBSCRIPTION: error parsing cdmaSubscription params num="
421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + cdmaSubscription.length);
422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_POLL_SIGNAL_STRENGTH:
428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Just poll signal strength...not part of pollState()
429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            cm.getSignalStrength(obtainMessage(EVENT_GET_SIGNAL_STRENGTH));
431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_NITZ_TIME:
434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ar = (AsyncResult) msg.obj;
435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String nitzString = (String)((Object[])ar.result)[0];
437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            long nitzReceiveTime = ((Long)((Object[])ar.result)[1]).longValue();
438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            setTimeFromNITZString(nitzString, nitzReceiveTime);
440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_SIGNAL_STRENGTH_UPDATE:
443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // This is a notification from CommandsInterface.setOnSignalStrengthUpdate.
444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ar = (AsyncResult) msg.obj;
446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // The radio is telling us about signal strength changes,
448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // so we don't have to ask it.
449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            dontPollSignalStrength = true;
450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
4515b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingam            onSignalStrengthResult(ar, phone, false);
452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_RUIM_RECORDS_LOADED:
455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            updateSpnDisplay();
456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_LOCATION_UPDATES_ENABLED:
459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ar = (AsyncResult) msg.obj;
460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ar.exception == null) {
462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                cm.getVoiceRegistrationState(obtainMessage(EVENT_GET_LOC_DONE_CDMA, null));
463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_ERI_FILE_LOADED:
467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Repoll the state once the ERI file has been loaded.
468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("[CdmaServiceStateTracker] ERI file has been loaded, repolling.");
469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            pollState();
470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_OTA_PROVISION_STATUS_CHANGE:
473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ar = (AsyncResult)msg.obj;
474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ar.exception == null) {
475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ints = (int[]) ar.result;
476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int otaStatus = ints[0];
477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (otaStatus == Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED
478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    || otaStatus == Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED) {
479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("EVENT_OTA_PROVISION_STATUS_CHANGE: Complete, Reload MDN");
480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    cm.getCDMASubscription( obtainMessage(EVENT_POLL_STATE_CDMA_SUBSCRIPTION));
481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_CDMA_PRL_VERSION_CHANGED:
486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ar = (AsyncResult)msg.obj;
487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ar.exception == null) {
488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ints = (int[]) ar.result;
489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mPrlVersion = Integer.toString(ints[0]);
490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        default:
494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            super.handleMessage(msg);
495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        break;
496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    //***** Private Instance Methods
500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleCdmaSubscriptionSource(int newSubscriptionSource) {
502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("Subscription Source : " + newSubscriptionSource);
503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        isSubscriptionFromRuim =
504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            (newSubscriptionSource == CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM);
505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        saveCdmaSubscriptionSource(newSubscriptionSource);
506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (!isSubscriptionFromRuim) {
507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // NV is ready when subscription source is NV
508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            sendMessage(obtainMessage(EVENT_NV_READY));
509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.getIccCard().registerForReady(this, EVENT_RUIM_READY, null);
511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void setPowerStateToDesired() {
516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // If we want it on and it's off, turn it on
517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mDesiredPowerState
518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            && cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            cm.setRadioPower(true, null);
520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            DataConnectionTracker dcTracker = phone.mDataConnectionTracker;
522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // If it's on and available and we want it off gracefully
524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            powerOffRadioSafely(dcTracker);
525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } // Otherwise, we're in the desired state
526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void updateSpnDisplay() {
530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // mOperatorAlphaLong contains the ERI text
531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String plmn = ss.getOperatorAlphaLong();
532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (!TextUtils.equals(plmn, mCurPlmn)) {
533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Allow A blank plmn, "" to set showPlmn to true. Previously, we
534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // would set showPlmn to true only if plmn was not empty, i.e. was not
535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // null and not blank. But this would cause us to incorrectly display
536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // "No Service". Now showPlmn is set to true for any non null string.
537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            boolean showPlmn = plmn != null;
538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) {
539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log(String.format("updateSpnDisplay: changed sending intent" +
540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            " showPlmn='%b' plmn='%s'", showPlmn, plmn));
541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Intent intent = new Intent(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION);
543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            intent.putExtra(TelephonyIntents.EXTRA_SHOW_SPN, false);
545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            intent.putExtra(TelephonyIntents.EXTRA_SPN, "");
546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            intent.putExtra(TelephonyIntents.EXTRA_SHOW_PLMN, showPlmn);
547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            intent.putExtra(TelephonyIntents.EXTRA_PLMN, plmn);
548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.getContext().sendStickyBroadcast(intent);
549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCurPlmn = plmn;
552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected Phone getPhone() {
556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return phone;
557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    * Determine data network type based on radio technology.
561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    */
562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void setCdmaTechnology(int radioTech){
563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNewDataConnectionState = radioTechnologyToDataServiceState(radioTech);
564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        newSS.setRadioTechnology(radioTech);
565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNewRilRadioTechnology = radioTech;
566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    * Hanlde the PollStateResult message
570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    */
571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void handlePollStateResultMessage(int what, AsyncResult ar){
572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int ints[];
573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String states[];
574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch (what) {
575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_POLL_STATE_REGISTRATION_CDMA: // Handle RIL_REQUEST_REGISTRATION_STATE.
576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            states = (String[])ar.result;
577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int registrationState = 4;     //[0] registrationState
579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int radioTechnology = -1;      //[3] radioTechnology
580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int baseStationId = -1;        //[4] baseStationId
581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            //[5] baseStationLatitude
582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG;
583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            //[6] baseStationLongitude
584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int cssIndicator = 0;          //[7] init with 0, because it is treated as a boolean
586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int systemId = 0;              //[8] systemId
587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int networkId = 0;             //[9] networkId
588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int roamingIndicator = -1;     //[10] Roaming indicator
589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int systemIsInPrl = 0;         //[11] Indicates if current system is in PRL
590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int defaultRoamingIndicator = 0;  //[12] Is default roaming indicator from PRL
591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int reasonForDenial = 0;       //[13] Denial reason if registrationState = 3
592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (states.length >= 14) {
594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                try {
595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[0] != null) {
596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        registrationState = Integer.parseInt(states[0]);
597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[3] != null) {
599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        radioTechnology = Integer.parseInt(states[3]);
600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[4] != null) {
602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        baseStationId = Integer.parseInt(states[4]);
603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[5] != null) {
605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        baseStationLatitude = Integer.parseInt(states[5]);
606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[6] != null) {
608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        baseStationLongitude = Integer.parseInt(states[6]);
609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Some carriers only return lat-lngs of 0,0
611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (baseStationLatitude == 0 && baseStationLongitude == 0) {
612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        baseStationLatitude  = CdmaCellLocation.INVALID_LAT_LONG;
613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[7] != null) {
616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        cssIndicator = Integer.parseInt(states[7]);
617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[8] != null) {
619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        systemId = Integer.parseInt(states[8]);
620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[9] != null) {
622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        networkId = Integer.parseInt(states[9]);
623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[10] != null) {
625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        roamingIndicator = Integer.parseInt(states[10]);
626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[11] != null) {
628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        systemIsInPrl = Integer.parseInt(states[11]);
629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[12] != null) {
631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        defaultRoamingIndicator = Integer.parseInt(states[12]);
632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (states[13] != null) {
634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        reasonForDenial = Integer.parseInt(states[13]);
635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } catch (NumberFormatException ex) {
637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("EVENT_POLL_STATE_REGISTRATION_CDMA: error parsing: " + ex);
638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                throw new RuntimeException("Warning! Wrong number of parameters returned from "
641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                     + "RIL_REQUEST_REGISTRATION_STATE: expected 14 or more "
642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                     + "strings and got " + states.length + " strings");
643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mRegistrationState = registrationState;
646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // When registration state is roaming and TSB58
647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // roaming indicator is not in the carrier-specified
648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // list of ERIs for home system, mCdmaRoaming is true.
649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mCdmaRoaming =
650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    regCodeIsRoaming(registrationState) && !isRoamIndForHomeSystem(states[10]);
651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newSS.setState (regCodeToServiceState(registrationState));
652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            setCdmaTechnology(radioTechnology);
654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newSS.setCssIndicator(cssIndicator);
656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newSS.setSystemAndNetworkId(systemId, networkId);
657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mRoamingIndicator = roamingIndicator;
658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mIsInPrl = (systemIsInPrl == 0) ? false : true;
659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mDefaultRoamingIndicator = defaultRoamingIndicator;
660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Values are -1 if not available.
663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newCellLoc.setCellLocationData(baseStationId, baseStationLatitude,
664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    baseStationLongitude, systemId, networkId);
665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (reasonForDenial == 0) {
667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_GEN;
668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else if (reasonForDenial == 1) {
669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_AUTH;
670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mRegistrationDeniedReason = "";
672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (mRegistrationState == 3) {
675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("Registration denied, " + mRegistrationDeniedReason);
676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case EVENT_POLL_STATE_OPERATOR_CDMA: // Handle RIL_REQUEST_OPERATOR
680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String opNames[] = (String[])ar.result;
681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (opNames != null && opNames.length >= 3) {
683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // If the NUMERIC field isn't valid use PROPERTY_CDMA_HOME_OPERATOR_NUMERIC
684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if ((opNames[2] == null) || (opNames[2].length() < 5)
685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        || ("00000".equals(opNames[2]))) {
686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    opNames[2] = SystemProperties.get(
687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC, "00000");
688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) {
689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("RIL_REQUEST_OPERATOR.response[2], the numeric, " +
690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                " is bad. Using SystemProperties '" +
691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                        CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC +
692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                "'= " + opNames[2]);
693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (!isSubscriptionFromRuim) {
697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // In CDMA in case on NV, the ss.mOperatorAlphaLong is set later with the
698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // ERI text, so here it is ignored what is coming from the modem.
699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    newSS.setOperatorName(null, opNames[1], opNames[2]);
700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    newSS.setOperatorName(opNames[0], opNames[1], opNames[2]);
702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("EVENT_POLL_STATE_OPERATOR_CDMA: error parsing opNames");
705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        default:
708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("handlePollStateResultMessage: RIL response handle in wrong phone!"
709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    + " Expected CDMA RIL request and get GSM RIL request.");
710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        break;
711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Handle the result of one of the pollState() - related requests
716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void handlePollStateResult(int what, AsyncResult ar) {
719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Ignore stale requests from last poll.
720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ar.userObj != pollingContext) return;
721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ar.exception != null) {
723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            CommandException.Error err=null;
724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ar.exception instanceof CommandException) {
726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                err = ((CommandException)(ar.exception)).getCommandError();
727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (err == CommandException.Error.RADIO_NOT_AVAILABLE) {
730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Radio has crashed or turned off.
731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                cancelPollState();
732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return;
733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!cm.getRadioState().isOn()) {
736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Radio has crashed or turned off.
737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                cancelPollState();
738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return;
739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (err != CommandException.Error.OP_NOT_ALLOWED_BEFORE_REG_NW) {
742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                loge("handlePollStateResult: RIL returned an error where it must succeed"
743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        + ar.exception);
744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else try {
746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            handlePollStateResultMessage(what, ar);
747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } catch (RuntimeException ex) {
748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("handlePollStateResult: Exception while polling service state. "
749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    + "Probably malformed RIL response." + ex);
750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pollingContext[0]--;
753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (pollingContext[0] == 0) {
755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            boolean namMatch = false;
756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!isSidsAllZeros() && isHomeSid(newSS.getSystemId())) {
757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                namMatch = true;
758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Setting SS Roaming (general)
761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (isSubscriptionFromRuim) {
762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                newSS.setRoaming(isRoamingBetweenOperators(mCdmaRoaming, newSS));
763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                newSS.setRoaming(mCdmaRoaming);
765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Setting SS CdmaRoamingIndicator and CdmaDefaultRoamingIndicator
768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newSS.setCdmaDefaultRoamingIndicator(mDefaultRoamingIndicator);
769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newSS.setCdmaRoamingIndicator(mRoamingIndicator);
770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            boolean isPrlLoaded = true;
771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (TextUtils.isEmpty(mPrlVersion)) {
772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isPrlLoaded = false;
773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!isPrlLoaded) {
775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                newSS.setCdmaRoamingIndicator(EriInfo.ROAMING_INDICATOR_OFF);
776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else if (!isSidsAllZeros()) {
777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (!namMatch && !mIsInPrl) {
778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Use default
779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    newSS.setCdmaRoamingIndicator(mDefaultRoamingIndicator);
780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else if (namMatch && !mIsInPrl) {
781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    newSS.setCdmaRoamingIndicator(EriInfo.ROAMING_INDICATOR_FLASH);
782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else if (!namMatch && mIsInPrl) {
783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Use the one from PRL/ERI
784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    newSS.setCdmaRoamingIndicator(mRoamingIndicator);
785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // It means namMatch && mIsInPrl
787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if ((mRoamingIndicator <= 2)) {
788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        newSS.setCdmaRoamingIndicator(EriInfo.ROAMING_INDICATOR_OFF);
789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } else {
790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // Use the one from PRL/ERI
791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        newSS.setCdmaRoamingIndicator(mRoamingIndicator);
792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int roamingIndicator = newSS.getCdmaRoamingIndicator();
797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newSS.setCdmaEriIconIndex(phone.mEriManager.getCdmaEriIconIndex(roamingIndicator,
798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mDefaultRoamingIndicator));
799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newSS.setCdmaEriIconMode(phone.mEriManager.getCdmaEriIconMode(roamingIndicator,
800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mDefaultRoamingIndicator));
801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // NOTE: Some operator may require overriding mCdmaRoaming
803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // (set by the modem), depending on the mRoamingIndicator.
804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
805c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) {
806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("Set CDMA Roaming Indicator to: " + newSS.getCdmaRoamingIndicator()
807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    + ". mCdmaRoaming = " + mCdmaRoaming + ", isPrlLoaded = " + isPrlLoaded
808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    + ". namMatch = " + namMatch + " , mIsInPrl = " + mIsInPrl
809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    + ", mRoamingIndicator = " + mRoamingIndicator
810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    + ", mDefaultRoamingIndicator= " + mDefaultRoamingIndicator);
811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            pollStateDone();
813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void setSignalStrengthDefaultValues() {
8185b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingam        mSignalStrength = new SignalStrength( false);
819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
822c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * A complete "service state" from our perspective is
823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * composed of a handful of separate requests to the radio.
824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * We make all of these requests at once, but then abandon them
826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * and start over again if the radio notifies us that some
827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * event has changed
828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void
830c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    pollState() {
831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pollingContext = new int[1];
832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pollingContext[0] = 0;
833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch (cm.getRadioState()) {
835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case RADIO_UNAVAILABLE:
836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newSS.setStateOutOfService();
837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newCellLoc.setStateInvalid();
838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            setSignalStrengthDefaultValues();
839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mGotCountryCode = false;
840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            pollStateDone();
842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case RADIO_OFF:
845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newSS.setStateOff();
846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            newCellLoc.setStateInvalid();
847c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            setSignalStrengthDefaultValues();
848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mGotCountryCode = false;
849c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            pollStateDone();
851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        default:
854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Issue all poll-related commands at once, then count
855c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // down the responses which are allowed to arrive
856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // out-of-order.
857c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            pollingContext[0]++;
859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // RIL_REQUEST_OPERATOR is necessary for CDMA
860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            cm.getOperator(
861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_POLL_STATE_OPERATOR_CDMA, pollingContext));
862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            pollingContext[0]++;
864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // RIL_REQUEST_VOICE_REGISTRATION_STATE is necessary for CDMA
865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            cm.getVoiceRegistrationState(
866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_POLL_STATE_REGISTRATION_CDMA, pollingContext));
867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void fixTimeZone(String isoCountryCode) {
873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        TimeZone zone = null;
874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // If the offset is (0, false) and the time zone property
875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // is set, use the time zone property rather than GMT.
876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String zoneName = SystemProperties.get(TIMEZONE_PROPERTY);
877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) {
878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("fixTimeZone zoneName='" + zoneName +
879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                "' mZoneOffset=" + mZoneOffset + " mZoneDst=" + mZoneDst +
880c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                " iso-cc='" + isoCountryCode +
881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                "' iso-cc-idx=" + Arrays.binarySearch(GMT_COUNTRY_CODES, isoCountryCode));
882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if ((mZoneOffset == 0) && (mZoneDst == false) && (zoneName != null)
884c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                && (zoneName.length() > 0)
885c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                && (Arrays.binarySearch(GMT_COUNTRY_CODES, isoCountryCode) < 0)) {
886c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // For NITZ string without time zone,
887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // need adjust time to reflect default time zone setting
888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            zone = TimeZone.getDefault();
889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (mNeedFixZone) {
890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                long ctm = System.currentTimeMillis();
891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                long tzOffset = zone.getOffset(ctm);
892c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) {
893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("fixTimeZone: tzOffset=" + tzOffset +
894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            " ltod=" + TimeUtils.logTimeOfDay(ctm));
895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (getAutoTime()) {
897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    long adj = ctm - tzOffset;
898c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("fixTimeZone: adj ltod=" + TimeUtils.logTimeOfDay(adj));
899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    setAndBroadcastNetworkSetTime(adj);
900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
901c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Adjust the saved NITZ time to account for tzOffset.
902c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mSavedTime = mSavedTime - tzOffset;
903c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("fixTimeZone: adj mSavedTime=" + mSavedTime);
904c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
905c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("fixTimeZone: using default TimeZone");
907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else if (isoCountryCode.equals("")) {
908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Country code not found. This is likely a test network.
909c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Get a TimeZone based only on the NITZ parameters (best guess).
910c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            zone = getNitzTimeZone(mZoneOffset, mZoneDst, mZoneTime);
911c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("fixTimeZone: using NITZ TimeZone");
912c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
913c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            zone = TimeUtils.getTimeZone(mZoneOffset, mZoneDst, mZoneTime, isoCountryCode);
914c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("fixTimeZone: using getTimeZone(off, dst, time, iso)");
915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNeedFixZone = false;
918c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
919c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (zone != null) {
920c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("fixTimeZone: zone != null zone.getID=" + zone.getID());
921c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (getAutoTimeZone()) {
922c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                setAndBroadcastNetworkSetTimeZone(zone.getID());
923c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
924c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("fixTimeZone: skip changing zone as getAutoTimeZone was false");
925c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
926c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            saveNitzTimeZone(zone.getID());
927c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
928c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("fixTimeZone: zone == null, do nothing for zone");
929c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
930c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
931c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
932c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void pollStateDone() {
933c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("pollStateDone: oldSS=[" + ss + "] newSS=[" + newSS + "]");
934c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
935c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean hasRegistered =
936c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ss.getState() != ServiceState.STATE_IN_SERVICE
937c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            && newSS.getState() == ServiceState.STATE_IN_SERVICE;
938c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
939c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean hasDeregistered =
940c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ss.getState() == ServiceState.STATE_IN_SERVICE
941c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            && newSS.getState() != ServiceState.STATE_IN_SERVICE;
942c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
943c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean hasCdmaDataConnectionAttached =
944c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mDataConnectionState != ServiceState.STATE_IN_SERVICE
945c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            && mNewDataConnectionState == ServiceState.STATE_IN_SERVICE;
946c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean hasCdmaDataConnectionDetached =
948c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mDataConnectionState == ServiceState.STATE_IN_SERVICE
949c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            && mNewDataConnectionState != ServiceState.STATE_IN_SERVICE;
950c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
951c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean hasCdmaDataConnectionChanged =
952c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                       mDataConnectionState != mNewDataConnectionState;
953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
954c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean hasRadioTechnologyChanged = mRilRadioTechnology != mNewRilRadioTechnology;
955c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
956c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean hasChanged = !newSS.equals(ss);
957c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
958c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean hasRoamingOn = !ss.getRoaming() && newSS.getRoaming();
959c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
960c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean hasRoamingOff = ss.getRoaming() && !newSS.getRoaming();
961c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
962c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean hasLocationChanged = !newCellLoc.equals(cellLoc);
963c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
964c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Add an event log when connection state changes
965c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ss.getState() != newSS.getState() ||
966c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mDataConnectionState != mNewDataConnectionState) {
967c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            EventLog.writeEvent(EventLogTags.CDMA_SERVICE_STATE_CHANGE,
968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ss.getState(), mDataConnectionState,
969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    newSS.getState(), mNewDataConnectionState);
970c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
972c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        ServiceState tss;
973c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        tss = ss;
974c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        ss = newSS;
975c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        newSS = tss;
976c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // clean slate for next time
977c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        newSS.setStateOutOfService();
978c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
979c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        CdmaCellLocation tcl = cellLoc;
980c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cellLoc = newCellLoc;
981c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        newCellLoc = tcl;
982c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
983c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mDataConnectionState = mNewDataConnectionState;
984c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mRilRadioTechnology = mNewRilRadioTechnology;
985c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // this new state has been applied - forget it until we get a new new state
986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNewRilRadioTechnology = 0;
987c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
988c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        newSS.setStateOutOfService(); // clean slate for next time
989c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
990c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (hasRadioTechnologyChanged) {
991c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE,
992c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ServiceState.rilRadioTechnologyToString(mRilRadioTechnology));
993c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
994c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
995c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (hasRegistered) {
996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mNetworkAttachedRegistrants.notifyRegistrants();
997c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
998c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (hasChanged) {
1000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if ((cm.getRadioState().isOn()) && (!isSubscriptionFromRuim)) {
1001c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                String eriText;
1002c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Now the CDMAPhone sees the new ServiceState so it can get the new ERI text
1003c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ss.getState() == ServiceState.STATE_IN_SERVICE) {
1004c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    eriText = phone.getCdmaEriText();
1005c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1006c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Note that ServiceState.STATE_OUT_OF_SERVICE is valid used for
1007c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // mRegistrationState 0,2,3 and 4
1008c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    eriText = phone.getContext().getText(
1009c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            com.android.internal.R.string.roamingTextSearching).toString();
1010c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1011c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ss.setOperatorAlphaLong(eriText);
1012c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1013c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1014c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String operatorNumeric;
1015c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1016c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ALPHA,
1017c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ss.getOperatorAlphaLong());
1018c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1019c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String prevOperatorNumeric =
1020c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, "");
1021c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            operatorNumeric = ss.getOperatorNumeric();
1022c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, operatorNumeric);
1023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (operatorNumeric == null) {
1025c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("operatorNumeric is null");
1026c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, "");
1027c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mGotCountryCode = false;
1028c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
1029c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                String isoCountryCode = "";
1030c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                String mcc = operatorNumeric.substring(0, 3);
1031c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                try{
1032c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    isoCountryCode = MccTable.countryCodeForMcc(Integer.parseInt(
1033c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            operatorNumeric.substring(0,3)));
1034c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } catch ( NumberFormatException ex){
1035c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("pollStateDone: countryCodeForMcc error" + ex);
1036c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } catch ( StringIndexOutOfBoundsException ex) {
1037c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("pollStateDone: countryCodeForMcc error" + ex);
1038c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1039c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1040c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY,
1041c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        isoCountryCode);
1042c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mGotCountryCode = true;
1043c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1044c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (shouldFixTimeZoneNow(phone, operatorNumeric, prevOperatorNumeric,
1045c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        mNeedFixZone)) {
1046c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    fixTimeZone(isoCountryCode);
1047c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1048c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1049c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1050c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING,
1051c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ss.getRoaming() ? "true" : "false");
1052c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1053c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            updateSpnDisplay();
1054c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.notifyServiceStateChanged(ss);
1055c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1056c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1057c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (hasCdmaDataConnectionAttached) {
1058c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mAttachedRegistrants.notifyRegistrants();
1059c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1060c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1061c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (hasCdmaDataConnectionDetached) {
1062c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mDetachedRegistrants.notifyRegistrants();
1063c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1064c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1065c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (hasCdmaDataConnectionChanged || hasRadioTechnologyChanged) {
1066c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.notifyDataConnection(null);
1067c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1068c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1069c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (hasRoamingOn) {
1070c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mRoamingOnRegistrants.notifyRegistrants();
1071c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1072c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1073c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (hasRoamingOff) {
1074c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mRoamingOffRegistrants.notifyRegistrants();
1075c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1076c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1077c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (hasLocationChanged) {
1078c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.notifyLocationChanged();
1079c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1080c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1081c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1082c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1083c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Returns a TimeZone object based only on parameters from the NITZ string.
1084c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1085c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private TimeZone getNitzTimeZone(int offset, boolean dst, long when) {
1086c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        TimeZone guess = findTimeZone(offset, dst, when);
1087c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (guess == null) {
1088c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Couldn't find a proper timezone.  Perhaps the DST data is wrong.
1089c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            guess = findTimeZone(offset, !dst, when);
1090c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1091c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("getNitzTimeZone returning " + (guess == null ? guess : guess.getID()));
1092c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return guess;
1093c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1094c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1095c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private TimeZone findTimeZone(int offset, boolean dst, long when) {
1096c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int rawOffset = offset;
1097c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (dst) {
1098c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            rawOffset -= 3600000;
1099c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String[] zones = TimeZone.getAvailableIDs(rawOffset);
1101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        TimeZone guess = null;
1102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Date d = new Date(when);
1103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (String zone : zones) {
1104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            TimeZone tz = TimeZone.getTimeZone(zone);
1105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (tz.getOffset(when) == offset &&
1106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    tz.inDaylightTime(d) == dst) {
1107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                guess = tz;
1108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return guess;
1113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * TODO: This code is exactly the same as in GsmServiceStateTracker
1117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * and has a TODO to not poll signal strength if screen is off.
1118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * This code should probably be hoisted to the base class so
1119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * the fix, when added, works for both.
1120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void
1122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    queueNextSignalStrengthPoll() {
1123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (dontPollSignalStrength) {
1124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // The radio is telling us about signal strength changes
1125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // we don't have to ask it
1126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Message msg;
1130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        msg = obtainMessage();
1132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        msg.what = EVENT_POLL_SIGNAL_STRENGTH;
1133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // TODO Don't poll signal strength if screen is off
1135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        sendMessageDelayed(msg, POLL_PERIOD_MILLIS);
1136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected int radioTechnologyToDataServiceState(int code) {
1139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int retVal = ServiceState.STATE_OUT_OF_SERVICE;
1140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch(code) {
1141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 0:
1142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 1:
1143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 2:
1144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 3:
1145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 4:
1146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 5:
1147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
1148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 6: // RADIO_TECHNOLOGY_1xRTT
1149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 7: // RADIO_TECHNOLOGY_EVDO_0
1150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 8: // RADIO_TECHNOLOGY_EVDO_A
1151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 12: // RADIO_TECHNOLOGY_EVDO_B
1152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 13: // RADIO_TECHNOLOGY_EHRPD
1153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            retVal = ServiceState.STATE_IN_SERVICE;
1154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
1155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        default:
1156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("radioTechnologyToDataServiceState: Wrong radioTechnology code.");
1157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        break;
1158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return(retVal);
1160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** code is registration state 0-5 from TS 27.007 7.2 */
1163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected int
1164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    regCodeToServiceState(int code) {
1165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch (code) {
1166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 0: // Not searching and not registered
1167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return ServiceState.STATE_OUT_OF_SERVICE;
1168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 1:
1169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return ServiceState.STATE_IN_SERVICE;
1170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 2: // 2 is "searching", fall through
1171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 3: // 3 is "registration denied", fall through
1172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 4: // 4 is "unknown", not valid in current baseband
1173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return ServiceState.STATE_OUT_OF_SERVICE;
1174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        case 5:// 5 is "Registered, roaming"
1175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return ServiceState.STATE_IN_SERVICE;
1176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        default:
1178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("regCodeToServiceState: unexpected service state " + code);
1179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return ServiceState.STATE_OUT_OF_SERVICE;
1180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public int getCurrentDataConnectionState() {
1184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mDataConnectionState;
1185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * code is registration state 0-5 from TS 27.007 7.2
1189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * returns true if registered roam, false otherwise
1190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean
1192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    regCodeIsRoaming (int code) {
1193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // 5 is  "in service -- roam"
1194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return 5 == code;
1195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Determine whether a roaming indicator is in the carrier-specified list of ERIs for
1199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * home system
1200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param roamInd roaming indicator in String
1202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @return true if the roamInd is in the carrier-specified list of ERIs for home network
1203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean isRoamIndForHomeSystem(String roamInd) {
1205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // retrieve the carrier-specified list of ERIs for home system
1206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String homeRoamIndicators = SystemProperties.get("ro.cdma.homesystem");
1207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (!TextUtils.isEmpty(homeRoamIndicators)) {
1209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // searches through the comma-separated list for a match,
1210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // return true if one is found.
1211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            for (String homeRoamInd : homeRoamIndicators.split(",")) {
1212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (homeRoamInd.equals(roamInd)) {
1213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    return true;
1214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // no matches found against the list!
1217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return false;
1218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // no system property found for the roaming indicators for home system
1221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return false;
1222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set roaming state when cdmaRoaming is true and ons is different from spn
1226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param cdmaRoaming TS 27.007 7.2 CREG registered roaming
1227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param s ServiceState hold current ons
1228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @return true for roaming state set
1229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private
1231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    boolean isRoamingBetweenOperators(boolean cdmaRoaming, ServiceState s) {
1232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String spn = SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, "empty");
1233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // NOTE: in case of RUIM we should completely ignore the ERI data file and
1235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // mOperatorAlphaLong is set from RIL_REQUEST_OPERATOR response 0 (alpha ONS)
1236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String onsl = s.getOperatorAlphaLong();
1237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String onss = s.getOperatorAlphaShort();
1238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean equalsOnsl = onsl != null && spn.equals(onsl);
1240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean equalsOnss = onss != null && spn.equals(onss);
1241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return cdmaRoaming && !(equalsOnsl || equalsOnss);
1243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * nitzReceiveTime is time_t that the NITZ time was posted
1248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private
1251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    void setTimeFromNITZString (String nitz, long nitzReceiveTime)
1252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    {
1253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // "yy/mm/dd,hh:mm:ss(+/-)tz"
1254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // tz is in number of quarter-hours
1255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        long start = SystemClock.elapsedRealtime();
1257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) {
1258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("NITZ: " + nitz + "," + nitzReceiveTime +
1259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        " start=" + start + " delay=" + (start - nitzReceiveTime));
1260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try {
1263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            /* NITZ time (hour:min:sec) will be in UTC but it supplies the timezone
1264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             * offset as well (which we won't worry about until later) */
1265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
1266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            c.clear();
1268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            c.set(Calendar.DST_OFFSET, 0);
1269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String[] nitzSubs = nitz.split("[/:,+-]");
1271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int year = 2000 + Integer.parseInt(nitzSubs[0]);
1273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            c.set(Calendar.YEAR, year);
1274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // month is 0 based!
1276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int month = Integer.parseInt(nitzSubs[1]) - 1;
1277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            c.set(Calendar.MONTH, month);
1278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int date = Integer.parseInt(nitzSubs[2]);
1280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            c.set(Calendar.DATE, date);
1281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int hour = Integer.parseInt(nitzSubs[3]);
1283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            c.set(Calendar.HOUR, hour);
1284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int minute = Integer.parseInt(nitzSubs[4]);
1286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            c.set(Calendar.MINUTE, minute);
1287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int second = Integer.parseInt(nitzSubs[5]);
1289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            c.set(Calendar.SECOND, second);
1290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            boolean sign = (nitz.indexOf('-') == -1);
1292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int tzOffset = Integer.parseInt(nitzSubs[6]);
1294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int dst = (nitzSubs.length >= 8 ) ? Integer.parseInt(nitzSubs[7])
1296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                              : 0;
1297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // The zone offset received from NITZ is for current local time,
1299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // so DST correction is already applied.  Don't add it again.
1300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            //
1301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // tzOffset += dst * 4;
1302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            //
1303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // We could unapply it if we wanted the raw offset.
1304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            tzOffset = (sign ? 1 : -1) * tzOffset * 15 * 60 * 1000;
1306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            TimeZone    zone = null;
1308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // As a special extension, the Android emulator appends the name of
1310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // the host computer's timezone to the nitz string. this is zoneinfo
1311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // timezone name of the form Area!Location or Area!Location!SubLocation
1312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // so we need to convert the ! into /
1313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (nitzSubs.length >= 9) {
1314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                String  tzname = nitzSubs[8].replace('!','/');
1315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                zone = TimeZone.getTimeZone( tzname );
1316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String iso = SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY);
1319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (zone == null) {
1321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (mGotCountryCode) {
1322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (iso != null && iso.length() > 0) {
1323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        zone = TimeUtils.getTimeZone(tzOffset, dst != 0,
1324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                c.getTimeInMillis(),
1325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                iso);
1326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } else {
1327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // We don't have a valid iso country code.  This is
1328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // most likely because we're on a test network that's
1329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // using a bogus MCC (eg, "001"), so get a TimeZone
1330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // based only on the NITZ parameters.
1331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        zone = getNitzTimeZone(tzOffset, (dst != 0), c.getTimeInMillis());
1332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if ((zone == null) || (mZoneOffset != tzOffset) || (mZoneDst != (dst != 0))){
1337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // We got the time before the country or the zone has changed
1338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // so we don't know how to identify the DST rules yet.  Save
1339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // the information and hope to fix it up later.
1340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mNeedFixZone = true;
1342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mZoneOffset  = tzOffset;
1343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mZoneDst     = dst != 0;
1344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mZoneTime    = c.getTimeInMillis();
1345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) {
1347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("NITZ: tzOffset=" + tzOffset + " dst=" + dst + " zone=" + zone.getID() +
1348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        " iso=" + iso + " mGotCountryCode=" + mGotCountryCode +
1349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        " mNeedFixZone=" + mNeedFixZone);
1350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (zone != null) {
1353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (getAutoTimeZone()) {
1354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    setAndBroadcastNetworkSetTimeZone(zone.getID());
1355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                saveNitzTimeZone(zone.getID());
1357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String ignore = SystemProperties.get("gsm.ignore-nitz");
1360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ignore != null && ignore.equals("yes")) {
1361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("NITZ: Not setting clock because gsm.ignore-nitz is set");
1362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return;
1363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            try {
1366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mWakeLock.acquire();
1367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                /**
1369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 * Correct the NITZ time by how long its taken to get here.
1370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 */
1371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                long millisSinceNitzReceived
1372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        = SystemClock.elapsedRealtime() - nitzReceiveTime;
1373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (millisSinceNitzReceived < 0) {
1375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Sanity check: something is wrong
1376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) {
1377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("NITZ: not setting time, clock has rolled "
1378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                        + "backwards since NITZ time was received, "
1379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                        + nitz);
1380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    return;
1382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (millisSinceNitzReceived > Integer.MAX_VALUE) {
1385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // If the time is this far off, something is wrong > 24 days!
1386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) {
1387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("NITZ: not setting time, processing has taken "
1388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                    + (millisSinceNitzReceived / (1000 * 60 * 60 * 24))
1389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                    + " days");
1390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    return;
1392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Note: with range checks above, cast to int is safe
1395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                c.add(Calendar.MILLISECOND, (int)millisSinceNitzReceived);
1396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (getAutoTime()) {
1398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    /**
1399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     * Update system time automatically
1400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     */
1401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    long gained = c.getTimeInMillis() - System.currentTimeMillis();
1402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    long timeSinceLastUpdate = SystemClock.elapsedRealtime() - mSavedAtTime;
1403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    int nitzUpdateSpacing = Settings.Secure.getInt(cr,
1404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            Settings.Secure.NITZ_UPDATE_SPACING, mNitzUpdateSpacing);
1405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    int nitzUpdateDiff = Settings.Secure.getInt(cr,
1406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            Settings.Secure.NITZ_UPDATE_DIFF, mNitzUpdateDiff);
1407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if ((mSavedAtTime == 0) || (timeSinceLastUpdate > nitzUpdateSpacing)
1409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            || (Math.abs(gained) > nitzUpdateDiff)) {
1410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (DBG) {
1411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            log("NITZ: Auto updating time of day to " + c.getTime()
1412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                + " NITZ receive delay=" + millisSinceNitzReceived
1413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                + "ms gained=" + gained + "ms from " + nitz);
1414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
1415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        setAndBroadcastNetworkSetTime(c.getTimeInMillis());
1417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } else {
1418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (DBG) {
1419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            log("NITZ: ignore, a previous update was "
1420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                + timeSinceLastUpdate + "ms ago and gained=" + gained + "ms");
1421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
1422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        return;
1423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                /**
1427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 * Update properties and save the time we did the update
1428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 */
1429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("NITZ: update nitz time property");
1430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                SystemProperties.set("gsm.nitz.time", String.valueOf(c.getTimeInMillis()));
1431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mSavedTime = c.getTimeInMillis();
1432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mSavedAtTime = SystemClock.elapsedRealtime();
1433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } finally {
1434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                long end = SystemClock.elapsedRealtime();
1435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("NITZ: end=" + end + " dur=" + (end - start));
1436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mWakeLock.release();
1437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } catch (RuntimeException ex) {
1439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("NITZ: Parsing NITZ time " + nitz + " ex=" + ex);
1440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean getAutoTime() {
1444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try {
1445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return Settings.System.getInt(cr, Settings.System.AUTO_TIME) > 0;
1446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } catch (SettingNotFoundException snfe) {
1447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return true;
1448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean getAutoTimeZone() {
1452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try {
1453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return Settings.System.getInt(cr, Settings.System.AUTO_TIME_ZONE) > 0;
1454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } catch (SettingNotFoundException snfe) {
1455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return true;
1456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void saveNitzTimeZone(String zoneId) {
1460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mSavedTimeZone = zoneId;
1461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set the timezone and send out a sticky broadcast so the system can
1465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * determine if the timezone was set by the carrier.
1466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param zoneId timezone set by carrier
1468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void setAndBroadcastNetworkSetTimeZone(String zoneId) {
1470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("setAndBroadcastNetworkSetTimeZone: setTimeZone=" + zoneId);
1471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        AlarmManager alarm =
1472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            (AlarmManager) phone.getContext().getSystemService(Context.ALARM_SERVICE);
1473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        alarm.setTimeZone(zoneId);
1474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Intent intent = new Intent(TelephonyIntents.ACTION_NETWORK_SET_TIMEZONE);
1475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
1476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        intent.putExtra("time-zone", zoneId);
1477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        phone.getContext().sendStickyBroadcast(intent);
1478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set the time and Send out a sticky broadcast so the system can determine
1482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * if the time was set by the carrier.
1483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param time time set by network
1485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void setAndBroadcastNetworkSetTime(long time) {
1487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("setAndBroadcastNetworkSetTime: time=" + time + "ms");
1488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        SystemClock.setCurrentTimeMillis(time);
1489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Intent intent = new Intent(TelephonyIntents.ACTION_NETWORK_SET_TIME);
1490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
1491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        intent.putExtra("time", time);
1492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        phone.getContext().sendStickyBroadcast(intent);
1493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void revertToNitzTime() {
1496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (Settings.System.getInt(cr, Settings.System.AUTO_TIME, 0) == 0) {
1497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) {
1500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("revertToNitzTime: mSavedTime=" + mSavedTime + " mSavedAtTime=" + mSavedAtTime);
1501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mSavedTime != 0 && mSavedAtTime != 0) {
1503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            setAndBroadcastNetworkSetTime(mSavedTime
1504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    + (SystemClock.elapsedRealtime() - mSavedAtTime));
1505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void revertToNitzTimeZone() {
1509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (Settings.System.getInt(phone.getContext().getContentResolver(),
1510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                Settings.System.AUTO_TIME_ZONE, 0) == 0) {
1511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("revertToNitzTimeZone: tz='" + mSavedTimeZone);
1514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mSavedTimeZone != null) {
1515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            setAndBroadcastNetworkSetTimeZone(mSavedTimeZone);
1516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected boolean isSidsAllZeros() {
1520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mHomeSystemId != null) {
1521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            for (int i=0; i < mHomeSystemId.length; i++) {
1522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (mHomeSystemId[i] != 0) {
1523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    return false;
1524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return true;
1528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Check whether a specified system ID that matches one of the home system IDs.
1532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean isHomeSid(int sid) {
1534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mHomeSystemId != null) {
1535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            for (int i=0; i < mHomeSystemId.length; i++) {
1536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (sid == mHomeSystemId[i]) {
1537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    return true;
1538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return false;
1542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @return true if phone is camping on a technology
1546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * that could support voice and data simultaneously.
1547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean isConcurrentVoiceAndDataAllowed() {
1549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Note: it needs to be confirmed which CDMA network types
1550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // can support voice and data calls concurrently.
1551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // For the time-being, the return value will be false.
1552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return false;
1553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getMdnNumber() {
1556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mMdn;
1557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getCdmaMin() {
1560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville         return mMin;
1561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** Returns null if NV is not yet ready */
1564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getPrlVersion() {
1565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mPrlVersion;
1566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Returns IMSI as MCC + MNC + MIN
1570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    String getImsi() {
1572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // TODO: When RUIM is enabled, IMSI will come from RUIM not build-time props.
1573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String operatorNumeric = SystemProperties.get(
1574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, "");
1575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (!TextUtils.isEmpty(operatorNumeric) && getCdmaMin() != null) {
1577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return (operatorNumeric + getCdmaMin());
1578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
1579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return null;
1580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Check if subscription data has been assigned to mMin
1585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * return true if MIN info is ready; false otherwise.
1587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean isMinInfoReady() {
1589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mIsMinInfoReady;
1590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Returns OTASP_UNKNOWN, OTASP_NEEDED or OTASP_NOT_NEEDED
1594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    int getOtasp() {
1596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int provisioningState;
1597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mMin == null || (mMin.length() < 6)) {
1598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("getOtasp: bad mMin='" + mMin + "'");
1599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            provisioningState = OTASP_UNKNOWN;
1600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
1601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if ((mMin.equals(UNACTIVATED_MIN_VALUE)
1602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    || mMin.substring(0,6).equals(UNACTIVATED_MIN2_VALUE))
1603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    || SystemProperties.getBoolean("test_cdma_setup", false)) {
1604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                provisioningState = OTASP_NEEDED;
1605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
1606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                provisioningState = OTASP_NOT_NEEDED;
1607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("getOtasp: state=" + provisioningState);
1610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return provisioningState;
1611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
1614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void hangupAndPowerOff() {
1615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // hang up all active voice calls
1616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        phone.mCT.ringingCall.hangupIfAlive();
1617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        phone.mCT.backgroundCall.hangupIfAlive();
1618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        phone.mCT.foregroundCall.hangupIfAlive();
1619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cm.setRadioPower(false, null);
1620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void parseSidNid (String sidStr, String nidStr) {
1623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (sidStr != null) {
1624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String[] sid = sidStr.split(",");
1625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mHomeSystemId = new int[sid.length];
1626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            for (int i = 0; i < sid.length; i++) {
1627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                try {
1628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mHomeSystemId[i] = Integer.parseInt(sid[i]);
1629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } catch (NumberFormatException ex) {
1630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("error parsing system id: " + ex);
1631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("CDMA_SUBSCRIPTION: SID=" + sidStr);
1635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (nidStr != null) {
1637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String[] nid = nidStr.split(",");
1638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mHomeNetworkId = new int[nid.length];
1639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            for (int i = 0; i < nid.length; i++) {
1640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                try {
1641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mHomeNetworkId[i] = Integer.parseInt(nid[i]);
1642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } catch (NumberFormatException ex) {
1643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("CDMA_SUBSCRIPTION: error parsing network id: " + ex);
1644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("CDMA_SUBSCRIPTION: NID=" + nidStr);
1648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void updateOtaspState() {
1651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int otaspMode = getOtasp();
1652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int oldOtaspMode = mCurrentOtaspMode;
1653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCurrentOtaspMode = otaspMode;
1654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Notify apps subscription info is ready
1656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (cdmaForSubscriptionInfoReadyRegistrants != null) {
1657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("CDMA_SUBSCRIPTION: call notifyRegistrants()");
1658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            cdmaForSubscriptionInfoReadyRegistrants.notifyRegistrants();
1659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (oldOtaspMode != mCurrentOtaspMode) {
1661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) {
1662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("CDMA_SUBSCRIPTION: call notifyOtaspChanged old otaspMode=" +
1663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    oldOtaspMode + " new otaspMode=" + mCurrentOtaspMode);
1664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            phone.notifyOtaspChanged(mCurrentOtaspMode);
1666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
1670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void log(String s) {
1671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Log.d(LOG_TAG, "[CdmaSST] " + s);
1672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
1675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void loge(String s) {
1676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Log.e(LOG_TAG, "[CdmaSST] " + s);
1677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
1680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println("CdmaServiceStateTracker extends:");
1682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super.dump(fd, pw, args);
1683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" phone=" + phone);
1684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" cellLoc=" + cellLoc);
1685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" newCellLoc=" + newCellLoc);
1686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mCurrentOtaspMode=" + mCurrentOtaspMode);
1687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mCdmaRoaming=" + mCdmaRoaming);
1688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mRoamingIndicator=" + mRoamingIndicator);
1689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mIsInPrl=" + mIsInPrl);
1690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mDefaultRoamingIndicator=" + mDefaultRoamingIndicator);
1691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mDataConnectionState=" + mDataConnectionState);
1692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mNewDataConnectionState=" + mNewDataConnectionState);
1693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mRegistrationState=" + mRegistrationState);
1694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mNeedFixZone=" + mNeedFixZone);
1695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mZoneOffset=" + mZoneOffset);
1696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mZoneDst=" + mZoneDst);
1697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mZoneTime=" + mZoneTime);
1698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mGotCountryCode=" + mGotCountryCode);
1699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mSavedTimeZone=" + mSavedTimeZone);
1700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mSavedTime=" + mSavedTime);
1701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mSavedAtTime=" + mSavedAtTime);
1702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mNeedToRegForRuimLoaded=" + mNeedToRegForRuimLoaded);
1703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mWakeLock=" + mWakeLock);
1704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mCurPlmn=" + mCurPlmn);
1705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mMdn=" + mMdn);
1706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mHomeSystemId=" + mHomeSystemId);
1707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mHomeNetworkId=" + mHomeNetworkId);
1708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mMin=" + mMin);
1709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mPrlVersion=" + mPrlVersion);
1710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mIsMinInfoReady=" + mIsMinInfoReady);
1711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" isEriTextLoaded=" + isEriTextLoaded);
1712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" isSubscriptionFromRuim=" + isSubscriptionFromRuim);
1713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mCdmaSSM=" + mCdmaSSM);
1714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mRegistrationDeniedReason=" + mRegistrationDeniedReason);
1715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" currentCarrier=" + currentCarrier);
1716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville}
1718