DcTrackerBase.java revision 8002387711e57456dbb4353eb894714592f303fb
1cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville/*
2cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Copyright (C) 2006 The Android Open Source Project
3cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville *
4cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * you may not use this file except in compliance with the License.
6cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * You may obtain a copy of the License at
7cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville *
8cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville *
10cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Unless required by applicable law or agreed to in writing, software
11cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * See the License for the specific language governing permissions and
14cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * limitations under the License.
15cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */
16cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
17cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savillepackage com.android.internal.telephony.dataconnection;
18cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
19cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.app.AlarmManager;
20cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.app.PendingIntent;
21cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.content.BroadcastReceiver;
22cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.content.ContentResolver;
23cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.content.Context;
24cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.content.Intent;
25cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.content.IntentFilter;
269d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajanimport android.content.res.Resources;
27cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.content.SharedPreferences;
28cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.database.ContentObserver;
29c9b81a0c05128694c617fcdd67e73821895822feWink Savilleimport android.net.ConnectivityManager;
30cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.LinkProperties;
3196cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwaltimport android.net.NetworkCapabilities;
32cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.NetworkInfo;
33cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.TrafficStats;
34cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.wifi.WifiManager;
35cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.AsyncResult;
36d54f9906ce6218a0a9e7a274342082901e7d5d18Wink Savilleimport android.os.Build;
37cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.Bundle;
38cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.Handler;
39ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.HandlerThread;
40cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.Message;
41cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.Messenger;
42cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.SystemClock;
43cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.SystemProperties;
44cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.preference.PreferenceManager;
45cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.provider.Settings;
46cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.provider.Settings.SettingNotFoundException;
47a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.SubscriptionManager;
48cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.telephony.TelephonyManager;
49cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.text.TextUtils;
50cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.util.EventLog;
51cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.telephony.Rlog;
529d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajanimport android.telephony.ServiceState;
53cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
54cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.R;
55cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.DctConstants;
56c9b81a0c05128694c617fcdd67e73821895822feWink Savilleimport com.android.internal.telephony.DctConstants.State;
57cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.EventLogTags;
58bda761320929f714951c328bfec6a51a1978db97Wink Savilleimport com.android.internal.telephony.TelephonyIntents;
59cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.Phone;
60cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.PhoneBase;
61cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.PhoneConstants;
62cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.uicc.IccRecords;
63cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.uicc.UiccController;
64cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.util.AsyncChannel;
65dd6e67fb45fa3ce0d43f8d874cd7ffaeddf0926fLorenzo Colittiimport com.android.internal.util.ArrayUtils;
66cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
67cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.io.FileDescriptor;
68cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.io.PrintWriter;
69cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.ArrayList;
703fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwaltimport java.util.Comparator;
71cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.HashMap;
723262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawalimport java.util.List;
73cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.Map.Entry;
74cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.Set;
75cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.concurrent.ConcurrentHashMap;
76cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.concurrent.atomic.AtomicInteger;
77cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.concurrent.atomic.AtomicReference;
783fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwaltimport java.util.PriorityQueue;
79cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
80cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville/**
81cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * {@hide}
82cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */
83454b1dfd508844b42eb775e4ab2359be74d3672bWink Savillepublic abstract class DcTrackerBase extends Handler {
84cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final boolean DBG = true;
85ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final boolean VDBG = false; // STOPSHIP if true
86ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final boolean VDBG_STALL = true; // STOPSHIP if true
87cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final boolean RADIO_TESTS = false;
88cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    static boolean mIsCleanupRequired = false;
90cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
91cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Constants for the data connection activity:
92cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * physical link down/up
93cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
94cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_CONNECTION_ACTIVE_PH_LINK_INACTIVE = 0;
95cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_CONNECTION_ACTIVE_PH_LINK_DOWN = 1;
96cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_CONNECTION_ACTIVE_PH_LINK_UP = 2;
97cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
98cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Delay between APN attempts.
99cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Note the property override mechanism is there just for testing purpose only. */
100ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    protected static final int APN_DELAY_DEFAULT_MILLIS = 20000;
101cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
102ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    /** Delay between APN attempts when in fail fast mode */
103ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    protected static final int APN_FAIL_FAST_DELAY_DEFAULT_MILLIS = 3000;
104da1dd2e1bccb6141109a65d4e40253f39c405537Wink Saville
105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    AlarmManager mAlarmManager;
106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
107cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected Object mDataEnabledLock = new Object();
108cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
109cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // responds to the setInternalDataEnabled call - used internally to turn off data
110cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // for example during emergency calls
111cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mInternalDataEnabled = true;
112cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
113cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // responds to public (user) API to enable/disable data use
114cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // independent of mInternalDataEnabled and requests for APN access
115cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // persisted
116cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mUserDataEnabled = true;
117cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
118cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // TODO: move away from static state once 5587429 is fixed.
119cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static boolean sPolicyDataEnabled = true;
120cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
12122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private boolean[] mDataEnabled = new boolean[DctConstants.APN_NUM_TYPES];
122cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
12322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private int mEnabledCount = 0;
124cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
125cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /* Currently requested APN type (TODO: This should probably be a parameter not a member) */
126cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected String mRequestedApnType = PhoneConstants.APN_TYPE_DEFAULT;
127cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
128cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Retry configuration: A doubling of retry times from 5secs to 30minutes */
129cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String DEFAULT_DATA_RETRY_CONFIG = "default_randomization=2000,"
130cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        + "5000,10000,20000,40000,80000:5000,160000:5000,"
131cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        + "320000:5000,640000:5000,1280000:5000,1800000:5000";
132cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
133cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Retry configuration for secondary networks: 4 tries in 20 sec */
134cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String SECONDARY_DATA_RETRY_CONFIG =
135cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            "max_retries=3, 5000, 5000, 5000";
136cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
137cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Slow poll when attempting connection recovery. */
138cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int POLL_NETSTAT_SLOW_MILLIS = 5000;
139cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Default max failure count before attempting to network re-registration. */
140cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DEFAULT_MAX_PDP_RESET_FAIL = 3;
141cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
142cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
143cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * After detecting a potential connection problem, this is the max number
144cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * of subsequent polls before attempting recovery.
145cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
146cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int NO_RECV_POLL_LIMIT = 24;
147cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // 1 sec. default polling interval when screen is on.
148cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int POLL_NETSTAT_MILLIS = 1000;
149cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // 10 min. default polling interval when screen is off.
150cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int POLL_NETSTAT_SCREEN_OFF_MILLIS = 1000*60*10;
151cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // 2 min for round trip time
152cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int POLL_LONGEST_RTT = 120 * 1000;
153cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Default sent packets without ack which triggers initial recovery steps
154cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int NUMBER_SENT_PACKETS_OF_HANG = 10;
155cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // how long to wait before switching back to default APN
156cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int RESTORE_DEFAULT_APN_DELAY = 1 * 60 * 1000;
157cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // system property that can override the above value
158cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String APN_RESTORE_DELAY_PROP_NAME = "android.telephony.apn-restore";
159cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // represents an invalid IP address
160cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String NULL_IP = "0.0.0.0";
161cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
162cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Default for the data stall alarm while non-aggressive stall detection
163cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT = 1000 * 60 * 6;
164cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Default for the data stall alarm for aggressive stall detection
165cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT = 1000 * 60;
166cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // If attempt is less than this value we're doing first level recovery
167cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_STALL_NO_RECV_POLL_LIMIT = 1;
168cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Tag for tracking stale alarms
169cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String DATA_STALL_ALARM_TAG_EXTRA = "data.stall.alram.tag";
170cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
171cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final boolean DATA_STALL_SUSPECTED = true;
172cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final boolean DATA_STALL_NOT_SUSPECTED = false;
173cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
174cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected String RADIO_RESET_PROPERTY = "gsm.radioreset";
175cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final String INTENT_RECONNECT_ALARM =
177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            "com.android.internal.telephony.data-reconnect";
178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final String INTENT_RECONNECT_ALARM_EXTRA_TYPE = "reconnect_alarm_extra_type";
179cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String INTENT_RECONNECT_ALARM_EXTRA_REASON =
180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            "reconnect_alarm_extra_reason";
181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final String INTENT_RESTART_TRYSETUP_ALARM =
183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            "com.android.internal.telephony.data-restart-trysetup";
184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final String INTENT_RESTART_TRYSETUP_ALARM_EXTRA_TYPE =
185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            "restart_trysetup_alarm_extra_type";
186ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
187ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final String INTENT_DATA_STALL_ALARM =
188ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            "com.android.internal.telephony.data-stall";
189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
190cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
191cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
192cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String DEFALUT_DATA_ON_BOOT_PROP = "net.def_data_on_boot";
193cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
194ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected DcTesterFailBringUpAll mDcTesterFailBringUpAll;
195ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected DcController mDcc;
196ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
197cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // member variables
198cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected PhoneBase mPhone;
199cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected UiccController mUiccController;
200cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>();
201cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected DctConstants.Activity mActivity = DctConstants.Activity.NONE;
202cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected DctConstants.State mState = DctConstants.State.IDLE;
203cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected Handler mDataConnectionTracker = null;
204cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
205cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected long mTxPkts;
206cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected long mRxPkts;
207cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected int mNetStatPollPeriod;
208cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mNetStatPollEnabled = false;
209cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
210cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected TxRxSum mDataStallTxRxSum = new TxRxSum(0, 0);
211cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Used to track stale data stall alarms.
212cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected int mDataStallAlarmTag = (int) SystemClock.elapsedRealtime();
213cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // The current data stall alarm intent
214cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected PendingIntent mDataStallAlarmIntent = null;
215cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Number of packets sent since the last received packet
216cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected long mSentSinceLastRecv;
217cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Controls when a simple recovery attempt it to be tried
218cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected int mNoRecvPollCount = 0;
219d54f9906ce6218a0a9e7a274342082901e7d5d18Wink Saville    // Refrence counter for enabling fail fast
22016a01fe85457587ad5fd02ea06aa2882baf3535bWink Saville    protected static int sEnableFailFastRefCounter = 0;
221ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    // True if data stall detection is enabled
222ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    protected volatile boolean mDataStallDetectionEnabled = true;
223ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville
224ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    protected volatile boolean mFailFast = false;
225ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville
226ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    // True when in voice call
227ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    protected boolean mInVoiceCall = false;
228cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
229cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // wifi connection status will be updated by sticky intent
230cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mIsWifiConnected = false;
231cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
232cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Intent sent when the reconnect alarm fires. */
233cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected PendingIntent mReconnectIntent = null;
234cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
235cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** CID of active data connection */
236cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected int mCidActive;
237cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
238cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // When false we will not auto attach and manually attaching is required.
23912fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao    protected boolean mAutoAttachOnCreationConfig = false;
240cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mAutoAttachOnCreation = false;
241cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
242cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // State of screen
243cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // (TODO: Reconsider tying directly to screen, maybe this is
244cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    //        really a lower power mode")
245cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mIsScreenOn = true;
246cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
247cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Allows the generation of unique Id's for DataConnection objects */
248cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected AtomicInteger mUniqueIdGenerator = new AtomicInteger(0);
249cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
250cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** The data connections. */
251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected HashMap<Integer, DataConnection> mDataConnections =
252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        new HashMap<Integer, DataConnection>();
253cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
254cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** The data connection async channels */
255454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville    protected HashMap<Integer, DcAsyncChannel> mDataConnectionAcHashMap =
256454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        new HashMap<Integer, DcAsyncChannel>();
257cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
258cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Convert an ApnType string to Id (TODO: Use "enumeration" instead of String for ApnType) */
259cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected HashMap<String, Integer> mApnToDataConnectionId =
260cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                                    new HashMap<String, Integer>();
261cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
262cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Phone.APN_TYPE_* ===> ApnContext */
2633fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt    protected final ConcurrentHashMap<String, ApnContext> mApnContexts =
264cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                                    new ConcurrentHashMap<String, ApnContext>();
265cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
2663fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt    /** kept in sync with mApnContexts
2673fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt     * Higher numbers are higher priority and sorted so highest priority is first */
2683fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt    protected final PriorityQueue<ApnContext>mPrioritySortedApnContexts =
2693fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt            new PriorityQueue<ApnContext>(5,
2703fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt            new Comparator<ApnContext>() {
2713fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt                public int compare(ApnContext c1, ApnContext c2) {
2723fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt                    return c2.priority - c1.priority;
2733fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt                }
2743fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt            } );
2753fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt
276cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /* Currently active APN */
277cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected ApnSetting mActiveApn;
278cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
279cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** allApns holds all apns */
280ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected ArrayList<ApnSetting> mAllApnSettings = null;
281cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
282cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** preferred apn */
283cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected ApnSetting mPreferredApn = null;
284cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
285cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Is packet service restricted by network */
286cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mIsPsRestricted = false;
287cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
28876f43316a5a6082d601bffd4b6898d0bd81e11fcram    /** emergency apn Setting*/
28976f43316a5a6082d601bffd4b6898d0bd81e11fcram    protected ApnSetting mEmergencyApn = null;
29076f43316a5a6082d601bffd4b6898d0bd81e11fcram
291cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /* Once disposed dont handle any messages */
292cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mIsDisposed = false;
293cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
294cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected ContentResolver mResolver;
295cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
296c9b81a0c05128694c617fcdd67e73821895822feWink Saville    /* Set to true with CMD_ENABLE_MOBILE_PROVISIONING */
297c9b81a0c05128694c617fcdd67e73821895822feWink Saville    protected boolean mIsProvisioning = false;
298c9b81a0c05128694c617fcdd67e73821895822feWink Saville
299e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* The Url passed as object parameter in CMD_ENABLE_MOBILE_PROVISIONING */
300c9b81a0c05128694c617fcdd67e73821895822feWink Saville    protected String mProvisioningUrl = null;
301c9b81a0c05128694c617fcdd67e73821895822feWink Saville
302e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* Intent for the provisioning apn alarm */
303e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected static final String INTENT_PROVISIONING_APN_ALARM =
304e9063f6973039d66e12d0d930af03906d377969eWink Saville            "com.android.internal.telephony.provisioning_apn_alarm";
305e9063f6973039d66e12d0d930af03906d377969eWink Saville
306e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* Tag for tracking stale alarms */
307e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected static final String PROVISIONING_APN_ALARM_TAG_EXTRA = "provisioning.apn.alarm.tag";
308e9063f6973039d66e12d0d930af03906d377969eWink Saville
309e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* Debug property for overriding the PROVISIONING_APN_ALARM_DELAY_IN_MS */
310e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected static final String DEBUG_PROV_APN_ALARM =
311e9063f6973039d66e12d0d930af03906d377969eWink Saville            "persist.debug.prov_apn_alarm";
312e9063f6973039d66e12d0d930af03906d377969eWink Saville
313e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* Default for the provisioning apn alarm timeout */
314e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected static final int PROVISIONING_APN_ALARM_DELAY_IN_MS_DEFAULT = 1000 * 60 * 15;
315e9063f6973039d66e12d0d930af03906d377969eWink Saville
316e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* The provision apn alarm intent used to disable the provisioning apn */
317e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected PendingIntent mProvisioningApnAlarmIntent = null;
318e9063f6973039d66e12d0d930af03906d377969eWink Saville
319e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* Used to track stale provisioning apn alarms */
320e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected int mProvisioningApnAlarmTag = (int) SystemClock.elapsedRealtime();
321e9063f6973039d66e12d0d930af03906d377969eWink Saville
322c9b81a0c05128694c617fcdd67e73821895822feWink Saville    protected AsyncChannel mReplyAc = new AsyncChannel();
323c9b81a0c05128694c617fcdd67e73821895822feWink Saville
324cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected BroadcastReceiver mIntentReceiver = new BroadcastReceiver ()
325cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    {
326cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        @Override
327cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public void onReceive(Context context, Intent intent)
328cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        {
329cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            String action = intent.getAction();
330cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (DBG) log("onReceive: action=" + action);
331cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (action.equals(Intent.ACTION_SCREEN_ON)) {
332cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mIsScreenOn = true;
333cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                stopNetStatPoll();
334cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                startNetStatPoll();
335cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                restartDataStallAlarm();
336cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
337cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mIsScreenOn = false;
338cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                stopNetStatPoll();
339cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                startNetStatPoll();
340cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                restartDataStallAlarm();
341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else if (action.startsWith(INTENT_RECONNECT_ALARM)) {
342cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("Reconnect alarm. Previous state was " + mState);
343cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onActionIntentReconnectAlarm(intent);
344ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else if (action.startsWith(INTENT_RESTART_TRYSETUP_ALARM)) {
345ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                if (DBG) log("Restart trySetup alarm");
346ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                onActionIntentRestartTrySetupAlarm(intent);
347ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else if (action.equals(INTENT_DATA_STALL_ALARM)) {
348cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onActionIntentDataStallAlarm(intent);
349e9063f6973039d66e12d0d930af03906d377969eWink Saville            } else if (action.equals(INTENT_PROVISIONING_APN_ALARM)) {
350e9063f6973039d66e12d0d930af03906d377969eWink Saville                onActionIntentProvisioningApnAlarm(intent);
351cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
352cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                final android.net.NetworkInfo networkInfo = (NetworkInfo)
353cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
354cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mIsWifiConnected = (networkInfo != null && networkInfo.isConnected());
355cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("NETWORK_STATE_CHANGED_ACTION: mIsWifiConnected=" + mIsWifiConnected);
356cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
357cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                final boolean enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
358cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
359cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
360cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (!enabled) {
361cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // when WiFi got disabled, the NETWORK_STATE_CHANGED_ACTION
362cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // quit and won't report disconnected until next enabling.
363cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    mIsWifiConnected = false;
364cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
365cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("WIFI_STATE_CHANGED_ACTION: enabled=" + enabled
366cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        + " mIsWifiConnected=" + mIsWifiConnected);
367cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
368cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
369cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    };
370cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
371cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private Runnable mPollNetStat = new Runnable()
372cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    {
373cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        @Override
374cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public void run() {
375cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            updateDataActivity();
376cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
377cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mIsScreenOn) {
378cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mNetStatPollPeriod = Settings.Global.getInt(mResolver,
379cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        Settings.Global.PDP_WATCHDOG_POLL_INTERVAL_MS, POLL_NETSTAT_MILLIS);
380cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
381cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mNetStatPollPeriod = Settings.Global.getInt(mResolver,
382cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        Settings.Global.PDP_WATCHDOG_LONG_POLL_INTERVAL_MS,
383cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        POLL_NETSTAT_SCREEN_OFF_MILLIS);
384cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
385cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
386cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mNetStatPollEnabled) {
387cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mDataConnectionTracker.postDelayed(this, mNetStatPollPeriod);
388cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
389cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
390cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    };
391cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
392cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private class DataRoamingSettingObserver extends ContentObserver {
393ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
394ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public DataRoamingSettingObserver(Handler handler, Context context) {
395cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            super(handler);
396ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mResolver = context.getContentResolver();
397cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
398cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void register() {
400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mResolver.registerContentObserver(
401191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan                    Settings.Global.getUriFor(Settings.Global.DATA_ROAMING + mPhone.getSubId()),
402191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan                    false, this);
403cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
404cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void unregister() {
406ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mResolver.unregisterContentObserver(this);
407cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
408cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
409cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        @Override
410cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public void onChange(boolean selfChange) {
411cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // already running on mPhone handler thread
412ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao            if (mPhone.getServiceState().getDataRoaming()) {
413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                sendMessage(obtainMessage(DctConstants.EVENT_ROAMING_ON));
414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
415cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
416cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private final DataRoamingSettingObserver mDataRoamingSettingObserver;
418ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The Initial MaxRetry sent to a DataConnection as a parameter
421ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * to DataConnectionAc.bringUp. This value can be defined at compile
422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * time using the SystemProperty Settings.Global.DCT_INITIAL_MAX_RETRY
423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * and at runtime using gservices to change Settings.Global.DCT_INITIAL_MAX_RETRY.
424ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private static final int DEFAULT_MDC_INITIAL_RETRY = 1;
426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected int getInitialMaxRetry() {
427ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville        if (mFailFast) {
428ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville            return 0;
429ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville        }
430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // Get default value from system property or use DEFAULT_MDC_INITIAL_RETRY
431ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        int value = SystemProperties.getInt(
432ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                Settings.Global.MDC_INITIAL_MAX_RETRY, DEFAULT_MDC_INITIAL_RETRY);
433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // Check if its been overridden
435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return Settings.Global.getInt(mResolver,
436ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                Settings.Global.MDC_INITIAL_MAX_RETRY, value);
437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
438cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
439cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Maintain the sum of transmit and receive packets.
441cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *
442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The packet counts are initialized and reset to -1 and
443cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * remain -1 until they can be updated.
444cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
445cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public class TxRxSum {
446cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public long txPkts;
447cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public long rxPkts;
448cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
449cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public TxRxSum() {
450cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            reset();
451cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
452cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
453cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public TxRxSum(long txPkts, long rxPkts) {
454cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            this.txPkts = txPkts;
455cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            this.rxPkts = rxPkts;
456cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
457cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
458cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public TxRxSum(TxRxSum sum) {
459cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            txPkts = sum.txPkts;
460cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            rxPkts = sum.rxPkts;
461cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
462cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
463cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public void reset() {
464cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            txPkts = -1;
465cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            rxPkts = -1;
466cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
467cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
468cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        @Override
469cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public String toString() {
470cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return "{txSum=" + txPkts + " rxSum=" + rxPkts + "}";
471cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
472cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
473cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public void updateTxRxSum() {
474cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            this.txPkts = TrafficStats.getMobileTcpTxPackets();
475cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            this.rxPkts = TrafficStats.getMobileTcpRxPackets();
476cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
477cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
478cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
479cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onActionIntentReconnectAlarm(Intent intent) {
480cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String reason = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON);
481ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        String apnType = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE);
482ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
483b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int phoneSubId = mPhone.getSubId();
484b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int currSubId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
4854b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
486a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        log("onActionIntentReconnectAlarm: currSubId = " + currSubId + " phoneSubId=" + phoneSubId);
487a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
488a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // Stop reconnect if not current subId is not correct.
4896bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        // FIXME STOPSHIP - phoneSubId is coming up as -1 way after boot and failing this?
4908002387711e57456dbb4353eb894714592f303fbWink Saville        if (!SubscriptionManager.isValidSubscriptionId(currSubId) || (currSubId != phoneSubId)) {
4916bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville            log("receive ReconnectAlarm but subId incorrect, ignore");
4926bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville            return;
4936bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        }
494a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ApnContext apnContext = mApnContexts.get(apnType);
496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
497ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (DBG) {
498ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            log("onActionIntentReconnectAlarm: mState=" + mState + " reason=" + reason +
499ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    " apnType=" + apnType + " apnContext=" + apnContext +
500ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    " mDataConnectionAsyncChannels=" + mDataConnectionAcHashMap);
501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
503608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt        if ((apnContext != null) && (apnContext.isEnabled())) {
504ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            apnContext.setReason(reason);
505ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            DctConstants.State apnContextState = apnContext.getState();
506ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) {
507ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                log("onActionIntentReconnectAlarm: apnContext state=" + apnContextState);
508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
509ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if ((apnContextState == DctConstants.State.FAILED)
510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    || (apnContextState == DctConstants.State.IDLE)) {
511ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                if (DBG) {
512ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    log("onActionIntentReconnectAlarm: state is FAILED|IDLE, disassociate");
513ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
5144750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville                DcAsyncChannel dcac = apnContext.getDcAc();
5154750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville                if (dcac != null) {
5164750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville                    dcac.tearDown(apnContext, "", null);
5174750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville                }
518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                apnContext.setDataConnectionAc(null);
519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                apnContext.setState(DctConstants.State.IDLE);
520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else {
521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                if (DBG) log("onActionIntentReconnectAlarm: keep associated");
522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
523ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            // TODO: IF already associated should we send the EVENT_TRY_SETUP_DATA???
524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, apnContext));
525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            apnContext.setReconnectIntent(null);
527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected void onActionIntentRestartTrySetupAlarm(Intent intent) {
531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        String apnType = intent.getStringExtra(INTENT_RESTART_TRYSETUP_ALARM_EXTRA_TYPE);
532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ApnContext apnContext = mApnContexts.get(apnType);
53374672e8ee972f12406b72551261b4cc7e0651933Wink Saville        if (DBG) {
53474672e8ee972f12406b72551261b4cc7e0651933Wink Saville            log("onActionIntentRestartTrySetupAlarm: mState=" + mState +
53574672e8ee972f12406b72551261b4cc7e0651933Wink Saville                    " apnType=" + apnType + " apnContext=" + apnContext +
53674672e8ee972f12406b72551261b4cc7e0651933Wink Saville                    " mDataConnectionAsyncChannels=" + mDataConnectionAcHashMap);
53774672e8ee972f12406b72551261b4cc7e0651933Wink Saville        }
538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, apnContext));
539cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
540cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
541cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onActionIntentDataStallAlarm(Intent intent) {
542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) log("onActionIntentDataStallAlarm: action=" + intent.getAction());
543cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Message msg = obtainMessage(DctConstants.EVENT_DATA_STALL_ALARM,
544cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                intent.getAction());
545cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.arg1 = intent.getIntExtra(DATA_STALL_ALARM_TAG_EXTRA, 0);
546cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        sendMessage(msg);
547cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
548cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
549c9b81a0c05128694c617fcdd67e73821895822feWink Saville    ConnectivityManager mCm;
550c9b81a0c05128694c617fcdd67e73821895822feWink Saville
551cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
552cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Default constructor
553cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
554454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville    protected DcTrackerBase(PhoneBase phone) {
555cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        super();
556cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mPhone = phone;
557a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (DBG) log("DCT.constructor");
558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mResolver = mPhone.getContext().getContentResolver();
559cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mUiccController = UiccController.getInstance();
560cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mUiccController.registerForIccChanged(this, DctConstants.EVENT_ICC_CHANGED, null);
561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mAlarmManager =
562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
563c9b81a0c05128694c617fcdd67e73821895822feWink Saville        mCm = (ConnectivityManager) mPhone.getContext().getSystemService(
564c9b81a0c05128694c617fcdd67e73821895822feWink Saville                Context.CONNECTIVITY_SERVICE);
565ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
566cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
56724b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest        int phoneSubId = mPhone.getSubId();
568cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        IntentFilter filter = new IntentFilter();
569cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        filter.addAction(Intent.ACTION_SCREEN_ON);
570cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        filter.addAction(Intent.ACTION_SCREEN_OFF);
571cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
572cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
573ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        filter.addAction(INTENT_DATA_STALL_ALARM);
574e9063f6973039d66e12d0d930af03906d377969eWink Saville        filter.addAction(INTENT_PROVISIONING_APN_ALARM);
575cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
576c9e4b3e8c1be7626ddbb81d49457e529a4e33847Amit Mahajan        mUserDataEnabled = TelephonyManager.getIntWithSubId(
577c9e4b3e8c1be7626ddbb81d49457e529a4e33847Amit Mahajan                mPhone.getContext().getContentResolver(), Settings.Global.MOBILE_DATA, phoneSubId,
57824b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest                1) == 1;
579cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
580cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
581cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
582cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // This preference tells us 1) initial condition for "dataEnabled",
583cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // and 2) whether the RIL will setup the baseband to auto-PS attach.
584cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
58522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mDataEnabled[DctConstants.APN_DEFAULT_ID] =
586cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                SystemProperties.getBoolean(DEFALUT_DATA_ON_BOOT_PROP,true);
58722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mDataEnabled[DctConstants.APN_DEFAULT_ID]) {
58822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mEnabledCount++;
589cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
590cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
591cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext());
592cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mAutoAttachOnCreation = sp.getBoolean(PhoneBase.DATA_DISABLED_ON_BOOT_KEY, false);
593cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
594ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // Watch for changes to Settings.Global.DATA_ROAMING
595ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDataRoamingSettingObserver = new DataRoamingSettingObserver(mPhone, mPhone.getContext());
596ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDataRoamingSettingObserver.register();
597cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        HandlerThread dcHandlerThread = new HandlerThread("DcHandlerThread");
599ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        dcHandlerThread.start();
600ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Handler dcHandler = new Handler(dcHandlerThread.getLooper());
601ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcc = DcController.makeDcc(mPhone, this, dcHandler);
602ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcTesterFailBringUpAll = new DcTesterFailBringUpAll(mPhone, dcHandler);
603cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
604cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
605cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void dispose() {
606cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG) log("DCT.dispose");
607454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        for (DcAsyncChannel dcac : mDataConnectionAcHashMap.values()) {
608cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            dcac.disconnect();
609cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
610ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDataConnectionAcHashMap.clear();
611cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mIsDisposed = true;
61222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.getContext().unregisterReceiver(mIntentReceiver);
613cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mUiccController.unregisterForIccChanged(this);
614ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDataRoamingSettingObserver.unregister();
615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcc.dispose();
616ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcTesterFailBringUpAll.dispose();
617cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
618cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
6196bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    public long getSubId() {
6206bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        return mPhone.getSubId();
6216bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    }
6226bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville
623cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public DctConstants.Activity getActivity() {
624cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return mActivity;
625cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
626cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
627b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    void setActivity(DctConstants.Activity activity) {
628b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        log("setActivity = " + activity);
629b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        mActivity = activity;
630b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        mPhone.notifyDataActivity();
631b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    }
632b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh
633bda761320929f714951c328bfec6a51a1978db97Wink Saville    public void incApnRefCount(String name) {
634bda761320929f714951c328bfec6a51a1978db97Wink Saville
635bda761320929f714951c328bfec6a51a1978db97Wink Saville    }
636bda761320929f714951c328bfec6a51a1978db97Wink Saville
637bda761320929f714951c328bfec6a51a1978db97Wink Saville    public void decApnRefCount(String name) {
638bda761320929f714951c328bfec6a51a1978db97Wink Saville
639bda761320929f714951c328bfec6a51a1978db97Wink Saville    }
640bda761320929f714951c328bfec6a51a1978db97Wink Saville
641bda761320929f714951c328bfec6a51a1978db97Wink Saville    public boolean isApnSupported(String name) {
642bda761320929f714951c328bfec6a51a1978db97Wink Saville        return false;
643bda761320929f714951c328bfec6a51a1978db97Wink Saville    }
644bda761320929f714951c328bfec6a51a1978db97Wink Saville
645bda761320929f714951c328bfec6a51a1978db97Wink Saville    public int getApnPriority(String name) {
646bda761320929f714951c328bfec6a51a1978db97Wink Saville        return -1;
647bda761320929f714951c328bfec6a51a1978db97Wink Saville    }
648bda761320929f714951c328bfec6a51a1978db97Wink Saville
649bda761320929f714951c328bfec6a51a1978db97Wink Saville
650cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public boolean isApnTypeActive(String type) {
651cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // TODO: support simultaneous with List instead
652cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (PhoneConstants.APN_TYPE_DUN.equals(type)) {
653cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            ApnSetting dunApn = fetchDunApn();
654cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (dunApn != null) {
655cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                return ((mActiveApn != null) && (dunApn.toString().equals(mActiveApn.toString())));
656cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
657cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
658cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return mActiveApn != null && mActiveApn.canHandleType(type);
659cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
660cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
661cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected ApnSetting fetchDunApn() {
662cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (SystemProperties.getBoolean("net.tethering.noprovisioning", false)) {
663cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("fetchDunApn: net.tethering.noprovisioning=true ret: null");
664cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return null;
665cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
666a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt        int bearer = -1;
667f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        ApnSetting retDunSetting = null;
668cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Context c = mPhone.getContext();
669cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String apnData = Settings.Global.getString(c.getContentResolver(),
670cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                Settings.Global.TETHER_DUN_APN);
6713262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal        List<ApnSetting> dunSettings = ApnSetting.arrayFromString(apnData);
672f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        IccRecords r = mIccRecords.get();
6733262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal        for (ApnSetting dunSetting : dunSettings) {
674ff51a1e0381b303e5bb7e4e0a8a6ad7d124437bdSungmin Choi            String operator = (r != null) ? r.getOperatorNumeric() : "";
675a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt            if (dunSetting.bearer != 0) {
676a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                if (bearer == -1) bearer = mPhone.getServiceState().getRilDataRadioTechnology();
677a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                if (dunSetting.bearer != bearer) continue;
678a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt            }
679ff51a1e0381b303e5bb7e4e0a8a6ad7d124437bdSungmin Choi            if (dunSetting.numeric.equals(operator)) {
6803262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                if (dunSetting.hasMvnoParams()) {
681a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                    if (r != null &&
682a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                            mvnoMatches(r, dunSetting.mvnoType, dunSetting.mvnoMatchData)) {
683a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                        if (VDBG) {
684a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                            log("fetchDunApn: global TETHER_DUN_APN dunSetting=" + dunSetting);
685a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                        }
6863262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                        return dunSetting;
6873262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                    }
6883262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                } else {
6893262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                    if (VDBG) log("fetchDunApn: global TETHER_DUN_APN dunSetting=" + dunSetting);
6903262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                    return dunSetting;
6913262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                }
692ff51a1e0381b303e5bb7e4e0a8a6ad7d124437bdSungmin Choi            }
693cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
694cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
695f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        String[] apnArrayData = c.getResources().getStringArray(R.array.config_tether_apndata);
696f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        for (String apn : apnArrayData) {
697f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi            ApnSetting dunSetting = ApnSetting.fromString(apn);
698f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi            if (dunSetting != null) {
699f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                if (dunSetting.bearer != 0) {
700f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                    if (bearer == -1) bearer = mPhone.getServiceState().getRilDataRadioTechnology();
701f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                    if (dunSetting.bearer != bearer) continue;
702f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                }
703f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                if (dunSetting.hasMvnoParams()) {
704f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                    if (r != null &&
705f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                            mvnoMatches(r, dunSetting.mvnoType, dunSetting.mvnoMatchData)) {
706f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                        if (VDBG) log("fetchDunApn: config_tether_apndata mvno dunSetting="
707f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                                + dunSetting);
708f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                        return dunSetting;
709f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                    }
710f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                } else {
711f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                    retDunSetting = dunSetting;
712f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                }
713f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi            }
714f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        }
715f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi
716f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        if (VDBG) log("fetchDunApn: config_tether_apndata dunSetting=" + retDunSetting);
717f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        return retDunSetting;
718cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
719cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
72079f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu    public boolean hasMatchedTetherApnSetting() {
72179f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu        ApnSetting matched = fetchDunApn();
72279f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu        log("hasMatchedTetherApnSetting: APN=" + matched);
72379f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu        return matched != null;
72479f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu    }
725cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
726cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public String[] getActiveApnTypes() {
727cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String[] result;
728cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mActiveApn != null) {
729cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result = mActiveApn.types;
730cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
731cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result = new String[1];
732cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result[0] = PhoneConstants.APN_TYPE_DEFAULT;
733cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
734cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return result;
735cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
736cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
737cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** TODO: See if we can remove */
738cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public String getActiveApnString(String apnType) {
739cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String result = null;
740cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mActiveApn != null) {
741cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result = mActiveApn.apn;
742cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
743cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return result;
744cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
745cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
746cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
747cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Modify {@link android.provider.Settings.Global#DATA_ROAMING} value.
748cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
749cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void setDataOnRoamingEnabled(boolean enabled) {
750cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (getDataOnRoamingEnabled() != enabled) {
751cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            final ContentResolver resolver = mPhone.getContext().getContentResolver();
75224b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest            final int phoneSubId = mPhone.getSubId();
75324b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest            Settings.Global.putInt(resolver, Settings.Global.DATA_ROAMING + phoneSubId, enabled ? 1 : 0);
754cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // will trigger handleDataOnRoamingChange() through observer
755cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
756cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
757cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
758cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
759cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Return current {@link android.provider.Settings.Global#DATA_ROAMING} value.
760cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
761cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public boolean getDataOnRoamingEnabled() {
762cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        try {
763cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            final ContentResolver resolver = mPhone.getContext().getContentResolver();
76424b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest            final int phoneSubId = mPhone.getSubId();
765191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan            return TelephonyManager.getIntWithSubId(resolver, Settings.Global.DATA_ROAMING,
766191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan                    phoneSubId) != 0;
767cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } catch (SettingNotFoundException snfe) {
768191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan            return "true".equalsIgnoreCase(SystemProperties.get("ro.com.android.dataroaming",
769191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan                    "false"));
770cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
7713a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    }
7723a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt
7733a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    /**
7743a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt     * Modify {@link android.provider.Settings.Global#MOBILE_DATA} value.
7753a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt     */
7763a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    public void setDataEnabled(boolean enable) {
7773a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        Message msg = obtainMessage(DctConstants.CMD_SET_USER_DATA_ENABLE);
7783a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        msg.arg1 = enable ? 1 : 0;
779652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville        if (DBG) log("setDataEnabled: sendMessage: enable=" + enable);
7803a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        sendMessage(msg);
7813a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    }
7823a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt
7833a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    /**
7843a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt     * Return current {@link android.provider.Settings.Global#MOBILE_DATA} value.
7853a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt     */
7863a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    public boolean getDataEnabled() {
787c9e4b3e8c1be7626ddbb81d49457e529a4e33847Amit Mahajan        final ContentResolver resolver = mPhone.getContext().getContentResolver();
788652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville        boolean retVal;
7893a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        try {
79024b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest            int phoneSubId = mPhone.getSubId();
791652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville            retVal = TelephonyManager.getIntWithSubId(resolver, Settings.Global.MOBILE_DATA,
792c9e4b3e8c1be7626ddbb81d49457e529a4e33847Amit Mahajan                    phoneSubId) != 0;
793652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville            if (DBG) log("getDataEnabled: getIntWithSubId retVal=" + retVal);
7943a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        } catch (SettingNotFoundException snfe) {
795652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville            retVal = "true".equalsIgnoreCase(
796c9e4b3e8c1be7626ddbb81d49457e529a4e33847Amit Mahajan                    SystemProperties.get("ro.com.android.mobiledata", "true"));
797652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville            if (DBG) {
798652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville                log("getDataEnabled: system property ro.com.android.mobiledata retVal=" + retVal);
799652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville            }
8003a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        }
801652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville        return retVal;
802cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
803cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
804cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // abstract methods
805cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void restartRadio();
806cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void log(String s);
807cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void loge(String s);
808cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract boolean isDataAllowed();
809cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract boolean isApnTypeAvailable(String type);
810cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public    abstract DctConstants.State getState(String apnType);
811c9b81a0c05128694c617fcdd67e73821895822feWink Saville    protected abstract boolean isProvisioningApn(String apnType);
812cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void setState(DctConstants.State s);
813cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void gotoIdleAndNotifyDataConnection(String reason);
814cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
815cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract boolean onTrySetupData(String reason);
816cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onRoamingOff();
817cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onRoamingOn();
818cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onRadioAvailable();
819cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onRadioOffOrNotAvailable();
820cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onDataSetupComplete(AsyncResult ar);
821ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected abstract void onDataSetupCompleteError(AsyncResult ar);
822cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onDisconnectDone(int connId, AsyncResult ar);
823ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected abstract void onDisconnectDcRetrying(int connId, AsyncResult ar);
824cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onVoiceCallStarted();
825cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onVoiceCallEnded();
826cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onCleanUpConnection(boolean tearDown, int apnId, String reason);
827cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onCleanUpAllConnections(String cause);
828cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public abstract boolean isDataPossible(String apnType);
829cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onUpdateIcc();
830c9b81a0c05128694c617fcdd67e73821895822feWink Saville    protected abstract void completeConnection(ApnContext apnContext);
831a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public abstract void setDataAllowed(boolean enable, Message response);
832bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram    public abstract String[] getPcscfAddress(String apnType);
833a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public abstract void setImsRegistrationState(boolean registered);
8343262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal    protected abstract boolean mvnoMatches(IccRecords r, String mvno_type, String mvno_match_data);
835796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan    protected abstract boolean isPermanentFail(DcFailCause dcFailCause);
836cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
837cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
838cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void handleMessage(Message msg) {
839cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        switch (msg.what) {
840cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {
841cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("DISCONNECTED_CONNECTED: msg=" + msg);
842454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                DcAsyncChannel dcac = (DcAsyncChannel) msg.obj;
843ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                mDataConnectionAcHashMap.remove(dcac.getDataConnectionIdSync());
844cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                dcac.disconnected();
845cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
846cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
847cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_ENABLE_NEW_APN:
848cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onEnableApn(msg.arg1, msg.arg2);
849cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
850cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
851cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_TRY_SETUP_DATA:
852cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                String reason = null;
853cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (msg.obj instanceof String) {
854cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    reason = (String) msg.obj;
855cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
856cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onTrySetupData(reason);
857cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
858cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
859cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_DATA_STALL_ALARM:
860cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onDataStallAlarm(msg.arg1);
861cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
862cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
863cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_ROAMING_OFF:
864cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onRoamingOff();
865cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
866cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
867cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_ROAMING_ON:
868cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onRoamingOn();
869cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
870cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
871cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_RADIO_AVAILABLE:
872cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onRadioAvailable();
873cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
874cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
875cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_RADIO_OFF_OR_NOT_AVAILABLE:
876cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onRadioOffOrNotAvailable();
877cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
878cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
879cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_DATA_SETUP_COMPLETE:
880cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mCidActive = msg.arg1;
881cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onDataSetupComplete((AsyncResult) msg.obj);
882cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
883cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
884ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            case DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR:
885ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                onDataSetupCompleteError((AsyncResult) msg.obj);
886ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                break;
887ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
888cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_DISCONNECT_DONE:
889c6bbea82bf74ebb492508199b6f3e172b7ce860aWink Saville                log("DataConnectionTracker.handleMessage: EVENT_DISCONNECT_DONE msg=" + msg);
890cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onDisconnectDone(msg.arg1, (AsyncResult) msg.obj);
891cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
892cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            case DctConstants.EVENT_DISCONNECT_DC_RETRYING:
894c6bbea82bf74ebb492508199b6f3e172b7ce860aWink Saville                log("DataConnectionTracker.handleMessage: EVENT_DISCONNECT_DC_RETRYING msg=" + msg);
895ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                onDisconnectDcRetrying(msg.arg1, (AsyncResult) msg.obj);
896ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                break;
897ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
898cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_VOICE_CALL_STARTED:
899cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onVoiceCallStarted();
900cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
901cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
902cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_VOICE_CALL_ENDED:
903cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onVoiceCallEnded();
904cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
905cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
906cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_CLEAN_UP_ALL_CONNECTIONS: {
907cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onCleanUpAllConnections((String) msg.obj);
908cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
909cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
910cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_CLEAN_UP_CONNECTION: {
911cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                boolean tearDown = (msg.arg1 == 0) ? false : true;
912cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onCleanUpConnection(tearDown, msg.arg2, (String) msg.obj);
913cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
914cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
915cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_SET_INTERNAL_DATA_ENABLE: {
916cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false;
917cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onSetInternalDataEnabled(enabled);
918cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
919cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
920cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_RESET_DONE: {
921cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("EVENT_RESET_DONE");
922cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onResetDone((AsyncResult) msg.obj);
923cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
924cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
925cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.CMD_SET_USER_DATA_ENABLE: {
926bda761320929f714951c328bfec6a51a1978db97Wink Saville                final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false;
927bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) log("CMD_SET_USER_DATA_ENABLE enabled=" + enabled);
928bda761320929f714951c328bfec6a51a1978db97Wink Saville                onSetUserDataEnabled(enabled);
929cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
930cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
931cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.CMD_SET_DEPENDENCY_MET: {
932bda761320929f714951c328bfec6a51a1978db97Wink Saville                boolean met = (msg.arg1 == DctConstants.ENABLED) ? true : false;
933bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) log("CMD_SET_DEPENDENCY_MET met=" + met);
934bda761320929f714951c328bfec6a51a1978db97Wink Saville                Bundle bundle = msg.getData();
935bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (bundle != null) {
936bda761320929f714951c328bfec6a51a1978db97Wink Saville                    String apnType = (String)bundle.get(DctConstants.APN_TYPE_KEY);
937bda761320929f714951c328bfec6a51a1978db97Wink Saville                    if (apnType != null) {
938bda761320929f714951c328bfec6a51a1978db97Wink Saville                        onSetDependencyMet(apnType, met);
939cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    }
940cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
941cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
942cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
943cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.CMD_SET_POLICY_DATA_ENABLE: {
944bda761320929f714951c328bfec6a51a1978db97Wink Saville                final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false;
945bda761320929f714951c328bfec6a51a1978db97Wink Saville                onSetPolicyDataEnabled(enabled);
946cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
947cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
948ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville            case DctConstants.CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: {
949bda761320929f714951c328bfec6a51a1978db97Wink Saville                sEnableFailFastRefCounter += (msg.arg1 == DctConstants.ENABLED) ? 1 : -1;
950bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) {
951bda761320929f714951c328bfec6a51a1978db97Wink Saville                    log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: "
952bda761320929f714951c328bfec6a51a1978db97Wink Saville                            + " sEnableFailFastRefCounter=" + sEnableFailFastRefCounter);
953bda761320929f714951c328bfec6a51a1978db97Wink Saville                }
954bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (sEnableFailFastRefCounter < 0) {
955bda761320929f714951c328bfec6a51a1978db97Wink Saville                    final String s = "CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: "
956bda761320929f714951c328bfec6a51a1978db97Wink Saville                            + "sEnableFailFastRefCounter:" + sEnableFailFastRefCounter + " < 0";
957bda761320929f714951c328bfec6a51a1978db97Wink Saville                    loge(s);
958bda761320929f714951c328bfec6a51a1978db97Wink Saville                    sEnableFailFastRefCounter = 0;
959bda761320929f714951c328bfec6a51a1978db97Wink Saville                }
960bda761320929f714951c328bfec6a51a1978db97Wink Saville                final boolean enabled = sEnableFailFastRefCounter > 0;
961bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) {
962bda761320929f714951c328bfec6a51a1978db97Wink Saville                    log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: enabled=" + enabled
963bda761320929f714951c328bfec6a51a1978db97Wink Saville                            + " sEnableFailFastRefCounter=" + sEnableFailFastRefCounter);
964bda761320929f714951c328bfec6a51a1978db97Wink Saville                }
965bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (mFailFast != enabled) {
966bda761320929f714951c328bfec6a51a1978db97Wink Saville                    mFailFast = enabled;
967bda761320929f714951c328bfec6a51a1978db97Wink Saville                    mDataStallDetectionEnabled = !enabled;
968bda761320929f714951c328bfec6a51a1978db97Wink Saville                    if (mDataStallDetectionEnabled
969bda761320929f714951c328bfec6a51a1978db97Wink Saville                            && (getOverallState() == DctConstants.State.CONNECTED)
970bda761320929f714951c328bfec6a51a1978db97Wink Saville                            && (!mInVoiceCall ||
971bda761320929f714951c328bfec6a51a1978db97Wink Saville                                    mPhone.getServiceStateTracker()
972bda761320929f714951c328bfec6a51a1978db97Wink Saville                                        .isConcurrentVoiceAndDataAllowed())) {
973bda761320929f714951c328bfec6a51a1978db97Wink Saville                        if (DBG) log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: start data stall");
974bda761320929f714951c328bfec6a51a1978db97Wink Saville                        stopDataStallAlarm();
975bda761320929f714951c328bfec6a51a1978db97Wink Saville                        startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
976bda761320929f714951c328bfec6a51a1978db97Wink Saville                    } else {
977bda761320929f714951c328bfec6a51a1978db97Wink Saville                        if (DBG) log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: stop data stall");
978bda761320929f714951c328bfec6a51a1978db97Wink Saville                        stopDataStallAlarm();
979ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville                    }
980ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville                }
981bda761320929f714951c328bfec6a51a1978db97Wink Saville
982ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville                break;
983ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville            }
984c9b81a0c05128694c617fcdd67e73821895822feWink Saville            case DctConstants.CMD_ENABLE_MOBILE_PROVISIONING: {
985bda761320929f714951c328bfec6a51a1978db97Wink Saville                Bundle bundle = msg.getData();
986bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (bundle != null) {
987bda761320929f714951c328bfec6a51a1978db97Wink Saville                    try {
988bda761320929f714951c328bfec6a51a1978db97Wink Saville                        mProvisioningUrl = (String)bundle.get(DctConstants.PROVISIONING_URL_KEY);
989bda761320929f714951c328bfec6a51a1978db97Wink Saville                    } catch(ClassCastException e) {
990bda761320929f714951c328bfec6a51a1978db97Wink Saville                        loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioning url not a string" + e);
991c9b81a0c05128694c617fcdd67e73821895822feWink Saville                        mProvisioningUrl = null;
992c9b81a0c05128694c617fcdd67e73821895822feWink Saville                    }
993c9b81a0c05128694c617fcdd67e73821895822feWink Saville                }
994bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (TextUtils.isEmpty(mProvisioningUrl)) {
995bda761320929f714951c328bfec6a51a1978db97Wink Saville                    loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioning url is empty, ignoring");
996bda761320929f714951c328bfec6a51a1978db97Wink Saville                    mIsProvisioning = false;
997bda761320929f714951c328bfec6a51a1978db97Wink Saville                    mProvisioningUrl = null;
998bda761320929f714951c328bfec6a51a1978db97Wink Saville                } else {
999bda761320929f714951c328bfec6a51a1978db97Wink Saville                    loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioningUrl=" + mProvisioningUrl);
1000bda761320929f714951c328bfec6a51a1978db97Wink Saville                    mIsProvisioning = true;
1001bda761320929f714951c328bfec6a51a1978db97Wink Saville                    startProvisioningApnAlarm();
1002bda761320929f714951c328bfec6a51a1978db97Wink Saville                }
1003c9b81a0c05128694c617fcdd67e73821895822feWink Saville                break;
1004c9b81a0c05128694c617fcdd67e73821895822feWink Saville            }
1005e9063f6973039d66e12d0d930af03906d377969eWink Saville            case DctConstants.EVENT_PROVISIONING_APN_ALARM: {
1006e9063f6973039d66e12d0d930af03906d377969eWink Saville                if (DBG) log("EVENT_PROVISIONING_APN_ALARM");
1007e9063f6973039d66e12d0d930af03906d377969eWink Saville                ApnContext apnCtx = mApnContexts.get("default");
1008e9063f6973039d66e12d0d930af03906d377969eWink Saville                if (apnCtx.isProvisioningApn() && apnCtx.isConnectedOrConnecting()) {
1009e9063f6973039d66e12d0d930af03906d377969eWink Saville                    if (mProvisioningApnAlarmTag == msg.arg1) {
1010e9063f6973039d66e12d0d930af03906d377969eWink Saville                        if (DBG) log("EVENT_PROVISIONING_APN_ALARM: Disconnecting");
1011e9063f6973039d66e12d0d930af03906d377969eWink Saville                        mIsProvisioning = false;
1012e9063f6973039d66e12d0d930af03906d377969eWink Saville                        mProvisioningUrl = null;
1013e9063f6973039d66e12d0d930af03906d377969eWink Saville                        stopProvisioningApnAlarm();
1014e9063f6973039d66e12d0d930af03906d377969eWink Saville                        sendCleanUpConnection(true, apnCtx);
1015e9063f6973039d66e12d0d930af03906d377969eWink Saville                    } else {
1016e9063f6973039d66e12d0d930af03906d377969eWink Saville                        if (DBG) {
1017e9063f6973039d66e12d0d930af03906d377969eWink Saville                            log("EVENT_PROVISIONING_APN_ALARM: ignore stale tag,"
1018e9063f6973039d66e12d0d930af03906d377969eWink Saville                                    + " mProvisioningApnAlarmTag:" + mProvisioningApnAlarmTag
1019e9063f6973039d66e12d0d930af03906d377969eWink Saville                                    + " != arg1:" + msg.arg1);
1020e9063f6973039d66e12d0d930af03906d377969eWink Saville                        }
1021e9063f6973039d66e12d0d930af03906d377969eWink Saville                    }
1022e9063f6973039d66e12d0d930af03906d377969eWink Saville                } else {
1023e9063f6973039d66e12d0d930af03906d377969eWink Saville                    if (DBG) log("EVENT_PROVISIONING_APN_ALARM: Not connected ignore");
1024e9063f6973039d66e12d0d930af03906d377969eWink Saville                }
1025e9063f6973039d66e12d0d930af03906d377969eWink Saville                break;
1026e9063f6973039d66e12d0d930af03906d377969eWink Saville            }
1027c9b81a0c05128694c617fcdd67e73821895822feWink Saville            case DctConstants.CMD_IS_PROVISIONING_APN: {
1028bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) log("CMD_IS_PROVISIONING_APN");
1029bda761320929f714951c328bfec6a51a1978db97Wink Saville                boolean isProvApn;
1030bda761320929f714951c328bfec6a51a1978db97Wink Saville                try {
1031bda761320929f714951c328bfec6a51a1978db97Wink Saville                    String apnType = null;
1032bda761320929f714951c328bfec6a51a1978db97Wink Saville                    Bundle bundle = msg.getData();
1033bda761320929f714951c328bfec6a51a1978db97Wink Saville                    if (bundle != null) {
1034bda761320929f714951c328bfec6a51a1978db97Wink Saville                        apnType = (String)bundle.get(DctConstants.APN_TYPE_KEY);
1035bda761320929f714951c328bfec6a51a1978db97Wink Saville                    }
1036bda761320929f714951c328bfec6a51a1978db97Wink Saville                    if (TextUtils.isEmpty(apnType)) {
1037bda761320929f714951c328bfec6a51a1978db97Wink Saville                        loge("CMD_IS_PROVISIONING_APN: apnType is empty");
1038c9b81a0c05128694c617fcdd67e73821895822feWink Saville                        isProvApn = false;
1039bda761320929f714951c328bfec6a51a1978db97Wink Saville                    } else {
1040bda761320929f714951c328bfec6a51a1978db97Wink Saville                        isProvApn = isProvisioningApn(apnType);
1041c9b81a0c05128694c617fcdd67e73821895822feWink Saville                    }
1042bda761320929f714951c328bfec6a51a1978db97Wink Saville                } catch (ClassCastException e) {
1043bda761320929f714951c328bfec6a51a1978db97Wink Saville                    loge("CMD_IS_PROVISIONING_APN: NO provisioning url ignoring");
1044bda761320929f714951c328bfec6a51a1978db97Wink Saville                    isProvApn = false;
1045c9b81a0c05128694c617fcdd67e73821895822feWink Saville                }
1046bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) log("CMD_IS_PROVISIONING_APN: ret=" + isProvApn);
1047bda761320929f714951c328bfec6a51a1978db97Wink Saville                mReplyAc.replyToMessage(msg, DctConstants.CMD_IS_PROVISIONING_APN,
1048bda761320929f714951c328bfec6a51a1978db97Wink Saville                        isProvApn ? DctConstants.ENABLED : DctConstants.DISABLED);
1049c9b81a0c05128694c617fcdd67e73821895822feWink Saville                break;
1050c9b81a0c05128694c617fcdd67e73821895822feWink Saville            }
1051ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            case DctConstants.EVENT_ICC_CHANGED: {
1052cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onUpdateIcc();
1053cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1055979786625e7ceacf4a545a25704ef8a15338a854Wink Saville            case DctConstants.EVENT_RESTART_RADIO: {
1056979786625e7ceacf4a545a25704ef8a15338a854Wink Saville                restartRadio();
1057979786625e7ceacf4a545a25704ef8a15338a854Wink Saville                break;
1058979786625e7ceacf4a545a25704ef8a15338a854Wink Saville            }
1059b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh            case DctConstants.CMD_NET_STAT_POLL: {
1060b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                if (msg.arg1 == DctConstants.ENABLED) {
1061b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                    handleStartNetStatPoll((DctConstants.Activity)msg.obj);
1062b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                } else if (msg.arg1 == DctConstants.DISABLED) {
1063b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                    handleStopNetStatPoll((DctConstants.Activity)msg.obj);
1064b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                }
1065b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                break;
1066b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh            }
1067cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            default:
1068cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                Rlog.e("DATA", "Unidentified event msg=" + msg);
1069cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1070cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1071cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1072cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1073cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
1074cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Report on whether data connectivity is enabled
1075cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *
1076cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * @return {@code false} if data connectivity has been explicitly disabled,
1077cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *         {@code true} otherwise.
1078cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
1079cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public boolean getAnyDataEnabled() {
1080cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        final boolean result;
1081cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        synchronized (mDataEnabledLock) {
1082cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result = (mInternalDataEnabled && mUserDataEnabled && sPolicyDataEnabled
108322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    && (mEnabledCount != 0));
1084cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1085cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (!result && DBG) log("getAnyDataEnabled " + result);
1086cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return result;
1087cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1088cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1089cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean isEmergency() {
1090cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        final boolean result;
1091cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        synchronized (mDataEnabledLock) {
1092cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result = mPhone.isInEcm() || mPhone.isInEmergencyCall();
1093cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1094cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        log("isEmergency: result=" + result);
1095cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return result;
1096cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1097cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1098cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected int apnTypeToId(String type) {
1099cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (TextUtils.equals(type, PhoneConstants.APN_TYPE_DEFAULT)) {
1100cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_DEFAULT_ID;
1101cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_MMS)) {
1102cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_MMS_ID;
1103cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_SUPL)) {
1104cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_SUPL_ID;
1105cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_DUN)) {
1106cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_DUN_ID;
1107cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_HIPRI)) {
1108cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_HIPRI_ID;
1109cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_IMS)) {
1110cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_IMS_ID;
1111cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_FOTA)) {
1112cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_FOTA_ID;
1113cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_CBS)) {
1114cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_CBS_ID;
11151b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_IA)) {
11161b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            return DctConstants.APN_IA_ID;
1117cf5205f70eb1eac497164124187a088ecb03fff5Ram        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_EMERGENCY)) {
1118cf5205f70eb1eac497164124187a088ecb03fff5Ram            return DctConstants.APN_EMERGENCY_ID;
1119cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1120cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_INVALID_ID;
1121cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1122cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1123cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1124cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected String apnIdToType(int id) {
1125cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        switch (id) {
1126cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_DEFAULT_ID:
1127cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_DEFAULT;
1128cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_MMS_ID:
1129cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_MMS;
1130cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_SUPL_ID:
1131cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_SUPL;
1132cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_DUN_ID:
1133cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_DUN;
1134cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_HIPRI_ID:
1135cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_HIPRI;
1136cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_IMS_ID:
1137cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_IMS;
1138cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_FOTA_ID:
1139cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_FOTA;
1140cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_CBS_ID:
1141cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_CBS;
11421b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        case DctConstants.APN_IA_ID:
11431b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            return PhoneConstants.APN_TYPE_IA;
1144cf5205f70eb1eac497164124187a088ecb03fff5Ram        case DctConstants.APN_EMERGENCY_ID:
1145cf5205f70eb1eac497164124187a088ecb03fff5Ram            return PhoneConstants.APN_TYPE_EMERGENCY;
1146cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        default:
1147cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("Unknown id (" + id + ") in apnIdToType");
1148cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_DEFAULT;
1149cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1150cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1151cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1152cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public LinkProperties getLinkProperties(String apnType) {
1153cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int id = apnTypeToId(apnType);
1154cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1155cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (isApnIdEnabled(id)) {
1156454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            DcAsyncChannel dcac = mDataConnectionAcHashMap.get(0);
1157cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return dcac.getLinkPropertiesSync();
1158cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1159cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return new LinkProperties();
1160cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1161cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1162cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
116396cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwalt    public NetworkCapabilities getNetworkCapabilities(String apnType) {
1164608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt        int id = apnTypeToId(apnType);
1165608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt        if (isApnIdEnabled(id)) {
1166608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt            DcAsyncChannel dcac = mDataConnectionAcHashMap.get(0);
1167608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt            return dcac.getNetworkCapabilitiesSync();
1168cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
116996cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwalt            return new NetworkCapabilities();
1170cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1171cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1172cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1173cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // tell all active apns of the current condition
1174cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void notifyDataConnection(String reason) {
1175cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        for (int id = 0; id < DctConstants.APN_NUM_TYPES; id++) {
117622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mDataEnabled[id]) {
1177cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.notifyDataConnection(reason, apnIdToType(id));
1178cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1179cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1180cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        notifyOffApnsOfAvailability(reason);
1181cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1182cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1183cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // a new APN has gone active and needs to send events to catch up with the
1184cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // current condition
1185cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void notifyApnIdUpToCurrent(String reason, int apnId) {
1186cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        switch (mState) {
1187cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case IDLE:
1188cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1189ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            case RETRYING:
1190cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case CONNECTING:
1191cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case SCANNING:
1192cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.notifyDataConnection(reason, apnIdToType(apnId),
1193cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        PhoneConstants.DataState.CONNECTING);
1194cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1195cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case CONNECTED:
1196cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DISCONNECTING:
1197cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.notifyDataConnection(reason, apnIdToType(apnId),
1198cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        PhoneConstants.DataState.CONNECTING);
1199cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.notifyDataConnection(reason, apnIdToType(apnId),
1200cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        PhoneConstants.DataState.CONNECTED);
1201cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1202cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            default:
1203ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                // Ignore
1204cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1205cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1206cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1207cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1208cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // since we normally don't send info to a disconnected APN, we need to do this specially
1209cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void notifyApnIdDisconnected(String reason, int apnId) {
1210cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mPhone.notifyDataConnection(reason, apnIdToType(apnId),
1211cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                PhoneConstants.DataState.DISCONNECTED);
1212cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1213cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1214cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // disabled apn's still need avail/unavail notificiations - send them out
1215cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void notifyOffApnsOfAvailability(String reason) {
1216cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG) log("notifyOffApnsOfAvailability - reason= " + reason);
1217cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        for (int id = 0; id < DctConstants.APN_NUM_TYPES; id++) {
1218cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (!isApnIdEnabled(id)) {
1219cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                notifyApnIdDisconnected(reason, id);
1220cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1221cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1222cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1223cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1224cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public boolean isApnTypeEnabled(String apnType) {
1225cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (apnType == null) {
1226cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return false;
1227cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1228cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return isApnIdEnabled(apnTypeToId(apnType));
1229cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1230cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1231cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1232cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected synchronized boolean isApnIdEnabled(int id) {
1233cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (id != DctConstants.APN_INVALID_ID) {
123422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            return mDataEnabled[id];
1235cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1236cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return false;
1237cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1238cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1239cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void setEnabled(int id, boolean enable) {
1240cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG) {
124122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            log("setEnabled(" + id + ", " + enable + ") with old state = " + mDataEnabled[id]
124222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    + " and enabledCount = " + mEnabledCount);
1243cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1244cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Message msg = obtainMessage(DctConstants.EVENT_ENABLE_NEW_APN);
1245cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.arg1 = id;
1246cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.arg2 = (enable ? DctConstants.ENABLED : DctConstants.DISABLED);
1247cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        sendMessage(msg);
1248cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1249cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1250cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onEnableApn(int apnId, int enabled) {
1251cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG) {
1252cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("EVENT_APN_ENABLE_REQUEST apnId=" + apnId + ", apnType=" + apnIdToType(apnId) +
125322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    ", enabled=" + enabled + ", dataEnabled = " + mDataEnabled[apnId] +
125422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    ", enabledCount = " + mEnabledCount + ", isApnTypeActive = " +
1255cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    isApnTypeActive(apnIdToType(apnId)));
1256cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1257cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (enabled == DctConstants.ENABLED) {
1258cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            synchronized (this) {
125922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (!mDataEnabled[apnId]) {
126022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mDataEnabled[apnId] = true;
126122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mEnabledCount++;
1262cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1263cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1264cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            String type = apnIdToType(apnId);
1265cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (!isApnTypeActive(type)) {
1266cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mRequestedApnType = type;
1267cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onEnableNewApn();
1268cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1269cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                notifyApnIdUpToCurrent(Phone.REASON_APN_SWITCHED, apnId);
1270cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1271cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1272cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // disable
1273cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            boolean didDisable = false;
1274cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            synchronized (this) {
127522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mDataEnabled[apnId]) {
127622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mDataEnabled[apnId] = false;
127722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mEnabledCount--;
1278cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    didDisable = true;
1279cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1280cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1281cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (didDisable) {
128222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if ((mEnabledCount == 0) || (apnId == DctConstants.APN_DUN_ID)) {
1283cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    mRequestedApnType = PhoneConstants.APN_TYPE_DEFAULT;
1284cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    onCleanUpConnection(true, apnId, Phone.REASON_DATA_DISABLED);
1285cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1286cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1287cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // send the disconnect msg manually, since the normal route wont send
1288cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // it (it's not enabled)
1289cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                notifyApnIdDisconnected(Phone.REASON_DATA_DISABLED, apnId);
129022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mDataEnabled[DctConstants.APN_DEFAULT_ID] == true
1291cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        && !isApnTypeActive(PhoneConstants.APN_TYPE_DEFAULT)) {
1292cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // TODO - this is an ugly way to restore the default conn - should be done
1293cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // by a real contention manager and policy that disconnects the lower pri
1294cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // stuff as enable requests come in and pops them back on as we disable back
1295cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // down to the lower pri stuff
1296cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    mRequestedApnType = PhoneConstants.APN_TYPE_DEFAULT;
1297cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    onEnableNewApn();
1298cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1299cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1300cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1301cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1302cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1303cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
1304cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Called when we switch APNs.
1305cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *
1306cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * mRequestedApnType is set prior to call
1307cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * To be overridden.
1308cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
1309cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onEnableNewApn() {
1310cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1311cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1312cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
1313cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Called when EVENT_RESET_DONE is received so goto
1314cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * IDLE state and send notifications to those interested.
1315cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *
1316cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * TODO - currently unused.  Needs to be hooked into DataConnection cleanup
1317cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * TODO - needs to pass some notion of which connection is reset..
1318cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
1319cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onResetDone(AsyncResult ar) {
1320cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG) log("EVENT_RESET_DONE");
1321cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String reason = null;
1322cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (ar.userObj instanceof String) {
1323cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            reason = (String) ar.userObj;
1324cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1325cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        gotoIdleAndNotifyDataConnection(reason);
1326cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1327cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1328cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
1329cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Prevent mobile data connections from being established, or once again
1330cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * allow mobile data connections. If the state toggles, then either tear
1331cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * down or set up data, as appropriate to match the new state.
1332cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *
1333cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * @param enable indicates whether to enable ({@code true}) or disable (
1334cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *            {@code false}) data
1335cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * @return {@code true} if the operation succeeded
1336cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
1337cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public boolean setInternalDataEnabled(boolean enable) {
1338cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG)
1339cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("setInternalDataEnabled(" + enable + ")");
1340cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1341cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Message msg = obtainMessage(DctConstants.EVENT_SET_INTERNAL_DATA_ENABLE);
1342cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.arg1 = (enable ? DctConstants.ENABLED : DctConstants.DISABLED);
1343cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        sendMessage(msg);
1344cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return true;
1345cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1346cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1347cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onSetInternalDataEnabled(boolean enabled) {
1348cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        synchronized (mDataEnabledLock) {
1349cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mInternalDataEnabled = enabled;
1350cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (enabled) {
1351cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("onSetInternalDataEnabled: changed to enabled, try to setup data call");
1352cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onTrySetupData(Phone.REASON_DATA_ENABLED);
1353cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1354cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("onSetInternalDataEnabled: changed to disabled, cleanUpAllConnections");
1355cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                cleanUpAllConnections(null);
1356cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1357cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1358cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1359cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1360cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void cleanUpAllConnections(String cause) {
1361cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Message msg = obtainMessage(DctConstants.EVENT_CLEAN_UP_ALL_CONNECTIONS);
1362cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.obj = cause;
1363cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        sendMessage(msg);
1364cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1365cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1366cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public abstract boolean isDisconnected();
1367cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1368cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onSetUserDataEnabled(boolean enabled) {
1369cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        synchronized (mDataEnabledLock) {
1370cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mUserDataEnabled != enabled) {
1371cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mUserDataEnabled = enabled;
137224b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest                int phoneSubId = mPhone.getSubId();
1373cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                Settings.Global.putInt(mPhone.getContext().getContentResolver(),
137424b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest                        Settings.Global.MOBILE_DATA + phoneSubId, enabled ? 1 : 0);
1375cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (getDataOnRoamingEnabled() == false &&
1376ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao                        mPhone.getServiceState().getDataRoaming() == true) {
1377cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    if (enabled) {
1378cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON);
1379cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    } else {
1380cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        notifyOffApnsOfAvailability(Phone.REASON_DATA_DISABLED);
1381cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    }
1382cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1383014103f70a8d7dc5b0030f18641ca5d117197ce0xinhe
1384014103f70a8d7dc5b0030f18641ca5d117197ce0xinhe                if (enabled) {
1385014103f70a8d7dc5b0030f18641ca5d117197ce0xinhe                    onTrySetupData(Phone.REASON_DATA_ENABLED);
1386014103f70a8d7dc5b0030f18641ca5d117197ce0xinhe                } else {
1387014103f70a8d7dc5b0030f18641ca5d117197ce0xinhe                    onCleanUpAllConnections(Phone.REASON_DATA_SPECIFIC_DISABLED);
1388cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1389cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1390cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1391cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1392cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1393cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onSetDependencyMet(String apnType, boolean met) {
1394cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1395cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1396cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onSetPolicyDataEnabled(boolean enabled) {
1397cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        synchronized (mDataEnabledLock) {
1398cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            final boolean prevEnabled = getAnyDataEnabled();
1399cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (sPolicyDataEnabled != enabled) {
1400cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                sPolicyDataEnabled = enabled;
1401cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (prevEnabled != getAnyDataEnabled()) {
1402cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    if (!prevEnabled) {
1403cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        onTrySetupData(Phone.REASON_DATA_ENABLED);
1404cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    } else {
1405a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        onCleanUpAllConnections(Phone.REASON_DATA_SPECIFIC_DISABLED);
1406cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    }
1407cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1408cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1409cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1410cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1411cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1412cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected String getReryConfig(boolean forDefault) {
1413cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int nt = mPhone.getServiceState().getNetworkType();
1414cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1415cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if ((nt == TelephonyManager.NETWORK_TYPE_CDMA) ||
1416cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            (nt == TelephonyManager.NETWORK_TYPE_1xRTT) ||
1417cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            (nt == TelephonyManager.NETWORK_TYPE_EVDO_0) ||
1418cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            (nt == TelephonyManager.NETWORK_TYPE_EVDO_A) ||
1419cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            (nt == TelephonyManager.NETWORK_TYPE_EVDO_B) ||
1420cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            (nt == TelephonyManager.NETWORK_TYPE_EHRPD)) {
1421cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // CDMA variant
1422cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return SystemProperties.get("ro.cdma.data_retry_config");
1423cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1424cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // Use GSM varient for all others.
1425cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (forDefault) {
1426cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                return SystemProperties.get("ro.gsm.data_retry_config");
1427cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1428cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                return SystemProperties.get("ro.gsm.2nd_data_retry_config");
1429cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1430cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1431cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1432cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1433cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void resetPollStats() {
1434cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mTxPkts = -1;
1435cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mRxPkts = -1;
1436cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mNetStatPollPeriod = POLL_NETSTAT_MILLIS;
1437cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1438cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1439cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract DctConstants.State getOverallState();
1440cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1441b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    void startNetStatPoll() {
1442ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville        if (getOverallState() == DctConstants.State.CONNECTED
1443ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville                && mNetStatPollEnabled == false) {
1444b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh            if (DBG) {
1445b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                log("startNetStatPoll");
1446b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh            }
1447cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            resetPollStats();
1448cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mNetStatPollEnabled = true;
1449cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mPollNetStat.run();
1450cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
14516bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        if (mPhone != null) {
14526bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville            mPhone.notifyDataActivity();
14536bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        }
1454cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1455cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1456b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    void stopNetStatPoll() {
1457cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mNetStatPollEnabled = false;
1458cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        removeCallbacks(mPollNetStat);
1459b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        if (DBG) {
1460b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh            log("stopNetStatPoll");
1461b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        }
14626bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville
14636bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        // To sync data activity icon in the case of switching data connection to send MMS.
14646bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        if (mPhone != null) {
14656bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville            mPhone.notifyDataActivity();
14666bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        }
1467b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    }
1468b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh
1469b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    public void sendStartNetStatPoll(DctConstants.Activity activity) {
1470b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        Message msg = obtainMessage(DctConstants.CMD_NET_STAT_POLL);
1471b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        msg.arg1 = DctConstants.ENABLED;
1472b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        msg.obj = activity;
1473b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        sendMessage(msg);
1474b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    }
1475b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh
1476b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    protected void handleStartNetStatPoll(DctConstants.Activity activity) {
1477b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        startNetStatPoll();
1478b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
1479b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        setActivity(activity);
1480b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    }
1481b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh
1482b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    public void sendStopNetStatPoll(DctConstants.Activity activity) {
1483b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        Message msg = obtainMessage(DctConstants.CMD_NET_STAT_POLL);
1484b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        msg.arg1 = DctConstants.DISABLED;
1485b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        msg.obj = activity;
1486b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        sendMessage(msg);
1487b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    }
1488b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh
1489b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    protected void handleStopNetStatPoll(DctConstants.Activity activity) {
1490b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        stopNetStatPoll();
1491b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        stopDataStallAlarm();
1492b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        setActivity(activity);
1493cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1494cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1495cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void updateDataActivity() {
1496cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        long sent, received;
1497cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1498cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        DctConstants.Activity newActivity;
1499cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1500cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        TxRxSum preTxRxSum = new TxRxSum(mTxPkts, mRxPkts);
1501cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        TxRxSum curTxRxSum = new TxRxSum();
1502cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        curTxRxSum.updateTxRxSum();
1503cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mTxPkts = curTxRxSum.txPkts;
1504cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mRxPkts = curTxRxSum.rxPkts;
1505cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1506cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (VDBG) {
1507cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("updateDataActivity: curTxRxSum=" + curTxRxSum + " preTxRxSum=" + preTxRxSum);
1508cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1509cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1510cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mNetStatPollEnabled && (preTxRxSum.txPkts > 0 || preTxRxSum.rxPkts > 0)) {
1511cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            sent = mTxPkts - preTxRxSum.txPkts;
1512cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            received = mRxPkts - preTxRxSum.rxPkts;
1513cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1514cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (VDBG)
1515cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("updateDataActivity: sent=" + sent + " received=" + received);
1516cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (sent > 0 && received > 0) {
1517cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                newActivity = DctConstants.Activity.DATAINANDOUT;
1518cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else if (sent > 0 && received == 0) {
1519cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                newActivity = DctConstants.Activity.DATAOUT;
1520cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else if (sent == 0 && received > 0) {
1521cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                newActivity = DctConstants.Activity.DATAIN;
1522cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1523cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                newActivity = (mActivity == DctConstants.Activity.DORMANT) ?
1524cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        mActivity : DctConstants.Activity.NONE;
1525cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1526cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1527cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mActivity != newActivity && mIsScreenOn) {
1528cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (VDBG)
1529cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    log("updateDataActivity: newActivity=" + newActivity);
1530cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mActivity = newActivity;
1531cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.notifyDataActivity();
1532cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1533cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1534cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1535cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1536cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Recovery action taken in case of data stall
1537cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static class RecoveryAction {
1538cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public static final int GET_DATA_CALL_LIST      = 0;
1539cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public static final int CLEANUP                 = 1;
1540cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public static final int REREGISTER              = 2;
1541cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public static final int RADIO_RESTART           = 3;
1542cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public static final int RADIO_RESTART_WITH_PROP = 4;
1543cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1544cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        private static boolean isAggressiveRecovery(int value) {
1545cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return ((value == RecoveryAction.CLEANUP) ||
1546cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    (value == RecoveryAction.REREGISTER) ||
1547cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    (value == RecoveryAction.RADIO_RESTART) ||
1548cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    (value == RecoveryAction.RADIO_RESTART_WITH_PROP));
1549cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1550cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1551cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1552cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public int getRecoveryAction() {
1553cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int action = Settings.System.getInt(mPhone.getContext().getContentResolver(),
1554cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                "radio.data.stall.recovery.action", RecoveryAction.GET_DATA_CALL_LIST);
1555ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) log("getRecoveryAction: " + action);
1556cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return action;
1557cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1558cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void putRecoveryAction(int action) {
1559cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Settings.System.putInt(mPhone.getContext().getContentResolver(),
1560cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                "radio.data.stall.recovery.action", action);
1561ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) log("putRecoveryAction: " + action);
1562cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1563cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1564cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean isConnected() {
1565cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return false;
1566cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1567cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1568cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void doRecovery() {
1569cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (getOverallState() == DctConstants.State.CONNECTED) {
1570cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // Go through a series of recovery steps, each action transitions to the next action
1571cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            int recoveryAction = getRecoveryAction();
1572cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            switch (recoveryAction) {
1573cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case RecoveryAction.GET_DATA_CALL_LIST:
1574cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_GET_DATA_CALL_LIST,
1575cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        mSentSinceLastRecv);
1576cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("doRecovery() get data call list");
157722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.mCi.getDataCallList(obtainMessage(DctConstants.EVENT_DATA_STATE_CHANGED));
1578cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                putRecoveryAction(RecoveryAction.CLEANUP);
1579cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1580cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case RecoveryAction.CLEANUP:
1581cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_CLEANUP, mSentSinceLastRecv);
1582cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("doRecovery() cleanup all connections");
1583cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                cleanUpAllConnections(Phone.REASON_PDP_RESET);
1584cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                putRecoveryAction(RecoveryAction.REREGISTER);
1585cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1586cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case RecoveryAction.REREGISTER:
1587cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_REREGISTER,
1588cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        mSentSinceLastRecv);
1589cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("doRecovery() re-register");
1590cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.getServiceStateTracker().reRegisterNetwork(null);
1591cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                putRecoveryAction(RecoveryAction.RADIO_RESTART);
1592cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1593cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case RecoveryAction.RADIO_RESTART:
1594cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_RADIO_RESTART,
1595cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        mSentSinceLastRecv);
1596cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("restarting radio");
1597cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                putRecoveryAction(RecoveryAction.RADIO_RESTART_WITH_PROP);
1598cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                restartRadio();
1599cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1600cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case RecoveryAction.RADIO_RESTART_WITH_PROP:
1601cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // This is in case radio restart has not recovered the data.
1602cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // It will set an additional "gsm.radioreset" property to tell
1603cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // RIL or system to take further action.
1604cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // The implementation of hard reset recovery action is up to OEM product.
1605cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // Once RADIO_RESET property is consumed, it is expected to set back
1606cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // to false by RIL.
1607cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_RADIO_RESTART_WITH_PROP, -1);
1608cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("restarting radio with gsm.radioreset to true");
1609cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                SystemProperties.set(RADIO_RESET_PROPERTY, "true");
1610cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // give 1 sec so property change can be notified.
1611cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                try {
1612cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    Thread.sleep(1000);
1613cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                } catch (InterruptedException e) {}
1614cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                restartRadio();
1615cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                putRecoveryAction(RecoveryAction.GET_DATA_CALL_LIST);
1616cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1617cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            default:
1618cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                throw new RuntimeException("doRecovery: Invalid recoveryAction=" +
1619cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    recoveryAction);
1620cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1621cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mSentSinceLastRecv = 0;
1622cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1623cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1624cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1625cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void updateDataStallInfo() {
1626cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        long sent, received;
1627cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1628cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        TxRxSum preTxRxSum = new TxRxSum(mDataStallTxRxSum);
1629cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mDataStallTxRxSum.updateTxRxSum();
1630cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1631ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) {
1632cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("updateDataStallInfo: mDataStallTxRxSum=" + mDataStallTxRxSum +
1633cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    " preTxRxSum=" + preTxRxSum);
1634cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1635cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1636cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        sent = mDataStallTxRxSum.txPkts - preTxRxSum.txPkts;
1637cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        received = mDataStallTxRxSum.rxPkts - preTxRxSum.rxPkts;
1638cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1639cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (RADIO_TESTS) {
1640cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (SystemProperties.getBoolean("radio.test.data.stall", false)) {
1641cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("updateDataStallInfo: radio.test.data.stall true received = 0;");
1642cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                received = 0;
1643cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1644cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1645cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if ( sent > 0 && received > 0 ) {
1646ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) log("updateDataStallInfo: IN/OUT");
1647cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mSentSinceLastRecv = 0;
1648cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            putRecoveryAction(RecoveryAction.GET_DATA_CALL_LIST);
1649cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (sent > 0 && received == 0) {
1650cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mPhone.getState() == PhoneConstants.State.IDLE) {
1651cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mSentSinceLastRecv += sent;
1652cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1653cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mSentSinceLastRecv = 0;
1654cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1655cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (DBG) {
1656cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("updateDataStallInfo: OUT sent=" + sent +
1657cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        " mSentSinceLastRecv=" + mSentSinceLastRecv);
1658cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1659cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (sent == 0 && received > 0) {
1660ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) log("updateDataStallInfo: IN");
1661cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mSentSinceLastRecv = 0;
1662cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            putRecoveryAction(RecoveryAction.GET_DATA_CALL_LIST);
1663cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1664ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) log("updateDataStallInfo: NONE");
1665cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1666cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1667cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1668cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onDataStallAlarm(int tag) {
1669cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mDataStallAlarmTag != tag) {
1670cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (DBG) {
1671cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("onDataStallAlarm: ignore, tag=" + tag + " expecting " + mDataStallAlarmTag);
1672cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1673cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return;
1674cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1675cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        updateDataStallInfo();
1676cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1677cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int hangWatchdogTrigger = Settings.Global.getInt(mResolver,
1678cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                Settings.Global.PDP_WATCHDOG_TRIGGER_PACKET_COUNT,
1679cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                NUMBER_SENT_PACKETS_OF_HANG);
1680cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1681cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        boolean suspectedStall = DATA_STALL_NOT_SUSPECTED;
1682cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mSentSinceLastRecv >= hangWatchdogTrigger) {
1683cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (DBG) {
1684cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("onDataStallAlarm: tag=" + tag + " do recovery action=" + getRecoveryAction());
1685cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1686cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            suspectedStall = DATA_STALL_SUSPECTED;
1687cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            sendMessage(obtainMessage(DctConstants.EVENT_DO_RECOVERY));
1688cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1689ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) {
1690cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("onDataStallAlarm: tag=" + tag + " Sent " + String.valueOf(mSentSinceLastRecv) +
1691cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    " pkts since last received, < watchdogTrigger=" + hangWatchdogTrigger);
1692cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1693cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1694cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        startDataStallAlarm(suspectedStall);
1695cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1696cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1697cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void startDataStallAlarm(boolean suspectedStall) {
1698cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int nextAction = getRecoveryAction();
1699cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int delayInMs;
1700cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1701ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville        if (mDataStallDetectionEnabled && getOverallState() == DctConstants.State.CONNECTED) {
1702cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // If screen is on or data stall is currently suspected, set the alarm
1703cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // with an aggresive timeout.
1704cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mIsScreenOn || suspectedStall || RecoveryAction.isAggressiveRecovery(nextAction)) {
1705cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                delayInMs = Settings.Global.getInt(mResolver,
1706cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        Settings.Global.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS,
1707cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT);
1708cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1709cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                delayInMs = Settings.Global.getInt(mResolver,
1710cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        Settings.Global.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS,
1711cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT);
1712cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1713cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1714cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mDataStallAlarmTag += 1;
1715ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) {
1716cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("startDataStallAlarm: tag=" + mDataStallAlarmTag +
1717cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        " delay=" + (delayInMs / 1000) + "s");
1718cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1719ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Intent intent = new Intent(INTENT_DATA_STALL_ALARM);
1720cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            intent.putExtra(DATA_STALL_ALARM_TAG_EXTRA, mDataStallAlarmTag);
1721cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mDataStallAlarmIntent = PendingIntent.getBroadcast(mPhone.getContext(), 0, intent,
1722cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    PendingIntent.FLAG_UPDATE_CURRENT);
1723ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
1724cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    SystemClock.elapsedRealtime() + delayInMs, mDataStallAlarmIntent);
1725ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
1726ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) {
1727ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                log("startDataStallAlarm: NOT started, no connection tag=" + mDataStallAlarmTag);
1728ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1729cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1730cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1731cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1732cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void stopDataStallAlarm() {
1733ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) {
1734cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("stopDataStallAlarm: current tag=" + mDataStallAlarmTag +
1735cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    " mDataStallAlarmIntent=" + mDataStallAlarmIntent);
1736cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1737cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mDataStallAlarmTag += 1;
1738cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mDataStallAlarmIntent != null) {
1739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mAlarmManager.cancel(mDataStallAlarmIntent);
1740cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mDataStallAlarmIntent = null;
1741cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1742cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1743cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1744cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void restartDataStallAlarm() {
1745cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (isConnected() == false) return;
1746cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // To be called on screen status change.
1747cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // Do not cancel the alarm if it is set with aggressive timeout.
1748cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int nextAction = getRecoveryAction();
1749cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1750cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (RecoveryAction.isAggressiveRecovery(nextAction)) {
1751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) log("restartDataStallAlarm: action is pending. not resetting the alarm.");
1752cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return;
1753cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1754ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) log("restartDataStallAlarm: stop then start.");
1755cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        stopDataStallAlarm();
1756cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
1757cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1758cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
17595d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi    protected void setInitialAttachApn() {
17601b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        ApnSetting iaApnSetting = null;
17611b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        ApnSetting defaultApnSetting = null;
17621b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        ApnSetting firstApnSetting = null;
17635d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
17641b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        log("setInitialApn: E mPreferredApn=" + mPreferredApn);
17651b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville
17661b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        if (mAllApnSettings != null && !mAllApnSettings.isEmpty()) {
17671b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            firstApnSetting = mAllApnSettings.get(0);
17681b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            log("setInitialApn: firstApnSetting=" + firstApnSetting);
17691b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville
17701b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            // Search for Initial APN setting and the first apn that can handle default
17715d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi            for (ApnSetting apn : mAllApnSettings) {
1772dd6e67fb45fa3ce0d43f8d874cd7ffaeddf0926fLorenzo Colitti                // Can't use apn.canHandleType(), as that returns true for APNs that have no type.
1773dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                if (ArrayUtils.contains(apn.types, PhoneConstants.APN_TYPE_IA) &&
1774dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                        apn.carrierEnabled) {
17751b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    // The Initial Attach APN is highest priority so use it if there is one
17761b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    log("setInitialApn: iaApnSetting=" + apn);
17771b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    iaApnSetting = apn;
17785d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi                    break;
17791b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                } else if ((defaultApnSetting == null)
17801b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                        && (apn.canHandleType(PhoneConstants.APN_TYPE_DEFAULT))) {
17811b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    // Use the first default apn if no better choice
17821b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    log("setInitialApn: defaultApnSetting=" + apn);
17831b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    defaultApnSetting = apn;
17845d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi                }
17855d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi            }
17865d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi        }
17875d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
17881b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        // The priority of apn candidates from highest to lowest is:
17891b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        //   1) APN_TYPE_IA (Inital Attach)
17901b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        //   2) mPreferredApn, i.e. the current preferred apn
17911b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        //   3) The first apn that than handle APN_TYPE_DEFAULT
17921b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        //   4) The first APN we can find.
17931b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville
17941b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        ApnSetting initialAttachApnSetting = null;
17951b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        if (iaApnSetting != null) {
17961b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: using iaApnSetting");
17971b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            initialAttachApnSetting = iaApnSetting;
17981b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        } else if (mPreferredApn != null) {
17991b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: using mPreferredApn");
18001b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            initialAttachApnSetting = mPreferredApn;
18011b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        } else if (defaultApnSetting != null) {
18021b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: using defaultApnSetting");
18031b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            initialAttachApnSetting = defaultApnSetting;
18041b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        } else if (firstApnSetting != null) {
18051b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: using firstApnSetting");
18061b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            initialAttachApnSetting = firstApnSetting;
18071b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        }
18081b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville
18091b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        if (initialAttachApnSetting == null) {
18101b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: X There in no available apn");
18111b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        } else {
18121b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: X selected Apn=" + initialAttachApnSetting);
18135d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
18141b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            mPhone.mCi.setInitialAttachApn(initialAttachApnSetting.apn,
18151b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    initialAttachApnSetting.protocol, initialAttachApnSetting.authType,
18161b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    initialAttachApnSetting.user, initialAttachApnSetting.password, null);
18171b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        }
18185d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi    }
18195d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
18209d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan    protected void setDataProfilesAsNeeded() {
18219d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan        if (DBG) log("setDataProfilesAsNeeded");
18229d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan        if (mAllApnSettings != null && !mAllApnSettings.isEmpty()) {
18239d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan            ArrayList<DataProfile> dps = new ArrayList<DataProfile>();
18249d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan            for (ApnSetting apn : mAllApnSettings) {
18259d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan                if (apn.modemCognitive) {
18269d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan                    DataProfile dp = new DataProfile(apn,
1827ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao                            mPhone.getServiceState().getDataRoaming());
1828dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                    boolean isDup = false;
1829dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                    for(DataProfile dpIn : dps) {
1830dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                        if (dp.equals(dpIn)) {
1831dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                            isDup = true;
1832dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                            break;
1833dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                        }
1834dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                    }
1835dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                    if (!isDup) {
1836dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                        dps.add(dp);
1837dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                    }
18389d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan                }
18399d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan            }
18409d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan            if(dps.size() > 0) {
18419d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan                mPhone.mCi.setDataProfile(dps.toArray(new DataProfile[0]), null);
18429d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan            }
18439d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan        }
18449d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan    }
18459d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan
1846e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected void onActionIntentProvisioningApnAlarm(Intent intent) {
1847e9063f6973039d66e12d0d930af03906d377969eWink Saville        if (DBG) log("onActionIntentProvisioningApnAlarm: action=" + intent.getAction());
1848e9063f6973039d66e12d0d930af03906d377969eWink Saville        Message msg = obtainMessage(DctConstants.EVENT_PROVISIONING_APN_ALARM,
1849e9063f6973039d66e12d0d930af03906d377969eWink Saville                intent.getAction());
1850e9063f6973039d66e12d0d930af03906d377969eWink Saville        msg.arg1 = intent.getIntExtra(PROVISIONING_APN_ALARM_TAG_EXTRA, 0);
1851e9063f6973039d66e12d0d930af03906d377969eWink Saville        sendMessage(msg);
1852e9063f6973039d66e12d0d930af03906d377969eWink Saville    }
1853e9063f6973039d66e12d0d930af03906d377969eWink Saville
1854e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected void startProvisioningApnAlarm() {
1855e9063f6973039d66e12d0d930af03906d377969eWink Saville        int delayInMs = Settings.Global.getInt(mResolver,
1856e9063f6973039d66e12d0d930af03906d377969eWink Saville                                Settings.Global.PROVISIONING_APN_ALARM_DELAY_IN_MS,
1857e9063f6973039d66e12d0d930af03906d377969eWink Saville                                PROVISIONING_APN_ALARM_DELAY_IN_MS_DEFAULT);
1858e9063f6973039d66e12d0d930af03906d377969eWink Saville        if (Build.IS_DEBUGGABLE) {
1859e9063f6973039d66e12d0d930af03906d377969eWink Saville            // Allow debug code to use a system property to provide another value
1860e9063f6973039d66e12d0d930af03906d377969eWink Saville            String delayInMsStrg = Integer.toString(delayInMs);
1861e9063f6973039d66e12d0d930af03906d377969eWink Saville            delayInMsStrg = System.getProperty(DEBUG_PROV_APN_ALARM, delayInMsStrg);
1862e9063f6973039d66e12d0d930af03906d377969eWink Saville            try {
1863e9063f6973039d66e12d0d930af03906d377969eWink Saville                delayInMs = Integer.parseInt(delayInMsStrg);
1864e9063f6973039d66e12d0d930af03906d377969eWink Saville            } catch (NumberFormatException e) {
1865e9063f6973039d66e12d0d930af03906d377969eWink Saville                loge("startProvisioningApnAlarm: e=" + e);
1866e9063f6973039d66e12d0d930af03906d377969eWink Saville            }
1867e9063f6973039d66e12d0d930af03906d377969eWink Saville        }
1868e9063f6973039d66e12d0d930af03906d377969eWink Saville        mProvisioningApnAlarmTag += 1;
1869e9063f6973039d66e12d0d930af03906d377969eWink Saville        if (DBG) {
1870e9063f6973039d66e12d0d930af03906d377969eWink Saville            log("startProvisioningApnAlarm: tag=" + mProvisioningApnAlarmTag +
1871e9063f6973039d66e12d0d930af03906d377969eWink Saville                    " delay=" + (delayInMs / 1000) + "s");
1872e9063f6973039d66e12d0d930af03906d377969eWink Saville        }
1873e9063f6973039d66e12d0d930af03906d377969eWink Saville        Intent intent = new Intent(INTENT_PROVISIONING_APN_ALARM);
1874e9063f6973039d66e12d0d930af03906d377969eWink Saville        intent.putExtra(PROVISIONING_APN_ALARM_TAG_EXTRA, mProvisioningApnAlarmTag);
1875e9063f6973039d66e12d0d930af03906d377969eWink Saville        mProvisioningApnAlarmIntent = PendingIntent.getBroadcast(mPhone.getContext(), 0, intent,
1876e9063f6973039d66e12d0d930af03906d377969eWink Saville                PendingIntent.FLAG_UPDATE_CURRENT);
1877e9063f6973039d66e12d0d930af03906d377969eWink Saville        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
1878e9063f6973039d66e12d0d930af03906d377969eWink Saville                SystemClock.elapsedRealtime() + delayInMs, mProvisioningApnAlarmIntent);
1879e9063f6973039d66e12d0d930af03906d377969eWink Saville    }
1880e9063f6973039d66e12d0d930af03906d377969eWink Saville
1881e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected void stopProvisioningApnAlarm() {
1882e9063f6973039d66e12d0d930af03906d377969eWink Saville        if (DBG) {
1883e9063f6973039d66e12d0d930af03906d377969eWink Saville            log("stopProvisioningApnAlarm: current tag=" + mProvisioningApnAlarmTag +
1884e9063f6973039d66e12d0d930af03906d377969eWink Saville                    " mProvsioningApnAlarmIntent=" + mProvisioningApnAlarmIntent);
1885e9063f6973039d66e12d0d930af03906d377969eWink Saville        }
1886e9063f6973039d66e12d0d930af03906d377969eWink Saville        mProvisioningApnAlarmTag += 1;
1887e9063f6973039d66e12d0d930af03906d377969eWink Saville        if (mProvisioningApnAlarmIntent != null) {
1888e9063f6973039d66e12d0d930af03906d377969eWink Saville            mAlarmManager.cancel(mProvisioningApnAlarmIntent);
1889e9063f6973039d66e12d0d930af03906d377969eWink Saville            mProvisioningApnAlarmIntent = null;
1890e9063f6973039d66e12d0d930af03906d377969eWink Saville        }
1891e9063f6973039d66e12d0d930af03906d377969eWink Saville    }
1892e9063f6973039d66e12d0d930af03906d377969eWink Saville
1893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    void sendCleanUpConnection(boolean tearDown, ApnContext apnContext) {
1894ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (DBG)log("sendCleanUpConnection: tearDown=" + tearDown + " apnContext=" + apnContext);
1895ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Message msg = obtainMessage(DctConstants.EVENT_CLEAN_UP_CONNECTION);
1896ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        msg.arg1 = tearDown ? 1 : 0;
1897ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        msg.arg2 = 0;
1898ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        msg.obj = apnContext;
1899ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sendMessage(msg);
1900ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1901ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1902979786625e7ceacf4a545a25704ef8a15338a854Wink Saville    void sendRestartRadio() {
1903979786625e7ceacf4a545a25704ef8a15338a854Wink Saville        if (DBG)log("sendRestartRadio:");
1904979786625e7ceacf4a545a25704ef8a15338a854Wink Saville        Message msg = obtainMessage(DctConstants.EVENT_RESTART_RADIO);
1905979786625e7ceacf4a545a25704ef8a15338a854Wink Saville        sendMessage(msg);
1906979786625e7ceacf4a545a25704ef8a15338a854Wink Saville    }
1907979786625e7ceacf4a545a25704ef8a15338a854Wink Saville
1908cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1909bda761320929f714951c328bfec6a51a1978db97Wink Saville        pw.println("DcTrackerBase:");
1910cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" RADIO_TESTS=" + RADIO_TESTS);
1911cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mInternalDataEnabled=" + mInternalDataEnabled);
1912cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mUserDataEnabled=" + mUserDataEnabled);
1913cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" sPolicyDataEnabed=" + sPolicyDataEnabled);
191422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mDataEnabled:");
191522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for(int i=0; i < mDataEnabled.length; i++) {
191622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            pw.printf("  mDataEnabled[%d]=%b\n", i, mDataEnabled[i]);
1917cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1918cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
191922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mEnabledCount=" + mEnabledCount);
1920cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mRequestedApnType=" + mRequestedApnType);
1921cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mPhone=" + mPhone.getPhoneName());
1922cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mActivity=" + mActivity);
1923cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mState=" + mState);
1924cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mTxPkts=" + mTxPkts);
1925cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mRxPkts=" + mRxPkts);
1926cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mNetStatPollPeriod=" + mNetStatPollPeriod);
1927cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mNetStatPollEnabled=" + mNetStatPollEnabled);
1928cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mDataStallTxRxSum=" + mDataStallTxRxSum);
1929cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mDataStallAlarmTag=" + mDataStallAlarmTag);
1930ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville        pw.println(" mDataStallDetectionEanbled=" + mDataStallDetectionEnabled);
1931cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mSentSinceLastRecv=" + mSentSinceLastRecv);
1932cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mNoRecvPollCount=" + mNoRecvPollCount);
1933cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mResolver=" + mResolver);
1934cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mIsWifiConnected=" + mIsWifiConnected);
1935cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mReconnectIntent=" + mReconnectIntent);
1936cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mCidActive=" + mCidActive);
1937cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mAutoAttachOnCreation=" + mAutoAttachOnCreation);
1938cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mIsScreenOn=" + mIsScreenOn);
1939cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mUniqueIdGenerator=" + mUniqueIdGenerator);
1940cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
1941cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" ***************************************");
1942ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        DcController dcc = mDcc;
1943ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (dcc != null) {
1944ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            dcc.dump(fd, pw, args);
1945ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
1946ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mDcc=null");
1947ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1948ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" ***************************************");
1949ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        HashMap<Integer, DataConnection> dcs = mDataConnections;
1950ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (dcs != null) {
1951ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Set<Entry<Integer, DataConnection> > mDcSet = mDataConnections.entrySet();
1952ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mDataConnections: count=" + mDcSet.size());
1953ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            for (Entry<Integer, DataConnection> entry : mDcSet) {
1954ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                pw.printf(" *** mDataConnection[%d] \n", entry.getKey());
1955ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                entry.getValue().dump(fd, pw, args);
1956ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1957ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
1958ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println("mDataConnections=null");
1959cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1960cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" ***************************************");
1961cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
1962ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        HashMap<String, Integer> apnToDcId = mApnToDataConnectionId;
1963ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (apnToDcId != null) {
1964ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Set<Entry<String, Integer>> apnToDcIdSet = apnToDcId.entrySet();
1965ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mApnToDataConnectonId size=" + apnToDcIdSet.size());
1966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            for (Entry<String, Integer> entry : apnToDcIdSet) {
1967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                pw.printf(" mApnToDataConnectonId[%s]=%d\n", entry.getKey(), entry.getValue());
1968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
1970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println("mApnToDataConnectionId=null");
1971cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1972cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" ***************************************");
1973cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
1974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ConcurrentHashMap<String, ApnContext> apnCtxs = mApnContexts;
1975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (apnCtxs != null) {
1976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Set<Entry<String, ApnContext>> apnCtxsSet = apnCtxs.entrySet();
1977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mApnContexts size=" + apnCtxsSet.size());
1978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            for (Entry<String, ApnContext> entry : apnCtxsSet) {
1979cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                entry.getValue().dump(fd, pw, args);
1980cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1981cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            pw.println(" ***************************************");
1982cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1983cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            pw.println(" mApnContexts=null");
1984cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1985cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
1986cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mActiveApn=" + mActiveApn);
1987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ArrayList<ApnSetting> apnSettings = mAllApnSettings;
1988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (apnSettings != null) {
1989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mAllApnSettings size=" + apnSettings.size());
1990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            for (int i=0; i < apnSettings.size(); i++) {
1991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                pw.printf(" mAllApnSettings[%d]: %s\n", i, apnSettings.get(i));
1992cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1993cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            pw.flush();
1994cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1995ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mAllApnSettings=null");
1996cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1997cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mPreferredApn=" + mPreferredApn);
1998cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mIsPsRestricted=" + mIsPsRestricted);
1999cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mIsDisposed=" + mIsDisposed);
2000cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mIntentReceiver=" + mIntentReceiver);
2001cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mDataRoamingSettingObserver=" + mDataRoamingSettingObserver);
2002cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
2003cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
2004cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville}
2005