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