DataConnection.java revision fcc57e87d1620ab7dc877d65e7e85dca77132054
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.LinkCapabilities; 34ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.net.LinkProperties; 35ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.net.ProxyProperties; 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.text.TextUtils; 42ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.Rlog; 43ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.TelephonyManager; 44ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.util.Patterns; 45ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.util.TimeUtils; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter; 49ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.ArrayList; 50ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.List; 51ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport java.util.concurrent.atomic.AtomicInteger; 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 55ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 56ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * DataConnection StateMachine. 57ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 58ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * This a class for representing a single data connection, with instances of this 59ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * class representing a connection via the cellular network. There may be multiple 60ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * data connections and all of them are managed by the <code>DataConnectionTracker</code>. 61ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 62ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * A recent change is to move retry handling into this class, with that change the 63ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * old retry manager is now used internally rather than exposed to the DCT. Also, 64ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * bringUp now has an initialRetry which is used limit the number of retries 65ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * during the initial bring up of the connection. After the connection becomes active 66ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * the current max retry is restored to the configured value. 67ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 68ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * NOTE: All DataConnection objects must be running on the same looper, which is the default 69ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * as the coordinator has members which are used without synchronization. 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 71ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepublic final class DataConnection extends StateMachine { 72ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean DBG = true; 73ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean VDBG = true; 74ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 75ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Retry configuration: A doubling of retry times from 5secs to 30minutes */ 76ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String DEFAULT_DATA_RETRY_CONFIG = "default_randomization=2000," 77ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "5000,10000,20000,40000,80000:5000,160000:5000," 78ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "320000:5000,640000:5000,1280000:5000,1800000:5000"; 79ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 80ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Retry configuration for secondary networks: 4 tries in 20 sec */ 81ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String SECONDARY_DATA_RETRY_CONFIG = 82ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "max_retries=3, 5000, 5000, 5000"; 83ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 84ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The data connection controller 85ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcController mDcController; 86ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 87ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The Tester for failing all bringup's 88ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcTesterFailBringUpAll mDcTesterFailBringUpAll; 89ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 90ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static AtomicInteger mInstanceNumber = new AtomicInteger(0); 91ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private AsyncChannel mAc; 92ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 93ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Utilities for the DataConnection 94ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcRetryAlarmController mDcRetryAlarmController; 95ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 96ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The DCT that's talking to us, we only support one! 97454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private DcTrackerBase mDct = null; 98ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 99ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving connecting parameters. 101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class ConnectionParams { 103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mInitialMaxRetry; 106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mProfileId; 107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 109ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams(ApnContext apnContext, int initialMaxRetry, int profileId, 110ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message onCompletedMsg) { 111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInitialMaxRetry = initialMaxRetry; 113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mProfileId = profileId; 114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mInitialMaxRetry=" + mInitialMaxRetry + " mProfileId=" + mProfileId 121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 125ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used internally for saving disconnecting parameters. 127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class DisconnectParams { 129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext mApnContext; 131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String mReason; 132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message mOnCompletedMsg; 133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams(ApnContext apnContext, String reason, Message onCompletedMsg) { 135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContext = apnContext; 136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReason = reason; 137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mOnCompletedMsg = onCompletedMsg; 138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{mTag=" + mTag + " mApnContext=" + mApnContext 143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mReason=" + mReason 144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mOnCompletedMsg=" + msgToString(mOnCompletedMsg) + "}"; 145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1472563e7e1ec513121b980045571a245aa5390f1c5Wink Saville 148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ApnSetting mApnSetting; 149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private ConnectionParams mConnectionParams; 150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DisconnectParams mDisconnectParams; 151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mDcFailCause; 152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private PhoneBase mPhone; 154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private LinkProperties mLinkProperties = new LinkProperties(); 155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private LinkCapabilities mLinkCapabilities = new LinkCapabilities(); 156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mCreateTime; 157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private long mLastFailTime; 158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcFailCause mLastFailCause; 159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String NULL_IP = "0.0.0.0"; 160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private Object mUserData; 161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Package visible variables 163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mTag; 164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int mCid; 165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville List<ApnContext> mApnContexts = null; 166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville PendingIntent mReconnectIntent = null; 167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville RetryManager mRetryManager = new RetryManager(); 168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ***** Event codes for driving the state machine, package visible for Dcc 171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int BASE = Protocol.BASE_DATA_CONNECTION; 172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_CONNECT = BASE + 0; 173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_SETUP_DATA_CONNECTION_DONE = BASE + 1; 174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_GET_LAST_FAIL_DONE = BASE + 2; 175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DEACTIVATE_DONE = BASE + 3; 176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT = BASE + 4; 177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RIL_CONNECTED = BASE + 5; 178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DISCONNECT_ALL = BASE + 6; 179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_DATA_STATE_CHANGED = BASE + 7; 180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_TEAR_DOWN_NOW = BASE + 8; 181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_LOST_CONNECTION = BASE + 9; 182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static final int EVENT_RETRY_CONNECTION = BASE + 10; 183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final int CMD_TO_STRING_COUNT = EVENT_RETRY_CONNECTION - BASE + 1; 185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; 186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static { 187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_CONNECT - BASE] = "EVENT_CONNECT"; 188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_SETUP_DATA_CONNECTION_DONE - BASE] = 189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "EVENT_SETUP_DATA_CONNECTION_DONE"; 190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_GET_LAST_FAIL_DONE - BASE] = "EVENT_GET_LAST_FAIL_DONE"; 191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DEACTIVATE_DONE - BASE] = "EVENT_DEACTIVATE_DONE"; 192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT - BASE] = "EVENT_DISCONNECT"; 193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RIL_CONNECTED - BASE] = "EVENT_RIL_CONNECTED"; 194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DISCONNECT_ALL - BASE] = "EVENT_DISCONNECT_ALL"; 195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_DATA_STATE_CHANGED - BASE] = "EVENT_DATA_STATE_CHANGED"; 196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_TEAR_DOWN_NOW - BASE] = "EVENT_TEAR_DOWN_NOW"; 197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_LOST_CONNECTION - BASE] = "EVENT_LOST_CONNECTION"; 198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sCmdToString[EVENT_RETRY_CONNECTION - BASE] = "EVENT_RETRY_CONNECTION"; 199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Convert cmd to string or null if unknown 201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static String cmdToString(int cmd) { 202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String value; 203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cmd -= BASE; 204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((cmd >= 0) && (cmd < sCmdToString.length)) { 205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = sCmdToString[cmd]; 206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 207454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville value = DcAsyncChannel.cmdToString(cmd + BASE); 208ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 209ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (value == null) { 210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville value = "0x" + Integer.toHexString(cmd + BASE); 211ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return value; 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 216cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Create the connection object 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 218cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param phone the Phone 219cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param id the connection id 220cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return DataConnection that was created. 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static DataConnection makeDataConnection(PhoneBase phone, int id, 223454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, 224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection dc = new DataConnection(phone, 226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DC-" + mInstanceNumber.incrementAndGet(), id, dct, failBringUpAll, dcc); 227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dc.start(); 228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) dc.log("Made " + dc.getName()); 229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return dc; 230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void dispose() { 233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("dispose: call quiteNow()"); 234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quitNow(); 235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* Getter functions */ 238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkCapabilities getCopyLinkCapabilities() { 240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return new LinkCapabilities(mLinkCapabilities); 241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties getCopyLinkProperties() { 244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return new LinkProperties(mLinkProperties); 245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean getIsInactive() { 248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getCurrentState() == mInactiveState; 249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int getCid() { 252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mCid; 253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting getApnSetting() { 256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mApnSetting; 257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 258ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 259ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void setLinkPropertiesHttpProxy(ProxyProperties proxy) { 260ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties.setHttpProxy(proxy); 261ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static class UpdateLinkPropertyResult { 264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public DataCallResponse.SetupResult setupResult = DataCallResponse.SetupResult.SUCCESS; 265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties oldLp; 266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public LinkProperties newLp; 267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public UpdateLinkPropertyResult(LinkProperties curLp) { 268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville oldLp = curLp; 269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville newLp = curLp; 270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult updateLinkProperty(DataCallResponse newState) { 274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties); 275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (newState == null) return result; 277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult setupResult; 279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp = new LinkProperties(); 280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.setupResult = setLinkProperties(newState, result.newLp); 283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result.setupResult != DataCallResponse.SetupResult.SUCCESS) { 284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("updateLinkProperty failed : " + result.setupResult); 285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // copy HTTP proxy as it is not part DataCallResponse. 288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.newLp.setHttpProxy(mLinkProperties.getHttpProxy()); 289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG && (! result.oldLp.equals(result.newLp))) { 291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty old LP=" + result.oldLp); 292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("updateLinkProperty new LP=" + result.newLp); 293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = result.newLp; 295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville //***** Constructor (NOTE: uses dcc.getHandler() as its Handler) 300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataConnection(PhoneBase phone, String name, int id, 301454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, 302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcController dcc) { 303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville super(name, dcc.getHandler()); 304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogRecSize(300); 305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLogOnlyTransitions(true); 306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DataConnection constructor E"); 307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = phone; 309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = dct; 310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = failBringUpAll; 311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = dcc; 312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mId = id; 313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = new DcRetryAlarmController(mPhone, this); 315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDefaultState); 317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mInactiveState, mDefaultState); 318ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActivatingState, mDefaultState); 319ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mRetryingState, mDefaultState); 320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mActiveState, mDefaultState); 321ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingState, mDefaultState); 322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville addState(mDisconnectingErrorCreatingConnection, mDefaultState); 323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setInitialState(mInactiveState); 324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 325ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = new ArrayList<ApnContext>(); 326ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DataConnection constructor X"); 327ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 329ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private String getRetryConfig(boolean forDefault) { 330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int nt = mPhone.getServiceState().getNetworkType(); 331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 3322cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Saville if (Build.IS_DEBUGGABLE) { 333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String config = SystemProperties.get("test.data_retry_config"); 334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (! TextUtils.isEmpty(config)) { 335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return config; 336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((nt == TelephonyManager.NETWORK_TYPE_CDMA) || 340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_1xRTT) || 341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_0) || 342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_A) || 343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EVDO_B) || 344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville (nt == TelephonyManager.NETWORK_TYPE_EHRPD)) { 345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // CDMA variant 346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.cdma.data_retry_config"); 347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Use GSM variant for all others. 349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (forDefault) { 350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.gsm.data_retry_config"); 351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return SystemProperties.get("ro.gsm.2nd_data_retry_config"); 353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 355ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 356ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 357ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void configureRetry(boolean forDefault) { 358ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retryConfig = getRetryConfig(forDefault); 359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 360ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(retryConfig)) { 361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (forDefault) { 362ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(DEFAULT_DATA_RETRY_CONFIG)) { 363ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Should never happen, log an error and default to a simple linear sequence. 364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("configureRetry: Could not configure using " + 365ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "DEFAULT_DATA_RETRY_CONFIG=" + DEFAULT_DATA_RETRY_CONFIG); 366ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.configure(5, 2000, 1000); 367ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 368ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 369ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mRetryManager.configure(SECONDARY_DATA_RETRY_CONFIG)) { 370ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Should never happen, log an error and default to a simple sequence. 371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("configureRetry: Could note configure using " + 372ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville "SECONDARY_DATA_RETRY_CONFIG=" + SECONDARY_DATA_RETRY_CONFIG); 373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.configure(5, 2000, 1000); 374ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 375ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 376ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("configureRetry: forDefault=" + forDefault + " mRetryManager=" + mRetryManager); 379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 383cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Begin setting up a data connection, calls setupDataCall 384cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * and the ConnectionParams will be returned with the 385cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * EVENT_SETUP_DATA_CONNECTION_DONE AsyncResul.userObj. 3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 387cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param cp is the connection parameters 3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 389ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void onConnect(ConnectionParams cp) { 390ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onConnect: carrier='" + mApnSetting.carrier 391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' APN='" + mApnSetting.apn 392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "' proxy='" + mApnSetting.proxy + "' port='" + mApnSetting.port + "'"); 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if we should fake an error. 395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDcTesterFailBringUpAll.getDcFailBringUp().mCounter > 0) { 396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = new DataCallResponse(); 397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.version = mPhone.mCi.getRilVersion(); 398ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.status = mDcTesterFailBringUpAll.getDcFailBringUp().mFailCause.getErrorCode(); 399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.cid = 0; 400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.active = 0; 401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.type = ""; 402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.ifname = ""; 403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.addresses = new String[0]; 404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.dnses = new String[0]; 405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.gateways = new String[0]; 406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville response.suggestedRetryTime = 407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mSuggestedRetryTime; 408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg, response, null); 411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(msg); 412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onConnect: FailBringUpAll=" + mDcTesterFailBringUpAll.getDcFailBringUp() 414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " send error response=" + response); 415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll.getDcFailBringUp().mCounter -= 1; 417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return; 418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 42022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = -1; 42122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mLastFailTime = -1; 422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 424cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // msg.obj will be returned in AsyncResult.userObj; 425cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp); 426cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville msg.obj = cp; 4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int authType = mApnSetting.authType; 429cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (authType == -1) { 430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville authType = TextUtils.isEmpty(mApnSetting.user) ? RILConstants.SETUP_DATA_AUTH_NONE 431cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville : RILConstants.SETUP_DATA_AUTH_PAP_CHAP; 4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 434cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String protocol; 43522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPhone.getServiceState().getRoaming()) { 436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.roamingProtocol; 437cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protocol = mApnSetting.protocol; 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 44122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.mCi.setupDataCall( 442cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Integer.toString(getRilRadioTechnology()), 443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Integer.toString(cp.mProfileId), 444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.apn, mApnSetting.user, mApnSetting.password, 445cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Integer.toString(authType), 446cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protocol, msg); 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * TearDown the data connection when the deactivation is complete a Message with 451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * msg.what == EVENT_DEACTIVATE_DONE and msg.obj == AsyncResult with AsyncResult.obj 452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * containing the parameter o. 453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param o is the object returned in the AsyncResult.obj. 455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void tearDownData(Object o) { 457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int discReason = RILConstants.DEACTIVATE_REASON_NONE; 458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if ((o != null) && (o instanceof DisconnectParams)) { 459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams)o; 460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (TextUtils.equals(dp.mReason, Phone.REASON_RADIO_TURNED_OFF)) { 462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF; 463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (TextUtils.equals(dp.mReason, Phone.REASON_PDP_RESET)) { 464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET; 465ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 466ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mPhone.mCi.getRadioState().isOn()) { 468ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownData radio is on, call deactivateDataCall"); 469ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, discReason, 470ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o)); 471ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately"); 473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = new AsyncResult(o, null, null); 474ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, ar)); 475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) { 479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (ApnContext apnContext : mApnContexts) { 480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (apnContext == alreadySent) continue; 481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (reason != null) apnContext.setReason(reason); 482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = mDct.obtainMessage(event, apnContext); 483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfConnected(String reason) { 489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DATA_SETUP_COMPLETE, reason); 4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllOfDisconnectDcRetrying(String reason) { 493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DC_RETRYING, reason); 494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyAllDisconnectCompleted(DcFailCause cause) { 496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(null, DctConstants.EVENT_DISCONNECT_DONE, cause.toString()); 4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send the connectionCompletedMsg. 502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cp is the ConnectionParams 504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param cause and if no error the cause is DcFailCause.NONE 505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param sendAll is true if all contexts are to be notified 506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyConnectCompleted(ConnectionParams cp, DcFailCause cause, boolean sendAll) { 508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp != null && cp.mOnCompletedMsg != null) { 511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message connectionCompletedMsg = cp.mOnCompletedMsg; 513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp.mOnCompletedMsg = null; 514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (connectionCompletedMsg.obj instanceof ApnContext) { 515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)connectionCompletedMsg.obj; 516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville long timeStamp = System.currentTimeMillis(); 519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.arg1 = mCid; 520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == DcFailCause.NONE) { 522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = timeStamp; 523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg); 524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = cause; 526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = timeStamp; 527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Return message with a Throwable exception to signify an error. 529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cause == null) cause = DcFailCause.UNKNOWN; 530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(connectionCompletedMsg, cause, 531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new Throwable(cause.toString())); 532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("notifyConnectCompleted at " + timeStamp + " cause=" + cause 535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " connectionCompletedMsg=" + msgToString(connectionCompletedMsg)); 536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville connectionCompletedMsg.sendToTarget(); 539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR, 542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause.toString()); 543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 547ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Send ar.userObj if its a message, which is should be back to originator. 548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param dp is the DisconnectParams. 550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) { 552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("NotifyDisconnectCompleted"); 553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext alreadySent = null; 555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String reason = null; 556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp != null && dp.mOnCompletedMsg != null) { 558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Get the completed message but only use it once 559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Message msg = dp.mOnCompletedMsg; 560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mOnCompletedMsg = null; 561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj instanceof ApnContext) { 562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville alreadySent = (ApnContext)msg.obj; 563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = dp.mReason; 565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log(String.format("msg=%s msg.obj=%s", msg.toString(), 567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>"))); 568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult.forMessage(msg); 570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville msg.sendToTarget(); 571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (sendAll) { 573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (reason == null) { 574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville reason = DcFailCause.UNKNOWN.toString(); 575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllWithEvent(alreadySent, DctConstants.EVENT_DISCONNECT_DONE, reason); 577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp); 579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 580ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private int getRilRadioTechnology() { 582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int rilRadioTechnology; 583ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnSetting.bearer > 0) { 584ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville rilRadioTechnology = mApnSetting.bearer + 2; 585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville rilRadioTechnology = mPhone.getServiceState().getRilDataRadioTechnology() + 2; 587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return rilRadioTechnology; 589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Begin Members and methods owned by DataConnectionTracker but stored 594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * in a DataConnection because there is one per connection. 595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The id is owned by DataConnectionTracker. 600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private int mId; 602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Get the DataConnection ID 605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public int getDataConnectionId() { 607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return mId; 608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* 611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * End members owned by DataConnectionTracker 613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * ************************************************************************** 614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Clear all settings called when entering mInactiveState. 618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void clearSettings() { 620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("clearSettings"); 621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCreateTime = -1; 623ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailTime = -1; 624ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = DcFailCause.NONE; 625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = new LinkProperties(); 628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = null; 631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Process setup completion. 635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param ar is the result 637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return SetupResult. 638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult onSetupConnectionCompleted(AsyncResult ar) { 640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse response = (DataCallResponse) ar.result; 641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result; 643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag != mTag) { 645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted stale cp.tag=" + cp.mTag + ", mtag=" + mTag); 647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_Stale; 649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (ar.exception != null) { 650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception + 652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " response=" + response); 653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception instanceof CommandException 656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville && ((CommandException) (ar.exception)).getCommandError() 657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville == CommandException.Error.RADIO_NOT_AVAILABLE) { 658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_BadCommand; 659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.RADIO_NOT_AVAILABLE; 660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if ((response == null) || (response.version < 4)) { 661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_GetLastErrorFromRil; 662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (response.status != 0) { 667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = DataCallResponse.SetupResult.ERR_RilError; 668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result.mFailCause = DcFailCause.fromInt(response.status); 669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onSetupConnectionCompleted received DataCallResponse: " + response); 671ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = response.cid; 672ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville result = updateLinkProperty(response).setupResult; 673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 674ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return result; 676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isDnsOk(String[] domainNameServers) { 679cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (NULL_IP.equals(domainNameServers[0]) && NULL_IP.equals(domainNameServers[1]) 68022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && !mPhone.isDnsCheckDisabled()) { 681cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Work around a race condition where QMI does not fill in DNS: 682cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Deactivate PDP and let DataConnectionTracker retry. 683cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Do not apply the race condition workaround for MMS APN 684cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // if Proxy is an IP-address. 685cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Otherwise, the default APN will not be restored anymore. 686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (!mApnSetting.types[0].equals(PhoneConstants.APN_TYPE_MMS) 687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville || !isIpAddress(mApnSetting.mmsProxy)) { 688cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log(String.format( 689cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville "isDnsOk: return false apn.types[0]=%s APN_TYPE_MMS=%s isIpAddress(%s)=%s", 690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting.types[0], PhoneConstants.APN_TYPE_MMS, mApnSetting.mmsProxy, 691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville isIpAddress(mApnSetting.mmsProxy))); 692cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 693cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 694cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 695cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean isIpAddress(String address) { 699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (address == null) return false; 700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 701ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return Patterns.IP_ADDRESS.matcher(address).matches(); 702ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 703ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 704ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DataCallResponse.SetupResult setLinkProperties(DataCallResponse response, 705ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp) { 706ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Check if system property dns usable 707ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean okToUseSystemPropertyDns = false; 708ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String propertyPrefix = "net." + response.ifname + "."; 709ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String dnsServers[] = new String[2]; 710ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1"); 711ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2"); 712ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville okToUseSystemPropertyDns = isDnsOk(dnsServers); 713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // set link properties based on data call response 715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return response.setLinkProperties(lp, okToUseSystemPropertyDns); 716ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 717ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 718ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 7199a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * Initialize connection, this will fail if the 7209a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * apnSettings are not compatible. 7219a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * 7229a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @param cp the Connection paramemters 7239a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville * @return true if initialization was successful. 7249a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville */ 7259a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville private boolean initConnection(ConnectionParams cp) { 7269a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ApnContext apnContext = cp.mApnContext; 7279a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (mApnSetting == null) { 7289a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // Only change apn setting if it isn't set, it will 7299a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // only NOT be set only if we're in DcInactiveState. 7309a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnSetting = apnContext.getApnSetting(); 7319a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else if (mApnSetting.canHandleType(apnContext.getApnType())) { 7329a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville // All is good. 7339a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 7349a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 7359a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: incompatible apnSetting in ConnectionParams cp=" + cp 7369a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " dc=" + DataConnection.this); 7379a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 7389a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return false; 7399a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 7409a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mTag += 1; 7419a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams = cp; 7429a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mConnectionParams.mTag = mTag; 7439a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 7449a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (!mApnContexts.contains(apnContext)) { 7459a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mApnContexts.add(apnContext); 7469a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 7479a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville configureRetry(mApnSetting.canHandleType(PhoneConstants.APN_TYPE_DEFAULT)); 7489a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setRetryCount(0); 7499a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville mRetryManager.setCurMaxRetryCount(mConnectionParams.mInitialMaxRetry); 750fcc57e87d1620ab7dc877d65e7e85dca77132054Wink Saville mRetryManager.setRetryForever(false); 7519a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 7529a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 7539a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("initConnection: " 7549a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() 7559a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mApnList=" + mApnContexts 7569a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " mConnectionParams=" + mConnectionParams); 7579a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 7589a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville return true; 7599a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 7609a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville 7619a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville /** 762ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The parent state for all other states. 763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 764ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDefaultState extends State { 765ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 766ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 767ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: enter"); 768ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 769ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Add ourselves to the list of data connections 770ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addDc(DataConnection.this); 771ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 772ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 773ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 774ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: exit"); 775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 776ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 777ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.disconnected(); 779ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = null; 780ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 781ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.dispose(); 782ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController = null; 783ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts = null; 784ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mReconnectIntent = null; 785ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDct = null; 786ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnSetting = null; 787ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = null; 788ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkProperties = null; 789ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLinkCapabilities = null; 790ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mLastFailCause = null; 791ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mUserData = null; 792ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 793ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from the DC lists 794ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeDc(DataConnection.this); 795ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 796ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController = null; 797ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcTesterFailBringUpAll = null; 798ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 799ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 800ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 802ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal = HANDLED; 803ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 804ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 805ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 806ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefault msg=" + getWhatToString(msg.what) 807ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RefCount=" + mApnContexts.size()); 808ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 809ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 810ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: { 811ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAc != null) { 812ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("Disconnecting to previous connection mAc=" + mAc); 813ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 814ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED); 815ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 816ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc = new AsyncChannel(); 817ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.connected(null, getHandler(), msg.replyTo); 818ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected"); 819ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED, 820ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncChannel.STATUS_SUCCESSFUL, mId, "hi"); 821ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 822ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 823ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 824ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 825ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("CMD_CHANNEL_DISCONNECTED"); 826ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville quit(); 827ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 828ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 829454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_IS_INACTIVE: { 830ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean val = getIsInactive(); 831ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_IS_INACTIVE isInactive=" + val); 832454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_IS_INACTIVE, val ? 1 : 0); 833ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 834ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 835454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_CID: { 836ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int cid = getCid(); 837ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_CID cid=" + cid); 838454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_CID, cid); 839ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 840ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 841454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_APNSETTING: { 842ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting = getApnSetting(); 843ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_APNSETTING mApnSetting=" + apnSetting); 844454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_APNSETTING, apnSetting); 845ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 846ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 847454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_LINK_PROPERTIES: { 848ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkProperties lp = getCopyLinkProperties(); 849ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp); 850454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_PROPERTIES, lp); 851ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 852ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 853454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: { 854ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ProxyProperties proxy = (ProxyProperties) msg.obj; 855ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy); 856ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setLinkPropertiesHttpProxy(proxy); 857454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY); 858ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 859ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 860454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_GET_LINK_CAPABILITIES: { 861ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville LinkCapabilities lc = getCopyLinkCapabilities(); 862ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("REQ_GET_LINK_CAPABILITIES linkCapabilities" + lc); 863454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_LINK_CAPABILITIES, lc); 864ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 865ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 866454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 867ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcDefaultState: msg.what=REQ_RESET"); 868ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 869ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 870ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 871ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); 872ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 873ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.UNKNOWN, false); 874ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 875ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 876ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 877ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 878ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT RefCount=" 879ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 880ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 881ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 882ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 883ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 884ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 885ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 886ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL RefCount=" 887ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 888ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 889ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 890ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 891ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 892ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_TEAR_DOWN_NOW: 893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDefaultState EVENT_TEAR_DOWN_NOW"); 894ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.deactivateDataCall(mCid, 0, null); 895ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 896ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 897ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: 898ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 899ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_LOST_CONNECTION" 900ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 901ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 902ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 903ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 904ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 905ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: 906ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 907ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String s = "DcDefaultState ignore EVENT_RETRY_CONNECTION" 908ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag=" + msg.arg1 + ":mTag=" + mTag; 909ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville logAndAddLogRec(s); 910ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 911ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 912ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 913ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 914ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 915ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDefaultState: shouldn't happen but ignore msg.what=" 916ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 918ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 919ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 920ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 921ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 922ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 923ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 924ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDefaultState mDefaultState = new DcDefaultState(); 925ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 926ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 927ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is inactive and expects a EVENT_CONNECT. 928ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 929ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcInactiveState extends State { 930ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed connecting 931ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(ConnectionParams cp, DcFailCause cause) { 932ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams cp,cause"); 933ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = cp; 934ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 935ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 936ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 937ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 938ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts we've failed disconnected 939ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DisconnectParams dp) { 940ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("DcInactiveState: setEnterNoticationParams dp"); 941ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 942ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 943ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 944ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 945ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 946ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Inform all contexts of the failure cause 947ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void setEnterNotificationParams(DcFailCause cause) { 948ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 949ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = null; 950ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 951ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 952ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 953ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 954ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 955ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag += 1; 956ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: enter() mTag=" + mTag); 957ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 958ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != null) { 959ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 960ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyConnectCompleted +ALL failCause=" 961ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 962ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(mConnectionParams, mDcFailCause, true); 964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams != null) { 966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyDisconnectCompleted +ALL failCause=" 968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(mDisconnectParams, true); 971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mDisconnectParams == null && mConnectionParams == null && mDcFailCause != null) { 973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: enter notifyAllDisconnectCompleted failCause=" 975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mDcFailCause); 976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllDisconnectCompleted(mDcFailCause); 978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from cid mapping, before clearSettings 981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 983ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville clearSettings(); 984ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 985ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 995454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: 996ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset"); 998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 10039a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcInactiveState: mag.what=EVENT_CONNECT"); 10049a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 10059a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 10069a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 10079a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 10089a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 10099a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 10109a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcInactiveState: msg.what=EVENT_CONNECT initConnection failed"); 10119a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 10129a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 10139a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 1014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1016ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1017ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1018ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: 1019ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT"); 1020ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1021ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1022ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1023ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1024ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: 1025ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL"); 1026ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted((DisconnectParams)msg.obj, false); 1027ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1028ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1029ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1030ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1031ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1032ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcInactiveState nothandled msg.what=" + getWhatToString(msg.what)); 1033ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1034ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1035ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1036ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1037ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1038ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1039ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1040ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcInactiveState mInactiveState = new DcInactiveState(); 1041ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1042ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1043ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is retrying and expects a EVENT_RETRY_CONNECTION. 1044ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1045ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcRetryingState extends State { 1046ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1047ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void enter() { 1048ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1049ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState: enter() mTag=" + mTag 1050ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + ", call notifyAllOfDisconnectDcRetrying lostConnection"); 1051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1052ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1053ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllOfDisconnectDcRetrying(Phone.REASON_LOST_DATA_CONNECTION); 1054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1055ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Remove ourselves from cid mapping 1056ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.removeActiveDcByCid(DataConnection.this); 1057ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mCid = -1; 1058ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1059ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1060ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1061ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1062ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1063ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1064ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1065ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_RETRY_CONNECTION: { 1066ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 == mTag) { 1067ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.increaseRetryCount(); 1068ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1069ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState EVENT_RETRY_CONNECTION" 1070ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " RetryCount=" + mRetryManager.getRetryCount() 1071ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1072ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1073ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville onConnect(mConnectionParams); 1074ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActivatingState); 1075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1077ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState stale EVENT_RETRY_CONNECTION" 1078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + msg.arg1 + " != mTag:" + mTag); 1079ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1080ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1081ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1082ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1083ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1084454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville case DcAsyncChannel.REQ_RESET: { 1085ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1086ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState: msg.what=RSP_RESET, ignore we're already reset"); 1087ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1088ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(mConnectionParams, 1089ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.RESET_BY_FRAMEWORK); 1090ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1091ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1092ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1093ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1094ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 10959a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1096ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 10979a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT" 10989a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville + " RefCount=" + mApnContexts.size() + " cp=" + cp 1099ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mConnectionParams=" + mConnectionParams); 1100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 11019a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (initConnection(cp)) { 11029a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville onConnect(mConnectionParams); 11039a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville transitionTo(mActivatingState); 11049a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } else { 11059a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) { 11069a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville log("DcRetryingState: msg.what=EVENT_CONNECT initConnection failed"); 11079a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 11089a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville notifyConnectCompleted(cp, DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER, 11099a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville false); 11109a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville } 1111ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1112ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1114ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1115ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1116ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1117ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.remove(dp.mApnContext) && mApnContexts.size() == 0) { 1118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1119ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT " + " RefCount=" 1120ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size() + " dp=" + dp); 1121ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1122ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(dp); 1123ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1124ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 11259a480819c79acf31f328d254b1bb9fe6cfac2c34Wink Saville if (DBG) log("DcRetryingState: msg.what=EVENT_DISCONNECT"); 1126ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1127ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1128ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1129ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1130ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1131ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1132ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1133ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState msg.what=EVENT_DISCONNECT/DISCONNECT_ALL " 1134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + "RefCount=" + mApnContexts.size()); 1135ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1136ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1137ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1138ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1139ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1140ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1141ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1142ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: { 1143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcRetryingState nothandled msg.what=" + getWhatToString(msg.what)); 1145ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1146ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1148ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1152ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1153ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcRetryingState mRetryingState = new DcRetryingState(); 1154ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1155ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1156ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is activating a connection. 1157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1158ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActivatingState extends State { 1159ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1160ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1161ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1162ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar; 1163ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp; 1164ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1165ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActivatingState: msg=" + msgToString(msg)); 1166ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1167ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1169ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1170ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1171ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_SETUP_DATA_CONNECTION_DONE: 1173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1175ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar); 1177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (result != DataCallResponse.SetupResult.ERR_Stale) { 1178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:"+ mConnectionParams 1180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1183c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1184c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState onSetupConnectionCompleted result=" + result 1185c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1186c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (result) { 1188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case SUCCESS: 1189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // All is well 1190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = DcFailCause.NONE; 1191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mActiveState); 1192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1193ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_BadCommand: 1194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Vendor ril rejected the command and didn't connect. 1195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1197ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1198ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1199ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1200ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_UnacceptableParameter: 1201ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The addresses given from the RIL are bad 1202ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(cp); 1203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingErrorCreatingConnection); 1204ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1205ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_GetLastErrorFromRil: 1206ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Request failed and this is an old RIL 1207ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.mCi.getLastDataCallFailCause( 1208ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp)); 1209ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1210ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_RilError: 1211ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delay = mDcRetryAlarmController.getSuggestedRetryTime( 1212ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection.this, ar); 1213c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1214c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState: ERR_RilError " 1215c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " delay=" + delay 1216c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded()); 1217c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (delay >= 0) { 1219ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, 1220ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mTag, delay); 1221ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1222ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1223ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, result.mFailCause); 1224ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1225ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1226ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case ERR_Stale: 1228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_SETUP_DATA_CONNECTION_DONE" 1229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1232ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville throw new RuntimeException("Unknown SetupResult, should not happen"); 1233ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1234ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1235ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_GET_LAST_FAIL_DONE: 1238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ar = (AsyncResult) msg.obj; 1239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cp = (ConnectionParams) ar.userObj; 1240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mConnectionParams != cp) { 1242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: WEIRD mConnectionsParams:" + mConnectionParams 1243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " != cp:" + cp); 1244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause cause = DcFailCause.UNKNOWN; 1247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (ar.exception == null) { 1249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int rilFailCause = ((int[]) (ar.result))[0]; 1250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = DcFailCause.fromInt(rilFailCause); 1251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcFailCause = cause; 1253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int retryDelay = mRetryManager.getRetryTimer(); 1255c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1256c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE" 1257c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " cause=" + cause 1258c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " retryDelay=" + retryDelay 1259c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " isRetryNeeded=" + mRetryManager.isRetryNeeded() 1260c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1261c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.isRetryNeeded()) { 1263ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1264ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retryDelay); 1265ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1266ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1267ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1268ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1269ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, cause); 1270ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1271ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1273ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("DcActivatingState: stale EVENT_GET_LAST_FAIL_DONE" 1274ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " tag:" + cp.mTag + " != mTag:" + mTag); 1275ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1279ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1281ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1282ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActivatingState not handled msg.what=" + 1283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville getWhatToString(msg.what) + " RefCount=" + mApnContexts.size()); 1284ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1286ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1287ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1288ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1290ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1291ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActivatingState mActivatingState = new DcActivatingState(); 1292ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1294ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is connected, expecting an EVENT_DISCONNECT. 1295ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1296ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcActiveState extends State { 1297ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override public void enter() { 1298ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: enter dc=" + DataConnection.this); 1299ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1300ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.getRetryCount() != 0) { 1301ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState: connected after retrying call notifyAllOfConnected"); 1302ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.setRetryCount(0); 1303ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1304ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If we were retrying there maybe more than one, otherwise they'll only be one. 1305ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyAllOfConnected(Phone.REASON_CONNECTED); 1306ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1307ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // If the EVENT_CONNECT set the current max retry restore it here 1308ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // if it didn't then this is effectively a NOP. 1309ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mRetryManager.restoreCurMaxRetryCount(); 1310ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcController.addActiveDcByCid(DataConnection.this); 1311ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1312ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1313ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1314ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void exit() { 1315ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcActiveState: exit dc=" + this); 1316ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1317ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1318ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1319ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1320ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1321ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1322ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1323ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: { 1324ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) msg.obj; 1325c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1326c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_CONNECT cp=" + cp + " dc=" + DataConnection.this); 1327c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1328ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.contains(cp.mApnContext)) { 1329c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState ERROR already added apnContext=" + cp.mApnContext); 1330ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1331ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.add(cp.mApnContext); 1332ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1333ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_CONNECT RefCount=" 1334ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1335ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1336ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyConnectCompleted(cp, DcFailCause.NONE, false); 1338ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1339ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT: { 1342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1343c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1344c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState: EVENT_DISCONNECT dp=" + dp 1345c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1346c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.contains(dp.mApnContext)) { 1348ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1349ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" 1350ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1351ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1352ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1353ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mApnContexts.size() == 1) { 1354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 1355ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1356ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1357ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1358ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1359ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1360ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1361ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.remove(dp.mApnContext); 1362ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1363ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1364ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1365ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState ERROR no such apnContext=" + dp.mApnContext 1366c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " in this dc=" + DataConnection.this); 1367ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyDisconnectCompleted(dp, false); 1368ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1369ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1370ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1372ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DISCONNECT_ALL: { 1373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1374c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_DISCONNECT clearing apn contexts," 1375c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville + " dc=" + DataConnection.this); 1376ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1377ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mApnContexts.clear(); 1378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) msg.obj; 1379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDisconnectParams = dp; 1380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mConnectionParams = null; 1381ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dp.mTag = mTag; 1382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville tearDownData(dp); 1383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mDisconnectingState); 1384ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1385ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1386ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1387ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_LOST_CONNECTION: { 1388c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville if (DBG) { 1389c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville log("DcActiveState EVENT_LOST_CONNECTION dc=" + DataConnection.this); 1390c3b7c73fd6a494483e941adddcb3c0c23f4f0a70Wink Saville } 1391ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mRetryManager.isRetryNeeded()) { 1392ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // We're going to retry 1393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville int delayMillis = mRetryManager.getRetryTimer(); 1394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1395ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState EVENT_LOST_CONNECTION startRetryAlarm" 1396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag + " delay=" + delayMillis + "ms"); 1397ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1398ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag, 1399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville delayMillis); 1400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mRetryingState); 1401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1402ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(DcFailCause.LOST_CONNECTION); 1403ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1409ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1410ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcActiveState not handled msg.what=" + getWhatToString(msg.what)); 1411ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcActiveState mActiveState = new DcActiveState(); 1419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting. 1422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectingState extends State { 1424ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1427ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1428ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1429ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_CONNECT: 1430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " 1431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville deferMessage(msg); 1433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount=" 1438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + mApnContexts.size()); 1439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DisconnectParams dp = (DisconnectParams) ar.userObj; 1441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dp.mTag == mTag) { 1442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj); 1445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("DcDisconnectState stale EVENT_DEACTIVATE_DONE" 1448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + dp.mTag + " mTag=" + mTag); 1449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectingState not handled msg.what=" 1456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1459ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1463ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1464ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectingState mDisconnectingState = new DcDisconnectingState(); 1465ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1466ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1467ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * The state machine is disconnecting after an creating a connection. 1468ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1469ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private class DcDisconnectionErrorCreatingConnection extends State { 1470ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1471ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public boolean processMessage(Message msg) { 1472ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville boolean retVal; 1473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1474ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (msg.what) { 1475ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case EVENT_DEACTIVATE_DONE: 1476ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville AsyncResult ar = (AsyncResult) msg.obj; 1477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ConnectionParams cp = (ConnectionParams) ar.userObj; 1478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (cp.mTag == mTag) { 1479ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1480ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection" + 1481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " msg.what=EVENT_DEACTIVATE_DONE"); 1482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1483ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1484ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Transition to inactive but send notifications after 1485ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we've entered the mInactive state. 1486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mInactiveState.setEnterNotificationParams(cp, 1487ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER); 1488ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville transitionTo(mInactiveState); 1489ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1490ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 1491ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection stale EVENT_DEACTIVATE_DONE" 1492ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " dp.tag=" + cp.mTag + ", mTag=" + mTag); 1493ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1494ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = HANDLED; 1496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville default: 1499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("DcDisconnectionErrorCreatingConnection not handled msg.what=" 1501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + getWhatToString(msg.what)); 1502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1503ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = NOT_HANDLED; 1504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville break; 1505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection = 1510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville new DcDisconnectionErrorCreatingConnection(); 1511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // ******* "public" interface 1513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1514ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Used for testing purposes. 1516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /* package */ void tearDownNow() { 1518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("tearDownNow()"); 1519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville sendMessage(obtainMessage(EVENT_TEAR_DOWN_NOW)); 1520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @return the string for msg.what as our info. 1524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected String getWhatToString(int what) { 1527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return cmdToString(what); 1528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static String msgToString(Message msg) { 1531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String retVal; 1532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg == null) { 1533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = "null"; 1534ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 1535ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville StringBuilder b = new StringBuilder(); 1536ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1537ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("{what="); 1538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(cmdToString(msg.what)); 1539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" when="); 1541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville TimeUtils.formatDuration(msg.getWhen() - SystemClock.uptimeMillis(), b); 1542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg1 != 0) { 1544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg1="); 1545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg1); 1546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1547ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.arg2 != 0) { 1549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" arg2="); 1550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.arg2); 1551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1553ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (msg.obj != null) { 1554ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" obj="); 1555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.obj); 1556ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" target="); 1559ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.getTarget()); 1560ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(" replyTo="); 1562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append(msg.replyTo); 1563ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1564ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville b.append("}"); 1565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1566ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville retVal = b.toString(); 1567ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1568ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return retVal; 1569ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1570ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville static void slog(String s) { 1572ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d("DC", s); 1573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1574ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1575ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1576ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug 1577ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1580cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1581cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void log(String s) { 1582cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.d(getName(), s); 15830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1586ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with debug attribute 1587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1589ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1591ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logd(String s) { 1592ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(getName(), s); 1593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 15940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with verbose attribute 1597ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logv(String s) { 1602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.v(getName(), s); 1603ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1604ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1605ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1606ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with info attribute 1607ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1608ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1609ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1611ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logi(String s) { 1612ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.i(getName(), s); 1613ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with warning attribute 1617ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void logw(String s) { 1622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.w(getName(), s); 16230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1625ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1626ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 1627ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1628ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1629ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s) { 1632ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s); 1633ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1634ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1635ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1636ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Log with error attribute 1637ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1638ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param s is string log 1639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param e is a Throwable which logs additional information. 1640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 1641ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1642ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected void loge(String s, Throwable e) { 1643ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.e(getName(), s, e); 1644ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1645ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Doesn't print mApnList of ApnContext's which would be recursive */ 1647ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toStringSimple() { 1648ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return getName() + ": State=" + getCurrentState().getName() 1649ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size() 1650ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mCid=" + mCid + " mCreateTime=" + mCreateTime 1651ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastastFailTime=" + mLastFailTime 1652ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLastFailCause=" + mLastFailCause 1653ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mTag=" + mTag 1654ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mRetryManager=" + mRetryManager 1655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLinkProperties=" + mLinkProperties 1656ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " mLinkCapabilities=" + mLinkCapabilities; 1657ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1658ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1659ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 1660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public String toString() { 1661ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return "{" + toStringSimple() + " mApnContexts=" + mApnContexts + "}"; 1662ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1663ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 1664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 1665ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Dump the current state. 1666ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 1667ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param fd 1668ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param pw 1669ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param args 1670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 16710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 16720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 1673ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.print("DataConnection "); 16740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 1675ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts.size=" + mApnContexts.size()); 1676ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnContexts=" + mApnContexts); 1677ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 1678ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDataConnectionTracker=" + mDct); 1679ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mApnSetting=" + mApnSetting); 1680ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mTag=" + mTag); 1681ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCid=" + mCid); 1682ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mRetryManager=" + mRetryManager); 1683ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mConnectionParams=" + mConnectionParams); 1684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDisconnectParams=" + mDisconnectParams); 1685ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcFailCause=" + mDcFailCause); 1686ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 1687ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mPhone=" + mPhone); 1688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 1689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLinkProperties=" + mLinkProperties); 1690ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 1691ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLinkCapabilities=" + mLinkCapabilities); 1692ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime)); 1693ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime)); 1694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mLastFailCause=" + mLastFailCause); 1695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 1696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mUserData=" + mUserData); 1697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mInstanceNumber=" + mInstanceNumber); 1698ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mAc=" + mAc); 1699ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDcRetryAlarmController=" + mDcRetryAlarmController); 1700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.flush(); 17010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1703