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