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
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.DataCallState.SetupResult;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.AsyncChannel;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.Protocol;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.State;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.StateMachine;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.PendingIntent;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkCapabilities;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkProperties;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.ProxyProperties;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.TimeUtils;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Calendar;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.HashMap;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicInteger;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * DataConnection StateMachine.
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This is an abstract base class for representing a single data connection.
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Instances of this class such as <code>CdmaDataConnection</code> and
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>GsmDataConnection</code>, * represent a connection via the cellular network.
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * There may be multiple data connections and all of them are managed by the
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>DataConnectionTracker</code>.
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Instances are asynchronous state machines and have two primary entry points
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>connect()</code> and <code>disconnect</code>. The message a parameter will be returned
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * hen the operation completes. The <code>msg.obj</code> will contain an AsyncResult
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and <code>AsyncResult.userObj</code> is the original <code>msg.obj</code>. if successful
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * with the <code>AsyncResult.result == null</code> and <code>AsyncResult.exception == null</code>.
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If an error <code>AsyncResult.result = FailCause</code> and
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>AsyncResult.exception = new Exception()</code>.
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The other public methods are provided for debugging.
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic abstract class DataConnection extends StateMachine {
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final boolean DBG = true;
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final boolean VDBG = false;
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static AtomicInteger mCount = new AtomicInteger(0);
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected AsyncChannel mAc;
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected List<ApnContext> mApnList = null;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    PendingIntent mReconnectIntent = null;
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DataConnectionTracker mDataConnectionTracker = null;
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Used internally for saving connecting parameters.
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static class ConnectionParams {
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public ConnectionParams(ApnSetting apn, Message onCompletedMsg) {
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.apn = apn;
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.onCompletedMsg = onCompletedMsg;
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public int tag;
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public ApnSetting apn;
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public Message onCompletedMsg;
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Used internally for saving disconnecting parameters.
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static class DisconnectParams {
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public DisconnectParams(String reason, Message onCompletedMsg) {
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.reason = reason;
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.onCompletedMsg = onCompletedMsg;
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public int tag;
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public String reason;
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public Message onCompletedMsg;
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returned as the reason for a connection failure as defined
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * by RIL_DataCallFailCause in ril.h and some local errors.
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public enum FailCause {
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        NONE(0),
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This series of errors as specified by the standards
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // specified in ril.h
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        OPERATOR_BARRED(0x08),
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        INSUFFICIENT_RESOURCES(0x1A),
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        MISSING_UNKNOWN_APN(0x1B),
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        UNKNOWN_PDP_ADDRESS_TYPE(0x1C),
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        USER_AUTHENTICATION(0x1D),
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ACTIVATION_REJECT_GGSN(0x1E),
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ACTIVATION_REJECT_UNSPECIFIED(0x1F),
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SERVICE_OPTION_NOT_SUPPORTED(0x20),
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SERVICE_OPTION_NOT_SUBSCRIBED(0x21),
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SERVICE_OPTION_OUT_OF_ORDER(0x22),
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        NSAPI_IN_USE(0x23),
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ONLY_IPV4_ALLOWED(0x32),
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ONLY_IPV6_ALLOWED(0x33),
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ONLY_SINGLE_BEARER_ALLOWED(0x34),
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        PROTOCOL_ERRORS(0x6F),
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Local errors generated by Vendor RIL
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // specified in ril.h
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        REGISTRATION_FAIL(-1),
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        GPRS_REGISTRATION_FAIL(-2),
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SIGNAL_LOST(-3),
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        PREF_RADIO_TECH_CHANGED(-4),
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        RADIO_POWER_OFF(-5),
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        TETHERED_CALL_ACTIVE(-6),
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ERROR_UNSPECIFIED(0xFFFF),
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Errors generated by the Framework
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // specified here
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        UNKNOWN(0x10000),
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        RADIO_NOT_AVAILABLE(0x10001),
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        UNACCEPTABLE_NETWORK_PARAMETER(0x10002),
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        CONNECTION_TO_DATACONNECTIONAC_BROKEN(0x10003);
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        private final int mErrorCode;
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        private static final HashMap<Integer, FailCause> sErrorCodeToFailCauseMap;
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        static {
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sErrorCodeToFailCauseMap = new HashMap<Integer, FailCause>();
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (FailCause fc : values()) {
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                sErrorCodeToFailCauseMap.put(fc.getErrorCode(), fc);
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        FailCause(int errorCode) {
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mErrorCode = errorCode;
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int getErrorCode() {
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return mErrorCode;
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public boolean isPermanentFail() {
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return (this == OPERATOR_BARRED) || (this == MISSING_UNKNOWN_APN) ||
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                   (this == UNKNOWN_PDP_ADDRESS_TYPE) || (this == USER_AUTHENTICATION) ||
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                   (this == SERVICE_OPTION_NOT_SUPPORTED) ||
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                   (this == SERVICE_OPTION_NOT_SUBSCRIBED) || (this == NSAPI_IN_USE) ||
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                   (this == PROTOCOL_ERRORS);
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public boolean isEventLoggable() {
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return (this == OPERATOR_BARRED) || (this == INSUFFICIENT_RESOURCES) ||
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    (this == UNKNOWN_PDP_ADDRESS_TYPE) || (this == USER_AUTHENTICATION) ||
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    (this == ACTIVATION_REJECT_GGSN) || (this == ACTIVATION_REJECT_UNSPECIFIED) ||
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    (this == SERVICE_OPTION_NOT_SUBSCRIBED) ||
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    (this == SERVICE_OPTION_NOT_SUPPORTED) ||
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    (this == SERVICE_OPTION_OUT_OF_ORDER) || (this == NSAPI_IN_USE) ||
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    (this == PROTOCOL_ERRORS) ||
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    (this == UNACCEPTABLE_NETWORK_PARAMETER);
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public static FailCause fromInt(int errorCode) {
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            FailCause fc = sErrorCodeToFailCauseMap.get(errorCode);
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (fc == null) {
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                fc = UNKNOWN;
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return fc;
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static class CallSetupException extends Exception {
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        private int mRetryOverride = -1;
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        CallSetupException (int retryOverride) {
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mRetryOverride = retryOverride;
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public int getRetryOverride() {
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return mRetryOverride;
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // ***** Event codes for driving the state machine
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int BASE = Protocol.BASE_DATA_CONNECTION;
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_CONNECT = BASE + 0;
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SETUP_DATA_CONNECTION_DONE = BASE + 1;
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_LAST_FAIL_DONE = BASE + 2;
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_DEACTIVATE_DONE = BASE + 3;
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_DISCONNECT = BASE + 4;
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_RIL_CONNECTED = BASE + 5;
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_DISCONNECT_ALL = BASE + 6;
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int CMD_TO_STRING_COUNT = EVENT_DISCONNECT_ALL - BASE + 1;
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT];
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static {
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sCmdToString[EVENT_CONNECT - BASE] = "EVENT_CONNECT";
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sCmdToString[EVENT_SETUP_DATA_CONNECTION_DONE - BASE] =
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "EVENT_SETUP_DATA_CONNECTION_DONE";
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sCmdToString[EVENT_GET_LAST_FAIL_DONE - BASE] = "EVENT_GET_LAST_FAIL_DONE";
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sCmdToString[EVENT_DEACTIVATE_DONE - BASE] = "EVENT_DEACTIVATE_DONE";
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sCmdToString[EVENT_DISCONNECT - BASE] = "EVENT_DISCONNECT";
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sCmdToString[EVENT_RIL_CONNECTED - BASE] = "EVENT_RIL_CONNECTED";
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sCmdToString[EVENT_DISCONNECT_ALL - BASE] = "EVENT_DISCONNECT_ALL";
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static String cmdToString(int cmd) {
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        cmd -= BASE;
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if ((cmd >= 0) && (cmd < sCmdToString.length)) {
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return sCmdToString[cmd];
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Tag IDs for EventLog
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_LOG_BAD_DNS_ADDRESS = 50100;
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Member Variables
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected ApnSetting mApn;
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int mTag;
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected PhoneBase phone;
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int mRilVersion = -1;
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int cid;
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected LinkProperties mLinkProperties = new LinkProperties();
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected LinkCapabilities mCapabilities = new LinkCapabilities();
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected long createTime;
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected long lastFailTime;
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected FailCause lastFailCause;
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int mRetryOverride = -1;
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final String NULL_IP = "0.0.0.0";
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int mRefCount;
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Object userData;
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Abstract methods
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract String toString();
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected abstract void onConnect(ConnectionParams cp);
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected abstract boolean isDnsOk(String[] domainNameServers);
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected abstract void log(String s);
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville   //***** Constructor
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected DataConnection(PhoneBase phone, String name, int id, RetryManager rm,
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            DataConnectionTracker dct) {
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super(name);
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setLogRecSize(100);
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("DataConnection constructor E");
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.phone = phone;
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.mDataConnectionTracker = dct;
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mId = id;
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRetryMgr = rm;
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.cid = -1;
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setDbg(false);
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        addState(mDefaultState);
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            addState(mInactiveState, mDefaultState);
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            addState(mActivatingState, mDefaultState);
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            addState(mActiveState, mDefaultState);
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            addState(mDisconnectingState, mDefaultState);
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            addState(mDisconnectingErrorCreatingConnection, mDefaultState);
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setInitialState(mInactiveState);
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApnList = new ArrayList<ApnContext>();
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("DataConnection constructor X");
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Shut down this instance and its state machine.
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void shutDown() {
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("shutDown");
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mAc != null) {
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mAc.disconnected();
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mAc = null;
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApnList = null;
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mReconnectIntent = null;
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataConnectionTracker = null;
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApn = null;
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        phone = null;
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mLinkProperties = null;
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCapabilities = null;
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        lastFailCause = null;
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        userData = null;
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * TearDown the data connection.
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param o will be returned in AsyncResult.userObj
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *          and is either a DisconnectParams or ConnectionParams.
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void tearDownData(Object o) {
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int discReason = RILConstants.DEACTIVATE_REASON_NONE;
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if ((o != null) && (o instanceof DisconnectParams)) {
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            DisconnectParams dp = (DisconnectParams)o;
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message m = dp.onCompletedMsg;
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (TextUtils.equals(dp.reason, Phone.REASON_RADIO_TURNED_OFF)) {
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF;
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (TextUtils.equals(dp.reason, Phone.REASON_PDP_RESET)) {
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET;
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (phone.mCM.getRadioState().isOn()) {
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("tearDownData radio is on, call deactivateDataCall");
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            phone.mCM.deactivateDataCall(cid, discReason, obtainMessage(EVENT_DEACTIVATE_DONE, o));
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately");
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult ar = new AsyncResult(o, null, null);
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, ar));
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Send the connectionCompletedMsg.
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param cp is the ConnectionParams
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param cause
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void notifyConnectCompleted(ConnectionParams cp, FailCause cause) {
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message connectionCompletedMsg = cp.onCompletedMsg;
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (connectionCompletedMsg == null) {
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        long timeStamp = System.currentTimeMillis();
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        connectionCompletedMsg.arg1 = cid;
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (cause == FailCause.NONE) {
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            createTime = timeStamp;
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult.forMessage(connectionCompletedMsg);
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            lastFailCause = cause;
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            lastFailTime = timeStamp;
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult.forMessage(connectionCompletedMsg, cause,
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                   new CallSetupException(mRetryOverride));
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("notifyConnectionCompleted at " + timeStamp + " cause=" + cause);
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        connectionCompletedMsg.sendToTarget();
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Send ar.userObj if its a message, which is should be back to originator.
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param dp is the DisconnectParams.
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) {
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (VDBG) log("NotifyDisconnectCompleted");
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ApnContext alreadySent = null;
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String reason = null;
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (dp.onCompletedMsg != null) {
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Get ApnContext, but only valid on GSM devices this is a string on CDMA devices.
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message msg = dp.onCompletedMsg;
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (msg.obj instanceof ApnContext) {
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                alreadySent = (ApnContext)msg.obj;
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            reason = dp.reason;
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (VDBG) {
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log(String.format("msg=%s msg.obj=%s", msg.toString(),
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>")));
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult.forMessage(msg);
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            msg.sendToTarget();
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (sendAll) {
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (ApnContext a : mApnList) {
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (a == alreadySent) continue;
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (reason != null) a.setReason(reason);
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Message msg = mDataConnectionTracker.obtainMessage(
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        DctConstants.EVENT_DISCONNECT_DONE, a);
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                AsyncResult.forMessage(msg);
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                msg.sendToTarget();
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp);
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int getRilRadioTechnology(int defaultRilRadioTechnology) {
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int rilRadioTechnology;
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mRilVersion < 6) {
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            rilRadioTechnology = defaultRilRadioTechnology;
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            rilRadioTechnology = phone.getServiceState().getRilRadioTechnology() + 2;
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return rilRadioTechnology;
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * **************************************************************************
4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Begin Members and methods owned by DataConnectionTracker but stored
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * in a DataConnection because there is one per connection.
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * **************************************************************************
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The id is owned by DataConnectionTracker.
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int mId;
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get the DataConnection ID
4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getDataConnectionId() {
4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mId;
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The retry manager is currently owned by the DataConnectionTracker but is stored
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * in the DataConnection because there is one per connection. These methods
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * should only be used by the DataConnectionTracker although someday the retrying
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * maybe managed by the DataConnection itself and these methods could disappear.
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private RetryManager mRetryMgr;
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return retry manager retryCount
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getRetryCount() {
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mRetryMgr.getRetryCount();
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * set retry manager retryCount
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setRetryCount(int retryCount) {
4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("setRetryCount: " + retryCount);
4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRetryMgr.setRetryCount(retryCount);
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return retry manager retryTimer
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getRetryTimer() {
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mRetryMgr.getRetryTimer();
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * increaseRetryCount of retry manager
4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void increaseRetryCount() {
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRetryMgr.increaseRetryCount();
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return retry manager isRetryNeeded
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isRetryNeeded() {
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mRetryMgr.isRetryNeeded();
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * resetRetryCount of retry manager
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void resetRetryCount() {
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRetryMgr.resetRetryCount();
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * set retryForeverUsingLasttimeout of retry manager
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void retryForeverUsingLastTimeout() {
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRetryMgr.retryForeverUsingLastTimeout();
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return retry manager isRetryForever
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isRetryForever() {
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mRetryMgr.isRetryForever();
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return whether the retry config is set successfully or not
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean configureRetry(int maxRetryCount, int retryTime, int randomizationTime) {
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mRetryMgr.configure(maxRetryCount, retryTime, randomizationTime);
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return whether the retry config is set successfully or not
5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean configureRetry(String configStr) {
5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mRetryMgr.configure(configStr);
5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * **************************************************************************
5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * End members owned by DataConnectionTracker
5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * **************************************************************************
5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Clear all settings called when entering mInactiveState.
5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void clearSettings() {
5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("clearSettings");
5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        createTime = -1;
5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        lastFailTime = -1;
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        lastFailCause = FailCause.NONE;
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRetryOverride = -1;
5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRefCount = 0;
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        cid = -1;
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mLinkProperties = new LinkProperties();
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mApn = null;
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Process setup completion.
5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param ar is the result
5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return SetupResult.
5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DataCallState.SetupResult onSetupConnectionCompleted(AsyncResult ar) {
5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DataCallState response = (DataCallState) ar.result;
5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ConnectionParams cp = (ConnectionParams) ar.userObj;
5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DataCallState.SetupResult result;
5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ar.exception != null) {
5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) {
5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("onSetupConnectionCompleted failed, ar.exception=" + ar.exception +
5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    " response=" + response);
5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ar.exception instanceof CommandException
5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    && ((CommandException) (ar.exception)).getCommandError()
5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    == CommandException.Error.RADIO_NOT_AVAILABLE) {
5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = DataCallState.SetupResult.ERR_BadCommand;
5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result.mFailCause = FailCause.RADIO_NOT_AVAILABLE;
5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if ((response == null) || (response.version < 4)) {
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = DataCallState.SetupResult.ERR_GetLastErrorFromRil;
5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = DataCallState.SetupResult.ERR_RilError;
5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result.mFailCause = FailCause.fromInt(response.status);
5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (cp.tag != mTag) {
5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) {
5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("BUG: onSetupConnectionCompleted is stale cp.tag=" + cp.tag + ", mtag=" + mTag);
5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            result = DataCallState.SetupResult.ERR_Stale;
5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (response.status != 0) {
5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            result = DataCallState.SetupResult.ERR_RilError;
5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            result.mFailCause = FailCause.fromInt(response.status);
5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("onSetupConnectionCompleted received DataCallState: " + response);
5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            cid = response.cid;
5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            result = updateLinkProperty(response).setupResult;
5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return result;
5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int getSuggestedRetryTime(AsyncResult ar) {
5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int retry = -1;
5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ar.exception == null) {
5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            DataCallState response = (DataCallState) ar.result;
5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            retry =  response.suggestedRetryTime;
5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return retry;
5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DataCallState.SetupResult setLinkProperties(DataCallState response,
5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            LinkProperties lp) {
5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Check if system property dns usable
5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean okToUseSystemPropertyDns = false;
5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String propertyPrefix = "net." + response.ifname + ".";
5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String dnsServers[] = new String[2];
5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1");
5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2");
5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        okToUseSystemPropertyDns = isDnsOk(dnsServers);
5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // set link properties based on data call response
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return response.setLinkProperties(lp, okToUseSystemPropertyDns);
6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static class UpdateLinkPropertyResult {
6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public DataCallState.SetupResult setupResult = DataCallState.SetupResult.SUCCESS;
6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public LinkProperties oldLp;
6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public LinkProperties newLp;
6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public UpdateLinkPropertyResult(LinkProperties curLp) {
6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            oldLp = curLp;
6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            newLp = curLp;
6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private UpdateLinkPropertyResult updateLinkProperty(DataCallState newState) {
6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        UpdateLinkPropertyResult result = new UpdateLinkPropertyResult(mLinkProperties);
6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (newState == null) return result;
6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DataCallState.SetupResult setupResult;
6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        result.newLp = new LinkProperties();
6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // set link properties based on data call response
6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        result.setupResult = setLinkProperties(newState, result.newLp);
6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (result.setupResult != DataCallState.SetupResult.SUCCESS) {
6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("updateLinkProperty failed : " + result.setupResult);
6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return result;
6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // copy HTTP proxy as it is not part DataCallState.
6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        result.newLp.setHttpProxy(mLinkProperties.getHttpProxy());
6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG && (! result.oldLp.equals(result.newLp))) {
6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("updateLinkProperty old LP=" + result.oldLp);
6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("updateLinkProperty new LP=" + result.newLp);
6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mLinkProperties = result.newLp;
6350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return result;
6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The parent state for all other states.
6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private class DcDefaultState extends State {
6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void enter() {
6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            phone.mCM.registerForRilConnected(getHandler(), EVENT_RIL_CONNECTED, null);
6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void exit() {
6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            phone.mCM.unregisterForRilConnected(getHandler());
6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            shutDown();
6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public boolean processMessage(Message msg) {
6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean retVal = HANDLED;
6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult ar;
6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (msg.what) {
6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: {
6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (mAc != null) {
6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (VDBG) log("Disconnecting to previous connection mAc=" + mAc);
6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED,
6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED);
6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mAc = new AsyncChannel();
6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mAc.connected(null, getHandler(), msg.replyTo);
6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (VDBG) log("DcDefaultState: FULL_CONNECTION reply connected");
6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mAc.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED,
6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                AsyncChannel.STATUS_SUCCESSFUL, mId, "hi");
6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {
6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("CMD_CHANNEL_DISCONNECTED");
6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    quit();
6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_IS_INACTIVE: {
6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    boolean val = getCurrentState() == mInactiveState;
6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_IS_INACTIVE  isInactive=" + val);
6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_IS_INACTIVE, val ? 1 : 0);
6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_GET_CID: {
6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_GET_CID  cid=" + cid);
6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_CID, cid);
6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_GET_APNSETTING: {
6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_GET_APNSETTING  apnSetting=" + mApn);
6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_APNSETTING, mApn);
6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_GET_LINK_PROPERTIES: {
6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    LinkProperties lp = new LinkProperties(mLinkProperties);
6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_GET_LINK_PROPERTIES linkProperties" + lp);
6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_LINK_PROPERTIES, lp);
6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_SET_LINK_PROPERTIES_HTTP_PROXY: {
7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ProxyProperties proxy = (ProxyProperties) msg.obj;
7010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_SET_LINK_PROPERTIES_HTTP_PROXY proxy=" + proxy);
7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mLinkProperties.setHttpProxy(proxy);
7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_SET_LINK_PROPERTIES_HTTP_PROXY);
7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
7060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE: {
7070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    DataCallState newState = (DataCallState) msg.obj;
7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    UpdateLinkPropertyResult result =
7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                             updateLinkProperty(newState);
7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) {
7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE result="
7120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            + result + " newState=" + newState);
7130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
7140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg,
7150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                   DataConnectionAc.RSP_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE,
7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                   result);
7170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_GET_LINK_CAPABILITIES: {
7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    LinkCapabilities lc = new LinkCapabilities(mCapabilities);
7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_GET_LINK_CAPABILITIES linkCapabilities" + lc);
7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_LINK_CAPABILITIES, lc);
7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
7250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_RESET:
7260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("DcDefaultState: msg.what=REQ_RESET");
7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_RESET);
7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    transitionTo(mInactiveState);
7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_GET_REFCOUNT: {
7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_GET_REFCOUNT  refCount=" + mRefCount);
7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_REFCOUNT, mRefCount);
7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_ADD_APNCONTEXT: {
7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ApnContext apnContext = (ApnContext) msg.obj;
7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_ADD_APNCONTEXT apn=" + apnContext.getApnType());
7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (!mApnList.contains(apnContext)) {
7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mApnList.add(apnContext);
7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_ADD_APNCONTEXT);
7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
7440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_REMOVE_APNCONTEXT: {
7450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ApnContext apnContext = (ApnContext) msg.obj;
7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_REMOVE_APNCONTEXT apn=" + apnContext.getApnType());
7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mApnList.remove(apnContext);
7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_REMOVE_APNCONTEXT);
7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_GET_APNCONTEXT_LIST: {
7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_GET_APNCONTEXT_LIST num in list=" + mApnList.size());
7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_APNCONTEXT_LIST,
7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                       new ArrayList<ApnContext>(mApnList));
7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_SET_RECONNECT_INTENT: {
7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    PendingIntent intent = (PendingIntent) msg.obj;
7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_SET_RECONNECT_INTENT");
7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mReconnectIntent = intent;
7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_SET_RECONNECT_INTENT);
7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_GET_RECONNECT_INTENT: {
7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) log("REQ_GET_RECONNECT_INTENT");
7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_RECONNECT_INTENT,
7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                       mReconnectIntent);
7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_CONNECT:
7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected");
7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ConnectionParams cp = (ConnectionParams) msg.obj;
7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    notifyConnectCompleted(cp, FailCause.UNKNOWN);
7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_DISCONNECT:
7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) {
7780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcDefaultState deferring msg.what=EVENT_DISCONNECT" + mRefCount);
7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    deferMessage(msg);
7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_DISCONNECT_ALL:
7840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) {
7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL" + mRefCount);
7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    deferMessage(msg);
7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_RIL_CONNECTED:
7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ar = (AsyncResult)msg.obj;
7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (ar.exception == null) {
7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mRilVersion = (Integer)ar.result;
7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (DBG) {
7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            log("DcDefaultState: msg.what=EVENT_RIL_CONNECTED mRilVersion=" +
7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                mRilVersion);
7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("Unexpected exception on EVENT_RIL_CONNECTED");
8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mRilVersion = -1;
8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                default:
8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) {
8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcDefaultState: shouldn't happen but ignore msg.what=0x" +
8070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                Integer.toHexString(msg.what));
8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return retVal;
8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DcDefaultState mDefaultState = new DcDefaultState();
8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The state machine is inactive and expects a EVENT_CONNECT.
8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private class DcInactiveState extends State {
8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        private ConnectionParams mConnectionParams = null;
8220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        private FailCause mFailCause = null;
8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        private DisconnectParams mDisconnectParams = null;
8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void setEnterNotificationParams(ConnectionParams cp, FailCause cause,
8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                               int retryOverride) {
8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (VDBG) log("DcInactiveState: setEnterNoticationParams cp,cause");
8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mConnectionParams = cp;
8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mFailCause = cause;
8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mRetryOverride = retryOverride;
8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void setEnterNotificationParams(DisconnectParams dp) {
8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (VDBG) log("DcInactiveState: setEnterNoticationParams dp");
8350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mDisconnectParams = dp;
8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void enter() {
8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mTag += 1;
8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            /**
8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * Now that we've transitioned to Inactive state we
8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * can send notifications. Previously we sent the
8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * notifications in the processMessage handler but
8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * that caused a race condition because the synchronous
8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * call to isInactive.
8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             */
8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if ((mConnectionParams != null) && (mFailCause != null)) {
8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (VDBG) log("DcInactiveState: enter notifyConnectCompleted");
8510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                notifyConnectCompleted(mConnectionParams, mFailCause);
8520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (mDisconnectParams != null) {
8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (VDBG) log("DcInactiveState: enter notifyDisconnectCompleted");
8550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                notifyDisconnectCompleted(mDisconnectParams, true);
8560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            clearSettings();
8580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void exit() {
8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // clear notifications
8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mConnectionParams = null;
8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mFailCause = null;
8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mDisconnectParams = null;
8660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public boolean processMessage(Message msg) {
8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean retVal;
8710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (msg.what) {
8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DataConnectionAc.REQ_RESET:
8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) {
8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcInactiveState: msg.what=RSP_RESET, ignore we're already reset");
8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mAc.replyToMessage(msg, DataConnectionAc.RSP_RESET);
8780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_CONNECT:
8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ConnectionParams cp = (ConnectionParams) msg.obj;
8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    cp.tag = mTag;
8840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) {
8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcInactiveState msg.what=EVENT_CONNECT." + "RefCount = "
8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                + mRefCount);
8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mRefCount = 1;
8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    onConnect(cp);
8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    transitionTo(mActivatingState);
8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_DISCONNECT:
8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT");
8960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    notifyDisconnectCompleted((DisconnectParams)msg.obj, false);
8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_DISCONNECT_ALL:
9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL");
9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    notifyDisconnectCompleted((DisconnectParams)msg.obj, false);
9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                default:
9070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) {
9080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcInactiveState nothandled msg.what=0x" +
9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                Integer.toHexString(msg.what));
9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = NOT_HANDLED;
9120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
9130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return retVal;
9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DcInactiveState mInactiveState = new DcInactiveState();
9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The state machine is activating a connection.
9210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private class DcActivatingState extends State {
9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public boolean processMessage(Message msg) {
9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean retVal;
9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult ar;
9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ConnectionParams cp;
9280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (msg.what) {
9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_CONNECT:
9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("DcActivatingState deferring msg.what=EVENT_CONNECT refCount = "
9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            + mRefCount);
9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    deferMessage(msg);
9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
9350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
9360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_SETUP_DATA_CONNECTION_DONE:
9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("DcActivatingState msg.what=EVENT_SETUP_DATA_CONNECTION_DONE");
9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ar = (AsyncResult) msg.obj;
9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    cp = (ConnectionParams) ar.userObj;
9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    DataCallState.SetupResult result = onSetupConnectionCompleted(ar);
9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("DcActivatingState onSetupConnectionCompleted result=" + result);
9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    switch (result) {
9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        case SUCCESS:
9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // All is well
9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            mActiveState.setEnterNotificationParams(cp, FailCause.NONE);
9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            transitionTo(mActiveState);
9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            break;
9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        case ERR_BadCommand:
9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // Vendor ril rejected the command and didn't connect.
9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // Transition to inactive but send notifications after
9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // we've entered the mInactive state.
9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            mInactiveState.setEnterNotificationParams(cp, result.mFailCause, -1);
9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            transitionTo(mInactiveState);
9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            break;
9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        case ERR_UnacceptableParameter:
9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // The addresses given from the RIL are bad
9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            tearDownData(cp);
9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            transitionTo(mDisconnectingErrorCreatingConnection);
9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            break;
9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        case ERR_GetLastErrorFromRil:
9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // Request failed and this is an old RIL
9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            phone.mCM.getLastDataCallFailCause(
9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    obtainMessage(EVENT_GET_LAST_FAIL_DONE, cp));
9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            break;
9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        case ERR_RilError:
9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // Request failed and mFailCause has the reason
9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            mInactiveState.setEnterNotificationParams(cp, result.mFailCause,
9710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                                                      getSuggestedRetryTime(ar));
9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            transitionTo(mInactiveState);
9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            break;
9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        case ERR_Stale:
9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // Request is stale, ignore.
9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            break;
9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        default:
9780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            throw new RuntimeException("Unknown SetupResult, should not happen");
9790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
9810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
9820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_GET_LAST_FAIL_DONE:
9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ar = (AsyncResult) msg.obj;
9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    cp = (ConnectionParams) ar.userObj;
9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    FailCause cause = FailCause.UNKNOWN;
9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (cp.tag == mTag) {
9890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (DBG) log("DcActivatingState msg.what=EVENT_GET_LAST_FAIL_DONE");
9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (ar.exception == null) {
9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            int rilFailCause = ((int[]) (ar.result))[0];
9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            cause = FailCause.fromInt(rilFailCause);
9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Transition to inactive but send notifications after
9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // we've entered the mInactive state.
9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mInactiveState.setEnterNotificationParams(cp, cause, -1);
9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        transitionTo(mInactiveState);
9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
9990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (DBG) {
10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            log("DcActivatingState EVENT_GET_LAST_FAIL_DONE is stale cp.tag="
10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                + cp.tag + ", mTag=" + mTag);
10020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
10040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                default:
10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) {
10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcActivatingState not handled msg.what=0x" +
10110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                Integer.toHexString(msg.what));
10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
10130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = NOT_HANDLED;
10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return retVal;
10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DcActivatingState mActivatingState = new DcActivatingState();
10200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The state machine is connected, expecting an EVENT_DISCONNECT.
10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private class DcActiveState extends State {
10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        private ConnectionParams mConnectionParams = null;
10260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        private FailCause mFailCause = null;
10270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void setEnterNotificationParams(ConnectionParams cp, FailCause cause) {
10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (VDBG) log("DcInactiveState: setEnterNoticationParams cp,cause");
10300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mConnectionParams = cp;
10310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mFailCause = cause;
10320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override public void enter() {
10350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            /**
10360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * Now that we've transitioned to Active state we
10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * can send notifications. Previously we sent the
10380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * notifications in the processMessage handler but
10390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * that caused a race condition because the synchronous
10400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * call to isActive.
10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             */
10420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if ((mConnectionParams != null) && (mFailCause != null)) {
10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (VDBG) log("DcActiveState: enter notifyConnectCompleted");
10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                notifyConnectCompleted(mConnectionParams, mFailCause);
10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void exit() {
10500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // clear notifications
10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mConnectionParams = null;
10520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mFailCause = null;
10530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public boolean processMessage(Message msg) {
10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean retVal;
10580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (msg.what) {
10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_CONNECT:
10610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mRefCount++;
10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("DcActiveState msg.what=EVENT_CONNECT RefCount=" + mRefCount);
10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (msg.obj != null) {
10640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        notifyConnectCompleted((ConnectionParams) msg.obj, FailCause.NONE);
10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
10660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
10670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
10680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_DISCONNECT:
10690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mRefCount--;
10700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" + mRefCount);
10710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (mRefCount == 0)
10720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    {
10730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        DisconnectParams dp = (DisconnectParams) msg.obj;
10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        dp.tag = mTag;
10750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        tearDownData(dp);
10760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        transitionTo(mDisconnectingState);
10770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
10780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (msg.obj != null) {
10790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            notifyDisconnectCompleted((DisconnectParams) msg.obj, false);
10800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
10810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
10820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
10830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
10840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_DISCONNECT_ALL:
10860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) {
10870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcActiveState msg.what=EVENT_DISCONNECT_ALL RefCount=" + mRefCount);
10880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mRefCount = 0;
10900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    DisconnectParams dp = (DisconnectParams) msg.obj;
10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    dp.tag = mTag;
10920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    tearDownData(dp);
10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    transitionTo(mDisconnectingState);
10940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
10950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
10960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                default:
10980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) {
10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcActiveState not handled msg.what=0x" +
11000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                Integer.toHexString(msg.what));
11010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
11020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = NOT_HANDLED;
11030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
11040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return retVal;
11060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DcActiveState mActiveState = new DcActiveState();
11090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The state machine is disconnecting.
11120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private class DcDisconnectingState extends State {
11140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
11150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public boolean processMessage(Message msg) {
11160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean retVal;
11170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (msg.what) {
11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_CONNECT:
11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = "
11210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            + mRefCount);
11220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    deferMessage(msg);
11230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
11240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
11250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_DEACTIVATE_DONE:
11270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE");
11280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    AsyncResult ar = (AsyncResult) msg.obj;
11290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    DisconnectParams dp = (DisconnectParams) ar.userObj;
11300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (dp.tag == mTag) {
11310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Transition to inactive but send notifications after
11320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // we've entered the mInactive state.
11330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj);
11340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        transitionTo(mInactiveState);
11350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
11360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (DBG) log("DcDisconnectState EVENT_DEACTIVATE_DONE stale dp.tag="
11370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                + dp.tag + " mTag=" + mTag);
11380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
11390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
11400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
11410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                default:
11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) {
11440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcDisconnectingState not handled msg.what=0x" +
11450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                Integer.toHexString(msg.what));
11460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
11470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = NOT_HANDLED;
11480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
11490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return retVal;
11510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DcDisconnectingState mDisconnectingState = new DcDisconnectingState();
11540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The state machine is disconnecting after an creating a connection.
11570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private class DcDisconnectionErrorCreatingConnection extends State {
11590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
11600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public boolean processMessage(Message msg) {
11610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean retVal;
11620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (msg.what) {
11640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_DEACTIVATE_DONE:
11650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    AsyncResult ar = (AsyncResult) msg.obj;
11660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ConnectionParams cp = (ConnectionParams) ar.userObj;
11670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (cp.tag == mTag) {
11680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (DBG) {
11690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            log("DcDisconnectionErrorCreatingConnection" +
11700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                " msg.what=EVENT_DEACTIVATE_DONE");
11710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
11720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Transition to inactive but send notifications after
11740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // we've entered the mInactive state.
11750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mInactiveState.setEnterNotificationParams(cp,
11760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                FailCause.UNACCEPTABLE_NETWORK_PARAMETER, -1);
11770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        transitionTo(mInactiveState);
11780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
11790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (DBG) {
11800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            log("DcDisconnectionErrorCreatingConnection EVENT_DEACTIVATE_DONE" +
11810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    " stale dp.tag=" + cp.tag + ", mTag=" + mTag);
11820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
11830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
11840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = HANDLED;
11850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
11860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                default:
11880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (VDBG) {
11890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("DcDisconnectionErrorCreatingConnection not handled msg.what=0x"
11900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                + Integer.toHexString(msg.what));
11910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
11920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    retVal = NOT_HANDLED;
11930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
11940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return retVal;
11960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DcDisconnectionErrorCreatingConnection mDisconnectingErrorCreatingConnection =
11990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                new DcDisconnectionErrorCreatingConnection();
12000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // ******* public interface
12020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Bring up a connection to the apn and return an AsyncResult in onCompletedMsg.
12050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Used for cellular networks that use Acesss Point Names (APN) such
12060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * as GSM networks.
12070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
12080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param onCompletedMsg is sent with its msg.obj as an AsyncResult object.
12090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *        With AsyncResult.userObj set to the original msg.obj,
12100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *        AsyncResult.result = FailCause and AsyncResult.exception = Exception().
12110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param apn is the Access Point Name to bring up a connection to
12120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void bringUp(Message onCompletedMsg, ApnSetting apn) {
12140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sendMessage(obtainMessage(EVENT_CONNECT, new ConnectionParams(apn, onCompletedMsg)));
12150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Tear down the connection through the apn on the network.
12190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
12200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param onCompletedMsg is sent with its msg.obj as an AsyncResult object.
12210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *        With AsyncResult.userObj set to the original msg.obj.
12220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void tearDown(String reason, Message onCompletedMsg) {
12240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sendMessage(obtainMessage(EVENT_DISCONNECT, new DisconnectParams(reason, onCompletedMsg)));
12250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Tear down the connection through the apn on the network.  Ignores refcount and
12290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * and always tears down.
12300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
12310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param onCompletedMsg is sent with its msg.obj as an AsyncResult object.
12320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *        With AsyncResult.userObj set to the original msg.obj.
12330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void tearDownAll(String reason, Message onCompletedMsg) {
12350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sendMessage(obtainMessage(EVENT_DISCONNECT_ALL,
12360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                new DisconnectParams(reason, onCompletedMsg)));
12370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the string for msg.what as our info.
12410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
12430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String getWhatToString(int what) {
12440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String info = null;
12450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        info = cmdToString(what);
12460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (info == null) {
12470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            info = DataConnectionAc.cmdToString(what);
12480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return info;
12500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Dump the current state.
12540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
12550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param fd
12560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param pw
12570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param args
12580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
12600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
12610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.print("DataConnection ");
12620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.dump(fd, pw, args);
12630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mApnList=" + mApnList);
12640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.flush();
12650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mDataConnectionTracker=" + mDataConnectionTracker);
12660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mApn=" + mApn);
12670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mTag=" + mTag);
12680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.flush();
12690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" phone=" + phone);
12700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mRilVersion=" + mRilVersion);
12710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" cid=" + cid);
12720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.flush();
12730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mLinkProperties=" + mLinkProperties);
12740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.flush();
12750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCapabilities=" + mCapabilities);
12760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" createTime=" + TimeUtils.logTimeOfDay(createTime));
12770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" lastFailTime=" + TimeUtils.logTimeOfDay(lastFailTime));
12780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" lastFailCause=" + lastFailCause);
12790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.flush();
12800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mRetryOverride=" + mRetryOverride);
12810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mRefCount=" + mRefCount);
12820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" userData=" + userData);
12830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mRetryMgr != null) pw.println(" " + mRetryMgr);
12840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.flush();
12850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
1287