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