DcTrackerBase.java revision c03103f7525d900f509283db959c2f8ae82b3fec
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;
26cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.content.SharedPreferences;
27cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.database.ContentObserver;
28c9b81a0c05128694c617fcdd67e73821895822feWink Savilleimport android.net.ConnectivityManager;
29cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.LinkProperties;
3096cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwaltimport android.net.NetworkCapabilities;
31cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.NetworkInfo;
32cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.TrafficStats;
33cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.wifi.WifiManager;
34cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.AsyncResult;
35d54f9906ce6218a0a9e7a274342082901e7d5d18Wink Savilleimport android.os.Build;
36cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.Bundle;
37cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.Handler;
38ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.os.HandlerThread;
39cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.Message;
40cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.SystemClock;
41cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.os.SystemProperties;
42cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.preference.PreferenceManager;
43cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.provider.Settings;
44cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.provider.Settings.SettingNotFoundException;
45a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.SubscriptionManager;
46c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajanimport android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
47cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.telephony.TelephonyManager;
48cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.text.TextUtils;
49cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.util.EventLog;
50cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.telephony.Rlog;
51cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
52cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.R;
53cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.DctConstants;
54cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.EventLogTags;
55cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.Phone;
56cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.PhoneBase;
57cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.PhoneConstants;
58cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.uicc.IccRecords;
59cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.uicc.UiccController;
60cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.util.AsyncChannel;
61dd6e67fb45fa3ce0d43f8d874cd7ffaeddf0926fLorenzo Colittiimport com.android.internal.util.ArrayUtils;
62cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
63cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.io.FileDescriptor;
64cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.io.PrintWriter;
65cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.ArrayList;
663fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwaltimport java.util.Comparator;
67cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.HashMap;
683262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawalimport java.util.List;
69cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.Map.Entry;
70cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.Set;
71cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.concurrent.ConcurrentHashMap;
72cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.concurrent.atomic.AtomicInteger;
73cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport java.util.concurrent.atomic.AtomicReference;
743fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwaltimport java.util.PriorityQueue;
75cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
76cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville/**
77cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * {@hide}
78cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */
79454b1dfd508844b42eb775e4ab2359be74d3672bWink Savillepublic abstract class DcTrackerBase extends Handler {
80cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final boolean DBG = true;
81ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final boolean VDBG = false; // STOPSHIP if true
82ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final boolean VDBG_STALL = true; // STOPSHIP if true
83cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final boolean RADIO_TESTS = false;
84cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    static boolean mIsCleanupRequired = false;
86cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
87cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Constants for the data connection activity:
88cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * physical link down/up
89cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
90cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_CONNECTION_ACTIVE_PH_LINK_INACTIVE = 0;
91cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_CONNECTION_ACTIVE_PH_LINK_DOWN = 1;
92cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_CONNECTION_ACTIVE_PH_LINK_UP = 2;
93cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
94cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Delay between APN attempts.
95cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Note the property override mechanism is there just for testing purpose only. */
96ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    protected static final int APN_DELAY_DEFAULT_MILLIS = 20000;
97cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
98ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    /** Delay between APN attempts when in fail fast mode */
99ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    protected static final int APN_FAIL_FAST_DELAY_DEFAULT_MILLIS = 3000;
100da1dd2e1bccb6141109a65d4e40253f39c405537Wink Saville
101ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    AlarmManager mAlarmManager;
102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
103cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected Object mDataEnabledLock = new Object();
104cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
105cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // responds to the setInternalDataEnabled call - used internally to turn off data
106cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // for example during emergency calls
107cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mInternalDataEnabled = true;
108cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
109cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // responds to public (user) API to enable/disable data use
110cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // independent of mInternalDataEnabled and requests for APN access
111cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // persisted
112cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mUserDataEnabled = true;
113cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
114cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // TODO: move away from static state once 5587429 is fixed.
115cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static boolean sPolicyDataEnabled = true;
116cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
11722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private boolean[] mDataEnabled = new boolean[DctConstants.APN_NUM_TYPES];
118cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
11922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private int mEnabledCount = 0;
120cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
121cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /* Currently requested APN type (TODO: This should probably be a parameter not a member) */
122cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected String mRequestedApnType = PhoneConstants.APN_TYPE_DEFAULT;
123cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
124cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Retry configuration: A doubling of retry times from 5secs to 30minutes */
125cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String DEFAULT_DATA_RETRY_CONFIG = "default_randomization=2000,"
126cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        + "5000,10000,20000,40000,80000:5000,160000:5000,"
127cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        + "320000:5000,640000:5000,1280000:5000,1800000:5000";
128cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
129cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Retry configuration for secondary networks: 4 tries in 20 sec */
130cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String SECONDARY_DATA_RETRY_CONFIG =
131cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            "max_retries=3, 5000, 5000, 5000";
132cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
133cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Slow poll when attempting connection recovery. */
134cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int POLL_NETSTAT_SLOW_MILLIS = 5000;
135cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Default max failure count before attempting to network re-registration. */
136cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DEFAULT_MAX_PDP_RESET_FAIL = 3;
137cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
138cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
139cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * After detecting a potential connection problem, this is the max number
140cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * of subsequent polls before attempting recovery.
141cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
142cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int NO_RECV_POLL_LIMIT = 24;
143cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // 1 sec. default polling interval when screen is on.
144cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int POLL_NETSTAT_MILLIS = 1000;
145cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // 10 min. default polling interval when screen is off.
146cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int POLL_NETSTAT_SCREEN_OFF_MILLIS = 1000*60*10;
147cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // 2 min for round trip time
148cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int POLL_LONGEST_RTT = 120 * 1000;
149cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Default sent packets without ack which triggers initial recovery steps
150cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int NUMBER_SENT_PACKETS_OF_HANG = 10;
151cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // how long to wait before switching back to default APN
152cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int RESTORE_DEFAULT_APN_DELAY = 1 * 60 * 1000;
153cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // system property that can override the above value
154cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String APN_RESTORE_DELAY_PROP_NAME = "android.telephony.apn-restore";
155cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // represents an invalid IP address
156cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String NULL_IP = "0.0.0.0";
157cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
158cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Default for the data stall alarm while non-aggressive stall detection
159cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT = 1000 * 60 * 6;
160cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Default for the data stall alarm for aggressive stall detection
161cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT = 1000 * 60;
162cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // If attempt is less than this value we're doing first level recovery
163cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final int DATA_STALL_NO_RECV_POLL_LIMIT = 1;
164cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Tag for tracking stale alarms
165cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String DATA_STALL_ALARM_TAG_EXTRA = "data.stall.alram.tag";
166cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
167cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final boolean DATA_STALL_SUSPECTED = true;
168cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final boolean DATA_STALL_NOT_SUSPECTED = false;
169cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
170cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected String RADIO_RESET_PROPERTY = "gsm.radioreset";
171cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
172ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final String INTENT_RECONNECT_ALARM =
173ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            "com.android.internal.telephony.data-reconnect";
174ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final String INTENT_RECONNECT_ALARM_EXTRA_TYPE = "reconnect_alarm_extra_type";
175cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String INTENT_RECONNECT_ALARM_EXTRA_REASON =
176ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            "reconnect_alarm_extra_reason";
177ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
178ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final String INTENT_RESTART_TRYSETUP_ALARM =
179ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            "com.android.internal.telephony.data-restart-trysetup";
180ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final String INTENT_RESTART_TRYSETUP_ALARM_EXTRA_TYPE =
181ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            "restart_trysetup_alarm_extra_type";
182ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
183ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected static final String INTENT_DATA_STALL_ALARM =
184ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            "com.android.internal.telephony.data-stall";
185ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
186cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
187cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
188cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String DEFALUT_DATA_ON_BOOT_PROP = "net.def_data_on_boot";
189cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
190ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected DcTesterFailBringUpAll mDcTesterFailBringUpAll;
191ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected DcController mDcc;
192ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
193cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // member variables
194cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected PhoneBase mPhone;
195cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected UiccController mUiccController;
196cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>();
197cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected DctConstants.Activity mActivity = DctConstants.Activity.NONE;
198cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected DctConstants.State mState = DctConstants.State.IDLE;
199cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected Handler mDataConnectionTracker = null;
200cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
201cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected long mTxPkts;
202cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected long mRxPkts;
203cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected int mNetStatPollPeriod;
204cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mNetStatPollEnabled = false;
205cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
206cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected TxRxSum mDataStallTxRxSum = new TxRxSum(0, 0);
207cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Used to track stale data stall alarms.
208cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected int mDataStallAlarmTag = (int) SystemClock.elapsedRealtime();
209cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // The current data stall alarm intent
210cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected PendingIntent mDataStallAlarmIntent = null;
211cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Number of packets sent since the last received packet
212cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected long mSentSinceLastRecv;
213cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Controls when a simple recovery attempt it to be tried
214cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected int mNoRecvPollCount = 0;
215d54f9906ce6218a0a9e7a274342082901e7d5d18Wink Saville    // Refrence counter for enabling fail fast
21616a01fe85457587ad5fd02ea06aa2882baf3535bWink Saville    protected static int sEnableFailFastRefCounter = 0;
217ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    // True if data stall detection is enabled
218ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    protected volatile boolean mDataStallDetectionEnabled = true;
219ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville
220ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    protected volatile boolean mFailFast = false;
221ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville
222ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    // True when in voice call
223ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville    protected boolean mInVoiceCall = false;
224cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
225cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // wifi connection status will be updated by sticky intent
226cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mIsWifiConnected = false;
227cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
228cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Intent sent when the reconnect alarm fires. */
229cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected PendingIntent mReconnectIntent = null;
230cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
231cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** CID of active data connection */
232cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected int mCidActive;
233cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
234cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // When false we will not auto attach and manually attaching is required.
23512fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao    protected boolean mAutoAttachOnCreationConfig = false;
236cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mAutoAttachOnCreation = false;
237cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
238cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // State of screen
239cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // (TODO: Reconsider tying directly to screen, maybe this is
240cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    //        really a lower power mode")
241cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mIsScreenOn = true;
242cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
243cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Allows the generation of unique Id's for DataConnection objects */
244cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected AtomicInteger mUniqueIdGenerator = new AtomicInteger(0);
245cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
246cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** The data connections. */
247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected HashMap<Integer, DataConnection> mDataConnections =
248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        new HashMap<Integer, DataConnection>();
249cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
250cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** The data connection async channels */
251454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville    protected HashMap<Integer, DcAsyncChannel> mDataConnectionAcHashMap =
252454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        new HashMap<Integer, DcAsyncChannel>();
253cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
254cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Convert an ApnType string to Id (TODO: Use "enumeration" instead of String for ApnType) */
255cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected HashMap<String, Integer> mApnToDataConnectionId =
256cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                                    new HashMap<String, Integer>();
257cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
258cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Phone.APN_TYPE_* ===> ApnContext */
2593fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt    protected final ConcurrentHashMap<String, ApnContext> mApnContexts =
260cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                                    new ConcurrentHashMap<String, ApnContext>();
261cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
2623fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt    /** kept in sync with mApnContexts
2633fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt     * Higher numbers are higher priority and sorted so highest priority is first */
2643fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt    protected final PriorityQueue<ApnContext>mPrioritySortedApnContexts =
2653fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt            new PriorityQueue<ApnContext>(5,
2663fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt            new Comparator<ApnContext>() {
2673fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt                public int compare(ApnContext c1, ApnContext c2) {
2683fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt                    return c2.priority - c1.priority;
2693fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt                }
2703fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt            } );
2713fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt
272cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /* Currently active APN */
273cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected ApnSetting mActiveApn;
274cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
275cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** allApns holds all apns */
276ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected ArrayList<ApnSetting> mAllApnSettings = null;
277cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
278cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** preferred apn */
279cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected ApnSetting mPreferredApn = null;
280cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
281cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** Is packet service restricted by network */
282cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mIsPsRestricted = false;
283cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
28476f43316a5a6082d601bffd4b6898d0bd81e11fcram    /** emergency apn Setting*/
28576f43316a5a6082d601bffd4b6898d0bd81e11fcram    protected ApnSetting mEmergencyApn = null;
28676f43316a5a6082d601bffd4b6898d0bd81e11fcram
287cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /* Once disposed dont handle any messages */
288cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean mIsDisposed = false;
289cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
290cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected ContentResolver mResolver;
291cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
292c9b81a0c05128694c617fcdd67e73821895822feWink Saville    /* Set to true with CMD_ENABLE_MOBILE_PROVISIONING */
293c9b81a0c05128694c617fcdd67e73821895822feWink Saville    protected boolean mIsProvisioning = false;
294c9b81a0c05128694c617fcdd67e73821895822feWink Saville
295e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* The Url passed as object parameter in CMD_ENABLE_MOBILE_PROVISIONING */
296c9b81a0c05128694c617fcdd67e73821895822feWink Saville    protected String mProvisioningUrl = null;
297c9b81a0c05128694c617fcdd67e73821895822feWink Saville
298e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* Intent for the provisioning apn alarm */
299e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected static final String INTENT_PROVISIONING_APN_ALARM =
300e9063f6973039d66e12d0d930af03906d377969eWink Saville            "com.android.internal.telephony.provisioning_apn_alarm";
301e9063f6973039d66e12d0d930af03906d377969eWink Saville
302e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* Tag for tracking stale alarms */
303e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected static final String PROVISIONING_APN_ALARM_TAG_EXTRA = "provisioning.apn.alarm.tag";
304e9063f6973039d66e12d0d930af03906d377969eWink Saville
305e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* Debug property for overriding the PROVISIONING_APN_ALARM_DELAY_IN_MS */
306e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected static final String DEBUG_PROV_APN_ALARM =
307e9063f6973039d66e12d0d930af03906d377969eWink Saville            "persist.debug.prov_apn_alarm";
308e9063f6973039d66e12d0d930af03906d377969eWink Saville
309e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* Default for the provisioning apn alarm timeout */
310e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected static final int PROVISIONING_APN_ALARM_DELAY_IN_MS_DEFAULT = 1000 * 60 * 15;
311e9063f6973039d66e12d0d930af03906d377969eWink Saville
312e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* The provision apn alarm intent used to disable the provisioning apn */
313e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected PendingIntent mProvisioningApnAlarmIntent = null;
314e9063f6973039d66e12d0d930af03906d377969eWink Saville
315e9063f6973039d66e12d0d930af03906d377969eWink Saville    /* Used to track stale provisioning apn alarms */
316e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected int mProvisioningApnAlarmTag = (int) SystemClock.elapsedRealtime();
317e9063f6973039d66e12d0d930af03906d377969eWink Saville
318c9b81a0c05128694c617fcdd67e73821895822feWink Saville    protected AsyncChannel mReplyAc = new AsyncChannel();
319c9b81a0c05128694c617fcdd67e73821895822feWink Saville
320cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected BroadcastReceiver mIntentReceiver = new BroadcastReceiver ()
321cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    {
322cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        @Override
323cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public void onReceive(Context context, Intent intent)
324cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        {
325cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            String action = intent.getAction();
326cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (DBG) log("onReceive: action=" + action);
327cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (action.equals(Intent.ACTION_SCREEN_ON)) {
328cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mIsScreenOn = true;
329cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                stopNetStatPoll();
330cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                startNetStatPoll();
331cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                restartDataStallAlarm();
332cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
333cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mIsScreenOn = false;
334cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                stopNetStatPoll();
335cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                startNetStatPoll();
336cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                restartDataStallAlarm();
337ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else if (action.startsWith(INTENT_RECONNECT_ALARM)) {
338cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("Reconnect alarm. Previous state was " + mState);
339cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onActionIntentReconnectAlarm(intent);
340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else if (action.startsWith(INTENT_RESTART_TRYSETUP_ALARM)) {
341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                if (DBG) log("Restart trySetup alarm");
342ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                onActionIntentRestartTrySetupAlarm(intent);
343ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else if (action.equals(INTENT_DATA_STALL_ALARM)) {
344cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onActionIntentDataStallAlarm(intent);
345e9063f6973039d66e12d0d930af03906d377969eWink Saville            } else if (action.equals(INTENT_PROVISIONING_APN_ALARM)) {
346e9063f6973039d66e12d0d930af03906d377969eWink Saville                onActionIntentProvisioningApnAlarm(intent);
347cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
348cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                final android.net.NetworkInfo networkInfo = (NetworkInfo)
349cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
350cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mIsWifiConnected = (networkInfo != null && networkInfo.isConnected());
351cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("NETWORK_STATE_CHANGED_ACTION: mIsWifiConnected=" + mIsWifiConnected);
352cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
353cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                final boolean enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
354cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
355cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
356cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (!enabled) {
357cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // when WiFi got disabled, the NETWORK_STATE_CHANGED_ACTION
358cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // quit and won't report disconnected until next enabling.
359cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    mIsWifiConnected = false;
360cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
361cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("WIFI_STATE_CHANGED_ACTION: enabled=" + enabled
362cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        + " mIsWifiConnected=" + mIsWifiConnected);
363cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
364cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
365cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    };
366cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
367cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private Runnable mPollNetStat = new Runnable()
368cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    {
369cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        @Override
370cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public void run() {
371cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            updateDataActivity();
372cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
373cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mIsScreenOn) {
374cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mNetStatPollPeriod = Settings.Global.getInt(mResolver,
375cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        Settings.Global.PDP_WATCHDOG_POLL_INTERVAL_MS, POLL_NETSTAT_MILLIS);
376cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
377cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mNetStatPollPeriod = Settings.Global.getInt(mResolver,
378cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        Settings.Global.PDP_WATCHDOG_LONG_POLL_INTERVAL_MS,
379cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        POLL_NETSTAT_SCREEN_OFF_MILLIS);
380cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
381cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
382cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mNetStatPollEnabled) {
383cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mDataConnectionTracker.postDelayed(this, mNetStatPollPeriod);
384cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
385cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
386cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    };
387cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
388c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan    private SubscriptionManager mSubscriptionManager;
389c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan    private final OnSubscriptionsChangedListener mOnSubscriptionsChangedListener =
390c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan            new OnSubscriptionsChangedListener() {
391c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan        /**
392c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan         * Callback invoked when there is any change to any SubscriptionInfo. Typically
393c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan         * this method would invoke {@link SubscriptionManager#getActiveSubscriptionInfoList}
394c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan         */
395c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan        @Override
396c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan        public void onSubscriptionsChanged() {
397c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan            if (DBG) log("SubscriptionListener.onSubscriptionInfoChanged");
398c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan            // Set the network type, in case the radio does not restore it.
399c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan            int subId = mPhone.getSubId();
400c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan            if (SubscriptionManager.isValidSubscriptionId(subId)) {
401c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan                if (mDataRoamingSettingObserver != null) {
402c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan                    mDataRoamingSettingObserver.unregister();
403c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan                }
404c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan                // Watch for changes to Settings.Global.DATA_ROAMING
405c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan                mDataRoamingSettingObserver = new DataRoamingSettingObserver(mPhone,
406c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan                        mPhone.getContext());
407c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan                mDataRoamingSettingObserver.register();
408c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan            }
409c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan        }
410c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan    };
411c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan
412cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private class DataRoamingSettingObserver extends ContentObserver {
413ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
414ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public DataRoamingSettingObserver(Handler handler, Context context) {
415cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            super(handler);
416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mResolver = context.getContentResolver();
417cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
418cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void register() {
420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mResolver.registerContentObserver(
421191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan                    Settings.Global.getUriFor(Settings.Global.DATA_ROAMING + mPhone.getSubId()),
422191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan                    false, this);
423cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
424cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        public void unregister() {
426ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mResolver.unregisterContentObserver(this);
427cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
428cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
429cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        @Override
430cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public void onChange(boolean selfChange) {
431cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // already running on mPhone handler thread
432ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao            if (mPhone.getServiceState().getDataRoaming()) {
433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                sendMessage(obtainMessage(DctConstants.EVENT_ROAMING_ON));
434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
435cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
436cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
437c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan    private DataRoamingSettingObserver mDataRoamingSettingObserver;
438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
439ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The Initial MaxRetry sent to a DataConnection as a parameter
441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * to DataConnectionAc.bringUp. This value can be defined at compile
442ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * time using the SystemProperty Settings.Global.DCT_INITIAL_MAX_RETRY
443ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * and at runtime using gservices to change Settings.Global.DCT_INITIAL_MAX_RETRY.
444ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
445ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private static final int DEFAULT_MDC_INITIAL_RETRY = 1;
446ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected int getInitialMaxRetry() {
447ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville        if (mFailFast) {
448ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville            return 0;
449ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville        }
450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // Get default value from system property or use DEFAULT_MDC_INITIAL_RETRY
451ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        int value = SystemProperties.getInt(
452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                Settings.Global.MDC_INITIAL_MAX_RETRY, DEFAULT_MDC_INITIAL_RETRY);
453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        // Check if its been overridden
455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return Settings.Global.getInt(mResolver,
456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                Settings.Global.MDC_INITIAL_MAX_RETRY, value);
457ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
458cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
459cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
460ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Maintain the sum of transmit and receive packets.
461cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *
462ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * The packet counts are initialized and reset to -1 and
463cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * remain -1 until they can be updated.
464cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
465cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public class TxRxSum {
466cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public long txPkts;
467cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public long rxPkts;
468cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
469cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public TxRxSum() {
470cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            reset();
471cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
472cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
473cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public TxRxSum(long txPkts, long rxPkts) {
474cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            this.txPkts = txPkts;
475cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            this.rxPkts = rxPkts;
476cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
477cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
478cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public TxRxSum(TxRxSum sum) {
479cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            txPkts = sum.txPkts;
480cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            rxPkts = sum.rxPkts;
481cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
482cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
483cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public void reset() {
484cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            txPkts = -1;
485cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            rxPkts = -1;
486cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
487cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
488cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        @Override
489cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public String toString() {
490cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return "{txSum=" + txPkts + " rxSum=" + rxPkts + "}";
491cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
492cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
493cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public void updateTxRxSum() {
494cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            this.txPkts = TrafficStats.getMobileTcpTxPackets();
495cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            this.rxPkts = TrafficStats.getMobileTcpRxPackets();
496cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
497cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
498cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
499cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onActionIntentReconnectAlarm(Intent intent) {
500cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String reason = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON);
501ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        String apnType = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE);
502ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
503b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int phoneSubId = mPhone.getSubId();
504b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int currSubId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
5054b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
506a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        log("onActionIntentReconnectAlarm: currSubId = " + currSubId + " phoneSubId=" + phoneSubId);
507a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
508a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // Stop reconnect if not current subId is not correct.
5096bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        // FIXME STOPSHIP - phoneSubId is coming up as -1 way after boot and failing this?
5108002387711e57456dbb4353eb894714592f303fbWink Saville        if (!SubscriptionManager.isValidSubscriptionId(currSubId) || (currSubId != phoneSubId)) {
5116bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville            log("receive ReconnectAlarm but subId incorrect, ignore");
5126bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville            return;
5136bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        }
514a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
515ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ApnContext apnContext = mApnContexts.get(apnType);
516ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
517ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (DBG) {
518ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            log("onActionIntentReconnectAlarm: mState=" + mState + " reason=" + reason +
519ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    " apnType=" + apnType + " apnContext=" + apnContext +
520ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    " mDataConnectionAsyncChannels=" + mDataConnectionAcHashMap);
521ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
522ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
523608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt        if ((apnContext != null) && (apnContext.isEnabled())) {
524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            apnContext.setReason(reason);
525ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            DctConstants.State apnContextState = apnContext.getState();
526ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) {
527ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                log("onActionIntentReconnectAlarm: apnContext state=" + apnContextState);
528ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
529ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if ((apnContextState == DctConstants.State.FAILED)
530ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    || (apnContextState == DctConstants.State.IDLE)) {
531ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                if (DBG) {
532ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                    log("onActionIntentReconnectAlarm: state is FAILED|IDLE, disassociate");
533ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                }
5344750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville                DcAsyncChannel dcac = apnContext.getDcAc();
5354750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville                if (dcac != null) {
5364750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville                    dcac.tearDown(apnContext, "", null);
5374750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville                }
538ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                apnContext.setDataConnectionAc(null);
539ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                apnContext.setState(DctConstants.State.IDLE);
540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            } else {
541ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                if (DBG) log("onActionIntentReconnectAlarm: keep associated");
542ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
543ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            // TODO: IF already associated should we send the EVENT_TRY_SETUP_DATA???
544ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, apnContext));
545ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
546ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            apnContext.setReconnectIntent(null);
547ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
548ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
549ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
550ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected void onActionIntentRestartTrySetupAlarm(Intent intent) {
551ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        String apnType = intent.getStringExtra(INTENT_RESTART_TRYSETUP_ALARM_EXTRA_TYPE);
552ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ApnContext apnContext = mApnContexts.get(apnType);
55374672e8ee972f12406b72551261b4cc7e0651933Wink Saville        if (DBG) {
55474672e8ee972f12406b72551261b4cc7e0651933Wink Saville            log("onActionIntentRestartTrySetupAlarm: mState=" + mState +
55574672e8ee972f12406b72551261b4cc7e0651933Wink Saville                    " apnType=" + apnType + " apnContext=" + apnContext +
55674672e8ee972f12406b72551261b4cc7e0651933Wink Saville                    " mDataConnectionAsyncChannels=" + mDataConnectionAcHashMap);
55774672e8ee972f12406b72551261b4cc7e0651933Wink Saville        }
558ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, apnContext));
559cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
560cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
561cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onActionIntentDataStallAlarm(Intent intent) {
562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) log("onActionIntentDataStallAlarm: action=" + intent.getAction());
563cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Message msg = obtainMessage(DctConstants.EVENT_DATA_STALL_ALARM,
564cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                intent.getAction());
565cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.arg1 = intent.getIntExtra(DATA_STALL_ALARM_TAG_EXTRA, 0);
566cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        sendMessage(msg);
567cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
568cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
569c9b81a0c05128694c617fcdd67e73821895822feWink Saville    ConnectivityManager mCm;
570c9b81a0c05128694c617fcdd67e73821895822feWink Saville
571cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
572cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Default constructor
573cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
574454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville    protected DcTrackerBase(PhoneBase phone) {
575cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        super();
576cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mPhone = phone;
577a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (DBG) log("DCT.constructor");
578ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mResolver = mPhone.getContext().getContentResolver();
579cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mUiccController = UiccController.getInstance();
580cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mUiccController.registerForIccChanged(this, DctConstants.EVENT_ICC_CHANGED, null);
581ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mAlarmManager =
582ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
583c9b81a0c05128694c617fcdd67e73821895822feWink Saville        mCm = (ConnectivityManager) mPhone.getContext().getSystemService(
584c9b81a0c05128694c617fcdd67e73821895822feWink Saville                Context.CONNECTIVITY_SERVICE);
585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
586cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
58724b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest        int phoneSubId = mPhone.getSubId();
588cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        IntentFilter filter = new IntentFilter();
589cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        filter.addAction(Intent.ACTION_SCREEN_ON);
590cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        filter.addAction(Intent.ACTION_SCREEN_OFF);
591cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
592cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
593ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        filter.addAction(INTENT_DATA_STALL_ALARM);
594e9063f6973039d66e12d0d930af03906d377969eWink Saville        filter.addAction(INTENT_PROVISIONING_APN_ALARM);
595cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
596c9e4b3e8c1be7626ddbb81d49457e529a4e33847Amit Mahajan        mUserDataEnabled = TelephonyManager.getIntWithSubId(
597c9e4b3e8c1be7626ddbb81d49457e529a4e33847Amit Mahajan                mPhone.getContext().getContentResolver(), Settings.Global.MOBILE_DATA, phoneSubId,
59824b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest                1) == 1;
599cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
600cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
601cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
602cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // This preference tells us 1) initial condition for "dataEnabled",
603cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // and 2) whether the RIL will setup the baseband to auto-PS attach.
604cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
60522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mDataEnabled[DctConstants.APN_DEFAULT_ID] =
606cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                SystemProperties.getBoolean(DEFALUT_DATA_ON_BOOT_PROP,true);
60722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mDataEnabled[DctConstants.APN_DEFAULT_ID]) {
60822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mEnabledCount++;
609cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
610cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
611cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext());
612cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mAutoAttachOnCreation = sp.getBoolean(PhoneBase.DATA_DISABLED_ON_BOOT_KEY, false);
613cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
614c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan        mSubscriptionManager = SubscriptionManager.from(mPhone.getContext());
615c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan        mSubscriptionManager
616c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan                .registerOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
617cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
618ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        HandlerThread dcHandlerThread = new HandlerThread("DcHandlerThread");
619ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        dcHandlerThread.start();
620ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Handler dcHandler = new Handler(dcHandlerThread.getLooper());
621ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcc = DcController.makeDcc(mPhone, this, dcHandler);
622ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcTesterFailBringUpAll = new DcTesterFailBringUpAll(mPhone, dcHandler);
623cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
624cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
625cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void dispose() {
626cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG) log("DCT.dispose");
627454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        for (DcAsyncChannel dcac : mDataConnectionAcHashMap.values()) {
628cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            dcac.disconnect();
629cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
630ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDataConnectionAcHashMap.clear();
631cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mIsDisposed = true;
63222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.getContext().unregisterReceiver(mIntentReceiver);
633cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mUiccController.unregisterForIccChanged(this);
634c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan        if (mDataRoamingSettingObserver != null) {
635c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan            mDataRoamingSettingObserver.unregister();
636c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan        }
637c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan        mSubscriptionManager
638c03103f7525d900f509283db959c2f8ae82b3fecAmit Mahajan                .unregisterOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
639ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcc.dispose();
640ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mDcTesterFailBringUpAll.dispose();
641cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
642cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
6436bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    public long getSubId() {
6446bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        return mPhone.getSubId();
6456bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    }
6466bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville
647cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public DctConstants.Activity getActivity() {
648cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return mActivity;
649cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
650cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
651b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    void setActivity(DctConstants.Activity activity) {
652b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        log("setActivity = " + activity);
653b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        mActivity = activity;
654b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        mPhone.notifyDataActivity();
655b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    }
656b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh
657bda761320929f714951c328bfec6a51a1978db97Wink Saville    public void incApnRefCount(String name) {
658bda761320929f714951c328bfec6a51a1978db97Wink Saville
659bda761320929f714951c328bfec6a51a1978db97Wink Saville    }
660bda761320929f714951c328bfec6a51a1978db97Wink Saville
661bda761320929f714951c328bfec6a51a1978db97Wink Saville    public void decApnRefCount(String name) {
662bda761320929f714951c328bfec6a51a1978db97Wink Saville
663bda761320929f714951c328bfec6a51a1978db97Wink Saville    }
664bda761320929f714951c328bfec6a51a1978db97Wink Saville
665bda761320929f714951c328bfec6a51a1978db97Wink Saville    public boolean isApnSupported(String name) {
666bda761320929f714951c328bfec6a51a1978db97Wink Saville        return false;
667bda761320929f714951c328bfec6a51a1978db97Wink Saville    }
668bda761320929f714951c328bfec6a51a1978db97Wink Saville
669bda761320929f714951c328bfec6a51a1978db97Wink Saville    public int getApnPriority(String name) {
670bda761320929f714951c328bfec6a51a1978db97Wink Saville        return -1;
671bda761320929f714951c328bfec6a51a1978db97Wink Saville    }
672bda761320929f714951c328bfec6a51a1978db97Wink Saville
673bda761320929f714951c328bfec6a51a1978db97Wink Saville
674cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public boolean isApnTypeActive(String type) {
675cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // TODO: support simultaneous with List instead
676cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (PhoneConstants.APN_TYPE_DUN.equals(type)) {
677cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            ApnSetting dunApn = fetchDunApn();
678cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (dunApn != null) {
679cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                return ((mActiveApn != null) && (dunApn.toString().equals(mActiveApn.toString())));
680cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
681cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
682cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return mActiveApn != null && mActiveApn.canHandleType(type);
683cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
684cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
685cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected ApnSetting fetchDunApn() {
686cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (SystemProperties.getBoolean("net.tethering.noprovisioning", false)) {
687cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("fetchDunApn: net.tethering.noprovisioning=true ret: null");
688cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return null;
689cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
690a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt        int bearer = -1;
691f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        ApnSetting retDunSetting = null;
692cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Context c = mPhone.getContext();
693cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String apnData = Settings.Global.getString(c.getContentResolver(),
694cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                Settings.Global.TETHER_DUN_APN);
6953262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal        List<ApnSetting> dunSettings = ApnSetting.arrayFromString(apnData);
696f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        IccRecords r = mIccRecords.get();
6973262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal        for (ApnSetting dunSetting : dunSettings) {
698ff51a1e0381b303e5bb7e4e0a8a6ad7d124437bdSungmin Choi            String operator = (r != null) ? r.getOperatorNumeric() : "";
699a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt            if (dunSetting.bearer != 0) {
700a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                if (bearer == -1) bearer = mPhone.getServiceState().getRilDataRadioTechnology();
701a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                if (dunSetting.bearer != bearer) continue;
702a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt            }
703ff51a1e0381b303e5bb7e4e0a8a6ad7d124437bdSungmin Choi            if (dunSetting.numeric.equals(operator)) {
7043262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                if (dunSetting.hasMvnoParams()) {
705a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                    if (r != null &&
706a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                            mvnoMatches(r, dunSetting.mvnoType, dunSetting.mvnoMatchData)) {
707a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                        if (VDBG) {
708a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                            log("fetchDunApn: global TETHER_DUN_APN dunSetting=" + dunSetting);
709a055c6e35a8b4cc3ffb9e2c1c6c5de87155d42a2Robert Greenwalt                        }
7103262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                        return dunSetting;
7113262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                    }
7123262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                } else {
7133262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                    if (VDBG) log("fetchDunApn: global TETHER_DUN_APN dunSetting=" + dunSetting);
7143262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                    return dunSetting;
7153262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal                }
716ff51a1e0381b303e5bb7e4e0a8a6ad7d124437bdSungmin Choi            }
717cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
718cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
719f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        String[] apnArrayData = c.getResources().getStringArray(R.array.config_tether_apndata);
720f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        for (String apn : apnArrayData) {
721f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi            ApnSetting dunSetting = ApnSetting.fromString(apn);
722f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi            if (dunSetting != null) {
723f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                if (dunSetting.bearer != 0) {
724f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                    if (bearer == -1) bearer = mPhone.getServiceState().getRilDataRadioTechnology();
725f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                    if (dunSetting.bearer != bearer) continue;
726f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                }
727f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                if (dunSetting.hasMvnoParams()) {
728f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                    if (r != null &&
729f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                            mvnoMatches(r, dunSetting.mvnoType, dunSetting.mvnoMatchData)) {
730f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                        if (VDBG) log("fetchDunApn: config_tether_apndata mvno dunSetting="
731f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                                + dunSetting);
732f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                        return dunSetting;
733f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                    }
734f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                } else {
735f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                    retDunSetting = dunSetting;
736f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi                }
737f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi            }
738f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        }
739f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi
740f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        if (VDBG) log("fetchDunApn: config_tether_apndata dunSetting=" + retDunSetting);
741f1d59f07cc3375134b448e849d33507af0662a1bSungmin Choi        return retDunSetting;
742cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
743cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
74479f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu    public boolean hasMatchedTetherApnSetting() {
74579f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu        ApnSetting matched = fetchDunApn();
74679f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu        log("hasMatchedTetherApnSetting: APN=" + matched);
74779f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu        return matched != null;
74879f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu    }
749cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
750cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public String[] getActiveApnTypes() {
751cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String[] result;
752cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mActiveApn != null) {
753cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result = mActiveApn.types;
754cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
755cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result = new String[1];
756cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result[0] = PhoneConstants.APN_TYPE_DEFAULT;
757cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
758cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return result;
759cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
760cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
761cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /** TODO: See if we can remove */
762cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public String getActiveApnString(String apnType) {
763cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String result = null;
764cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mActiveApn != null) {
765cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result = mActiveApn.apn;
766cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
767cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return result;
768cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
769cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
770cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
771cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Modify {@link android.provider.Settings.Global#DATA_ROAMING} value.
772cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
773cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void setDataOnRoamingEnabled(boolean enabled) {
774cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (getDataOnRoamingEnabled() != enabled) {
775cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            final ContentResolver resolver = mPhone.getContext().getContentResolver();
77624b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest            final int phoneSubId = mPhone.getSubId();
77724b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest            Settings.Global.putInt(resolver, Settings.Global.DATA_ROAMING + phoneSubId, enabled ? 1 : 0);
778cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // will trigger handleDataOnRoamingChange() through observer
779cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
780cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
781cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
782cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
783cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Return current {@link android.provider.Settings.Global#DATA_ROAMING} value.
784cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
785cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public boolean getDataOnRoamingEnabled() {
786cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        try {
787cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            final ContentResolver resolver = mPhone.getContext().getContentResolver();
78824b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest            final int phoneSubId = mPhone.getSubId();
789191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan            return TelephonyManager.getIntWithSubId(resolver, Settings.Global.DATA_ROAMING,
790191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan                    phoneSubId) != 0;
791cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } catch (SettingNotFoundException snfe) {
792191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan            return "true".equalsIgnoreCase(SystemProperties.get("ro.com.android.dataroaming",
793191fcbb559771da0f1339e1b90064cb444963811Amit Mahajan                    "false"));
794cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
7953a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    }
7963a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt
7973a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    /**
7983a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt     * Modify {@link android.provider.Settings.Global#MOBILE_DATA} value.
7993a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt     */
8003a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    public void setDataEnabled(boolean enable) {
8013a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        Message msg = obtainMessage(DctConstants.CMD_SET_USER_DATA_ENABLE);
8023a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        msg.arg1 = enable ? 1 : 0;
803652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville        if (DBG) log("setDataEnabled: sendMessage: enable=" + enable);
8043a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        sendMessage(msg);
8053a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    }
8063a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt
8073a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    /**
8083a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt     * Return current {@link android.provider.Settings.Global#MOBILE_DATA} value.
8093a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt     */
8103a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt    public boolean getDataEnabled() {
811c9e4b3e8c1be7626ddbb81d49457e529a4e33847Amit Mahajan        final ContentResolver resolver = mPhone.getContext().getContentResolver();
812652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville        boolean retVal;
8133a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        try {
81424b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest            int phoneSubId = mPhone.getSubId();
815652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville            retVal = TelephonyManager.getIntWithSubId(resolver, Settings.Global.MOBILE_DATA,
816c9e4b3e8c1be7626ddbb81d49457e529a4e33847Amit Mahajan                    phoneSubId) != 0;
817652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville            if (DBG) log("getDataEnabled: getIntWithSubId retVal=" + retVal);
8183a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        } catch (SettingNotFoundException snfe) {
819652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville            retVal = "true".equalsIgnoreCase(
820c9e4b3e8c1be7626ddbb81d49457e529a4e33847Amit Mahajan                    SystemProperties.get("ro.com.android.mobiledata", "true"));
821652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville            if (DBG) {
822652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville                log("getDataEnabled: system property ro.com.android.mobiledata retVal=" + retVal);
823652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville            }
8243a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt        }
825652c1add01ea5f0c93aa60c262863147d3aeefc2Wink Saville        return retVal;
826cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
827cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
828cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // abstract methods
829cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void restartRadio();
830cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void log(String s);
831cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void loge(String s);
832cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract boolean isDataAllowed();
833cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract boolean isApnTypeAvailable(String type);
834cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public    abstract DctConstants.State getState(String apnType);
835c9b81a0c05128694c617fcdd67e73821895822feWink Saville    protected abstract boolean isProvisioningApn(String apnType);
836cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void setState(DctConstants.State s);
837cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void gotoIdleAndNotifyDataConnection(String reason);
838cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
839cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract boolean onTrySetupData(String reason);
840cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onRoamingOff();
841cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onRoamingOn();
842cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onRadioAvailable();
843cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onRadioOffOrNotAvailable();
844cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onDataSetupComplete(AsyncResult ar);
845ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected abstract void onDataSetupCompleteError(AsyncResult ar);
846cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onDisconnectDone(int connId, AsyncResult ar);
847ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected abstract void onDisconnectDcRetrying(int connId, AsyncResult ar);
848cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onVoiceCallStarted();
849cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onVoiceCallEnded();
850cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onCleanUpConnection(boolean tearDown, int apnId, String reason);
851cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onCleanUpAllConnections(String cause);
852cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public abstract boolean isDataPossible(String apnType);
853cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract void onUpdateIcc();
854c9b81a0c05128694c617fcdd67e73821895822feWink Saville    protected abstract void completeConnection(ApnContext apnContext);
855a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public abstract void setDataAllowed(boolean enable, Message response);
856bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram    public abstract String[] getPcscfAddress(String apnType);
857a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public abstract void setImsRegistrationState(boolean registered);
8583262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal    protected abstract boolean mvnoMatches(IccRecords r, String mvno_type, String mvno_match_data);
859796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan    protected abstract boolean isPermanentFail(DcFailCause dcFailCause);
860cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
861cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
862cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void handleMessage(Message msg) {
863cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        switch (msg.what) {
864cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {
865cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("DISCONNECTED_CONNECTED: msg=" + msg);
866454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                DcAsyncChannel dcac = (DcAsyncChannel) msg.obj;
867ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                mDataConnectionAcHashMap.remove(dcac.getDataConnectionIdSync());
868cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                dcac.disconnected();
869cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
870cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
871cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_ENABLE_NEW_APN:
872cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onEnableApn(msg.arg1, msg.arg2);
873cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
874cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
875cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_TRY_SETUP_DATA:
876cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                String reason = null;
877cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (msg.obj instanceof String) {
878cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    reason = (String) msg.obj;
879cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
880cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onTrySetupData(reason);
881cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
882cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
883cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_DATA_STALL_ALARM:
884cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onDataStallAlarm(msg.arg1);
885cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
886cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
887cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_ROAMING_OFF:
888cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onRoamingOff();
889cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
890cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
891cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_ROAMING_ON:
892cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onRoamingOn();
893cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
894cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
895cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_RADIO_AVAILABLE:
896cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onRadioAvailable();
897cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
898cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
899cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_RADIO_OFF_OR_NOT_AVAILABLE:
900cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onRadioOffOrNotAvailable();
901cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
902cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
903cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_DATA_SETUP_COMPLETE:
904cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mCidActive = msg.arg1;
905cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onDataSetupComplete((AsyncResult) msg.obj);
906cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
907cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
908ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            case DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR:
909ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                onDataSetupCompleteError((AsyncResult) msg.obj);
910ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                break;
911ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
912cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_DISCONNECT_DONE:
913c6bbea82bf74ebb492508199b6f3e172b7ce860aWink Saville                log("DataConnectionTracker.handleMessage: EVENT_DISCONNECT_DONE msg=" + msg);
914cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onDisconnectDone(msg.arg1, (AsyncResult) msg.obj);
915cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
916cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            case DctConstants.EVENT_DISCONNECT_DC_RETRYING:
918c6bbea82bf74ebb492508199b6f3e172b7ce860aWink Saville                log("DataConnectionTracker.handleMessage: EVENT_DISCONNECT_DC_RETRYING msg=" + msg);
919ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                onDisconnectDcRetrying(msg.arg1, (AsyncResult) msg.obj);
920ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                break;
921ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
922cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_VOICE_CALL_STARTED:
923cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onVoiceCallStarted();
924cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
925cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
926cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_VOICE_CALL_ENDED:
927cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onVoiceCallEnded();
928cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
929cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
930cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_CLEAN_UP_ALL_CONNECTIONS: {
931cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onCleanUpAllConnections((String) msg.obj);
932cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
933cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
934cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_CLEAN_UP_CONNECTION: {
935cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                boolean tearDown = (msg.arg1 == 0) ? false : true;
936cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onCleanUpConnection(tearDown, msg.arg2, (String) msg.obj);
937cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
938cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
939cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_SET_INTERNAL_DATA_ENABLE: {
940cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false;
941cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onSetInternalDataEnabled(enabled);
942cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
943cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
944cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.EVENT_RESET_DONE: {
945cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("EVENT_RESET_DONE");
946cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onResetDone((AsyncResult) msg.obj);
947cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
948cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
949cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.CMD_SET_USER_DATA_ENABLE: {
950bda761320929f714951c328bfec6a51a1978db97Wink Saville                final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false;
951bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) log("CMD_SET_USER_DATA_ENABLE enabled=" + enabled);
952bda761320929f714951c328bfec6a51a1978db97Wink Saville                onSetUserDataEnabled(enabled);
953cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
954cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
955cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.CMD_SET_DEPENDENCY_MET: {
956bda761320929f714951c328bfec6a51a1978db97Wink Saville                boolean met = (msg.arg1 == DctConstants.ENABLED) ? true : false;
957bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) log("CMD_SET_DEPENDENCY_MET met=" + met);
958bda761320929f714951c328bfec6a51a1978db97Wink Saville                Bundle bundle = msg.getData();
959bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (bundle != null) {
960bda761320929f714951c328bfec6a51a1978db97Wink Saville                    String apnType = (String)bundle.get(DctConstants.APN_TYPE_KEY);
961bda761320929f714951c328bfec6a51a1978db97Wink Saville                    if (apnType != null) {
962bda761320929f714951c328bfec6a51a1978db97Wink Saville                        onSetDependencyMet(apnType, met);
963cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    }
964cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
965cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
966cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
967cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DctConstants.CMD_SET_POLICY_DATA_ENABLE: {
968bda761320929f714951c328bfec6a51a1978db97Wink Saville                final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false;
969bda761320929f714951c328bfec6a51a1978db97Wink Saville                onSetPolicyDataEnabled(enabled);
970cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
971cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
972ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville            case DctConstants.CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: {
973bda761320929f714951c328bfec6a51a1978db97Wink Saville                sEnableFailFastRefCounter += (msg.arg1 == DctConstants.ENABLED) ? 1 : -1;
974bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) {
975bda761320929f714951c328bfec6a51a1978db97Wink Saville                    log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: "
976bda761320929f714951c328bfec6a51a1978db97Wink Saville                            + " sEnableFailFastRefCounter=" + sEnableFailFastRefCounter);
977bda761320929f714951c328bfec6a51a1978db97Wink Saville                }
978bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (sEnableFailFastRefCounter < 0) {
979bda761320929f714951c328bfec6a51a1978db97Wink Saville                    final String s = "CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: "
980bda761320929f714951c328bfec6a51a1978db97Wink Saville                            + "sEnableFailFastRefCounter:" + sEnableFailFastRefCounter + " < 0";
981bda761320929f714951c328bfec6a51a1978db97Wink Saville                    loge(s);
982bda761320929f714951c328bfec6a51a1978db97Wink Saville                    sEnableFailFastRefCounter = 0;
983bda761320929f714951c328bfec6a51a1978db97Wink Saville                }
984bda761320929f714951c328bfec6a51a1978db97Wink Saville                final boolean enabled = sEnableFailFastRefCounter > 0;
985bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) {
986bda761320929f714951c328bfec6a51a1978db97Wink Saville                    log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: enabled=" + enabled
987bda761320929f714951c328bfec6a51a1978db97Wink Saville                            + " sEnableFailFastRefCounter=" + sEnableFailFastRefCounter);
988bda761320929f714951c328bfec6a51a1978db97Wink Saville                }
989bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (mFailFast != enabled) {
990bda761320929f714951c328bfec6a51a1978db97Wink Saville                    mFailFast = enabled;
991bda761320929f714951c328bfec6a51a1978db97Wink Saville                    mDataStallDetectionEnabled = !enabled;
992bda761320929f714951c328bfec6a51a1978db97Wink Saville                    if (mDataStallDetectionEnabled
993bda761320929f714951c328bfec6a51a1978db97Wink Saville                            && (getOverallState() == DctConstants.State.CONNECTED)
994bda761320929f714951c328bfec6a51a1978db97Wink Saville                            && (!mInVoiceCall ||
995bda761320929f714951c328bfec6a51a1978db97Wink Saville                                    mPhone.getServiceStateTracker()
996bda761320929f714951c328bfec6a51a1978db97Wink Saville                                        .isConcurrentVoiceAndDataAllowed())) {
997bda761320929f714951c328bfec6a51a1978db97Wink Saville                        if (DBG) log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: start data stall");
998bda761320929f714951c328bfec6a51a1978db97Wink Saville                        stopDataStallAlarm();
999bda761320929f714951c328bfec6a51a1978db97Wink Saville                        startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
1000bda761320929f714951c328bfec6a51a1978db97Wink Saville                    } else {
1001bda761320929f714951c328bfec6a51a1978db97Wink Saville                        if (DBG) log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: stop data stall");
1002bda761320929f714951c328bfec6a51a1978db97Wink Saville                        stopDataStallAlarm();
1003ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville                    }
1004ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville                }
1005bda761320929f714951c328bfec6a51a1978db97Wink Saville
1006ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville                break;
1007ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville            }
1008c9b81a0c05128694c617fcdd67e73821895822feWink Saville            case DctConstants.CMD_ENABLE_MOBILE_PROVISIONING: {
1009bda761320929f714951c328bfec6a51a1978db97Wink Saville                Bundle bundle = msg.getData();
1010bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (bundle != null) {
1011bda761320929f714951c328bfec6a51a1978db97Wink Saville                    try {
1012bda761320929f714951c328bfec6a51a1978db97Wink Saville                        mProvisioningUrl = (String)bundle.get(DctConstants.PROVISIONING_URL_KEY);
1013bda761320929f714951c328bfec6a51a1978db97Wink Saville                    } catch(ClassCastException e) {
1014bda761320929f714951c328bfec6a51a1978db97Wink Saville                        loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioning url not a string" + e);
1015c9b81a0c05128694c617fcdd67e73821895822feWink Saville                        mProvisioningUrl = null;
1016c9b81a0c05128694c617fcdd67e73821895822feWink Saville                    }
1017c9b81a0c05128694c617fcdd67e73821895822feWink Saville                }
1018bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (TextUtils.isEmpty(mProvisioningUrl)) {
1019bda761320929f714951c328bfec6a51a1978db97Wink Saville                    loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioning url is empty, ignoring");
1020bda761320929f714951c328bfec6a51a1978db97Wink Saville                    mIsProvisioning = false;
1021bda761320929f714951c328bfec6a51a1978db97Wink Saville                    mProvisioningUrl = null;
1022bda761320929f714951c328bfec6a51a1978db97Wink Saville                } else {
1023bda761320929f714951c328bfec6a51a1978db97Wink Saville                    loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioningUrl=" + mProvisioningUrl);
1024bda761320929f714951c328bfec6a51a1978db97Wink Saville                    mIsProvisioning = true;
1025bda761320929f714951c328bfec6a51a1978db97Wink Saville                    startProvisioningApnAlarm();
1026bda761320929f714951c328bfec6a51a1978db97Wink Saville                }
1027c9b81a0c05128694c617fcdd67e73821895822feWink Saville                break;
1028c9b81a0c05128694c617fcdd67e73821895822feWink Saville            }
1029e9063f6973039d66e12d0d930af03906d377969eWink Saville            case DctConstants.EVENT_PROVISIONING_APN_ALARM: {
1030e9063f6973039d66e12d0d930af03906d377969eWink Saville                if (DBG) log("EVENT_PROVISIONING_APN_ALARM");
1031e9063f6973039d66e12d0d930af03906d377969eWink Saville                ApnContext apnCtx = mApnContexts.get("default");
1032e9063f6973039d66e12d0d930af03906d377969eWink Saville                if (apnCtx.isProvisioningApn() && apnCtx.isConnectedOrConnecting()) {
1033e9063f6973039d66e12d0d930af03906d377969eWink Saville                    if (mProvisioningApnAlarmTag == msg.arg1) {
1034e9063f6973039d66e12d0d930af03906d377969eWink Saville                        if (DBG) log("EVENT_PROVISIONING_APN_ALARM: Disconnecting");
1035e9063f6973039d66e12d0d930af03906d377969eWink Saville                        mIsProvisioning = false;
1036e9063f6973039d66e12d0d930af03906d377969eWink Saville                        mProvisioningUrl = null;
1037e9063f6973039d66e12d0d930af03906d377969eWink Saville                        stopProvisioningApnAlarm();
1038e9063f6973039d66e12d0d930af03906d377969eWink Saville                        sendCleanUpConnection(true, apnCtx);
1039e9063f6973039d66e12d0d930af03906d377969eWink Saville                    } else {
1040e9063f6973039d66e12d0d930af03906d377969eWink Saville                        if (DBG) {
1041e9063f6973039d66e12d0d930af03906d377969eWink Saville                            log("EVENT_PROVISIONING_APN_ALARM: ignore stale tag,"
1042e9063f6973039d66e12d0d930af03906d377969eWink Saville                                    + " mProvisioningApnAlarmTag:" + mProvisioningApnAlarmTag
1043e9063f6973039d66e12d0d930af03906d377969eWink Saville                                    + " != arg1:" + msg.arg1);
1044e9063f6973039d66e12d0d930af03906d377969eWink Saville                        }
1045e9063f6973039d66e12d0d930af03906d377969eWink Saville                    }
1046e9063f6973039d66e12d0d930af03906d377969eWink Saville                } else {
1047e9063f6973039d66e12d0d930af03906d377969eWink Saville                    if (DBG) log("EVENT_PROVISIONING_APN_ALARM: Not connected ignore");
1048e9063f6973039d66e12d0d930af03906d377969eWink Saville                }
1049e9063f6973039d66e12d0d930af03906d377969eWink Saville                break;
1050e9063f6973039d66e12d0d930af03906d377969eWink Saville            }
1051c9b81a0c05128694c617fcdd67e73821895822feWink Saville            case DctConstants.CMD_IS_PROVISIONING_APN: {
1052bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) log("CMD_IS_PROVISIONING_APN");
1053bda761320929f714951c328bfec6a51a1978db97Wink Saville                boolean isProvApn;
1054bda761320929f714951c328bfec6a51a1978db97Wink Saville                try {
1055bda761320929f714951c328bfec6a51a1978db97Wink Saville                    String apnType = null;
1056bda761320929f714951c328bfec6a51a1978db97Wink Saville                    Bundle bundle = msg.getData();
1057bda761320929f714951c328bfec6a51a1978db97Wink Saville                    if (bundle != null) {
1058bda761320929f714951c328bfec6a51a1978db97Wink Saville                        apnType = (String)bundle.get(DctConstants.APN_TYPE_KEY);
1059bda761320929f714951c328bfec6a51a1978db97Wink Saville                    }
1060bda761320929f714951c328bfec6a51a1978db97Wink Saville                    if (TextUtils.isEmpty(apnType)) {
1061bda761320929f714951c328bfec6a51a1978db97Wink Saville                        loge("CMD_IS_PROVISIONING_APN: apnType is empty");
1062c9b81a0c05128694c617fcdd67e73821895822feWink Saville                        isProvApn = false;
1063bda761320929f714951c328bfec6a51a1978db97Wink Saville                    } else {
1064bda761320929f714951c328bfec6a51a1978db97Wink Saville                        isProvApn = isProvisioningApn(apnType);
1065c9b81a0c05128694c617fcdd67e73821895822feWink Saville                    }
1066bda761320929f714951c328bfec6a51a1978db97Wink Saville                } catch (ClassCastException e) {
1067bda761320929f714951c328bfec6a51a1978db97Wink Saville                    loge("CMD_IS_PROVISIONING_APN: NO provisioning url ignoring");
1068bda761320929f714951c328bfec6a51a1978db97Wink Saville                    isProvApn = false;
1069c9b81a0c05128694c617fcdd67e73821895822feWink Saville                }
1070bda761320929f714951c328bfec6a51a1978db97Wink Saville                if (DBG) log("CMD_IS_PROVISIONING_APN: ret=" + isProvApn);
1071bda761320929f714951c328bfec6a51a1978db97Wink Saville                mReplyAc.replyToMessage(msg, DctConstants.CMD_IS_PROVISIONING_APN,
1072bda761320929f714951c328bfec6a51a1978db97Wink Saville                        isProvApn ? DctConstants.ENABLED : DctConstants.DISABLED);
1073c9b81a0c05128694c617fcdd67e73821895822feWink Saville                break;
1074c9b81a0c05128694c617fcdd67e73821895822feWink Saville            }
1075ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            case DctConstants.EVENT_ICC_CHANGED: {
1076cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onUpdateIcc();
1077cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1078ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1079979786625e7ceacf4a545a25704ef8a15338a854Wink Saville            case DctConstants.EVENT_RESTART_RADIO: {
1080979786625e7ceacf4a545a25704ef8a15338a854Wink Saville                restartRadio();
1081979786625e7ceacf4a545a25704ef8a15338a854Wink Saville                break;
1082979786625e7ceacf4a545a25704ef8a15338a854Wink Saville            }
1083b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh            case DctConstants.CMD_NET_STAT_POLL: {
1084b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                if (msg.arg1 == DctConstants.ENABLED) {
1085b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                    handleStartNetStatPoll((DctConstants.Activity)msg.obj);
1086b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                } else if (msg.arg1 == DctConstants.DISABLED) {
1087b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                    handleStopNetStatPoll((DctConstants.Activity)msg.obj);
1088b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                }
1089b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                break;
1090b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh            }
1091cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            default:
1092cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                Rlog.e("DATA", "Unidentified event msg=" + msg);
1093cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1094cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1095cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1096cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1097cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
1098cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Report on whether data connectivity is enabled
1099cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *
1100cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * @return {@code false} if data connectivity has been explicitly disabled,
1101cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *         {@code true} otherwise.
1102cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
1103cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public boolean getAnyDataEnabled() {
1104cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        final boolean result;
1105cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        synchronized (mDataEnabledLock) {
1106cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result = (mInternalDataEnabled && mUserDataEnabled && sPolicyDataEnabled
110722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    && (mEnabledCount != 0));
1108cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1109cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (!result && DBG) log("getAnyDataEnabled " + result);
1110cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return result;
1111cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1112cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1113cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean isEmergency() {
1114cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        final boolean result;
1115cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        synchronized (mDataEnabledLock) {
1116cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            result = mPhone.isInEcm() || mPhone.isInEmergencyCall();
1117cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1118cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        log("isEmergency: result=" + result);
1119cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return result;
1120cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1121cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1122cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected int apnTypeToId(String type) {
1123cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (TextUtils.equals(type, PhoneConstants.APN_TYPE_DEFAULT)) {
1124cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_DEFAULT_ID;
1125cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_MMS)) {
1126cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_MMS_ID;
1127cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_SUPL)) {
1128cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_SUPL_ID;
1129cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_DUN)) {
1130cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_DUN_ID;
1131cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_HIPRI)) {
1132cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_HIPRI_ID;
1133cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_IMS)) {
1134cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_IMS_ID;
1135cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_FOTA)) {
1136cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_FOTA_ID;
1137cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_CBS)) {
1138cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_CBS_ID;
11391b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_IA)) {
11401b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            return DctConstants.APN_IA_ID;
1141cf5205f70eb1eac497164124187a088ecb03fff5Ram        } else if (TextUtils.equals(type, PhoneConstants.APN_TYPE_EMERGENCY)) {
1142cf5205f70eb1eac497164124187a088ecb03fff5Ram            return DctConstants.APN_EMERGENCY_ID;
1143cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1144cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return DctConstants.APN_INVALID_ID;
1145cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1146cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1147cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1148cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected String apnIdToType(int id) {
1149cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        switch (id) {
1150cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_DEFAULT_ID:
1151cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_DEFAULT;
1152cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_MMS_ID:
1153cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_MMS;
1154cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_SUPL_ID:
1155cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_SUPL;
1156cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_DUN_ID:
1157cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_DUN;
1158cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_HIPRI_ID:
1159cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_HIPRI;
1160cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_IMS_ID:
1161cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_IMS;
1162cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_FOTA_ID:
1163cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_FOTA;
1164cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        case DctConstants.APN_CBS_ID:
1165cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_CBS;
11661b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        case DctConstants.APN_IA_ID:
11671b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            return PhoneConstants.APN_TYPE_IA;
1168cf5205f70eb1eac497164124187a088ecb03fff5Ram        case DctConstants.APN_EMERGENCY_ID:
1169cf5205f70eb1eac497164124187a088ecb03fff5Ram            return PhoneConstants.APN_TYPE_EMERGENCY;
1170cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        default:
1171cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("Unknown id (" + id + ") in apnIdToType");
1172cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return PhoneConstants.APN_TYPE_DEFAULT;
1173cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1174cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1175cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1176cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public LinkProperties getLinkProperties(String apnType) {
1177cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int id = apnTypeToId(apnType);
1178cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1179cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (isApnIdEnabled(id)) {
1180454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            DcAsyncChannel dcac = mDataConnectionAcHashMap.get(0);
1181cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return dcac.getLinkPropertiesSync();
1182cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1183cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return new LinkProperties();
1184cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1185cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1186cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
118796cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwalt    public NetworkCapabilities getNetworkCapabilities(String apnType) {
1188608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt        int id = apnTypeToId(apnType);
1189608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt        if (isApnIdEnabled(id)) {
1190608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt            DcAsyncChannel dcac = mDataConnectionAcHashMap.get(0);
1191608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt            return dcac.getNetworkCapabilitiesSync();
1192cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
119396cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwalt            return new NetworkCapabilities();
1194cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1195cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1196cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1197cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // tell all active apns of the current condition
1198cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void notifyDataConnection(String reason) {
1199cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        for (int id = 0; id < DctConstants.APN_NUM_TYPES; id++) {
120022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mDataEnabled[id]) {
1201cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.notifyDataConnection(reason, apnIdToType(id));
1202cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1203cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1204cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        notifyOffApnsOfAvailability(reason);
1205cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1206cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1207cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // a new APN has gone active and needs to send events to catch up with the
1208cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // current condition
1209cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void notifyApnIdUpToCurrent(String reason, int apnId) {
1210cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        switch (mState) {
1211cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case IDLE:
1212cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1213ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            case RETRYING:
1214cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case CONNECTING:
1215cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case SCANNING:
1216cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.notifyDataConnection(reason, apnIdToType(apnId),
1217cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        PhoneConstants.DataState.CONNECTING);
1218cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1219cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case CONNECTED:
1220cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case DISCONNECTING:
1221cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.notifyDataConnection(reason, apnIdToType(apnId),
1222cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        PhoneConstants.DataState.CONNECTING);
1223cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.notifyDataConnection(reason, apnIdToType(apnId),
1224cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        PhoneConstants.DataState.CONNECTED);
1225cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1226cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            default:
1227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                // Ignore
1228cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1229cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1230cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1231cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1232cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // since we normally don't send info to a disconnected APN, we need to do this specially
1233cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void notifyApnIdDisconnected(String reason, int apnId) {
1234cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mPhone.notifyDataConnection(reason, apnIdToType(apnId),
1235cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                PhoneConstants.DataState.DISCONNECTED);
1236cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1237cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1238cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // disabled apn's still need avail/unavail notificiations - send them out
1239cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void notifyOffApnsOfAvailability(String reason) {
1240cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG) log("notifyOffApnsOfAvailability - reason= " + reason);
1241cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        for (int id = 0; id < DctConstants.APN_NUM_TYPES; id++) {
1242cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (!isApnIdEnabled(id)) {
1243cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                notifyApnIdDisconnected(reason, id);
1244cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1245cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1246cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1247cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1248cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public boolean isApnTypeEnabled(String apnType) {
1249cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (apnType == null) {
1250cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return false;
1251cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1252cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return isApnIdEnabled(apnTypeToId(apnType));
1253cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1254cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1255cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1256cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected synchronized boolean isApnIdEnabled(int id) {
1257cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (id != DctConstants.APN_INVALID_ID) {
125822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            return mDataEnabled[id];
1259cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1260cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return false;
1261cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1262cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1263cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void setEnabled(int id, boolean enable) {
1264cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG) {
126522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            log("setEnabled(" + id + ", " + enable + ") with old state = " + mDataEnabled[id]
126622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    + " and enabledCount = " + mEnabledCount);
1267cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1268cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Message msg = obtainMessage(DctConstants.EVENT_ENABLE_NEW_APN);
1269cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.arg1 = id;
1270cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.arg2 = (enable ? DctConstants.ENABLED : DctConstants.DISABLED);
1271cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        sendMessage(msg);
1272cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1273cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1274cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onEnableApn(int apnId, int enabled) {
1275cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG) {
1276cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("EVENT_APN_ENABLE_REQUEST apnId=" + apnId + ", apnType=" + apnIdToType(apnId) +
127722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    ", enabled=" + enabled + ", dataEnabled = " + mDataEnabled[apnId] +
127822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    ", enabledCount = " + mEnabledCount + ", isApnTypeActive = " +
1279cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    isApnTypeActive(apnIdToType(apnId)));
1280cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1281cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (enabled == DctConstants.ENABLED) {
1282cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            synchronized (this) {
128322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (!mDataEnabled[apnId]) {
128422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mDataEnabled[apnId] = true;
128522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mEnabledCount++;
1286cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1287cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1288cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            String type = apnIdToType(apnId);
1289cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (!isApnTypeActive(type)) {
1290cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mRequestedApnType = type;
1291cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onEnableNewApn();
1292cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1293cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                notifyApnIdUpToCurrent(Phone.REASON_APN_SWITCHED, apnId);
1294cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1295cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1296cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // disable
1297cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            boolean didDisable = false;
1298cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            synchronized (this) {
129922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mDataEnabled[apnId]) {
130022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mDataEnabled[apnId] = false;
130122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mEnabledCount--;
1302cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    didDisable = true;
1303cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1304cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1305cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (didDisable) {
130622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if ((mEnabledCount == 0) || (apnId == DctConstants.APN_DUN_ID)) {
1307cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    mRequestedApnType = PhoneConstants.APN_TYPE_DEFAULT;
1308cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    onCleanUpConnection(true, apnId, Phone.REASON_DATA_DISABLED);
1309cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1310cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1311cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // send the disconnect msg manually, since the normal route wont send
1312cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // it (it's not enabled)
1313cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                notifyApnIdDisconnected(Phone.REASON_DATA_DISABLED, apnId);
131422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mDataEnabled[DctConstants.APN_DEFAULT_ID] == true
1315cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        && !isApnTypeActive(PhoneConstants.APN_TYPE_DEFAULT)) {
1316cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // TODO - this is an ugly way to restore the default conn - should be done
1317cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // by a real contention manager and policy that disconnects the lower pri
1318cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // stuff as enable requests come in and pops them back on as we disable back
1319cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    // down to the lower pri stuff
1320cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    mRequestedApnType = PhoneConstants.APN_TYPE_DEFAULT;
1321cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    onEnableNewApn();
1322cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1323cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1324cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1325cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1326cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1327cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
1328cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Called when we switch APNs.
1329cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *
1330cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * mRequestedApnType is set prior to call
1331cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * To be overridden.
1332cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
1333cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onEnableNewApn() {
1334cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1335cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1336cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
1337cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Called when EVENT_RESET_DONE is received so goto
1338cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * IDLE state and send notifications to those interested.
1339cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *
1340cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * TODO - currently unused.  Needs to be hooked into DataConnection cleanup
1341cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * TODO - needs to pass some notion of which connection is reset..
1342cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
1343cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onResetDone(AsyncResult ar) {
1344cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG) log("EVENT_RESET_DONE");
1345cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        String reason = null;
1346cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (ar.userObj instanceof String) {
1347cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            reason = (String) ar.userObj;
1348cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1349cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        gotoIdleAndNotifyDataConnection(reason);
1350cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1351cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1352cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    /**
1353cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Prevent mobile data connections from being established, or once again
1354cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * allow mobile data connections. If the state toggles, then either tear
1355cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * down or set up data, as appropriate to match the new state.
1356cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *
1357cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * @param enable indicates whether to enable ({@code true}) or disable (
1358cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     *            {@code false}) data
1359cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * @return {@code true} if the operation succeeded
1360cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     */
1361cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public boolean setInternalDataEnabled(boolean enable) {
1362cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (DBG)
1363cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("setInternalDataEnabled(" + enable + ")");
1364cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1365cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Message msg = obtainMessage(DctConstants.EVENT_SET_INTERNAL_DATA_ENABLE);
1366cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.arg1 = (enable ? DctConstants.ENABLED : DctConstants.DISABLED);
1367cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        sendMessage(msg);
1368cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return true;
1369cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1370cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1371cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onSetInternalDataEnabled(boolean enabled) {
1372cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        synchronized (mDataEnabledLock) {
1373cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mInternalDataEnabled = enabled;
1374cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (enabled) {
1375cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("onSetInternalDataEnabled: changed to enabled, try to setup data call");
1376cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                onTrySetupData(Phone.REASON_DATA_ENABLED);
1377cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1378cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("onSetInternalDataEnabled: changed to disabled, cleanUpAllConnections");
1379cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                cleanUpAllConnections(null);
1380cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1381cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1382cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1383cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1384cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void cleanUpAllConnections(String cause) {
1385cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Message msg = obtainMessage(DctConstants.EVENT_CLEAN_UP_ALL_CONNECTIONS);
1386cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        msg.obj = cause;
1387cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        sendMessage(msg);
1388cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1389cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1390cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public abstract boolean isDisconnected();
1391cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1392cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onSetUserDataEnabled(boolean enabled) {
1393cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        synchronized (mDataEnabledLock) {
1394cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mUserDataEnabled != enabled) {
1395cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mUserDataEnabled = enabled;
139624b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest                int phoneSubId = mPhone.getSubId();
1397cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                Settings.Global.putInt(mPhone.getContext().getContentResolver(),
139824b9b00e7058ef1f1b3f1d996b7e46b605c53770PauloftheWest                        Settings.Global.MOBILE_DATA + phoneSubId, enabled ? 1 : 0);
1399cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (getDataOnRoamingEnabled() == false &&
1400ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao                        mPhone.getServiceState().getDataRoaming() == true) {
1401cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    if (enabled) {
1402cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON);
1403cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    } else {
1404cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        notifyOffApnsOfAvailability(Phone.REASON_DATA_DISABLED);
1405cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    }
1406cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1407014103f70a8d7dc5b0030f18641ca5d117197ce0xinhe
1408014103f70a8d7dc5b0030f18641ca5d117197ce0xinhe                if (enabled) {
1409014103f70a8d7dc5b0030f18641ca5d117197ce0xinhe                    onTrySetupData(Phone.REASON_DATA_ENABLED);
1410014103f70a8d7dc5b0030f18641ca5d117197ce0xinhe                } else {
1411014103f70a8d7dc5b0030f18641ca5d117197ce0xinhe                    onCleanUpAllConnections(Phone.REASON_DATA_SPECIFIC_DISABLED);
1412cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1413cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1414cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1415cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1416cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1417cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onSetDependencyMet(String apnType, boolean met) {
1418cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1419cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1420cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onSetPolicyDataEnabled(boolean enabled) {
1421cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        synchronized (mDataEnabledLock) {
1422cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            final boolean prevEnabled = getAnyDataEnabled();
1423cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (sPolicyDataEnabled != enabled) {
1424cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                sPolicyDataEnabled = enabled;
1425cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (prevEnabled != getAnyDataEnabled()) {
1426cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    if (!prevEnabled) {
1427cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        onTrySetupData(Phone.REASON_DATA_ENABLED);
1428cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    } else {
1429a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        onCleanUpAllConnections(Phone.REASON_DATA_SPECIFIC_DISABLED);
1430cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    }
1431cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                }
1432cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1433cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1434cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1435cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1436cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected String getReryConfig(boolean forDefault) {
1437cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int nt = mPhone.getServiceState().getNetworkType();
1438cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1439cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if ((nt == TelephonyManager.NETWORK_TYPE_CDMA) ||
1440cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            (nt == TelephonyManager.NETWORK_TYPE_1xRTT) ||
1441cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            (nt == TelephonyManager.NETWORK_TYPE_EVDO_0) ||
1442cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            (nt == TelephonyManager.NETWORK_TYPE_EVDO_A) ||
1443cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            (nt == TelephonyManager.NETWORK_TYPE_EVDO_B) ||
1444cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            (nt == TelephonyManager.NETWORK_TYPE_EHRPD)) {
1445cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // CDMA variant
1446cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return SystemProperties.get("ro.cdma.data_retry_config");
1447cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1448cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // Use GSM varient for all others.
1449cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (forDefault) {
1450cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                return SystemProperties.get("ro.gsm.data_retry_config");
1451cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1452cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                return SystemProperties.get("ro.gsm.2nd_data_retry_config");
1453cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1454cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1455cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1456cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1457cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void resetPollStats() {
1458cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mTxPkts = -1;
1459cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mRxPkts = -1;
1460cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mNetStatPollPeriod = POLL_NETSTAT_MILLIS;
1461cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1462cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1463cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected abstract DctConstants.State getOverallState();
1464cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1465b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    void startNetStatPoll() {
1466ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville        if (getOverallState() == DctConstants.State.CONNECTED
1467ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville                && mNetStatPollEnabled == false) {
1468b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh            if (DBG) {
1469b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh                log("startNetStatPoll");
1470b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh            }
1471cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            resetPollStats();
1472cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mNetStatPollEnabled = true;
1473cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mPollNetStat.run();
1474cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
14756bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        if (mPhone != null) {
14766bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville            mPhone.notifyDataActivity();
14776bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        }
1478cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1479cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1480b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    void stopNetStatPoll() {
1481cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mNetStatPollEnabled = false;
1482cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        removeCallbacks(mPollNetStat);
1483b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        if (DBG) {
1484b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh            log("stopNetStatPoll");
1485b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        }
14866bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville
14876bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        // To sync data activity icon in the case of switching data connection to send MMS.
14886bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        if (mPhone != null) {
14896bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville            mPhone.notifyDataActivity();
14906bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        }
1491b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    }
1492b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh
1493b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    public void sendStartNetStatPoll(DctConstants.Activity activity) {
1494b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        Message msg = obtainMessage(DctConstants.CMD_NET_STAT_POLL);
1495b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        msg.arg1 = DctConstants.ENABLED;
1496b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        msg.obj = activity;
1497b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        sendMessage(msg);
1498b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    }
1499b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh
1500b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    protected void handleStartNetStatPoll(DctConstants.Activity activity) {
1501b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        startNetStatPoll();
1502b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
1503b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        setActivity(activity);
1504b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    }
1505b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh
1506b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    public void sendStopNetStatPoll(DctConstants.Activity activity) {
1507b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        Message msg = obtainMessage(DctConstants.CMD_NET_STAT_POLL);
1508b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        msg.arg1 = DctConstants.DISABLED;
1509b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        msg.obj = activity;
1510b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        sendMessage(msg);
1511b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    }
1512b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh
1513b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh    protected void handleStopNetStatPoll(DctConstants.Activity activity) {
1514b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        stopNetStatPoll();
1515b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        stopDataStallAlarm();
1516b077af12dfe0abfcdd51ce5c9852940b89567e99Yashdev Singh        setActivity(activity);
1517cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1518cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1519cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void updateDataActivity() {
1520cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        long sent, received;
1521cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1522cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        DctConstants.Activity newActivity;
1523cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1524cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        TxRxSum preTxRxSum = new TxRxSum(mTxPkts, mRxPkts);
1525cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        TxRxSum curTxRxSum = new TxRxSum();
1526cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        curTxRxSum.updateTxRxSum();
1527cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mTxPkts = curTxRxSum.txPkts;
1528cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mRxPkts = curTxRxSum.rxPkts;
1529cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1530cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (VDBG) {
1531cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("updateDataActivity: curTxRxSum=" + curTxRxSum + " preTxRxSum=" + preTxRxSum);
1532cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1533cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1534cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mNetStatPollEnabled && (preTxRxSum.txPkts > 0 || preTxRxSum.rxPkts > 0)) {
1535cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            sent = mTxPkts - preTxRxSum.txPkts;
1536cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            received = mRxPkts - preTxRxSum.rxPkts;
1537cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1538cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (VDBG)
1539cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("updateDataActivity: sent=" + sent + " received=" + received);
1540cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (sent > 0 && received > 0) {
1541cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                newActivity = DctConstants.Activity.DATAINANDOUT;
1542cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else if (sent > 0 && received == 0) {
1543cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                newActivity = DctConstants.Activity.DATAOUT;
1544cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else if (sent == 0 && received > 0) {
1545cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                newActivity = DctConstants.Activity.DATAIN;
1546cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1547cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                newActivity = (mActivity == DctConstants.Activity.DORMANT) ?
1548cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        mActivity : DctConstants.Activity.NONE;
1549cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1550cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1551cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mActivity != newActivity && mIsScreenOn) {
1552cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (VDBG)
1553cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    log("updateDataActivity: newActivity=" + newActivity);
1554cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mActivity = newActivity;
1555cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.notifyDataActivity();
1556cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1557cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1558cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1559cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1560cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // Recovery action taken in case of data stall
1561cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static class RecoveryAction {
1562cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public static final int GET_DATA_CALL_LIST      = 0;
1563cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public static final int CLEANUP                 = 1;
1564cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public static final int REREGISTER              = 2;
1565cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public static final int RADIO_RESTART           = 3;
1566cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        public static final int RADIO_RESTART_WITH_PROP = 4;
1567cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1568cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        private static boolean isAggressiveRecovery(int value) {
1569cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return ((value == RecoveryAction.CLEANUP) ||
1570cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    (value == RecoveryAction.REREGISTER) ||
1571cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    (value == RecoveryAction.RADIO_RESTART) ||
1572cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    (value == RecoveryAction.RADIO_RESTART_WITH_PROP));
1573cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1574cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1575cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1576cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public int getRecoveryAction() {
1577cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int action = Settings.System.getInt(mPhone.getContext().getContentResolver(),
1578cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                "radio.data.stall.recovery.action", RecoveryAction.GET_DATA_CALL_LIST);
1579ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) log("getRecoveryAction: " + action);
1580cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return action;
1581cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1582cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void putRecoveryAction(int action) {
1583cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Settings.System.putInt(mPhone.getContext().getContentResolver(),
1584cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                "radio.data.stall.recovery.action", action);
1585ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) log("putRecoveryAction: " + action);
1586cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1587cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1588cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected boolean isConnected() {
1589cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        return false;
1590cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1591cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1592cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void doRecovery() {
1593cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (getOverallState() == DctConstants.State.CONNECTED) {
1594cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // Go through a series of recovery steps, each action transitions to the next action
1595cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            int recoveryAction = getRecoveryAction();
1596cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            switch (recoveryAction) {
1597cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case RecoveryAction.GET_DATA_CALL_LIST:
1598cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_GET_DATA_CALL_LIST,
1599cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        mSentSinceLastRecv);
1600cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("doRecovery() get data call list");
160122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.mCi.getDataCallList(obtainMessage(DctConstants.EVENT_DATA_STATE_CHANGED));
1602cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                putRecoveryAction(RecoveryAction.CLEANUP);
1603cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1604cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case RecoveryAction.CLEANUP:
1605cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_CLEANUP, mSentSinceLastRecv);
1606cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("doRecovery() cleanup all connections");
1607cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                cleanUpAllConnections(Phone.REASON_PDP_RESET);
1608cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                putRecoveryAction(RecoveryAction.REREGISTER);
1609cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1610cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case RecoveryAction.REREGISTER:
1611cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_REREGISTER,
1612cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        mSentSinceLastRecv);
1613cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("doRecovery() re-register");
1614cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mPhone.getServiceStateTracker().reRegisterNetwork(null);
1615cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                putRecoveryAction(RecoveryAction.RADIO_RESTART);
1616cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1617cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case RecoveryAction.RADIO_RESTART:
1618cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_RADIO_RESTART,
1619cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        mSentSinceLastRecv);
1620cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("restarting radio");
1621cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                putRecoveryAction(RecoveryAction.RADIO_RESTART_WITH_PROP);
1622cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                restartRadio();
1623cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1624cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            case RecoveryAction.RADIO_RESTART_WITH_PROP:
1625cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // This is in case radio restart has not recovered the data.
1626cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // It will set an additional "gsm.radioreset" property to tell
1627cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // RIL or system to take further action.
1628cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // The implementation of hard reset recovery action is up to OEM product.
1629cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // Once RADIO_RESET property is consumed, it is expected to set back
1630cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // to false by RIL.
1631cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_RADIO_RESTART_WITH_PROP, -1);
1632cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (DBG) log("restarting radio with gsm.radioreset to true");
1633cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                SystemProperties.set(RADIO_RESET_PROPERTY, "true");
1634cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // give 1 sec so property change can be notified.
1635cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                try {
1636cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    Thread.sleep(1000);
1637cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                } catch (InterruptedException e) {}
1638cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                restartRadio();
1639cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                putRecoveryAction(RecoveryAction.GET_DATA_CALL_LIST);
1640cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
1641cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            default:
1642cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                throw new RuntimeException("doRecovery: Invalid recoveryAction=" +
1643cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    recoveryAction);
1644cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1645cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mSentSinceLastRecv = 0;
1646cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1647cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1648cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1649cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void updateDataStallInfo() {
1650cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        long sent, received;
1651cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1652cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        TxRxSum preTxRxSum = new TxRxSum(mDataStallTxRxSum);
1653cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mDataStallTxRxSum.updateTxRxSum();
1654cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1655ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) {
1656cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("updateDataStallInfo: mDataStallTxRxSum=" + mDataStallTxRxSum +
1657cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    " preTxRxSum=" + preTxRxSum);
1658cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1659cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1660cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        sent = mDataStallTxRxSum.txPkts - preTxRxSum.txPkts;
1661cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        received = mDataStallTxRxSum.rxPkts - preTxRxSum.rxPkts;
1662cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1663cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (RADIO_TESTS) {
1664cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (SystemProperties.getBoolean("radio.test.data.stall", false)) {
1665cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("updateDataStallInfo: radio.test.data.stall true received = 0;");
1666cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                received = 0;
1667cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1668cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1669cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if ( sent > 0 && received > 0 ) {
1670ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) log("updateDataStallInfo: IN/OUT");
1671cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mSentSinceLastRecv = 0;
1672cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            putRecoveryAction(RecoveryAction.GET_DATA_CALL_LIST);
1673cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (sent > 0 && received == 0) {
1674cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mPhone.getState() == PhoneConstants.State.IDLE) {
1675cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mSentSinceLastRecv += sent;
1676cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1677cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                mSentSinceLastRecv = 0;
1678cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1679cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (DBG) {
1680cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("updateDataStallInfo: OUT sent=" + sent +
1681cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        " mSentSinceLastRecv=" + mSentSinceLastRecv);
1682cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1683cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else if (sent == 0 && received > 0) {
1684ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) log("updateDataStallInfo: IN");
1685cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mSentSinceLastRecv = 0;
1686cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            putRecoveryAction(RecoveryAction.GET_DATA_CALL_LIST);
1687cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1688ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) log("updateDataStallInfo: NONE");
1689cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1690cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1691cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1692cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void onDataStallAlarm(int tag) {
1693cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mDataStallAlarmTag != tag) {
1694cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (DBG) {
1695cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("onDataStallAlarm: ignore, tag=" + tag + " expecting " + mDataStallAlarmTag);
1696cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1697cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return;
1698cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1699cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        updateDataStallInfo();
1700cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1701cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int hangWatchdogTrigger = Settings.Global.getInt(mResolver,
1702cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                Settings.Global.PDP_WATCHDOG_TRIGGER_PACKET_COUNT,
1703cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                NUMBER_SENT_PACKETS_OF_HANG);
1704cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1705cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        boolean suspectedStall = DATA_STALL_NOT_SUSPECTED;
1706cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mSentSinceLastRecv >= hangWatchdogTrigger) {
1707cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (DBG) {
1708cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("onDataStallAlarm: tag=" + tag + " do recovery action=" + getRecoveryAction());
1709cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1710cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            suspectedStall = DATA_STALL_SUSPECTED;
1711cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            sendMessage(obtainMessage(DctConstants.EVENT_DO_RECOVERY));
1712cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
1713ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) {
1714cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("onDataStallAlarm: tag=" + tag + " Sent " + String.valueOf(mSentSinceLastRecv) +
1715cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    " pkts since last received, < watchdogTrigger=" + hangWatchdogTrigger);
1716cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1717cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1718cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        startDataStallAlarm(suspectedStall);
1719cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1720cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1721cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void startDataStallAlarm(boolean suspectedStall) {
1722cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int nextAction = getRecoveryAction();
1723cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int delayInMs;
1724cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1725ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville        if (mDataStallDetectionEnabled && getOverallState() == DctConstants.State.CONNECTED) {
1726cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // If screen is on or data stall is currently suspected, set the alarm
1727cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            // with an aggresive timeout.
1728cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (mIsScreenOn || suspectedStall || RecoveryAction.isAggressiveRecovery(nextAction)) {
1729cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                delayInMs = Settings.Global.getInt(mResolver,
1730cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        Settings.Global.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS,
1731cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT);
1732cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            } else {
1733cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                delayInMs = Settings.Global.getInt(mResolver,
1734cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        Settings.Global.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS,
1735cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT);
1736cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1737cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1738cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mDataStallAlarmTag += 1;
1739ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) {
1740cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                log("startDataStallAlarm: tag=" + mDataStallAlarmTag +
1741cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                        " delay=" + (delayInMs / 1000) + "s");
1742cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
1743ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Intent intent = new Intent(INTENT_DATA_STALL_ALARM);
1744cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            intent.putExtra(DATA_STALL_ALARM_TAG_EXTRA, mDataStallAlarmTag);
1745cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mDataStallAlarmIntent = PendingIntent.getBroadcast(mPhone.getContext(), 0, intent,
1746cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    PendingIntent.FLAG_UPDATE_CURRENT);
1747ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
1748cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    SystemClock.elapsedRealtime() + delayInMs, mDataStallAlarmIntent);
1749ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
1750ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (VDBG_STALL) {
1751ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                log("startDataStallAlarm: NOT started, no connection tag=" + mDataStallAlarmTag);
1752ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1753cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1754cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1755cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1756cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void stopDataStallAlarm() {
1757ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) {
1758cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            log("stopDataStallAlarm: current tag=" + mDataStallAlarmTag +
1759cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    " mDataStallAlarmIntent=" + mDataStallAlarmIntent);
1760cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1761cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        mDataStallAlarmTag += 1;
1762cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (mDataStallAlarmIntent != null) {
1763ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mAlarmManager.cancel(mDataStallAlarmIntent);
1764cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            mDataStallAlarmIntent = null;
1765cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1766cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1767cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1768cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void restartDataStallAlarm() {
1769cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (isConnected() == false) return;
1770cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // To be called on screen status change.
1771cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        // Do not cancel the alarm if it is set with aggressive timeout.
1772cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        int nextAction = getRecoveryAction();
1773cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1774cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        if (RecoveryAction.isAggressiveRecovery(nextAction)) {
1775ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (DBG) log("restartDataStallAlarm: action is pending. not resetting the alarm.");
1776cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            return;
1777cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1778ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (VDBG_STALL) log("restartDataStallAlarm: stop then start.");
1779cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        stopDataStallAlarm();
1780cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
1781cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1782cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
17835d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi    protected void setInitialAttachApn() {
17841b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        ApnSetting iaApnSetting = null;
17851b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        ApnSetting defaultApnSetting = null;
17861b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        ApnSetting firstApnSetting = null;
17875d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
17881b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        log("setInitialApn: E mPreferredApn=" + mPreferredApn);
17891b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville
17901b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        if (mAllApnSettings != null && !mAllApnSettings.isEmpty()) {
17911b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            firstApnSetting = mAllApnSettings.get(0);
17921b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            log("setInitialApn: firstApnSetting=" + firstApnSetting);
17931b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville
17941b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            // Search for Initial APN setting and the first apn that can handle default
17955d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi            for (ApnSetting apn : mAllApnSettings) {
1796dd6e67fb45fa3ce0d43f8d874cd7ffaeddf0926fLorenzo Colitti                // Can't use apn.canHandleType(), as that returns true for APNs that have no type.
1797dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                if (ArrayUtils.contains(apn.types, PhoneConstants.APN_TYPE_IA) &&
1798dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                        apn.carrierEnabled) {
17991b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    // The Initial Attach APN is highest priority so use it if there is one
18001b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    log("setInitialApn: iaApnSetting=" + apn);
18011b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    iaApnSetting = apn;
18025d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi                    break;
18031b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                } else if ((defaultApnSetting == null)
18041b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                        && (apn.canHandleType(PhoneConstants.APN_TYPE_DEFAULT))) {
18051b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    // Use the first default apn if no better choice
18061b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    log("setInitialApn: defaultApnSetting=" + apn);
18071b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    defaultApnSetting = apn;
18085d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi                }
18095d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi            }
18105d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi        }
18115d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
18121b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        // The priority of apn candidates from highest to lowest is:
18131b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        //   1) APN_TYPE_IA (Inital Attach)
18141b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        //   2) mPreferredApn, i.e. the current preferred apn
18151b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        //   3) The first apn that than handle APN_TYPE_DEFAULT
18161b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        //   4) The first APN we can find.
18171b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville
18181b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        ApnSetting initialAttachApnSetting = null;
18191b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        if (iaApnSetting != null) {
18201b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: using iaApnSetting");
18211b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            initialAttachApnSetting = iaApnSetting;
18221b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        } else if (mPreferredApn != null) {
18231b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: using mPreferredApn");
18241b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            initialAttachApnSetting = mPreferredApn;
18251b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        } else if (defaultApnSetting != null) {
18261b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: using defaultApnSetting");
18271b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            initialAttachApnSetting = defaultApnSetting;
18281b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        } else if (firstApnSetting != null) {
18291b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: using firstApnSetting");
18301b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            initialAttachApnSetting = firstApnSetting;
18311b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        }
18321b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville
18331b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        if (initialAttachApnSetting == null) {
18341b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: X There in no available apn");
18351b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        } else {
18361b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            if (DBG) log("setInitialAttachApn: X selected Apn=" + initialAttachApnSetting);
18375d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
18381b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville            mPhone.mCi.setInitialAttachApn(initialAttachApnSetting.apn,
18391b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    initialAttachApnSetting.protocol, initialAttachApnSetting.authType,
18401b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville                    initialAttachApnSetting.user, initialAttachApnSetting.password, null);
18411b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville        }
18425d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi    }
18435d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
18449d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan    protected void setDataProfilesAsNeeded() {
18459d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan        if (DBG) log("setDataProfilesAsNeeded");
18469d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan        if (mAllApnSettings != null && !mAllApnSettings.isEmpty()) {
18479d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan            ArrayList<DataProfile> dps = new ArrayList<DataProfile>();
18489d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan            for (ApnSetting apn : mAllApnSettings) {
18499d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan                if (apn.modemCognitive) {
18509d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan                    DataProfile dp = new DataProfile(apn,
1851ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao                            mPhone.getServiceState().getDataRoaming());
1852dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                    boolean isDup = false;
1853dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                    for(DataProfile dpIn : dps) {
1854dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                        if (dp.equals(dpIn)) {
1855dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                            isDup = true;
1856dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                            break;
1857dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                        }
1858dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                    }
1859dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                    if (!isDup) {
1860dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                        dps.add(dp);
1861dd5db09966b6d24e2ba0f4d6f5d26985d3303540Hui Wang                    }
18629d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan                }
18639d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan            }
18649d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan            if(dps.size() > 0) {
18659d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan                mPhone.mCi.setDataProfile(dps.toArray(new DataProfile[0]), null);
18669d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan            }
18679d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan        }
18689d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan    }
18699d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan
1870e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected void onActionIntentProvisioningApnAlarm(Intent intent) {
1871e9063f6973039d66e12d0d930af03906d377969eWink Saville        if (DBG) log("onActionIntentProvisioningApnAlarm: action=" + intent.getAction());
1872e9063f6973039d66e12d0d930af03906d377969eWink Saville        Message msg = obtainMessage(DctConstants.EVENT_PROVISIONING_APN_ALARM,
1873e9063f6973039d66e12d0d930af03906d377969eWink Saville                intent.getAction());
1874e9063f6973039d66e12d0d930af03906d377969eWink Saville        msg.arg1 = intent.getIntExtra(PROVISIONING_APN_ALARM_TAG_EXTRA, 0);
1875e9063f6973039d66e12d0d930af03906d377969eWink Saville        sendMessage(msg);
1876e9063f6973039d66e12d0d930af03906d377969eWink Saville    }
1877e9063f6973039d66e12d0d930af03906d377969eWink Saville
1878e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected void startProvisioningApnAlarm() {
1879e9063f6973039d66e12d0d930af03906d377969eWink Saville        int delayInMs = Settings.Global.getInt(mResolver,
1880e9063f6973039d66e12d0d930af03906d377969eWink Saville                                Settings.Global.PROVISIONING_APN_ALARM_DELAY_IN_MS,
1881e9063f6973039d66e12d0d930af03906d377969eWink Saville                                PROVISIONING_APN_ALARM_DELAY_IN_MS_DEFAULT);
1882e9063f6973039d66e12d0d930af03906d377969eWink Saville        if (Build.IS_DEBUGGABLE) {
1883e9063f6973039d66e12d0d930af03906d377969eWink Saville            // Allow debug code to use a system property to provide another value
1884e9063f6973039d66e12d0d930af03906d377969eWink Saville            String delayInMsStrg = Integer.toString(delayInMs);
1885e9063f6973039d66e12d0d930af03906d377969eWink Saville            delayInMsStrg = System.getProperty(DEBUG_PROV_APN_ALARM, delayInMsStrg);
1886e9063f6973039d66e12d0d930af03906d377969eWink Saville            try {
1887e9063f6973039d66e12d0d930af03906d377969eWink Saville                delayInMs = Integer.parseInt(delayInMsStrg);
1888e9063f6973039d66e12d0d930af03906d377969eWink Saville            } catch (NumberFormatException e) {
1889e9063f6973039d66e12d0d930af03906d377969eWink Saville                loge("startProvisioningApnAlarm: e=" + e);
1890e9063f6973039d66e12d0d930af03906d377969eWink Saville            }
1891e9063f6973039d66e12d0d930af03906d377969eWink Saville        }
1892e9063f6973039d66e12d0d930af03906d377969eWink Saville        mProvisioningApnAlarmTag += 1;
1893e9063f6973039d66e12d0d930af03906d377969eWink Saville        if (DBG) {
1894e9063f6973039d66e12d0d930af03906d377969eWink Saville            log("startProvisioningApnAlarm: tag=" + mProvisioningApnAlarmTag +
1895e9063f6973039d66e12d0d930af03906d377969eWink Saville                    " delay=" + (delayInMs / 1000) + "s");
1896e9063f6973039d66e12d0d930af03906d377969eWink Saville        }
1897e9063f6973039d66e12d0d930af03906d377969eWink Saville        Intent intent = new Intent(INTENT_PROVISIONING_APN_ALARM);
1898e9063f6973039d66e12d0d930af03906d377969eWink Saville        intent.putExtra(PROVISIONING_APN_ALARM_TAG_EXTRA, mProvisioningApnAlarmTag);
1899e9063f6973039d66e12d0d930af03906d377969eWink Saville        mProvisioningApnAlarmIntent = PendingIntent.getBroadcast(mPhone.getContext(), 0, intent,
1900e9063f6973039d66e12d0d930af03906d377969eWink Saville                PendingIntent.FLAG_UPDATE_CURRENT);
1901e9063f6973039d66e12d0d930af03906d377969eWink Saville        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
1902e9063f6973039d66e12d0d930af03906d377969eWink Saville                SystemClock.elapsedRealtime() + delayInMs, mProvisioningApnAlarmIntent);
1903e9063f6973039d66e12d0d930af03906d377969eWink Saville    }
1904e9063f6973039d66e12d0d930af03906d377969eWink Saville
1905e9063f6973039d66e12d0d930af03906d377969eWink Saville    protected void stopProvisioningApnAlarm() {
1906e9063f6973039d66e12d0d930af03906d377969eWink Saville        if (DBG) {
1907e9063f6973039d66e12d0d930af03906d377969eWink Saville            log("stopProvisioningApnAlarm: current tag=" + mProvisioningApnAlarmTag +
1908e9063f6973039d66e12d0d930af03906d377969eWink Saville                    " mProvsioningApnAlarmIntent=" + mProvisioningApnAlarmIntent);
1909e9063f6973039d66e12d0d930af03906d377969eWink Saville        }
1910e9063f6973039d66e12d0d930af03906d377969eWink Saville        mProvisioningApnAlarmTag += 1;
1911e9063f6973039d66e12d0d930af03906d377969eWink Saville        if (mProvisioningApnAlarmIntent != null) {
1912e9063f6973039d66e12d0d930af03906d377969eWink Saville            mAlarmManager.cancel(mProvisioningApnAlarmIntent);
1913e9063f6973039d66e12d0d930af03906d377969eWink Saville            mProvisioningApnAlarmIntent = null;
1914e9063f6973039d66e12d0d930af03906d377969eWink Saville        }
1915e9063f6973039d66e12d0d930af03906d377969eWink Saville    }
1916e9063f6973039d66e12d0d930af03906d377969eWink Saville
1917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    void sendCleanUpConnection(boolean tearDown, ApnContext apnContext) {
1918ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (DBG)log("sendCleanUpConnection: tearDown=" + tearDown + " apnContext=" + apnContext);
1919ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        Message msg = obtainMessage(DctConstants.EVENT_CLEAN_UP_CONNECTION);
1920ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        msg.arg1 = tearDown ? 1 : 0;
1921ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        msg.arg2 = 0;
1922ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        msg.obj = apnContext;
1923ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        sendMessage(msg);
1924ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
1925ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
1926979786625e7ceacf4a545a25704ef8a15338a854Wink Saville    void sendRestartRadio() {
1927979786625e7ceacf4a545a25704ef8a15338a854Wink Saville        if (DBG)log("sendRestartRadio:");
1928979786625e7ceacf4a545a25704ef8a15338a854Wink Saville        Message msg = obtainMessage(DctConstants.EVENT_RESTART_RADIO);
1929979786625e7ceacf4a545a25704ef8a15338a854Wink Saville        sendMessage(msg);
1930979786625e7ceacf4a545a25704ef8a15338a854Wink Saville    }
1931979786625e7ceacf4a545a25704ef8a15338a854Wink Saville
1932cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1933bda761320929f714951c328bfec6a51a1978db97Wink Saville        pw.println("DcTrackerBase:");
1934cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" RADIO_TESTS=" + RADIO_TESTS);
1935cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mInternalDataEnabled=" + mInternalDataEnabled);
1936cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mUserDataEnabled=" + mUserDataEnabled);
1937cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" sPolicyDataEnabed=" + sPolicyDataEnabled);
193822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mDataEnabled:");
193922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for(int i=0; i < mDataEnabled.length; i++) {
194022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            pw.printf("  mDataEnabled[%d]=%b\n", i, mDataEnabled[i]);
1941cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1942cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
194322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mEnabledCount=" + mEnabledCount);
1944cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mRequestedApnType=" + mRequestedApnType);
1945cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mPhone=" + mPhone.getPhoneName());
1946cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mActivity=" + mActivity);
1947cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mState=" + mState);
1948cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mTxPkts=" + mTxPkts);
1949cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mRxPkts=" + mRxPkts);
1950cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mNetStatPollPeriod=" + mNetStatPollPeriod);
1951cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mNetStatPollEnabled=" + mNetStatPollEnabled);
1952cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mDataStallTxRxSum=" + mDataStallTxRxSum);
1953cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mDataStallAlarmTag=" + mDataStallAlarmTag);
1954ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville        pw.println(" mDataStallDetectionEanbled=" + mDataStallDetectionEnabled);
1955cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mSentSinceLastRecv=" + mSentSinceLastRecv);
1956cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mNoRecvPollCount=" + mNoRecvPollCount);
1957cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mResolver=" + mResolver);
1958cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mIsWifiConnected=" + mIsWifiConnected);
1959cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mReconnectIntent=" + mReconnectIntent);
1960cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mCidActive=" + mCidActive);
1961cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mAutoAttachOnCreation=" + mAutoAttachOnCreation);
1962cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mIsScreenOn=" + mIsScreenOn);
1963cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mUniqueIdGenerator=" + mUniqueIdGenerator);
1964cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
1965cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" ***************************************");
1966ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        DcController dcc = mDcc;
1967ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (dcc != null) {
1968ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            dcc.dump(fd, pw, args);
1969ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
1970ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mDcc=null");
1971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
1972ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        pw.println(" ***************************************");
1973ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        HashMap<Integer, DataConnection> dcs = mDataConnections;
1974ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (dcs != null) {
1975ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Set<Entry<Integer, DataConnection> > mDcSet = mDataConnections.entrySet();
1976ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mDataConnections: count=" + mDcSet.size());
1977ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            for (Entry<Integer, DataConnection> entry : mDcSet) {
1978ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                pw.printf(" *** mDataConnection[%d] \n", entry.getKey());
1979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                entry.getValue().dump(fd, pw, args);
1980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
1982ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println("mDataConnections=null");
1983cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1984cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" ***************************************");
1985cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
1986ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        HashMap<String, Integer> apnToDcId = mApnToDataConnectionId;
1987ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (apnToDcId != null) {
1988ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Set<Entry<String, Integer>> apnToDcIdSet = apnToDcId.entrySet();
1989ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mApnToDataConnectonId size=" + apnToDcIdSet.size());
1990ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            for (Entry<String, Integer> entry : apnToDcIdSet) {
1991ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                pw.printf(" mApnToDataConnectonId[%s]=%d\n", entry.getKey(), entry.getValue());
1992ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
1993ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        } else {
1994ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println("mApnToDataConnectionId=null");
1995cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
1996cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" ***************************************");
1997cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
1998ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ConcurrentHashMap<String, ApnContext> apnCtxs = mApnContexts;
1999ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (apnCtxs != null) {
2000ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            Set<Entry<String, ApnContext>> apnCtxsSet = apnCtxs.entrySet();
2001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mApnContexts size=" + apnCtxsSet.size());
2002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            for (Entry<String, ApnContext> entry : apnCtxsSet) {
2003cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                entry.getValue().dump(fd, pw, args);
2004cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
2005cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            pw.println(" ***************************************");
2006cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
2007cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            pw.println(" mApnContexts=null");
2008cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
2009cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
2010cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mActiveApn=" + mActiveApn);
2011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        ArrayList<ApnSetting> apnSettings = mAllApnSettings;
2012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        if (apnSettings != null) {
2013ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mAllApnSettings size=" + apnSettings.size());
2014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            for (int i=0; i < apnSettings.size(); i++) {
2015ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                pw.printf(" mAllApnSettings[%d]: %s\n", i, apnSettings.get(i));
2016cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            }
2017cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            pw.flush();
2018cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        } else {
2019ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            pw.println(" mAllApnSettings=null");
2020cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        }
2021cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mPreferredApn=" + mPreferredApn);
2022cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mIsPsRestricted=" + mIsPsRestricted);
2023cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mIsDisposed=" + mIsDisposed);
2024cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mIntentReceiver=" + mIntentReceiver);
2025cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.println(" mDataRoamingSettingObserver=" + mDataRoamingSettingObserver);
2026cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        pw.flush();
2027cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
2028cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville}
2029