DataConnection.java revision f3ab6ab303e1da929ce26b7c5d63565bff136221
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 174918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savillepackage com.android.internal.telephony.dataconnection; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 20ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.CommandException; 21ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.DctConstants; 22ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.telephony.Phone; 234918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.PhoneBase; 24cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.PhoneConstants; 254918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RILConstants; 264918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RetryManager; 27ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.AsyncChannel; 28ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.Protocol; 29ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.State; 30ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.internal.util.StateMachine; 31ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 32ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.app.PendingIntent; 33ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.net.LinkProperties; 3496cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwaltimport android.net.NetworkCapabilities; 359c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monkimport android.net.ProxyInfo; 36ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.AsyncResult; 372cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Savilleimport android.os.Build; 38ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.Message; 39ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.SystemClock; 40ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.SystemProperties; 41ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.Rlog; 42203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.telephony.ServiceState; 43ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.TelephonyManager; 44203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.text.TextUtils; 45203e588e3c42a81aa8a56f595119c181a63b12caWink Savilleimport android.util.Pair; 46ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.util.Patterns; 47ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.util.TimeUtils; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor; 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter; 51ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.ArrayList; 52ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.List; 53ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.concurrent.atomic.AtomicInteger; 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 57ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 58ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * DataConnection StateMachine. 59ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 60ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * This a class for representing a single data connection, with instances of this 61ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * class representing a connection via the cellular network. There may be multiple 62ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * data connections and all of them are managed by the <code>DataConnectionTracker</code>. 63ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 64ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * A recent change is to move retry handling into this class, with that change the 65ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * old retry manager is now used internally rather than exposed to the DCT. Also, 66ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * bringUp now has an initialRetry which is used limit the number of retries 67ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * during the initial bring up of the connection. After the connection becomes active 68ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * the current max retry is restored to the configured value. 69ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 70ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * NOTE: All DataConnection objects must be running on the same looper, which is the default 71ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * as the coordinator has members which are used without synchronization. 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 73ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepublic final class DataConnection extends StateMachine { 74ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean DBG = true; 75ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean VDBG = true; 76ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 77ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Retry configuration: A doubling of retry times from 5secs to 30minutes */ 78ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String DEFAULT_DATA_RETRY_CONFIG = "default_randomization=2000," 79ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "5000,10000,20000,40000,80000:5000,160000:5000," 80ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "320000:5000,640000:5000,1280000:5000,1800000:5000"; 81ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 82ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Retry configuration for secondary networks: 4 tries in 20 sec */ 83ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String SECONDARY_DATA_RETRY_CONFIG = 84ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "max_retries=3, 5000, 5000, 5000"; 85ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 86ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The data connection controller 87ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcController mDcController; 88ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 89ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The Tester for failing all bringup's 90ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcTesterFailBringUpAll mDcTesterFailBringUpAll; 91ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 92ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static AtomicInteger mInstanceNumber = new AtomicInteger(0); 93ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private AsyncChannel mAc; 94ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 95ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Utilities for the DataConnection 96ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcRetryAlarmController mDcRetryAlarmController; 97ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 98ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The DCT that's talking to us, we only support one! 99454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private DcTrackerBase mDct = null; 100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving connecting parameters. 103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class ConnectionParams { 105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mInitialMaxRetry; 108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mProfileId; 109203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int mRilRat; 110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams(ApnContext apnContext, int initialMaxRetry, int profileId, 113203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int rilRadioTechnology, Message onCompletedMsg) { 114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInitialMaxRetry = initialMaxRetry; 116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mProfileId = profileId; 117203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rilRadioTechnology; 118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mInitialMaxRetry=" + mInitialMaxRetry + " mProfileId=" + mProfileId 125203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRat=" + mRilRat 126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving disconnecting parameters. 132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class DisconnectParams { 134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String mReason; 137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams(ApnContext apnContext, String reason, Message onCompletedMsg) { 140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReason = reason; 142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mReason=" + mReason 149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1522563e7e1ec513121b980045571a245aa5390f1c5Wink Saville 153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ApnSetting mApnSetting; 154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ConnectionParams mConnectionParams; 155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DisconnectParams mDisconnectParams; 156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mDcFailCause; 157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private PhoneBase mPhone; 159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private LinkProperties mLinkProperties = new LinkProperties(); 160f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt private NetworkCapabilities mNetworkCapabilities = new NetworkCapabilities(); 161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mCreateTime; 162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mLastFailTime; 163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mLastFailCause; 164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String NULL_IP = "0.0.0.0"; 165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private Object mUserData; 166203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mRilRat = Integer.MAX_VALUE; 167203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private int mDataRegState = Integer.MAX_VALUE; 168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Package visible variables 170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mCid; 172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville List<ApnContext> mApnContexts = null; 173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville PendingIntent mReconnectIntent = null; 174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville RetryManager mRetryManager = new RetryManager(); 175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ***** Event codes for driving the state machine, package visible for Dcc 178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int BASE = Protocol.BASE_DATA_CONNECTION; 179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_CONNECT = BASE + 0; 180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_SETUP_DATA_CONNECTION_DONE = BASE + 1; 181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_GET_LAST_FAIL_DONE = BASE + 2; 182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DEACTIVATE_DONE = BASE + 3; 183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT = BASE + 4; 184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RIL_CONNECTED = BASE + 5; 185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT_ALL = BASE + 6; 186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DATA_STATE_CHANGED = BASE + 7; 187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_TEAR_DOWN_NOW = BASE + 8; 188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_LOST_CONNECTION = BASE + 9; 189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RETRY_CONNECTION = BASE + 10; 190203e588e3c42a81aa8a56f595119c181a63b12caWink Saville static final int EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED = BASE + 11; 191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 192203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private static final int CMD_TO_STRING_COUNT = EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED - BASE + 1; 193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; 194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static { 195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_CONNECT - BASE] = "EVENT_CONNECT"; 196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_SETUP_DATA_CONNECTION_DONE - BASE] = 197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "EVENT_SETUP_DATA_CONNECTION_DONE"; 198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_GET_LAST_FAIL_DONE - BASE] = "EVENT_GET_LAST_FAIL_DONE"; 199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DEACTIVATE_DONE - BASE] = "EVENT_DEACTIVATE_DONE"; 200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT - BASE] = "EVENT_DISCONNECT"; 201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RIL_CONNECTED - BASE] = "EVENT_RIL_CONNECTED"; 202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT_ALL - BASE] = "EVENT_DISCONNECT_ALL"; 203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DATA_STATE_CHANGED - BASE] = "EVENT_DATA_STATE_CHANGED"; 204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_TEAR_DOWN_NOW - BASE] = "EVENT_TEAR_DOWN_NOW"; 205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_LOST_CONNECTION - BASE] = "EVENT_LOST_CONNECTION"; 206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RETRY_CONNECTION - BASE] = "EVENT_RETRY_CONNECTION"; 207203e588e3c42a81aa8a56f595119c181a63b12caWink Saville sCmdToString[EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED - BASE] = 208203e588e3c42a81aa8a56f595119c181a63b12caWink Saville "EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED"; 209ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Convert cmd to string or null if unknown 211ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static String cmdToString(int cmd) { 212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String value; 213ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cmd -= BASE; 214ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((cmd >= 0) && (cmd < sCmdToString.length)) { 215ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = sCmdToString[cmd]; 216ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 217454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville value = DcAsyncChannel.cmdToString(cmd + BASE); 218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (value == null) { 220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = "0x" + Integer.toHexString(cmd + BASE); 221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return value; 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 226cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Create the connection object 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 228cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param phone the Phone 229cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param id the connection id 230cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return DataConnection that was created. 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static DataConnection makeDataConnection(PhoneBase phone, int id, 233454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, 234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection dc = new DataConnection(phone, 236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DC-" + mInstanceNumber.incrementAndGet(), id, dct, failBringUpAll, dcc); 237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dc.start(); 238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) dc.log("Made " + dc.getName()); 239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return dc; 240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void dispose() { 243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("dispose: call quiteNow()"); 244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quitNow(); 245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* Getter functions */ 248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 249f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities getCopyNetworkCapabilities() { 250f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt return new NetworkCapabilities(mNetworkCapabilities); 251f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 252f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties getCopyLinkProperties() { 254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return new LinkProperties(mLinkProperties); 255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean getIsInactive() { 258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getCurrentState() == mInactiveState; 259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int getCid() { 262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mCid; 263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting getApnSetting() { 266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mApnSetting; 267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2699c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk void setLinkPropertiesHttpProxy(ProxyInfo proxy) { 270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties.setHttpProxy(proxy); 271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class UpdateLinkPropertyResult { 274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public DataCallResponse.SetupResult setupResult = DataCallResponse.SetupResult.SUCCESS; 275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties oldLp; 276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties newLp; 277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public UpdateLinkPropertyResult(LinkProperties curLp) { 278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville oldLp = curLp; 279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville newLp = curLp; 280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult updateLinkProperty(DataCallResponse newState) { 284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties); 285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (newState == null) return result; 287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult setupResult; 289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp = new LinkProperties(); 290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.setupResult = setLinkProperties(newState, result.newLp); 293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result.setupResult != DataCallResponse.SetupResult.SUCCESS) { 294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("updateLinkProperty failed : " + result.setupResult); 295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // copy HTTP proxy as it is not part DataCallResponse. 298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp.setHttpProxy(mLinkProperties.getHttpProxy()); 299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG && (! result.oldLp.equals(result.newLp))) { 301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty old LP=" + result.oldLp); 302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty new LP=" + result.newLp); 303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = result.newLp; 305f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt 306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Constructor (NOTE: uses dcc.getHandler() as its Handler) 310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataConnection(PhoneBase phone, String name, int id, 311454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, 312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville super(name, dcc.getHandler()); 314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogRecSize(300); 315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogOnlyTransitions(true); 316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DataConnection constructor E"); 317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 318ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = phone; 319ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = dct; 320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = failBringUpAll; 321ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = dcc; 322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mId = id; 323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = new DcRetryAlarmController(mPhone, this); 325203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = mPhone.getServiceState().getRilDataRadioTechnology(); 326203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = mPhone.getServiceState().getDataRegState(); 327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDefaultState); 329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mInactiveState, mDefaultState); 330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActivatingState, mDefaultState); 331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mRetryingState, mDefaultState); 332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActiveState, mDefaultState); 333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingState, mDefaultState); 334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingErrorCreatingConnection, mDefaultState); 335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setInitialState(mInactiveState); 336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = new ArrayList<ApnContext>(); 338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DataConnection constructor X"); 339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private String getRetryConfig(boolean forDefault) { 342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int nt = mPhone.getServiceState().getNetworkType(); 343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 3442cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Saville if (Build.IS_DEBUGGABLE) { 345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String config = SystemProperties.get("test.data_retry_config"); 346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (! TextUtils.isEmpty(config)) { 347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return config; 348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((nt == TelephonyManager.NETWORK_TYPE_CDMA) || 352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_1xRTT) || 353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_0) || 354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_A) || 355ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_B) || 356ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EHRPD)) { 357ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // CDMA variant 358ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.cdma.data_retry_config"); 359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 360ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Use GSM variant for all others. 361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (forDefault) { 362ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.gsm.data_retry_config"); 363ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.gsm.2nd_data_retry_config"); 365ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 366ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 367ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 368ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 369ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void configureRetry(boolean forDefault) { 370ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retryConfig = getRetryConfig(forDefault); 371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 372ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(retryConfig)) { 373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (forDefault) { 374ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(DEFAULT_DATA_RETRY_CONFIG)) { 375ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Should never happen, log an error and default to a simple linear sequence. 376ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("configureRetry: Could not configure using " + 377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DEFAULT_DATA_RETRY_CONFIG=" + DEFAULT_DATA_RETRY_CONFIG); 378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.configure(5, 2000, 1000); 379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(SECONDARY_DATA_RETRY_CONFIG)) { 382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Should never happen, log an error and default to a simple sequence. 383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("configureRetry: Could note configure using " + 384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "SECONDARY_DATA_RETRY_CONFIG=" + SECONDARY_DATA_RETRY_CONFIG); 385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.configure(5, 2000, 1000); 386ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 387ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 388ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 389ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 390ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("configureRetry: forDefault=" + forDefault + " mRetryManager=" + mRetryManager); 391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 395cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Begin setting up a data connection, calls setupDataCall 396cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * and the ConnectionParams will be returned with the 397cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj. 3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 399cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param cp is the connection parameters 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void onConnect(ConnectionParams cp) { 402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onConnect: carrier='" + mApnSetting.carrier 403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' APN='" + mApnSetting.apn 404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' proxy='" + mApnSetting.proxy + "' port='" + mApnSetting.port + "'"); 4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if we should fake an error. 407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDcTesterFailBringUpAll.getDcFailBringUp().mCounter > 0) { 408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = new DataCallResponse(); 409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.version = mPhone.mCi.getRilVersion(); 410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.status = mDcTesterFailBringUpAll.getDcFailBringUp().mFailCause.getErrorCode(); 411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.cid = 0; 412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.active = 0; 413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.type = ""; 414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.ifname = ""; 415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.addresses = new String[0]; 416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.dnses = new String[0]; 417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.gateways = new String[0]; 418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.suggestedRetryTime = 419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mSuggestedRetryTime; 420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg, response, null); 423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(msg); 424ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onConnect: FailBringUpAll=" + mDcTesterFailBringUpAll.getDcFailBringUp() 426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " send error response=" + response); 427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mCounter -= 1; 429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return; 430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 43222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = -1; 43322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mLastFailTime = -1; 434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 436cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // msg.obj will be returned in AsyncResult.userObj; 437cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 438cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville msg.obj = cp; 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int authType = mApnSetting.authType; 441cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (authType == -1) { 442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville authType = TextUtils.isEmpty(mApnSetting.user) ? RILConstants.SETUP_DATA_AUTH_NONE 443cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville : RILConstants.SETUP_DATA_AUTH_PAP_CHAP; 4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 446cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String protocol; 44722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPhone.getServiceState().getRoaming()) { 448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.roamingProtocol; 449cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.protocol; 4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 45322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.mCi.setupDataCall( 454203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Integer.toString(cp.mRilRat + 2), 455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Integer.toString(cp.mProfileId), 456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.apn, mApnSetting.user, mApnSetting.password, 457cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Integer.toString(authType), 458cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protocol, msg); 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * TearDown the data connection when the deactivation is complete a Message with 463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * msg.what == EVENT_DEACTIVATE_DONE and msg.obj == AsyncResult with AsyncResult.obj 464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * containing the parameter o. 465ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 466ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param o is the object returned in the AsyncResult.obj. 467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 468ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void tearDownData(Object o) { 469ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int discReason = RILConstants.DEACTIVATE_REASON_NONE; 470ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((o != null) && (o instanceof DisconnectParams)) { 471ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams)o; 472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (TextUtils.equals(dp.mReason, Phone.REASON_RADIO_TURNED_OFF)) { 474ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF; 475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (TextUtils.equals(dp.mReason, Phone.REASON_PDP_RESET)) { 476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET; 477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mPhone.mCi.getRadioState().isOn()) { 480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownData radio is on, call deactivateDataCall"); 481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, discReason, 482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o)); 483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately"); 485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = new AsyncResult(o, null, null); 486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, ar)); 487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) { 491f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt for (ApnContext apnContext : mApnContexts) { 492f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (apnContext == alreadySent) continue; 493f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (reason != null) apnContext.setReason(reason); 494f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt Message msg = mDct.obtainMessage(event, apnContext); 495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfConnected(String reason) { 501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason); 5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfDisconnectDcRetrying(String reason) { 505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DC_RETRYING, reason); 506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllDisconnectCompleted(DcFailCause cause) { 508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DONE, cause.toString()); 5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send the connectionCompletedMsg. 514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cp is the ConnectionParams 516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cause and if no error the cause is DcFailCause.NONE 517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param sendAll is true if all contexts are to be notified 518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyConnectCompleted(ConnectionParams cp, DcFailCause cause, boolean sendAll) { 520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp != null && cp.mOnCompletedMsg != null) { 523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message connectionCompletedMsg = cp.mOnCompletedMsg; 525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp.mOnCompletedMsg = null; 526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (connectionCompletedMsg.obj instanceof ApnContext) { 527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)connectionCompletedMsg.obj; 528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville long timeStamp = System.currentTimeMillis(); 531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.arg1 = mCid; 532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == DcFailCause.NONE) { 534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = timeStamp; 535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg); 536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = cause; 538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = timeStamp; 539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Return message with a Throwable exception to signify an error. 541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == null) cause = DcFailCause.UNKNOWN; 542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg, cause, 543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new Throwable(cause.toString())); 544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("notifyConnectCompleted at " + timeStamp + " cause=" + cause 547ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " connectionCompletedMsg=" + msgToString(connectionCompletedMsg)); 548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.sendToTarget(); 551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR, 554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause.toString()); 555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send ar.userObj if its a message, which is should be back to originator. 560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param dp is the DisconnectParams. 562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) { 564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("NotifyDisconnectCompleted"); 565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String reason = null; 568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp != null && dp.mOnCompletedMsg != null) { 570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = dp.mOnCompletedMsg; 572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mOnCompletedMsg = null; 573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj instanceof ApnContext) { 574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)msg.obj; 575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = dp.mReason; 577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log(String.format("msg=%s msg.obj=%s", msg.toString(), 579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>"))); 580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (reason == null) { 586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = DcFailCause.UNKNOWN.toString(); 587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DISCONNECT_DONE, reason); 589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp); 591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Begin Members and methods owned by DataConnectionTracker but stored 596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * in a DataConnection because there is one per connection. 597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The id is owned by DataConnectionTracker. 602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private int mId; 604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Get the DataConnection ID 607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public int getDataConnectionId() { 609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mId; 610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * End members owned by DataConnectionTracker 615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Clear all settings called when entering mInactiveState. 620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void clearSettings() { 622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("clearSettings"); 623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = -1; 625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = -1; 626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = new LinkProperties(); 630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = null; 633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Process setup completion. 637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param ar is the result 639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return SetupResult. 640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult onSetupConnectionCompleted(AsyncResult ar) { 642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = (DataCallResponse) ar.result; 643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result; 645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag != mTag) { 647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted stale cp.tag=" + cp.mTag + ", mtag=" + mTag); 649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_Stale; 651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (ar.exception != null) { 652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception + 654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " response=" + response); 655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception instanceof CommandException 658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville && ((CommandException) (ar.exception)).getCommandError() 659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville == CommandException.Error.RADIO_NOT_AVAILABLE) { 660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_BadCommand; 661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.RADIO_NOT_AVAILABLE; 662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if ((response == null) || (response.version < 4)) { 663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_GetLastErrorFromRil; 664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (response.status != 0) { 669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onSetupConnectionCompleted received DataCallResponse: " + response); 673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = response.cid; 674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = updateLinkProperty(response).setupResult; 675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isDnsOk(String[] domainNameServers) { 681cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1]) 68222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && !mPhone.isDnsCheckDisabled()) { 683cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Work around a race condition where QMI does not fill in DNS: 684cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Deactivate PDP and let DataConnectionTracker retry. 685cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Do not apply the race condition workaround for MMS APN 686cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // if Proxy is an IP-address. 687cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Otherwise, the default APN will not be restored anymore. 688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mApnSetting.types[0].equals(PhoneConstants.APN_TYPE_MMS) 689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || !isIpAddress(mApnSetting.mmsProxy)) { 690cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log(String.format( 691cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s", 692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.types[0], PhoneConstants.APN_TYPE_MMS, mApnSetting.mmsProxy, 693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville isIpAddress(mApnSetting.mmsProxy))); 694cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 695cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 696cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 697cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isIpAddress(String address) { 701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (address == null) return false; 702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return Patterns.IP_ADDRESS.matcher(address).matches(); 704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult setLinkProperties(DataCallResponse response, 707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp) { 708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if system property dns usable 709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean okToUseSystemPropertyDns = false; 710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String propertyPrefix = "net." + response.ifname + "."; 711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String dnsServers[] = new String[2]; 712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); 713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); 714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville okToUseSystemPropertyDns = isDnsOk(dnsServers); 715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return response.setLinkProperties(lp, okToUseSystemPropertyDns); 718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 7219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * Initialize connection, this will fail if the 7229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * apnSettings are not compatible. 7239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * 7249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @param cp the Connection paramemters 7259a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @return true if initialization was successful. 7269a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville */ 7279a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville private boolean initConnection(ConnectionParams cp) { 7289a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ApnContext apnContext = cp.mApnContext; 7299a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (mApnSetting == null) { 7309a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // Only change apn setting if it isn't set, it will 7319a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // only NOT be set only if we're in DcInactiveState. 7329a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnSetting = apnContext.getApnSetting(); 7339a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else if (mApnSetting.canHandleType(apnContext.getApnType())) { 7349a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // All is good. 7359a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 7369a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 7379a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: incompatible apnSetting in ConnectionParams cp=" + cp 7389a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " dc=" + DataConnection.this); 7399a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 7409a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return false; 7419a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 7429a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mTag += 1; 7439a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams = cp; 7449a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams.mTag = mTag; 7459a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 7469a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (!mApnContexts.contains(apnContext)) { 7479a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnContexts.add(apnContext); 7489a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 7499a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville configureRetry(mApnSetting.canHandleType(PhoneConstants.APN_TYPE_DEFAULT)); 7509a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setRetryCount(0); 7519a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setCurMaxRetryCount(mConnectionParams.mInitialMaxRetry); 752fcc57e87d1620ab7dc877d65e7e85dca77132054Wink Saville mRetryManager.setRetryForever(false); 7539a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 7549a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 7559a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: " 7569a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() 7579a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mApnList=" + mApnContexts 7589a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mConnectionParams=" + mConnectionParams); 7599a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 7609a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return true; 7619a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 7629a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 7639a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville /** 764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The parent state for all other states. 765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDefaultState extends State { 767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: enter"); 770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 771203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Register for DRS or RAT change 772203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), 773203e588e3c42a81aa8a56f595119c181a63b12caWink Saville DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); 774203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Add ourselves to the list of data connections 776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addDc(DataConnection.this); 777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: exit"); 781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 78246f190903e93c653b90b970c1a21159bb957575bWink Saville // Unregister for DRS or RAT change. 78346f190903e93c653b90b970c1a21159bb957575bWink Saville mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); 78446f190903e93c653b90b970c1a21159bb957575bWink Saville 78546f190903e93c653b90b970c1a21159bb957575bWink Saville // Remove ourselves from the DC lists 78646f190903e93c653b90b970c1a21159bb957575bWink Saville mDcController.removeDc(DataConnection.this); 787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 788ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 789ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.disconnected(); 790ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = null; 791ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 792ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.dispose(); 793ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = null; 794ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = null; 795ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReconnectIntent = null; 796ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = null; 797ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 798ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = null; 799ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = null; 800f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt mNetworkCapabilities = null; 801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = null; 802ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mUserData = null; 803ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = null; 804ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = null; 805ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 806ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 807ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 808ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 809ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal = HANDLED; 810ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 811ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 812ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefault msg=" + getWhatToString(msg.what) 813ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RefCount=" + mApnContexts.size()); 814ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 815ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 816ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 817ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 818ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("Disconnecting to previous connection mAc=" + mAc); 819ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 820ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED); 821ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 822ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = new AsyncChannel(); 823ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.connected(null, getHandler(), msg.replyTo); 824ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected"); 825ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 826ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_SUCCESSFUL, mId, "hi"); 827ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 828ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 829ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 830ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 831ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("CMD_CHANNEL_DISCONNECTED"); 832ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quit(); 833ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 834ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 835454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_IS_INACTIVE: { 836ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean val = getIsInactive(); 837ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_IS_INACTIVE isInactive=" + val); 838454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_IS_INACTIVE, val ? 1 : 0); 839ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 840ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 841454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_CID: { 842ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int cid = getCid(); 843ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_CID cid=" + cid); 844454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_CID, cid); 845ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 846ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 847454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_APNSETTING: { 848ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting = getApnSetting(); 849ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_APNSETTING mApnSetting=" + apnSetting); 850454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_APNSETTING, apnSetting); 851ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 852ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 853454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_LINK_PROPERTIES: { 854ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp = getCopyLinkProperties(); 855ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp); 856454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_PROPERTIES, lp); 857ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 858ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 859454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: { 8609c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk ProxyInfo proxy = (ProxyInfo) msg.obj; 861ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy); 862ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLinkPropertiesHttpProxy(proxy); 863454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY); 864ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 865ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 866f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt case DcAsyncChannel.REQ_GET_NETWORK_CAPABILITIES: { 867f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt NetworkCapabilities nc = getCopyNetworkCapabilities(); 868f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt if (VDBG) log("REQ_GET_NETWORK_CAPABILITIES networkCapabilities" + nc); 869f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_NETWORK_CAPABILITIES, nc); 870f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt break; 871f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt } 872454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 873ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: msg.what=REQ_RESET"); 874ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 875ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 876ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 877ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); 878ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 879ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.UNKNOWN, false); 880ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 881ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 882ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 883ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 884ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT RefCount=" 885ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 886ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 887ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 888ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 889ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 890ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 891ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 892ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL RefCount=" 893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 894ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 895ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 896ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 897ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 898ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_TEAR_DOWN_NOW: 899ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW"); 900ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, 0, null); 901ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 902ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 903ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: 904ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 905ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_LOST_CONNECTION" 906ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 907ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 908ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 909ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 910ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 911ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: 912ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 913ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_RETRY_CONNECTION" 914ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 915ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 916ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 918ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 919203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 920203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 921203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 922203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drsRatPair.first; 923203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = drsRatPair.second; 924203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 925203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcDefaultState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 926203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " drs=" + mDataRegState 927203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " mRilRat=" + mRilRat); 928203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 929203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 930203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 931ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 932ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 933ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState: shouldn't happen but ignore msg.what=" 934ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 935ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 936ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 937ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 938ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 939ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 940ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 941ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 942ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDefaultState mDefaultState = new DcDefaultState(); 943ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 944ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 945ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is inactive and expects a EVENT_CONNECT. 946ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 947ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcInactiveState extends State { 948ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed connecting 949ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(ConnectionParams cp, DcFailCause cause) { 950ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams cp,cause"); 951ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = cp; 952ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 953ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 954ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 955ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 956ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed disconnected 957ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DisconnectParams dp) { 958ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams dp"); 959ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 960ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 961ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 962ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts of the failure cause 965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DcFailCause cause) { 966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag += 1; 974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: enter() mTag=" + mTag); 975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != null) { 977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyConnectCompleted +ALL failCause=" 979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(mConnectionParams, mDcFailCause, true); 982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams != null) { 984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyDisconnectCompleted +ALL failCause=" 986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(mDisconnectParams, true); 989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams == null && mConnectionParams == null && mDcFailCause != null) { 991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyAllDisconnectCompleted failCause=" 993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllDisconnectCompleted(mDcFailCause); 996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from cid mapping, before clearSettings 999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville clearSettings(); 1002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1004ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1006ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1013454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 1014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset"); 1016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1017ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1018ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1019ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1020ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 10219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcInactiveState: mag.what=EVENT_CONNECT"); 10229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 10239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 10249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 10259a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 10269a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 10279a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10289a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcInactiveState: msg.what=EVENT_CONNECT initConnection failed"); 10299a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10309a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 10319a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 1032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1034ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1036ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT"); 1038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1040ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL"); 1044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1050ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState nothandled msg.what=" + getWhatToString(msg.what)); 1051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcInactiveState mInactiveState = new DcInactiveState(); 1059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is retrying and expects a EVENT_RETRY_CONNECTION. 1062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcRetryingState extends State { 1064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1066203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if ((mConnectionParams.mRilRat != mRilRat) 1067203e588e3c42a81aa8a56f595119c181a63b12caWink Saville || (mDataRegState != ServiceState.STATE_IN_SERVICE)){ 1068203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // RAT has changed or we're not in service so don't even begin retrying. 1069203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1070203e588e3c42a81aa8a56f595119c181a63b12caWink Saville String s = "DcRetryingState: enter() not retrying rat changed" 1071203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + ", mConnectionParams.mRilRat=" + mConnectionParams.mRilRat 1072203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " != mRilRat:" + mRilRat 1073203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " transitionTo(mInactiveState)"; 1074203e588e3c42a81aa8a56f595119c181a63b12caWink Saville logAndAddLogRec(s); 1075203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1076203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1077203e588e3c42a81aa8a56f595119c181a63b12caWink Saville transitionTo(mInactiveState); 1078203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } else { 1079203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1080203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcRetryingState: enter() mTag=" + mTag 1081203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + ", call notifyAllOfDisconnectDcRetrying lostConnection"); 1082203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1084203e588e3c42a81aa8a56f595119c181a63b12caWink Saville notifyAllOfDisconnectDcRetrying(Phone.REASON_LOST_DATA_CONNECTION); 1085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1086203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Remove ourselves from cid mapping 1087203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1088203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mCid = -1; 1089203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1095ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1097203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1098203e588e3c42a81aa8a56f595119c181a63b12caWink Saville AsyncResult ar = (AsyncResult)msg.obj; 1099203e588e3c42a81aa8a56f595119c181a63b12caWink Saville Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result; 1100203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int drs = drsRatPair.first; 1101203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int rat = drsRatPair.second; 1102203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if ((rat == mRilRat) && (drs == mDataRegState)) { 1103203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1104203e588e3c42a81aa8a56f595119c181a63b12caWink Saville log("DcRetryingState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1105203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " strange no change in drs=" + drs 1106203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " rat=" + rat + " ignoring"); 1107203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1108203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } else { 1109203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // We've lost the connection and we're retrying but DRS or RAT changed 1110203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // so we may never succeed, might as well give up. 1111203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1112203e588e3c42a81aa8a56f595119c181a63b12caWink Saville deferMessage(msg); 1113203e588e3c42a81aa8a56f595119c181a63b12caWink Saville transitionTo(mInactiveState); 1114203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1115203e588e3c42a81aa8a56f595119c181a63b12caWink Saville if (DBG) { 1116203e588e3c42a81aa8a56f595119c181a63b12caWink Saville String s = "DcRetryingState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED" 1117203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " giving up changed from " + mRilRat 1118203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " to rat=" + rat 1119203e588e3c42a81aa8a56f595119c181a63b12caWink Saville + " or drs changed from " + mDataRegState + " to drs=" + drs; 1120203e588e3c42a81aa8a56f595119c181a63b12caWink Saville logAndAddLogRec(s); 1121203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1122203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mDataRegState = drs; 1123203e588e3c42a81aa8a56f595119c181a63b12caWink Saville mRilRat = rat; 1124203e588e3c42a81aa8a56f595119c181a63b12caWink Saville } 1125203e588e3c42a81aa8a56f595119c181a63b12caWink Saville retVal = HANDLED; 1126203e588e3c42a81aa8a56f595119c181a63b12caWink Saville break; 1127203e588e3c42a81aa8a56f595119c181a63b12caWink Saville 1128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: { 1129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 == mTag) { 1130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.increaseRetryCount(); 1131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState EVENT_RETRY_CONNECTION" 1133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RetryCount=" + mRetryManager.getRetryCount() 1134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville onConnect(mConnectionParams); 1137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActivatingState); 1138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState stale EVENT_RETRY_CONNECTION" 1141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + msg.arg1 + " != mTag:" + mTag); 1142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1147454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: { 1148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState: msg.what=RSP_RESET, ignore we're already reset"); 1150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(mConnectionParams, 1152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.RESET_BY_FRAMEWORK); 1153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 11589a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 11609a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT" 11619a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() + " cp=" + cp 1162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 11649a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 11659a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 11669a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 11679a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 11689a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 11699a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT initConnection failed"); 11709a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 11719a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 11729a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 11739a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 1174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.remove(dp.mApnContext) && mApnContexts.size() == 0) { 1181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT " + " RefCount=" 1183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size() + " dp=" + dp); 1184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(dp); 1186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 11889a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcRetryingState: msg.what=EVENT_DISCONNECT"); 1189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT/DISCONNECT_ALL " 1197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "RefCount=" + mApnContexts.size()); 1198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: { 1205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState nothandled msg.what=" + getWhatToString(msg.what)); 1207ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1208ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1209ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1211ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1213ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1214ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1215ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcRetryingState mRetryingState = new DcRetryingState(); 1216ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1217ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is activating a connection. 1219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActivatingState extends State { 1221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 1225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp; 1226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActivatingState: msg=" + msgToString(msg)); 1228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1229203e588e3c42a81aa8a56f595119c181a63b12caWink Saville case EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED: 1230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1231203e588e3c42a81aa8a56f595119c181a63b12caWink Saville // Activating can't process until we're done. 1232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_SETUP_DATA_CONNECTION_DONE: 1237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar); 1241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result != DataCallResponse.SetupResult.ERR_Stale) { 1242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:"+ mConnectionParams 1244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1247c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1248c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState onSetupConnectionCompleted result=" + result 1249c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1250c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (result) { 1252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case SUCCESS: 1253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // All is well 1254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActiveState); 1256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_BadCommand: 1258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Vendor ril rejected the command and didn't connect. 1259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_UnacceptableParameter: 1265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The addresses given from the RIL are bad 1266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(cp); 1267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingErrorCreatingConnection); 1268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_GetLastErrorFromRil: 1270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Request failed and this is an old RIL 1271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.getLastDataCallFailCause( 1272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp)); 1273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_RilError: 1275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delay = mDcRetryAlarmController.getSuggestedRetryTime( 1276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection.this, ar); 1277c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1278c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState: ERR_RilError " 1279c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " delay=" + delay 1280979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 1281979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result=" + result 1282979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result.isRestartRadioFail=" + 1283979786625e7ceacf4a545a25704ef8a15338a854Wink Saville result.mFailCause.isRestartRadioFail() 1284979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " result.isPermanentFail=" + 1285979786625e7ceacf4a545a25704ef8a15338a854Wink Saville result.mFailCause.isPermanentFail()); 1286c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1287979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (result.mFailCause.isRestartRadioFail()) { 1288979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError restart radio"); 1289979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mDct.sendRestartRadio(); 1290979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1291979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1292979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (result.mFailCause.isPermanentFail()) { 1293979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError perm error"); 1294979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1295979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1296979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (delay >= 0) { 1297979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError retry"); 1298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, 1299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag, delay); 1300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1302979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: ERR_RilError no retry"); 1303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_Stale: 1308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_SETUP_DATA_CONNECTION_DONE" 1309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville throw new RuntimeException("Unknown SetupResult, should not happen"); 1313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_GET_LAST_FAIL_DONE: 1318ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1319ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1321ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:" + mConnectionParams 1323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause cause = DcFailCause.UNKNOWN; 1327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 1329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int rilFailCause = ((int[]) (ar.result))[0]; 1330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = DcFailCause.fromInt(rilFailCause); 13311db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (cause == DcFailCause.NONE) { 13321db7da14111228a5079d2970d7d0ce34173000b5Wink Saville if (DBG) { 13331db7da14111228a5079d2970d7d0ce34173000b5Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 13341db7da14111228a5079d2970d7d0ce34173000b5Wink Saville + " BAD: error was NONE, change to UNKNOWN"); 13351db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 13361db7da14111228a5079d2970d7d0ce34173000b5Wink Saville cause = DcFailCause.UNKNOWN; 13371db7da14111228a5079d2970d7d0ce34173000b5Wink Saville } 1338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int retryDelay = mRetryManager.getRetryTimer(); 1342c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1343c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 1344c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " cause=" + cause 1345c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " retryDelay=" + retryDelay 1346c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 1347c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1348c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1349979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (cause.isRestartRadioFail()) { 1350979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) { 1351979786625e7ceacf4a545a25704ef8a15338a854Wink Saville log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE" 1352979786625e7ceacf4a545a25704ef8a15338a854Wink Saville + " restart radio"); 1353979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } 1354979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mDct.sendRestartRadio(); 1355979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1356979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1357979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if (cause.isPermanentFail()) { 1358979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE perm er"); 1359979786625e7ceacf4a545a25704ef8a15338a854Wink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1360979786625e7ceacf4a545a25704ef8a15338a854Wink Saville transitionTo(mInactiveState); 1361979786625e7ceacf4a545a25704ef8a15338a854Wink Saville } else if ((retryDelay >= 0) && (mRetryManager.isRetryNeeded())) { 1362979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE retry"); 1363ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retryDelay); 1365ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1366ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1367979786625e7ceacf4a545a25704ef8a15338a854Wink Saville if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE no retry"); 1368ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1369ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1370ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1372ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_GET_LAST_FAIL_DONE" 1373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1374ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1375ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1376ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActivatingState not handled msg.what=" + 1382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville getWhatToString(msg.what) + " RefCount=" + mApnContexts.size()); 1383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1386ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1387ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1388ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1389ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1390ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActivatingState mActivatingState = new DcActivatingState(); 1391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is connected, expecting an EVENT_DISCONNECT. 1394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActiveState extends State { 1396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override public void enter() { 1397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: enter dc=" + DataConnection.this); 1398ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.getRetryCount() != 0) { 1400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState: connected after retrying call notifyAllOfConnected"); 1401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.setRetryCount(0); 1402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If we were retrying there maybe more than one, otherwise they'll only be one. 1404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllOfConnected(Phone.REASON_CONNECTED); 1405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If the EVENT_CONNECT set the current max retry restore it here 1407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // if it didn't then this is effectively a NOP. 1408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.restoreCurMaxRetryCount(); 1409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addActiveDcByCid(DataConnection.this); 1410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: exit dc=" + this); 1415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 1423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1424c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1425c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this); 1426c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.contains(cp.mApnContext)) { 1428c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState ERROR already added apnContext=" + cp.mApnContext); 1429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.add(cp.mApnContext); 1431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_CONNECT RefCount=" 1433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.NONE, false); 1437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1442c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1443c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_DISCONNECT dp=" + dp 1444c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1445c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.contains(dp.mApnContext)) { 1447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" 1449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.size() == 1) { 1453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 1454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.remove(dp.mApnContext); 1461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState ERROR no such apnContext=" + dp.mApnContext 1465c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " in this dc=" + DataConnection.this); 1466ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1468ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1469ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1470ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1471ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1473c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_DISCONNECT clearing apn contexts," 1474c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: { 1486c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1487c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_LOST_CONNECTION dc=" + DataConnection.this); 1488c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.isRetryNeeded()) { 1490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // We're going to retry 1491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delayMillis = mRetryManager.getRetryTimer(); 1492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState EVENT_LOST_CONNECTION startRetryAlarm" 1494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag + " delay=" + delayMillis + "ms"); 1495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville delayMillis); 1498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState not handled msg.what=" + getWhatToString(msg.what)); 1509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActiveState mActiveState = new DcActiveState(); 1517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting. 1520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectingState extends State { 1522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " 1529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount=" 1536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) ar.userObj; 1539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp.mTag == mTag) { 1540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj); 1543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectState stale EVENT_DEACTIVATE_DONE" 1546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + dp.mTag + " mTag=" + mTag); 1547ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectingState not handled msg.what=" 1554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectingState mDisconnectingState = new DcDisconnectingState(); 1563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting after an creating a connection. 1566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectionErrorCreatingConnection extends State { 1568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 1576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection" + 1579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " msg.what=EVENT_DEACTIVATE_DONE"); 1580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, 1585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER); 1586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection stale EVENT_DEACTIVATE_DONE" 1590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + cp.mTag + ", mTag=" + mTag); 1591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection not handled msg.what=" 1599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection = 1608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new DcDisconnectionErrorCreatingConnection(); 1609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ******* "public" interface 1611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used for testing purposes. 1614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* package */ void tearDownNow() { 1616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownNow()"); 1617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_TEAR_DOWN_NOW)); 1618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return the string for msg.what as our info. 1622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected String getWhatToString(int what) { 1625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return cmdToString(what); 1626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String msgToString(Message msg) { 1629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retVal; 1630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg == null) { 1631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = "null"; 1632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville StringBuilder b = new StringBuilder(); 1634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("{what="); 1636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(cmdToString(msg.what)); 1637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" when="); 1639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis(), b); 1640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 != 0) { 1642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg1="); 1643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg1); 1644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg2 != 0) { 1647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg2="); 1648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg2); 1649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj != null) { 1652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" obj="); 1653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.obj); 1654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" target="); 1657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.getTarget()); 1658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" replyTo="); 1660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.replyTo); 1661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("}"); 1663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = b.toString(); 1665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static void slog(String s) { 1670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d("DC", s); 1671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug 1675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1678cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1679cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void log(String s) { 1680cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.d(getName(), s); 16810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug attribute 1685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logd(String s) { 1690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(getName(), s); 1691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 16920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with verbose attribute 1695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logv(String s) { 1700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.v(getName(), s); 1701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with info attribute 1705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logi(String s) { 1710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.i(getName(), s); 1711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with warning attribute 1715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logw(String s) { 1720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.w(getName(), s); 17210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1723ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1724ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 1725ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1726ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s) { 1730ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s); 1731ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1732ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1733ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1734ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 1735ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1736ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1737ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param e is a Throwable which logs additional information. 1738ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1740ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s, Throwable e) { 1741ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s, e); 1742ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1744ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Doesn't print mApnList of ApnContext's which would be recursive */ 1745ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toStringSimple() { 1746ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getName() + ": State=" + getCurrentState().getName() 1747ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size() 1748ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mCid=" + mCid + " mCreateTime=" + mCreateTime 1749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastastFailTime=" + mLastFailTime 1750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastFailCause=" + mLastFailCause 1751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag 1752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mRetryManager=" + mRetryManager 1753f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt + " mLinkProperties=" + mLinkProperties 1754f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt + " mNetworkCapabilities=" + mNetworkCapabilities; 1755ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1756ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1758ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 1759ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{" + toStringSimple() + " mApnContexts=" + mApnContexts + "}"; 1760ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1761ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Dump the current state. 1764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param fd 1766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param pw 1767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param args 1768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 17690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 17700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 1771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.print("DataConnection "); 17720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 1773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts.size=" + mApnContexts.size()); 1774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts=" + mApnContexts); 1775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 1776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDataConnectionTracker=" + mDct); 1777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnSetting=" + mApnSetting); 1778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mTag=" + mTag); 1779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCid=" + mCid); 1780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mRetryManager=" + mRetryManager); 1781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mConnectionParams=" + mConnectionParams); 1782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDisconnectParams=" + mDisconnectParams); 1783ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcFailCause=" + mDcFailCause); 1784ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 1785ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mPhone=" + mPhone); 1786ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 1787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLinkProperties=" + mLinkProperties); 1788ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 1789203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mDataRegState=" + mDataRegState); 1790203e588e3c42a81aa8a56f595119c181a63b12caWink Saville pw.println(" mRilRat=" + mRilRat); 1791f3ab6ab303e1da929ce26b7c5d63565bff136221Robert Greenwalt pw.println(" mNetworkCapabilities=" + mNetworkCapabilities); 1792ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime)); 1793ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime)); 1794ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailCause=" + mLastFailCause); 1795ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 1796ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mUserData=" + mUserData); 1797ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mInstanceNumber=" + mInstanceNumber); 1798ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mAc=" + mAc); 1799ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcRetryAlarmController=" + mDcRetryAlarmController); 1800ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 18010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1803