1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*
2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2006 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 android.app.AlarmManager;
20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.app.PendingIntent;
21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context;
22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Intent;
23c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult;
24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message;
25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemClock;
26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemProperties;
27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.ServiceState;
28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.TelephonyManager;
29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.cdma.CdmaCellLocation;
30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.text.TextUtils;
31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.EventLog;
32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.Log;
33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.ApnSetting;
35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface;
36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.DataCallState;
37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.DataConnection.FailCause;
38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.DataConnection;
39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.DataConnectionAc;
40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.DataConnectionTracker;
41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.DctConstants;
42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.EventLogTags;
43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.PhoneConstants;
44bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkaimport com.android.internal.telephony.IccRecords;
45e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.Phone;
46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.RetryManager;
47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.RILConstants;
48e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.UiccCard;
49e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.uicc.UiccController;
50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.util.AsyncChannel;
51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.FileDescriptor;
53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.PrintWriter;
54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.ArrayList;
55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/**
57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide}
58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic final class CdmaDataConnectionTracker extends DataConnectionTracker {
60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected final String LOG_TAG = "CDMA";
61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private CDMAPhone mCdmaPhone;
63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private CdmaSubscriptionSourceManager mCdmaSSM;
64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** The DataConnection being setup */
66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private CdmaDataConnection mPendingDataConnection;
67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean mPendingRestartRadio = false;
69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int TIME_DELAYED_TO_RESTART_RADIO =
70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            SystemProperties.getInt("ro.cdma.timetoradiorestart", 60000);
71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Pool size of CdmaDataConnection objects.
74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int DATA_CONNECTION_POOL_SIZE = 1;
76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final String INTENT_RECONNECT_ALARM =
78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "com.android.internal.telephony.cdma-reconnect";
79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final String INTENT_DATA_STALL_ALARM =
81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "com.android.internal.telephony.cdma-data-stall";
82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final String[] mSupportedApnTypes = {
84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            PhoneConstants.APN_TYPE_DEFAULT,
85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            PhoneConstants.APN_TYPE_MMS,
86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            PhoneConstants.APN_TYPE_DUN,
87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            PhoneConstants.APN_TYPE_HIPRI };
88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final String[] mDefaultApnTypes = {
90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            PhoneConstants.APN_TYPE_DEFAULT,
91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            PhoneConstants.APN_TYPE_MMS,
92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            PhoneConstants.APN_TYPE_HIPRI };
93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private String[] mDunApnTypes = {
95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            PhoneConstants.APN_TYPE_DUN };
96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int mDefaultApnId = DctConstants.APN_DEFAULT_ID;
98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /* Constructor */
100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    CdmaDataConnectionTracker(CDMAPhone p) {
102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super(p);
103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaPhone = p;
104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        p.mCM.registerForAvailable (this, DctConstants.EVENT_RADIO_AVAILABLE, null);
106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        p.mCM.registerForOffOrNotAvailable(this, DctConstants.EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        p.mCM.registerForDataNetworkStateChanged (this, DctConstants.EVENT_DATA_STATE_CHANGED, null);
108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        p.mCT.registerForVoiceCallEnded (this, DctConstants.EVENT_VOICE_CALL_ENDED, null);
109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        p.mCT.registerForVoiceCallStarted (this, DctConstants.EVENT_VOICE_CALL_STARTED, null);
110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        p.mSST.registerForDataConnectionAttached(this, DctConstants.EVENT_TRY_SETUP_DATA, null);
111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        p.mSST.registerForDataConnectionDetached(this, DctConstants.EVENT_CDMA_DATA_DETACHED, null);
112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        p.mSST.registerForRoamingOn(this, DctConstants.EVENT_ROAMING_ON, null);
113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        p.mSST.registerForRoamingOff(this, DctConstants.EVENT_ROAMING_OFF, null);
114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        p.mCM.registerForCdmaOtaProvision(this, DctConstants.EVENT_CDMA_OTA_PROVISION, null);
115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaSSM = CdmaSubscriptionSourceManager.getInstance (p.getContext(), p.mCM, this,
116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                DctConstants.EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null);
117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mDataConnectionTracker = this;
119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        createAllDataConnectionList();
121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        broadcastMessenger();
122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Context c = mCdmaPhone.getContext();
124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String[] t = c.getResources().getStringArray(
125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                com.android.internal.R.array.config_cdma_dun_supported_types);
126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (t != null && t.length > 0) {
127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ArrayList<String> temp = new ArrayList<String>();
128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            for(int i=0; i< t.length; i++) {
129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (!PhoneConstants.APN_TYPE_DUN.equalsIgnoreCase(t[i])) {
130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    temp.add(t[i]);
131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            temp.add(0,PhoneConstants.APN_TYPE_DUN);
134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mDunApnTypes = temp.toArray(t);
135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void dispose() {
141c62df086696fc7cb42c51e086ea2aab076cff24bAjay Nambi        cleanUpConnection(true, null, false);
142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super.dispose();
144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Unregister from all events
146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mPhone.mCM.unregisterForAvailable(this);
147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mPhone.mCM.unregisterForOffOrNotAvailable(this);
148bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        IccRecords r = mIccRecords.get();
149bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        if (r != null) { r.unregisterForRecordsLoaded(this);}
150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mPhone.mCM.unregisterForDataNetworkStateChanged(this);
151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaPhone.mCT.unregisterForVoiceCallEnded(this);
152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaPhone.mCT.unregisterForVoiceCallStarted(this);
153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaPhone.mSST.unregisterForDataConnectionAttached(this);
154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaPhone.mSST.unregisterForDataConnectionDetached(this);
155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaPhone.mSST.unregisterForRoamingOn(this);
156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaPhone.mSST.unregisterForRoamingOff(this);
157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCdmaSSM.dispose(this);
158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mPhone.mCM.unregisterForCdmaOtaProvision(this);
159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        destroyAllDataConnectionList();
161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void finalize() {
165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if(DBG) log("CdmaDataConnectionTracker finalized");
166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected String getActionIntentReconnectAlarm() {
170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return INTENT_RECONNECT_ALARM;
171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected String getActionIntentDataStallAlarm() {
175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return INTENT_DATA_STALL_ALARM;
176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void restartDataStallAlarm() {}
180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void setState(DctConstants.State s) {
183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log ("setState: " + s);
184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mState != s) {
185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            EventLog.writeEvent(EventLogTags.CDMA_DATA_STATE_CHANGE,
186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mState.toString(), s.toString());
187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mState = s;
188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public synchronized DctConstants.State getState(String apnType) {
193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mState;
194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
197cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla    public DctConstants.State getOverallState() {
198cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla        return mState;
199cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla    }
200cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla
201cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla    @Override
202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected boolean isApnTypeAvailable(String type) {
203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (String s : mSupportedApnTypes) {
204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (TextUtils.equals(type, s)) {
205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return true;
206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return false;
209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected boolean isDataAllowed() {
213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        final boolean internalDataEnabled;
214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        synchronized (mDataEnabledLock) {
215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            internalDataEnabled = mInternalDataEnabled;
216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int psState = mCdmaPhone.mSST.getCurrentDataConnectionState();
219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean roaming = (mPhone.getServiceState().getRoaming() && !getDataOnRoamingEnabled());
220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean desiredPowerState = mCdmaPhone.mSST.getDesiredPowerState();
221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean subscriptionFromNv = (mCdmaSSM.getCdmaSubscriptionSource()
222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                       == CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_NV);
223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
224bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        IccRecords r = mIccRecords.get();
225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean allowed =
226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    (psState == ServiceState.STATE_IN_SERVICE ||
227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            mAutoAttachOnCreation) &&
228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    (subscriptionFromNv ||
229bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka                            (r != null && r.getRecordsLoaded())) &&
230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    (mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed() ||
231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            mPhone.getState() ==PhoneConstants.State.IDLE) &&
232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    !roaming &&
233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    internalDataEnabled &&
234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    desiredPowerState &&
235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    !mPendingRestartRadio &&
236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ((mPhone.getLteOnCdmaMode() ==PhoneConstants.LTE_ON_CDMA_TRUE) ||
237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            !mCdmaPhone.needsOtaServiceProvisioning());
238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (!allowed && DBG) {
239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String reason = "";
240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!((psState == ServiceState.STATE_IN_SERVICE) || mAutoAttachOnCreation)) {
241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                reason += " - psState= " + psState;
242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!subscriptionFromNv &&
244bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka                    !(r != null && r.getRecordsLoaded())) {
245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                reason += " - RUIM not loaded";
246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!(mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed() ||
248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mPhone.getState() ==PhoneConstants.State.IDLE)) {
249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                reason += " - concurrentVoiceAndData not allowed and state= " + mPhone.getState();
250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (roaming) reason += " - Roaming";
252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!internalDataEnabled) reason += " - mInternalDataEnabled= false";
253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!desiredPowerState) reason += " - desiredPowerState= false";
254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (mPendingRestartRadio) reason += " - mPendingRestartRadio= true";
255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (mCdmaPhone.needsOtaServiceProvisioning()) reason += " - needs Provisioning";
256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("Data not allowed due to" + reason);
257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return allowed;
259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected boolean isDataPossible(String apnType) {
263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean possible = isDataAllowed() && !(getAnyDataEnabled() &&
264abd59738ceb9d21b8bf159d4625ea9b0ade873eeRobert Greenwalt                mState == DctConstants.State.FAILED);
265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (!possible && DBG && isDataAllowed()) {
266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("Data not possible.  No coverage: dataState = " + mState);
267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return possible;
269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean trySetupData(String reason) {
272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("***trySetupData due to " + (reason == null ? "(unspecified)" : reason));
273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mPhone.getSimulatedRadioControl() != null) {
275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Assume data is connected on the simulator
276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // FIXME  this can be improved
277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            setState(DctConstants.State.CONNECTED);
278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyDataConnection(reason);
279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyOffApnsOfAvailability(reason);
280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("(fix?) We're on the simulator; assuming data is connected");
282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return true;
283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int psState = mCdmaPhone.mSST.getCurrentDataConnectionState();
286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean roaming = mPhone.getServiceState().getRoaming();
287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean desiredPowerState = mCdmaPhone.mSST.getDesiredPowerState();
288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if ((mState == DctConstants.State.IDLE || mState == DctConstants.State.SCANNING) &&
290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isDataAllowed() && getAnyDataEnabled() && !isEmergency()) {
291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            boolean retValue = setupData(reason);
292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyOffApnsOfAvailability(reason);
293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return retValue;
294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyOffApnsOfAvailability(reason);
296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return false;
297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Cleanup the CDMA data connection (only one is supported)
302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param tearDown true if the underlying DataConnection should be disconnected.
304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param reason for the clean up.
305cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla     * @param doAll Set RefCount to 0 and tear down data call even if
306cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla     *              multiple APN types are associated with it.
307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void cleanUpConnection(boolean tearDown, String reason, boolean doAll) {
309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("cleanUpConnection: reason: " + reason);
310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Clear the reconnect alarm, if set.
312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mReconnectIntent != null) {
313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            AlarmManager am =
314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            am.cancel(mReconnectIntent);
316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mReconnectIntent = null;
317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setState(DctConstants.State.DISCONNECTING);
320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        notifyOffApnsOfAvailability(reason);
321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean notificationDeferred = false;
323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (DataConnection conn : mDataConnections.values()) {
324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if(conn != null) {
325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                DataConnectionAc dcac =
326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mDataConnectionAsyncChannels.get(conn.getDataConnectionId());
327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (tearDown) {
328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (doAll) {
329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (DBG) log("cleanUpConnection: teardown, conn.tearDownAll");
330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        conn.tearDownAll(reason, obtainMessage(DctConstants.EVENT_DISCONNECT_DONE,
331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                conn.getDataConnectionId(), 0, reason));
332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } else {
333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (DBG) log("cleanUpConnection: teardown, conn.tearDown");
334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        conn.tearDown(reason, obtainMessage(DctConstants.EVENT_DISCONNECT_DONE,
335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                conn.getDataConnectionId(), 0, reason));
336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    notificationDeferred = true;
338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("cleanUpConnection: !tearDown, call conn.resetSynchronously");
340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (dcac != null) {
341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        dcac.resetSync();
342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    notificationDeferred = false;
344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        stopNetStatPoll();
349cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla        stopDataStallAlarm();
350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (!notificationDeferred) {
352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("cleanupConnection: !notificationDeferred");
353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            gotoIdleAndNotifyDataConnection(reason);
354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private CdmaDataConnection findFreeDataConnection() {
358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (DataConnectionAc dcac : mDataConnectionAsyncChannels.values()) {
359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (dcac.isInactiveSync()) {
360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("found free GsmDataConnection");
361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return (CdmaDataConnection) dcac.dataConnection;
362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("NO free CdmaDataConnection");
365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return null;
366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean setupData(String reason) {
369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        CdmaDataConnection conn = findFreeDataConnection();
370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (conn == null) {
372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("setupData: No free CdmaDataConnection found!");
373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return false;
374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        /** TODO: We probably want the connection being setup to a parameter passed around */
377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mPendingDataConnection = conn;
378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String[] types;
379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int apnId;
380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mRequestedApnType.equals(PhoneConstants.APN_TYPE_DUN)) {
381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            types = mDunApnTypes;
382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            apnId = DctConstants.APN_DUN_ID;
383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            types = mDefaultApnTypes;
385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            apnId = mDefaultApnId;
386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mActiveApn = new ApnSetting(apnId, "", "", "", "", "", "", "", "", "",
388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                    "", 0, types, "IP", "IP", true, 0);
389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("call conn.bringUp mActiveApn=" + mActiveApn);
390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Message msg = obtainMessage();
392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        msg.what = DctConstants.EVENT_DATA_SETUP_COMPLETE;
393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        msg.obj = reason;
394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        conn.bringUp(msg, mActiveApn);
395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setState(DctConstants.State.INITING);
397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        notifyDataConnection(reason);
398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return true;
399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void notifyDefaultData(String reason) {
402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setState(DctConstants.State.CONNECTED);
403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        notifyDataConnection(reason);
404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        startNetStatPoll();
405cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla        startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mDataConnections.get(0).resetRetryCount();
407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void restartRadio() {
411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("Cleanup connection and wait " +
412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                (TIME_DELAYED_TO_RESTART_RADIO / 1000) + "s to restart radio");
413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cleanUpAllConnections(null);
414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        sendEmptyMessageDelayed(DctConstants.EVENT_RESTART_RADIO, TIME_DELAYED_TO_RESTART_RADIO);
415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mPendingRestartRadio = true;
416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Returns true if the last fail cause is something that
420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * seems like it deserves an error notification.
421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Transient errors are ignored
422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean
424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    shouldPostNotification(FailCause cause) {
425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return (cause != FailCause.UNKNOWN);
426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return true if data connection need to be setup after disconnected due to
430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * reason.
431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param reason the reason why data is disconnected
433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @return true if try setup data connection is need for this reason
434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean retryAfterDisconnected(String reason) {
436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean retry = true;
437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if ( Phone.REASON_RADIO_TURNED_OFF.equals(reason) ) {
439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            retry = false;
440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return retry;
442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void reconnectAfterFail(FailCause lastFailCauseCode, String reason, int retryOverride) {
445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mState == DctConstants.State.FAILED) {
446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            /**
447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             * For now With CDMA we never try to reconnect on
448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             * error and instead just continue to retry
449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             * at the last time until the state is changed.
450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             * TODO: Make this configurable?
451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             */
452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int nextReconnectDelay = retryOverride;
453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (nextReconnectDelay < 0) {
454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                nextReconnectDelay = mDataConnections.get(0).getRetryTimer();
455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mDataConnections.get(0).increaseRetryCount();
456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            startAlarmForReconnect(nextReconnectDelay, reason);
458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!shouldPostNotification(lastFailCauseCode)) {
460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("NOT Posting Data Connection Unavailable notification "
461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                + "-- likely transient error");
462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                notifyNoData(lastFailCauseCode);
464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void startAlarmForReconnect(int delay, String reason) {
469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("Data Connection activate failed. Scheduling next attempt for "
471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                + (delay / 1000) + "s");
472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        AlarmManager am =
474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Intent intent = new Intent(INTENT_RECONNECT_ALARM);
476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, reason);
477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mReconnectIntent = PendingIntent.getBroadcast(
478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mPhone.getContext(), 0, intent, 0);
479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                SystemClock.elapsedRealtime() + delay, mReconnectIntent);
481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void notifyNoData(FailCause lastFailCauseCode) {
485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setState(DctConstants.State.FAILED);
486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        notifyOffApnsOfAvailability(null);
487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void gotoIdleAndNotifyDataConnection(String reason) {
490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("gotoIdleAndNotifyDataConnection: reason=" + reason);
491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setState(DctConstants.State.IDLE);
492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        notifyDataConnection(reason);
493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mActiveApn = null;
494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onRecordsLoaded() {
497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mState == DctConstants.State.FAILED) {
498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            cleanUpAllConnections(null);
499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, Phone.REASON_SIM_LOADED));
501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onNVReady() {
504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mState == DctConstants.State.FAILED) {
505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            cleanUpAllConnections(null);
506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA));
508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @override com.android.internal.telephony.DataConnectionTracker
512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onEnableNewApn() {
515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // No mRequestedApnType check; only one connection is supported
516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cleanUpConnection(true, Phone.REASON_APN_SWITCHED, false);
517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @override com.android.internal.telephony.DataConnectionTracker
521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected boolean onTrySetupData(String reason) {
524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return trySetupData(reason);
525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @override com.android.internal.telephony.DataConnectionTracker
529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onRoamingOff() {
532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mUserDataEnabled == false) return;
533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (getDataOnRoamingEnabled() == false) {
535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyOffApnsOfAvailability(Phone.REASON_ROAMING_OFF);
536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            trySetupData(Phone.REASON_ROAMING_OFF);
537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyDataConnection(Phone.REASON_ROAMING_OFF);
539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @override com.android.internal.telephony.DataConnectionTracker
544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onRoamingOn() {
547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mUserDataEnabled == false) return;
548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (getDataOnRoamingEnabled()) {
550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            trySetupData(Phone.REASON_ROAMING_ON);
551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyDataConnection(Phone.REASON_ROAMING_ON);
552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("Tear down data connection on roaming.");
554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            cleanUpAllConnections(null);
555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON);
556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @override com.android.internal.telephony.DataConnectionTracker
561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onRadioAvailable() {
564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mPhone.getSimulatedRadioControl() != null) {
565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Assume data is connected on the simulator
566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // FIXME  this can be improved
567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            setState(DctConstants.State.CONNECTED);
568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyDataConnection(null);
569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("We're on the simulator; assuming data is connected");
571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        notifyOffApnsOfAvailability(null);
574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mState != DctConstants.State.IDLE) {
576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            cleanUpAllConnections(null);
577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @override com.android.internal.telephony.DataConnectionTracker
582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onRadioOffOrNotAvailable() {
585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mDataConnections.get(0).resetRetryCount();
586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mPhone.getSimulatedRadioControl() != null) {
588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Assume data is connected on the simulator
589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // FIXME  this can be improved
590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("We're on the simulator; assuming radio off is meaningless");
591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("Radio is off and clean up all connection");
593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            cleanUpAllConnections(null);
594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @override com.android.internal.telephony.DataConnectionTracker
599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onDataSetupComplete(AsyncResult ar) {
602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String reason = null;
603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ar.userObj instanceof String) {
604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            reason = (String) ar.userObj;
605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (isDataSetupCompleteOk(ar)) {
608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Everything is setup
609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyDefaultData(reason);
610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            FailCause cause = (FailCause) (ar.result);
612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if(DBG) log("Data Connection setup failed " + cause);
613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // No try for permanent failure
615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (cause.isPermanentFail()) {
616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                notifyNoData(cause);
617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return;
618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int retryOverride = -1;
621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ar.exception instanceof DataConnection.CallSetupException) {
622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                retryOverride =
623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ((DataConnection.CallSetupException)ar.exception).getRetryOverride();
624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (retryOverride == RILConstants.MAX_INT) {
626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("No retry is suggested.");
627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                startDelayedRetry(cause, reason, retryOverride);
629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Called when DctConstants.EVENT_DISCONNECT_DONE is received.
635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onDisconnectDone(int connId, AsyncResult ar) {
638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if(DBG) log("EVENT_DISCONNECT_DONE connId=" + connId);
639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String reason = null;
640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ar.userObj instanceof String) {
641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            reason = (String) ar.userObj;
642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setState(DctConstants.State.IDLE);
644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Since the pending request to turn off or restart radio will be processed here,
646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // remove the pending event to restart radio from the message queue.
647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mPendingRestartRadio) removeMessages(DctConstants.EVENT_RESTART_RADIO);
648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Process the pending request to turn off radio in ServiceStateTracker first.
650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // If radio is turned off in ServiceStateTracker, ignore the pending event to restart radio.
651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        CdmaServiceStateTracker ssTracker = mCdmaPhone.mSST;
652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ssTracker.processPendingRadioPowerOffAfterDataOff()) {
653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mPendingRestartRadio = false;
654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            onRestartRadio();
656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        notifyDataConnection(reason);
659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mActiveApn = null;
660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (retryAfterDisconnected(reason)) {
661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville          // Wait a bit before trying, so we're not tying up RIL command channel.
662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville          startAlarmForReconnect(APN_DELAY_MILLIS, reason);
663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville      }
664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @override com.android.internal.telephony.DataConnectionTracker
668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onVoiceCallStarted() {
671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mState == DctConstants.State.CONNECTED &&
672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                !mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed()) {
673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            stopNetStatPoll();
674cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla            stopDataStallAlarm();
675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyDataConnection(Phone.REASON_VOICE_CALL_STARTED);
676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyOffApnsOfAvailability(Phone.REASON_VOICE_CALL_STARTED);
677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @override com.android.internal.telephony.DataConnectionTracker
682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onVoiceCallEnded() {
685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mState == DctConstants.State.CONNECTED) {
686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed()) {
687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                startNetStatPoll();
688cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla                startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED);
690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // clean slate after call end.
692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                resetPollStats();
693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyOffApnsOfAvailability(Phone.REASON_VOICE_CALL_ENDED);
695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mDataConnections.get(0).resetRetryCount();
697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // in case data setup was attempted when we were on a voice call
698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            trySetupData(Phone.REASON_VOICE_CALL_ENDED);
699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onCleanUpConnection(boolean tearDown, int apnId, String reason) {
704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // No apnId check; only one connection is supported
705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cleanUpConnection(tearDown, reason, (apnId == DctConstants.APN_DUN_ID));
706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onCleanUpAllConnections(String cause) {
710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Only one CDMA connection is supported
711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        cleanUpConnection(true, cause, false);
712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void createAllDataConnectionList() {
715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        CdmaDataConnection dataConn;
716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String retryConfig = SystemProperties.get("ro.cdma.data_retry_config");
718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (int i = 0; i < DATA_CONNECTION_POOL_SIZE; i++) {
719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            RetryManager rm = new RetryManager();
720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!rm.configure(retryConfig)) {
721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (!rm.configure(DEFAULT_DATA_RETRY_CONFIG)) {
722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Should never happen, log an error and default to a simple linear sequence.
723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("Could not configure using DEFAULT_DATA_RETRY_CONFIG="
724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + DEFAULT_DATA_RETRY_CONFIG);
725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    rm.configure(20, 2000, 1000);
726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int id = mUniqueIdGenerator.getAndIncrement();
730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            dataConn = CdmaDataConnection.makeDataConnection(mCdmaPhone, id, rm, this);
731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mDataConnections.put(id, dataConn);
732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            DataConnectionAc dcac = new DataConnectionAc(dataConn, LOG_TAG);
733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int status = dcac.fullyConnectSync(mPhone.getContext(), this, dataConn.getHandler());
734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (status == AsyncChannel.STATUS_SUCCESSFUL) {
735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("Fully connected");
736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mDataConnectionAsyncChannels.put(dcac.dataConnection.getDataConnectionId(), dcac);
737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("Could not connect to dcac.dataConnection=" + dcac.dataConnection +
739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        " status=" + status);
740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void destroyAllDataConnectionList() {
746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if(mDataConnections != null) {
747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mDataConnections.clear();
748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void onCdmaDataDetached() {
752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mState == DctConstants.State.CONNECTED) {
753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            startNetStatPoll();
754cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla            startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            notifyDataConnection(Phone.REASON_CDMA_DATA_DETACHED);
756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (mState == DctConstants.State.FAILED) {
758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                cleanUpConnection(false, Phone.REASON_CDMA_DATA_DETACHED, false);
759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mDataConnections.get(0).resetRetryCount();
760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                CdmaCellLocation loc = (CdmaCellLocation)(mPhone.getCellLocation());
762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                EventLog.writeEvent(EventLogTags.CDMA_DATA_SETUP_FAILED,
763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        loc != null ? loc.getBaseStationId() : -1,
764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        TelephonyManager.getDefault().getNetworkType());
765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            trySetupData(Phone.REASON_CDMA_DATA_DETACHED);
767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void onCdmaOtaProvision(AsyncResult ar) {
771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ar.exception != null) {
772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int [] otaPrivision = (int [])ar.result;
773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if ((otaPrivision != null) && (otaPrivision.length > 1)) {
774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                switch (otaPrivision[0]) {
775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED:
776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED:
777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mDataConnections.get(0).resetRetryCount();
778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                default:
780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void onRestartRadio() {
787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mPendingRestartRadio) {
788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("************TURN OFF RADIO**************");
789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mPhone.mCM.setRadioPower(false, null);
790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            /* Note: no need to call setRadioPower(true).  Assuming the desired
791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             * radio power state is still ON (as tracked by ServiceStateTracker),
792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             * ServiceStateTracker will call setRadioPower when it receives the
793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             * RADIO_STATE_CHANGED notification for the power off.  And if the
794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             * desired power state has changed in the interim, we don't want to
795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             * override it with an unconditional power on.
796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             */
797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mPendingRestartRadio = false;
798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void writeEventLogCdmaDataDrop() {
802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        CdmaCellLocation loc = (CdmaCellLocation)(mPhone.getCellLocation());
803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        EventLog.writeEvent(EventLogTags.CDMA_DATA_DROP,
804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                loc != null ? loc.getBaseStationId() : -1,
805c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                TelephonyManager.getDefault().getNetworkType());
806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onDataStateChanged(AsyncResult ar) {
809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        ArrayList<DataCallState> dataCallStates = (ArrayList<DataCallState>)(ar.result);
810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ar.exception != null) {
812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // This is probably "radio not available" or something
813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // of that sort. If so, the whole connection is going
814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // to come down soon anyway
815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mState == DctConstants.State.CONNECTED) {
819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            boolean isActiveOrDormantConnectionPresent = false;
820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int connectionState = DATA_CONNECTION_ACTIVE_PH_LINK_INACTIVE;
821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
822c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Check for an active or dormant connection element in
823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // the DATA_CALL_LIST array
824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            for (int index = 0; index < dataCallStates.size(); index++) {
825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                connectionState = dataCallStates.get(index).active;
826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (connectionState != DATA_CONNECTION_ACTIVE_PH_LINK_INACTIVE) {
827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    isActiveOrDormantConnectionPresent = true;
828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
830c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!isActiveOrDormantConnectionPresent) {
833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // No active or dormant connection
834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("onDataStateChanged: No active connection"
835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        + "state is CONNECTED, disconnecting/cleanup");
836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                writeEventLogCdmaDataDrop();
837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                cleanUpConnection(true, null, false);
838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return;
839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            switch (connectionState) {
842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                case DATA_CONNECTION_ACTIVE_PH_LINK_UP:
843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("onDataStateChanged: active=LINK_ACTIVE && CONNECTED, ignore");
844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mActivity = DctConstants.Activity.NONE;
845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mPhone.notifyDataActivity();
846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    startNetStatPoll();
847cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla                    startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
849c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                case DATA_CONNECTION_ACTIVE_PH_LINK_DOWN:
851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("onDataStateChanged active=LINK_DOWN && CONNECTED, dormant");
852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mActivity = DctConstants.Activity.DORMANT;
853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mPhone.notifyDataActivity();
854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    stopNetStatPoll();
855cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla                    stopDataStallAlarm();
856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
857c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                default:
859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("onDataStateChanged: IGNORE unexpected DataCallState.active="
860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + connectionState);
861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // TODO: Do we need to do anything?
864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("onDataStateChanged: not connected, state=" + mState + " ignoring");
865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void startDelayedRetry(FailCause cause, String reason, int retryOverride) {
869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        notifyNoData(cause);
870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        reconnectAfterFail(cause, reason, retryOverride);
871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void handleMessage (Message msg) {
875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (DBG) log("CdmaDCT handleMessage msg=" + msg);
876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (!mPhone.mIsTheCurrentActivePhone || mIsDisposed) {
878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("Ignore CDMA msgs since CDMA phone is inactive");
879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
880c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch (msg.what) {
883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case DctConstants.EVENT_RECORDS_LOADED:
884c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                onRecordsLoaded();
885c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
886c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case DctConstants.EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED:
888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if(mCdmaSSM.getCdmaSubscriptionSource() ==
889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                       CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_NV) {
890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    onNVReady();
891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
892c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case DctConstants.EVENT_CDMA_DATA_DETACHED:
895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                onCdmaDataDetached();
896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
898c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case DctConstants.EVENT_DATA_STATE_CHANGED:
899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                onDataStateChanged((AsyncResult) msg.obj);
900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
901c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
902c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case DctConstants.EVENT_CDMA_OTA_PROVISION:
903c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                onCdmaOtaProvision((AsyncResult) msg.obj);
904c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
905c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case DctConstants.EVENT_RESTART_RADIO:
907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("EVENT_RESTART_RADIO");
908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                onRestartRadio();
909c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
910c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
911c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
912c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // handle the message in the super class DataConnectionTracker
913c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                super.handleMessage(msg);
914c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
916bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    }
917bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
918bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    @Override
919bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    protected void onUpdateIcc() {
920bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        if (mUiccController == null ) {
921bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka            return;
922bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        }
923bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
924e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        IccRecords newIccRecords = mUiccController.getIccRecords(UiccController.APP_FAM_3GPP2);
925bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
926bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        IccRecords r = mIccRecords.get();
927bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        if (r != newIccRecords) {
928bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka            if (r != null) {
929bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka                log("Removing stale icc objects.");
930bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka                r.unregisterForRecordsLoaded(this);
931bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka                mIccRecords.set(null);
932bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka            }
933bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka            if (newIccRecords != null) {
934e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                log("New records found");
935bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka                mIccRecords.set(newIccRecords);
936bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka                newIccRecords.registerForRecordsLoaded(
937bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka                        this, DctConstants.EVENT_RECORDS_LOADED, null);
938bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka            }
939bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        }
940c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
941c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
942c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
943c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean isDisconnected() {
944c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return ((mState == DctConstants.State.IDLE) || (mState == DctConstants.State.FAILED));
945c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
946c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
948cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla    protected boolean isConnected() {
949cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla        return (mState == DctConstants.State.CONNECTED);
950cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla    }
951cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla
952cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla    @Override
953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void log(String s) {
954c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Log.d(LOG_TAG, "[CdmaDCT] " + s);
955c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
956c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
957c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
958c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void loge(String s) {
959c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Log.e(LOG_TAG, "[CdmaDCT] " + s);
960c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
961c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
962c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
963c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
964c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println("CdmaDataConnectionTracker extends:");
965c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super.dump(fd, pw, args);
966c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mCdmaPhone=" + mCdmaPhone);
967c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mCdmaSSM=" + mCdmaSSM);
968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mPendingDataConnection=" + mPendingDataConnection);
969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mPendingRestartRadio=" + mPendingRestartRadio);
970c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mSupportedApnTypes=" + mSupportedApnTypes);
971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mDefaultApnTypes=" + mDefaultApnTypes);
972c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mDunApnTypes=" + mDunApnTypes);
973c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" mDefaultApnId=" + mDefaultApnId);
974c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
975c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville}
976