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