DcTracker.java revision 80d38fe5c8f18997623b1133e4650c4a9a6e299c
1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* 2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2006 The Android Open Source Project 3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License. 6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at 7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software 11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and 14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License. 15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 174918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savillepackage com.android.internal.telephony.dataconnection; 18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 19cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kallaimport android.app.AlarmManager; 20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.app.PendingIntent; 212b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensenimport android.app.ProgressDialog; 22c9b81a0c05128694c617fcdd67e73821895822feWink Savilleimport android.content.ActivityNotFoundException; 23b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensenimport android.content.BroadcastReceiver; 24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.ContentResolver; 25cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.content.ContentValues; 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context; 27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Intent; 28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.IntentFilter; 291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.content.SharedPreferences; 30cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.content.res.Resources; 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.database.ContentObserver; 32cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.database.Cursor; 33cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.ConnectivityManager; 34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.net.LinkProperties; 3596cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwaltimport android.net.NetworkCapabilities; 36cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.NetworkConfig; 371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.net.NetworkInfo; 38af5593594070f825032be46dced573cd195956e1Robert Greenwaltimport android.net.NetworkRequest; 39cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.NetworkUtils; 409c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monkimport android.net.ProxyInfo; 411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.net.TrafficStats; 42cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.net.Uri; 431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.net.wifi.WifiManager; 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult; 453fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwaltimport android.os.Build; 46b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensenimport android.os.Bundle; 47a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Handler; 481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.HandlerThread; 49af5593594070f825032be46dced573cd195956e1Robert Greenwaltimport android.os.Looper; 50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message; 51a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.RegistrantList; 52b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensenimport android.os.ServiceManager; 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemClock; 54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemProperties; 551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.preference.PreferenceManager; 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.provider.Settings; 571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.provider.Settings.SettingNotFoundException; 58cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.provider.Telephony; 59cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.telephony.CellLocation; 600e776303ca82b5bec5db19bb44e0f13b0c7c6400Etan Cohenimport android.telephony.ServiceState; 61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.TelephonyManager; 62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.SubscriptionManager; 631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; 64cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.telephony.cdma.CdmaCellLocation; 65cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport android.telephony.gsm.GsmCellLocation; 66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.text.TextUtils; 67cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kallaimport android.util.EventLog; 682dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwaltimport android.util.LocalLog; 69ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwaltimport android.util.Pair; 70af5593594070f825032be46dced573cd195956e1Robert Greenwaltimport android.util.SparseArray; 712b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensenimport android.view.WindowManager; 7299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog; 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.R; 75af5593594070f825032be46dced573cd195956e1Robert Greenwaltimport com.android.internal.annotations.VisibleForTesting; 761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.GsmCdmaPhone; 774918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.Phone; 78cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.DctConstants; 79cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.EventLogTags; 80b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensenimport com.android.internal.telephony.ITelephony; 814918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.PhoneConstants; 82cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.RILConstants; 83d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccRecords; 84bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkaimport com.android.internal.telephony.uicc.UiccController; 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.util.AsyncChannel; 8676f43316a5a6082d601bffd4b6898d0bd81e11fcramimport com.android.internal.util.ArrayUtils; 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.FileDescriptor; 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.PrintWriter; 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.ArrayList; 9129c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwaltimport java.util.Arrays; 921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.Comparator; 931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.HashMap; 941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.List; 951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.Map.Entry; 9629c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwaltimport java.util.Objects; 971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.PriorityQueue; 981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.Set; 991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.concurrent.ConcurrentHashMap; 1001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.concurrent.atomic.AtomicBoolean; 1011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.concurrent.atomic.AtomicInteger; 1021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.concurrent.atomic.AtomicReference; 103d86df358b8fe07160caa12147b6e4ad34d378ce6xinheimport java.lang.StringBuilder; 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.ServiceStateTracker; 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1090c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajanpublic class DcTracker extends Handler { 1101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String LOG_TAG = "DCT"; 1111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final boolean DBG = true; 1121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final boolean VDBG = false; // STOPSHIP if true 1131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final boolean VDBG_STALL = false; // STOPSHIP if true 1141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final boolean RADIO_TESTS = false; 1151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1160e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu public AtomicBoolean isCleanupRequired = new AtomicBoolean(false); 1171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final AlarmManager mAlarmManager; 1191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private Object mDataEnabledLock = new Object(); 1211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // responds to the setInternalDataEnabled call - used internally to turn off data 1231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // for example during emergency calls 1241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mInternalDataEnabled = true; 1251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // responds to public (user) API to enable/disable data use 1271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // independent of mInternalDataEnabled and requests for APN access 1281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // persisted 1291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mUserDataEnabled = true; 1301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // TODO: move away from static state once 5587429 is fixed. 1321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static boolean sPolicyDataEnabled = true; 1331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* Currently requested APN type (TODO: This should probably be a parameter not a member) */ 1351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private String mRequestedApnType = PhoneConstants.APN_TYPE_DEFAULT; 1361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 1381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * After detecting a potential connection problem, this is the max number 1391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * of subsequent polls before attempting recovery. 1401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 1411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // 1 sec. default polling interval when screen is on. 1421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int POLL_NETSTAT_MILLIS = 1000; 1431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // 10 min. default polling interval when screen is off. 1441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int POLL_NETSTAT_SCREEN_OFF_MILLIS = 1000*60*10; 1451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Default sent packets without ack which triggers initial recovery steps 1461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int NUMBER_SENT_PACKETS_OF_HANG = 10; 1471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Default for the data stall alarm while non-aggressive stall detection 1491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT = 1000 * 60 * 6; 1501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Default for the data stall alarm for aggressive stall detection 1511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT = 1000 * 60; 1521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Tag for tracking stale alarms 1531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String DATA_STALL_ALARM_TAG_EXTRA = "data.stall.alram.tag"; 1541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final boolean DATA_STALL_SUSPECTED = true; 1561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final boolean DATA_STALL_NOT_SUSPECTED = false; 1571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private String RADIO_RESET_PROPERTY = "gsm.radioreset"; 1591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String INTENT_RECONNECT_ALARM = 1611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "com.android.internal.telephony.data-reconnect"; 1621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String INTENT_RECONNECT_ALARM_EXTRA_TYPE = "reconnect_alarm_extra_type"; 1631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String INTENT_RECONNECT_ALARM_EXTRA_REASON = 1641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "reconnect_alarm_extra_reason"; 1651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String INTENT_DATA_STALL_ALARM = 1671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "com.android.internal.telephony.data-stall"; 1681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private DcTesterFailBringUpAll mDcTesterFailBringUpAll; 1701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private DcController mDcc; 1711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** kept in sync with mApnContexts 1731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Higher numbers are higher priority and sorted so highest priority is first */ 1741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final PriorityQueue<ApnContext>mPrioritySortedApnContexts = 1751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu new PriorityQueue<ApnContext>(5, 1761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu new Comparator<ApnContext>() { 1771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public int compare(ApnContext c1, ApnContext c2) { 1781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return c2.priority - c1.priority; 1791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } ); 1811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** allApns holds all apns */ 1831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private ArrayList<ApnSetting> mAllApnSettings = null; 1841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** preferred apn */ 1861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private ApnSetting mPreferredApn = null; 1871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** Is packet service restricted by network */ 1891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mIsPsRestricted = false; 1901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** emergency apn Setting*/ 1921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private ApnSetting mEmergencyApn = null; 1931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* Once disposed dont handle any messages */ 1951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mIsDisposed = false; 1961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private ContentResolver mResolver; 1981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* Set to true with CMD_ENABLE_MOBILE_PROVISIONING */ 2001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mIsProvisioning = false; 2011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* The Url passed as object parameter in CMD_ENABLE_MOBILE_PROVISIONING */ 2031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private String mProvisioningUrl = null; 2041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* Intent for the provisioning apn alarm */ 2061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String INTENT_PROVISIONING_APN_ALARM = 2071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "com.android.internal.telephony.provisioning_apn_alarm"; 2081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* Tag for tracking stale alarms */ 2101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String PROVISIONING_APN_ALARM_TAG_EXTRA = "provisioning.apn.alarm.tag"; 2111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* Debug property for overriding the PROVISIONING_APN_ALARM_DELAY_IN_MS */ 2131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String DEBUG_PROV_APN_ALARM = "persist.debug.prov_apn_alarm"; 2141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* Default for the provisioning apn alarm timeout */ 2161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int PROVISIONING_APN_ALARM_DELAY_IN_MS_DEFAULT = 1000 * 60 * 15; 2171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* The provision apn alarm intent used to disable the provisioning apn */ 2191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private PendingIntent mProvisioningApnAlarmIntent = null; 2201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* Used to track stale provisioning apn alarms */ 2221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private int mProvisioningApnAlarmTag = (int) SystemClock.elapsedRealtime(); 2231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private AsyncChannel mReplyAc = new AsyncChannel(); 2251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver () { 2271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 2281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void onReceive(Context context, Intent intent) { 2291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String action = intent.getAction(); 230c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu 2311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (action.equals(Intent.ACTION_SCREEN_ON)) { 232c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu if (DBG) log("screen on"); 2331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsScreenOn = true; 2341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu stopNetStatPoll(); 2351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu startNetStatPoll(); 2361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu restartDataStallAlarm(); 2371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { 238c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu if (DBG) log("screen off"); 2391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsScreenOn = false; 2401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu stopNetStatPoll(); 2411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu startNetStatPoll(); 2421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu restartDataStallAlarm(); 2431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (action.startsWith(INTENT_RECONNECT_ALARM)) { 2441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("Reconnect alarm. Previous state was " + mState); 2451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onActionIntentReconnectAlarm(intent); 2461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (action.equals(INTENT_DATA_STALL_ALARM)) { 247c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu if (DBG) log("Data stall alarm"); 2481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onActionIntentDataStallAlarm(intent); 2491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (action.equals(INTENT_PROVISIONING_APN_ALARM)) { 250c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu if (DBG) log("Provisioning apn alarm"); 2511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onActionIntentProvisioningApnAlarm(intent); 2521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 2531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final android.net.NetworkInfo networkInfo = (NetworkInfo) 2541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 2551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsWifiConnected = (networkInfo != null && networkInfo.isConnected()); 2561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("NETWORK_STATE_CHANGED_ACTION: mIsWifiConnected=" + mIsWifiConnected); 2571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { 258c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu if (DBG) log("Wifi state changed"); 2591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final boolean enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 2601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED; 2611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!enabled) { 2621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // when WiFi got disabled, the NETWORK_STATE_CHANGED_ACTION 2631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // quit and won't report disconnected until next enabling. 2641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsWifiConnected = false; 2651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 2671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("WIFI_STATE_CHANGED_ACTION: enabled=" + enabled 2681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " mIsWifiConnected=" + mIsWifiConnected); 2691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 270c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu } else { 271c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu if (DBG) log("onReceive: Unknown action=" + action); 2721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu }; 2751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final Runnable mPollNetStat = new Runnable() { 2771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 2781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void run() { 2791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu updateDataActivity(); 2801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mIsScreenOn) { 2821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNetStatPollPeriod = Settings.Global.getInt(mResolver, 2831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.PDP_WATCHDOG_POLL_INTERVAL_MS, POLL_NETSTAT_MILLIS); 2841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 2851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNetStatPollPeriod = Settings.Global.getInt(mResolver, 2861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.PDP_WATCHDOG_LONG_POLL_INTERVAL_MS, 2871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu POLL_NETSTAT_SCREEN_OFF_MILLIS); 2881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mNetStatPollEnabled) { 2911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDataConnectionTracker.postDelayed(this, mNetStatPollPeriod); 2921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu }; 2951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private SubscriptionManager mSubscriptionManager; 2971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final OnSubscriptionsChangedListener mOnSubscriptionsChangedListener = 2981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu new OnSubscriptionsChangedListener() { 2991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public final AtomicInteger mPreviousSubId = 3001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu new AtomicInteger(SubscriptionManager.INVALID_SUBSCRIPTION_ID); 3011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 3031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Callback invoked when there is any change to any SubscriptionInfo. Typically 3041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * this method invokes {@link SubscriptionManager#getActiveSubscriptionInfoList} 3051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 3061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 3071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void onSubscriptionsChanged() { 3081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("SubscriptionListener.onSubscriptionInfoChanged"); 3091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Set the network type, in case the radio does not restore it. 3101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int subId = mPhone.getSubId(); 3111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (SubscriptionManager.isValidSubscriptionId(subId)) { 312f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt registerSettingsObserver(); 3131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mPreviousSubId.getAndSet(subId) != subId && 3151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SubscriptionManager.isValidSubscriptionId(subId)) { 3161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onRecordsLoadedOrSubIdChanged(); 3171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu }; 3201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 321f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt private static class SettingsObserver extends ContentObserver { 322f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt final private HashMap<Uri, Integer> mUriEventMap; 323f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt final private Context mContext; 324f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt final private Handler mHandler; 325f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt final private static String TAG = "DcTracker.SettingsObserver"; 3261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 327f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt SettingsObserver(Context context, Handler handler) { 328f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt super(null); 329f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mUriEventMap = new HashMap<Uri, Integer>(); 330f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mContext = context; 331f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mHandler = handler; 3321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 334f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt void observe(Uri uri, int what) { 335f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mUriEventMap.put(uri, what); 336f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt final ContentResolver resolver = mContext.getContentResolver(); 337f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt resolver.registerContentObserver(uri, false, this); 3381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 340f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt void unobserve() { 341f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt final ContentResolver resolver = mContext.getContentResolver(); 342f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt resolver.unregisterContentObserver(this); 3431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 3461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void onChange(boolean selfChange) { 347f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt Rlog.e(TAG, "Should never be reached."); 348f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } 349f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt 350f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt @Override 351f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt public void onChange(boolean selfChange, Uri uri) { 352f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt final Integer what = mUriEventMap.get(uri); 353f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt if (what != null) { 354f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mHandler.obtainMessage(what.intValue()).sendToTarget(); 355f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } else { 356f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt Rlog.e(TAG, "No matching event to send for URI=" + uri); 3571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 360f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt 361f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt private final SettingsObserver mSettingsObserver; 362f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt 363f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt private void registerSettingsObserver() { 364f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mSettingsObserver.unobserve(); 365f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt String simSuffix = ""; 366f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt if (TelephonyManager.getDefault().getSimCount() == 1) { 367f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt simSuffix = Integer.toString(mPhone.getSubId()); 368f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } 369f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mSettingsObserver.observe( 370f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt Settings.Global.getUriFor(Settings.Global.DATA_ROAMING + simSuffix), 371f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt DctConstants.EVENT_ROAMING_ON); 372f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt 373f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mSettingsObserver.observe( 374f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED), 375f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt DctConstants.EVENT_DEVICE_PROVISIONED_CHANGE); 376f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mSettingsObserver.observe( 377f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONING_MOBILE_DATA_ENABLED), 378f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt DctConstants.EVENT_DEVICE_PROVISIONED_CHANGE); 379f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } 3801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 3821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Maintain the sum of transmit and receive packets. 3831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 3841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * The packet counts are initialized and reset to -1 and 3851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * remain -1 until they can be updated. 3861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 3871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public static class TxRxSum { 3881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public long txPkts; 3891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public long rxPkts; 3901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public TxRxSum() { 3921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu reset(); 3931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public TxRxSum(long txPkts, long rxPkts) { 3961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this.txPkts = txPkts; 3971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this.rxPkts = rxPkts; 3981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public TxRxSum(TxRxSum sum) { 4011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu txPkts = sum.txPkts; 4021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu rxPkts = sum.rxPkts; 4031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void reset() { 4061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu txPkts = -1; 4071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu rxPkts = -1; 4081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 4111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String toString() { 4121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return "{txSum=" + txPkts + " rxSum=" + rxPkts + "}"; 4131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void updateTxRxSum() { 4161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this.txPkts = TrafficStats.getMobileTcpTxPackets(); 4171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this.rxPkts = TrafficStats.getMobileTcpRxPackets(); 4181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onActionIntentReconnectAlarm(Intent intent) { 4221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String reason = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON); 4231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String apnType = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE); 4241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int phoneSubId = mPhone.getSubId(); 4261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int currSubId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, 4271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SubscriptionManager.INVALID_SUBSCRIPTION_ID); 4281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("onActionIntentReconnectAlarm: currSubId = " + currSubId + " phoneSubId=" + phoneSubId); 4291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Stop reconnect if not current subId is not correct. 4311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // FIXME STOPSHIP - phoneSubId is coming up as -1 way after boot and failing this? 4321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!SubscriptionManager.isValidSubscriptionId(currSubId) || (currSubId != phoneSubId)) { 4331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("receive ReconnectAlarm but subId incorrect, ignore"); 4341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 4351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ApnContext apnContext = mApnContexts.get(apnType); 4381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 4401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("onActionIntentReconnectAlarm: mState=" + mState + " reason=" + reason + 4411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " apnType=" + apnType + " apnContext=" + apnContext + 4421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " mDataConnectionAsyncChannels=" + mDataConnectionAcHashMap); 4431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((apnContext != null) && (apnContext.isEnabled())) { 4461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu apnContext.setReason(reason); 4471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.State apnContextState = apnContext.getState(); 4481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 4491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("onActionIntentReconnectAlarm: apnContext state=" + apnContextState); 4501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((apnContextState == DctConstants.State.FAILED) 4521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || (apnContextState == DctConstants.State.IDLE)) { 4531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 4541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("onActionIntentReconnectAlarm: state is FAILED|IDLE, disassociate"); 4551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DcAsyncChannel dcac = apnContext.getDcAc(); 4571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dcac != null) { 4581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 4591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("onActionIntentReconnectAlarm: tearDown apnContext=" + apnContext); 4601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dcac.tearDown(apnContext, "", null); 4621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu apnContext.setDataConnectionAc(null); 4641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu apnContext.setState(DctConstants.State.IDLE); 4651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 4661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("onActionIntentReconnectAlarm: keep associated"); 4671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // TODO: IF already associated should we send the EVENT_TRY_SETUP_DATA??? 4691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(obtainMessage(DctConstants.EVENT_TRY_SETUP_DATA, apnContext)); 4701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu apnContext.setReconnectIntent(null); 4721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onActionIntentDataStallAlarm(Intent intent) { 4761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) log("onActionIntentDataStallAlarm: action=" + intent.getAction()); 4771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message msg = obtainMessage(DctConstants.EVENT_DATA_STALL_ALARM, 4781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu intent.getAction()); 4791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.arg1 = intent.getIntExtra(DATA_STALL_ALARM_TAG_EXTRA, 0); 4801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(msg); 4811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final ConnectivityManager mCm; 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 485b3a03455be44a2a0ffbeb757b193d860c1878599Naveen Kalla /** 486a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * List of messages that are waiting to be posted, when data call disconnect 487a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * is complete 488a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 489a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private ArrayList<Message> mDisconnectAllCompleteMsgList = new ArrayList<Message>(); 490a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 491a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private RegistrantList mAllDataDisconnectedRegistrants = new RegistrantList(); 492a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 4931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // member variables 4941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final Phone mPhone; 4951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final UiccController mUiccController; 4961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>(); 4971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private DctConstants.Activity mActivity = DctConstants.Activity.NONE; 4981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private DctConstants.State mState = DctConstants.State.IDLE; 4991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final Handler mDataConnectionTracker; 5001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private long mTxPkts; 5021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private long mRxPkts; 5031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private int mNetStatPollPeriod; 5041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mNetStatPollEnabled = false; 5051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private TxRxSum mDataStallTxRxSum = new TxRxSum(0, 0); 5071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Used to track stale data stall alarms. 5081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private int mDataStallAlarmTag = (int) SystemClock.elapsedRealtime(); 5091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // The current data stall alarm intent 5101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private PendingIntent mDataStallAlarmIntent = null; 5111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Number of packets sent since the last received packet 5121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private long mSentSinceLastRecv; 5131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Controls when a simple recovery attempt it to be tried 5141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private int mNoRecvPollCount = 0; 5150e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // Reference counter for enabling fail fast 5161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static int sEnableFailFastRefCounter = 0; 5171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // True if data stall detection is enabled 5181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private volatile boolean mDataStallDetectionEnabled = true; 5191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private volatile boolean mFailFast = false; 5211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // True when in voice call 5231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mInVoiceCall = false; 5241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // wifi connection status will be updated by sticky intent 5261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mIsWifiConnected = false; 5271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** Intent sent when the reconnect alarm fires. */ 5291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private PendingIntent mReconnectIntent = null; 5301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // When false we will not auto attach and manually attaching is required. 5321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mAutoAttachOnCreationConfig = false; 5331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private AtomicBoolean mAutoAttachOnCreation = new AtomicBoolean(false); 5341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // State of screen 5361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // (TODO: Reconsider tying directly to screen, maybe this is 5371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // really a lower power mode") 5381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mIsScreenOn = true; 5391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Indicates if we found mvno-specific APNs in the full APN list. 5411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // used to determine if we can accept mno-specific APN for tethering. 5421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mMvnoMatched = false; 5431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** Allows the generation of unique Id's for DataConnection objects */ 5451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private AtomicInteger mUniqueIdGenerator = new AtomicInteger(0); 5461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** The data connections. */ 5481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private HashMap<Integer, DataConnection> mDataConnections = 5491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu new HashMap<Integer, DataConnection>(); 5501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** The data connection async channels */ 5521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private HashMap<Integer, DcAsyncChannel> mDataConnectionAcHashMap = 5531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu new HashMap<Integer, DcAsyncChannel>(); 5541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** Convert an ApnType string to Id (TODO: Use "enumeration" instead of String for ApnType) */ 5561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private HashMap<String, Integer> mApnToDataConnectionId = new HashMap<String, Integer>(); 5571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** Phone.APN_TYPE_* ===> ApnContext */ 5591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final ConcurrentHashMap<String, ApnContext> mApnContexts = 5601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu new ConcurrentHashMap<String, ApnContext>(); 5611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 562af5593594070f825032be46dced573cd195956e1Robert Greenwalt private final SparseArray<ApnContext> mApnContextsById = new SparseArray<ApnContext>(); 563af5593594070f825032be46dced573cd195956e1Robert Greenwalt 5641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private int mDisconnectPendingCount = 0; 565a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 566a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 567cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Handles changes to the APN db. 568b3a03455be44a2a0ffbeb757b193d860c1878599Naveen Kalla */ 569cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private class ApnChangeObserver extends ContentObserver { 570cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public ApnChangeObserver () { 571cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville super(mDataConnectionTracker); 572cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 574cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 575cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public void onChange(boolean selfChange) { 576cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville sendMessage(obtainMessage(DctConstants.EVENT_APN_CHANGED)); 577cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 578cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 580cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville //***** Instance Variables 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 582cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private boolean mReregisterOnReconnectFailure = false; 583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 585cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville //***** Constants 586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 587ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Used by puppetmaster/*/radio_stress.py 588ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String PUPPET_MASTER_RADIO_STRESS_TEST = "gsm.defaultpdpcontext.active"; 589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 590ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final int POLL_PDP_MILLIS = 5 * 1000; 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5922b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen private static final int PROVISIONING_SPINNER_TIMEOUT_MILLIS = 120 * 1000; 5932b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen 5946bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville static final Uri PREFERAPN_NO_UPDATE_URI_USING_SUBID = 5956bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville Uri.parse("content://telephony/carriers/preferapn_no_update/subId/"); 596cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville static final String APN_ID = "apn_id"; 597cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 598ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private boolean mCanSetPreferApn = false; 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 600187a39f896f88eb6c5e4306d9595546654825976Wink Saville private AtomicBoolean mAttached = new AtomicBoolean(false); 601187a39f896f88eb6c5e4306d9595546654825976Wink Saville 602cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /** Watches for changes to the APN db. */ 603cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private ApnChangeObserver mApnObserver; 604cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 605b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen private final String mProvisionActionName; 606b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen private BroadcastReceiver mProvisionBroadcastReceiver; 6072b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen private ProgressDialog mProvisioningSpinner; 608b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen 609a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean mImsRegistrationState = false; 610a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 611cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville //***** Constructor 6121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public DcTracker(Phone phone) { 6131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super(); 6141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone = phone; 6151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("DCT.constructor"); 6171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mResolver = mPhone.getContext().getContentResolver(); 6191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUiccController = UiccController.getInstance(); 6201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUiccController.registerForIccChanged(this, DctConstants.EVENT_ICC_CHANGED, null); 6211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mAlarmManager = 6221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE); 6231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCm = (ConnectivityManager) mPhone.getContext().getSystemService( 6241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Context.CONNECTIVITY_SERVICE); 6251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IntentFilter filter = new IntentFilter(); 6281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu filter.addAction(Intent.ACTION_SCREEN_ON); 6291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu filter.addAction(Intent.ACTION_SCREEN_OFF); 6301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 6311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 6321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu filter.addAction(INTENT_DATA_STALL_ALARM); 6331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu filter.addAction(INTENT_PROVISIONING_APN_ALARM); 6341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // TODO - redundent with update call below? 6361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUserDataEnabled = getDataEnabled(); 6371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone); 6391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext()); 6411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mAutoAttachOnCreation.set(sp.getBoolean(Phone.DATA_DISABLED_ON_BOOT_KEY, false)); 6421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSubscriptionManager = SubscriptionManager.from(mPhone.getContext()); 6441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener); 6451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu HandlerThread dcHandlerThread = new HandlerThread("DcHandlerThread"); 6471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dcHandlerThread.start(); 6481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Handler dcHandler = new Handler(dcHandlerThread.getLooper()); 6491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDcc = DcController.makeDcc(mPhone, this, dcHandler); 6501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDcTesterFailBringUpAll = new DcTesterFailBringUpAll(mPhone, dcHandler); 651cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 652cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mDataConnectionTracker = this; 653c374098c17a81f73f51e9d7df99eba574882949bYifan Bai registerForAllEvents(); 654a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville update(); 655cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mApnObserver = new ApnChangeObserver(); 6561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu phone.getContext().getContentResolver().registerContentObserver( 657cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Telephony.Carriers.CONTENT_URI, true, mApnObserver); 658cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 659d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt initApnContexts(); 660d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt 661d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt for (ApnContext apnContext : mApnContexts.values()) { 662d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt // Register the reconnect and restart actions. 6631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu filter = new IntentFilter(); 664d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt filter.addAction(INTENT_RECONNECT_ALARM + '.' + apnContext.getApnType()); 665d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone); 666d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt } 667d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt 66876f43316a5a6082d601bffd4b6898d0bd81e11fcram // Add Emergency APN to APN setting list by default to support EPDN in sim absent cases 66976f43316a5a6082d601bffd4b6898d0bd81e11fcram initEmergencyApnSetting(); 67076f43316a5a6082d601bffd4b6898d0bd81e11fcram addEmergencyApnSetting(); 671b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen 6721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mProvisionActionName = "com.android.internal.telephony.PROVISION" + phone.getPhoneId(); 673f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt 674f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mSettingsObserver = new SettingsObserver(mPhone.getContext(), this); 675f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt registerSettingsObserver(); 6761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 678af5593594070f825032be46dced573cd195956e1Robert Greenwalt @VisibleForTesting 679af5593594070f825032be46dced573cd195956e1Robert Greenwalt public DcTracker() { 680af5593594070f825032be46dced573cd195956e1Robert Greenwalt mAlarmManager = null; 681af5593594070f825032be46dced573cd195956e1Robert Greenwalt mCm = null; 682af5593594070f825032be46dced573cd195956e1Robert Greenwalt mPhone = null; 683af5593594070f825032be46dced573cd195956e1Robert Greenwalt mUiccController = null; 684af5593594070f825032be46dced573cd195956e1Robert Greenwalt mDataConnectionTracker = null; 685af5593594070f825032be46dced573cd195956e1Robert Greenwalt mProvisionActionName = null; 686f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mSettingsObserver = new SettingsObserver(null, this); 687af5593594070f825032be46dced573cd195956e1Robert Greenwalt } 688af5593594070f825032be46dced573cd195956e1Robert Greenwalt 6891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void registerServiceStateTrackerEvents() { 6901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().registerForDataConnectionAttached(this, 6911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null); 6921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().registerForDataConnectionDetached(this, 6931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.EVENT_DATA_CONNECTION_DETACHED, null); 6941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().registerForDataRoamingOn(this, 6951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.EVENT_ROAMING_ON, null); 6961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().registerForDataRoamingOff(this, 6971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.EVENT_ROAMING_OFF, null); 6981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().registerForPsRestrictedEnabled(this, 6991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.EVENT_PS_RESTRICT_ENABLED, null); 7001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().registerForPsRestrictedDisabled(this, 7011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.EVENT_PS_RESTRICT_DISABLED, null); 7021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(this, 7031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.EVENT_DATA_RAT_CHANGED, null); 704cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void unregisterServiceStateTrackerEvents() { 7071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().unregisterForDataConnectionAttached(this); 7081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().unregisterForDataConnectionDetached(this); 7091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().unregisterForDataRoamingOn(this); 7101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().unregisterForDataRoamingOff(this); 7111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().unregisterForPsRestrictedEnabled(this); 7121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().unregisterForPsRestrictedDisabled(this); 7131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(this); 7141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void registerForAllEvents() { 717a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.mCi.registerForAvailable(this, DctConstants.EVENT_RADIO_AVAILABLE, null); 718a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.mCi.registerForOffOrNotAvailable(this, 7199c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu DctConstants.EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); 720a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.mCi.registerForDataNetworkStateChanged(this, 7219c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu DctConstants.EVENT_DATA_STATE_CHANGED, null); 7220710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // Note, this is fragile - the Phone is now presenting a merged picture 7230710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // of PS (volte) & CS and by diving into its internals you're just seeing 7240710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // the CS data. This works well for the purposes this is currently used for 7250710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // but that may not always be the case. Should probably be redesigned to 7260710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // accurately reflect what we're really interested in (registerForCSVoiceCallEnded). 7271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getCallTracker().registerForVoiceCallEnded(this, 7281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.EVENT_VOICE_CALL_ENDED, null); 7291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getCallTracker().registerForVoiceCallStarted(this, 7301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.EVENT_VOICE_CALL_STARTED, null); 7311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu registerServiceStateTrackerEvents(); 732a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // SubscriptionManager.registerForDdsSwitch(this, 733a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // DctConstants.EVENT_CLEAN_UP_ALL_CONNECTIONS, null); 734a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 7351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 736cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public void dispose() { 7371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("DCT.dispose"); 7384dfda5470a2582c0fb543ead6c79ccf598c580e0Robert Greenwalt 739b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen if (mProvisionBroadcastReceiver != null) { 740b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen mPhone.getContext().unregisterReceiver(mProvisionBroadcastReceiver); 741b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen mProvisionBroadcastReceiver = null; 742b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen } 7432b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen if (mProvisioningSpinner != null) { 7442b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner.dismiss(); 7452b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner = null; 7462b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen } 747b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen 748cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cleanUpAllConnections(true, null); 749cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 7501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (DcAsyncChannel dcac : mDataConnectionAcHashMap.values()) { 7511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dcac.disconnect(); 7521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDataConnectionAcHashMap.clear(); 7541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsDisposed = true; 7551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getContext().unregisterReceiver(mIntentReceiver); 7561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUiccController.unregisterForIccChanged(this); 757f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt mSettingsObserver.unobserve(); 758f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt 7591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSubscriptionManager 7601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu .removeOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener); 7611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDcc.dispose(); 7621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDcTesterFailBringUpAll.dispose(); 763cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 764a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.getContext().getContentResolver().unregisterContentObserver(mApnObserver); 765a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mApnContexts.clear(); 766af5593594070f825032be46dced573cd195956e1Robert Greenwalt mApnContextsById.clear(); 767a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPrioritySortedApnContexts.clear(); 768c374098c17a81f73f51e9d7df99eba574882949bYifan Bai unregisterForAllEvents(); 769a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 770a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville destroyDataConnections(); 771a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 7721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void unregisterForAllEvents() { 774a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Unregister for all events 77522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.mCi.unregisterForAvailable(this); 77622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.mCi.unregisterForOffOrNotAvailable(this); 777cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville IccRecords r = mIccRecords.get(); 778a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (r != null) { 779a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville r.unregisterForRecordsLoaded(this); 780a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIccRecords.set(null); 781a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 78222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.mCi.unregisterForDataNetworkStateChanged(this); 783cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.getCallTracker().unregisterForVoiceCallEnded(this); 784cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.getCallTracker().unregisterForVoiceCallStarted(this); 7851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu unregisterServiceStateTrackerEvents(); 786a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //SubscriptionManager.unregisterForDdsSwitch(this); 787cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 788cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 7891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 7901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Called when EVENT_RESET_DONE is received so goto 7911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * IDLE state and send notifications to those interested. 7921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 7931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * TODO - currently unused. Needs to be hooked into DataConnection cleanup 7941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * TODO - needs to pass some notion of which connection is reset.. 7951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 7961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onResetDone(AsyncResult ar) { 7971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("EVENT_RESET_DONE"); 7981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String reason = null; 7991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.userObj instanceof String) { 8001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu reason = (String) ar.userObj; 8011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu gotoIdleAndNotifyDataConnection(reason); 8031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 8061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Modify {@link android.provider.Settings.Global#MOBILE_DATA} value. 8071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 8081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setDataEnabled(boolean enable) { 8091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message msg = obtainMessage(DctConstants.CMD_SET_USER_DATA_ENABLE); 8101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.arg1 = enable ? 1 : 0; 8111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("setDataEnabled: sendMessage: enable=" + enable); 8121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(msg); 8131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onSetUserDataEnabled(boolean enabled) { 8161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu synchronized (mDataEnabledLock) { 8171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mUserDataEnabled != enabled) { 8181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUserDataEnabled = enabled; 8191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // For single SIM phones, this is a per phone property. 8211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (TelephonyManager.getDefault().getSimCount() == 1) { 8221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.putInt(mResolver, Settings.Global.MOBILE_DATA, enabled ? 1 : 0); 8231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 8241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int phoneSubId = mPhone.getSubId(); 8251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.putInt(mResolver, Settings.Global.MOBILE_DATA + phoneSubId, 8261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu enabled ? 1 : 0); 8271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getDataOnRoamingEnabled() == false && 8291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceState().getDataRoaming() == true) { 8301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (enabled) { 8311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON); 8321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 8331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu notifyOffApnsOfAvailability(Phone.REASON_DATA_DISABLED); 8341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (enabled) { 8381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onTrySetupData(Phone.REASON_DATA_ENABLED); 8391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 8401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onCleanUpAllConnections(Phone.REASON_DATA_SPECIFIC_DISABLED); 8411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 846f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt private void onDeviceProvisionedChange() { 847f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt if (getDataEnabled()) { 84880d38fe5c8f18997623b1133e4650c4a9a6e299cRobert Greenwalt mUserDataEnabled = true; 849f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt onTrySetupData(Phone.REASON_DATA_ENABLED); 850f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } else { 85180d38fe5c8f18997623b1133e4650c4a9a6e299cRobert Greenwalt mUserDataEnabled = false; 852f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt onCleanUpAllConnections(Phone.REASON_DATA_SPECIFIC_DISABLED); 853f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } 854f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } 8551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public long getSubId() { 8581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mPhone.getSubId(); 8591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public DctConstants.Activity getActivity() { 8621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mActivity; 8631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void setActivity(DctConstants.Activity activity) { 8661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("setActivity = " + activity); 8671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mActivity = activity; 8681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.notifyDataActivity(); 8691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 871af5593594070f825032be46dced573cd195956e1Robert Greenwalt public void requestNetwork(NetworkRequest networkRequest, LocalLog log) { 872af5593594070f825032be46dced573cd195956e1Robert Greenwalt final int apnId = ApnContext.apnIdForNetworkRequest(networkRequest); 873af5593594070f825032be46dced573cd195956e1Robert Greenwalt final ApnContext apnContext = mApnContextsById.get(apnId); 874af5593594070f825032be46dced573cd195956e1Robert Greenwalt log.log("DcTracker.requestNetwork for " + networkRequest + " found " + apnContext); 875af5593594070f825032be46dced573cd195956e1Robert Greenwalt if (apnContext != null) apnContext.incRefCount(log); 876af5593594070f825032be46dced573cd195956e1Robert Greenwalt } 877af5593594070f825032be46dced573cd195956e1Robert Greenwalt 878af5593594070f825032be46dced573cd195956e1Robert Greenwalt public void releaseNetwork(NetworkRequest networkRequest, LocalLog log) { 879af5593594070f825032be46dced573cd195956e1Robert Greenwalt final int apnId = ApnContext.apnIdForNetworkRequest(networkRequest); 880af5593594070f825032be46dced573cd195956e1Robert Greenwalt final ApnContext apnContext = mApnContextsById.get(apnId); 881af5593594070f825032be46dced573cd195956e1Robert Greenwalt log.log("DcTracker.releaseNetwork for " + networkRequest + " found " + apnContext); 882af5593594070f825032be46dced573cd195956e1Robert Greenwalt if (apnContext != null) apnContext.decRefCount(log); 883af5593594070f825032be46dced573cd195956e1Robert Greenwalt } 884af5593594070f825032be46dced573cd195956e1Robert Greenwalt 885bda761320929f714951c328bfec6a51a1978db97Wink Saville public boolean isApnSupported(String name) { 88691bce2abae052df918cb546b9c5d205706ede026Shishir Agrawal if (name == null) { 88791bce2abae052df918cb546b9c5d205706ede026Shishir Agrawal loge("isApnSupported: name=null"); 88891bce2abae052df918cb546b9c5d205706ede026Shishir Agrawal return false; 88991bce2abae052df918cb546b9c5d205706ede026Shishir Agrawal } 890bda761320929f714951c328bfec6a51a1978db97Wink Saville ApnContext apnContext = mApnContexts.get(name); 891bda761320929f714951c328bfec6a51a1978db97Wink Saville if (apnContext == null) { 892bda761320929f714951c328bfec6a51a1978db97Wink Saville loge("Request for unsupported mobile name: " + name); 893bda761320929f714951c328bfec6a51a1978db97Wink Saville return false; 894071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt } 895bda761320929f714951c328bfec6a51a1978db97Wink Saville return true; 896bda761320929f714951c328bfec6a51a1978db97Wink Saville } 897071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt 898bda761320929f714951c328bfec6a51a1978db97Wink Saville public int getApnPriority(String name) { 899071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt ApnContext apnContext = mApnContexts.get(name); 900071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt if (apnContext == null) { 901bda761320929f714951c328bfec6a51a1978db97Wink Saville loge("Request for unsupported mobile name: " + name); 902071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt } 903bda761320929f714951c328bfec6a51a1978db97Wink Saville return apnContext.priority; 904071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt } 905071b9f85ac559a35430ed37c03a66271977b9d17Robert Greenwalt 906b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // Turn telephony radio on or off. 907b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen private void setRadio(boolean on) { 908b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen final ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); 909b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen try { 910b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen phone.setRadio(on); 911b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen } catch (Exception e) { 912b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // Ignore. 913b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen } 914b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen } 915b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen 916b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // Class to handle Intent dispatched with user selects the "Sign-in to network" 917b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // notification. 918b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen private class ProvisionNotificationBroadcastReceiver extends BroadcastReceiver { 9192b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen private final String mNetworkOperator; 920b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // Mobile provisioning URL. Valid while provisioning notification is up. 921b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // Set prior to notification being posted as URL contains ICCID which 922b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // disappears when radio is off (which is the case when notification is up). 923b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen private final String mProvisionUrl; 924b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen 9252b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen public ProvisionNotificationBroadcastReceiver(String provisionUrl, String networkOperator) { 9262b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mNetworkOperator = networkOperator; 927b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen mProvisionUrl = provisionUrl; 928b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen } 929b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen 930b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen private void setEnableFailFastMobileData(int enabled) { 9316395443719ec3ee0257085945e753d02f603886bRobert Greenwalt sendMessage(obtainMessage(DctConstants.CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA, enabled, 0)); 932b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen } 933b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen 934b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen private void enableMobileProvisioning() { 935b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen final Message msg = obtainMessage(DctConstants.CMD_ENABLE_MOBILE_PROVISIONING); 936b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen msg.setData(Bundle.forPair(DctConstants.PROVISIONING_URL_KEY, mProvisionUrl)); 937b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen sendMessage(msg); 938b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen } 939b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen 940b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen @Override 941b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen public void onReceive(Context context, Intent intent) { 9422b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen // Turning back on the radio can take time on the order of a minute, so show user a 9432b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen // spinner so they know something is going on. 9442b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner = new ProgressDialog(context); 9452b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner.setTitle(mNetworkOperator); 9462b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner.setMessage( 9472b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen // TODO: Don't borrow "Connecting..." i18n string; give Telephony a version. 9482b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen context.getText(com.android.internal.R.string.media_route_status_connecting)); 9492b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner.setIndeterminate(true); 9502b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner.setCancelable(true); 9512b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen // Allow non-Activity Service Context to create a View. 9522b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner.getWindow().setType( 9532b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 9542b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner.show(); 9552b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen // After timeout, hide spinner so user can at least use their device. 9562b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen // TODO: Indicate to user that it is taking an unusually long time to connect? 9572b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen sendMessageDelayed(obtainMessage(DctConstants.CMD_CLEAR_PROVISIONING_SPINNER, 9582b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner), PROVISIONING_SPINNER_TIMEOUT_MILLIS); 959b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // This code is almost identical to the old 960b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // ConnectivityService.handleMobileProvisioningAction code. 961b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen setRadio(true); 962b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen setEnableFailFastMobileData(DctConstants.ENABLED); 963b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen enableMobileProvisioning(); 964b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen } 965b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen } 966b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen 967cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public boolean isApnTypeActive(String type) { 968cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnContext apnContext = mApnContexts.get(type); 969cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext == null) return false; 970cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 971ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return (apnContext.getDcAc() != null); 972cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 973cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 974cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public boolean isDataPossible(String apnType) { 975cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnContext apnContext = mApnContexts.get(apnType); 976cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext == null) { 977cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 978cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 979cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean apnContextIsEnabled = apnContext.isEnabled(); 980cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville DctConstants.State apnContextState = apnContext.getState(); 981cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean apnTypePossible = !(apnContextIsEnabled && 982cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville (apnContextState == DctConstants.State.FAILED)); 983cf5205f70eb1eac497164124187a088ecb03fff5Ram boolean isEmergencyApn = apnContext.getApnType().equals(PhoneConstants.APN_TYPE_EMERGENCY); 984cf5205f70eb1eac497164124187a088ecb03fff5Ram // Set the emergency APN availability status as TRUE irrespective of conditions checked in 985cf5205f70eb1eac497164124187a088ecb03fff5Ram // isDataAllowed() like IN_SERVICE, MOBILE DATA status etc. 9869c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu boolean dataAllowed = isEmergencyApn || isDataAllowed(null); 987cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean possible = dataAllowed && apnTypePossible; 988cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 9890e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh if ((apnContext.getApnType().equals(PhoneConstants.APN_TYPE_DEFAULT) 9900e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh || apnContext.getApnType().equals(PhoneConstants.APN_TYPE_IA)) 9910e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh && (mPhone.getServiceState().getRilDataRadioTechnology() 9920e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) { 9930e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh log("Default data call activation not possible in iwlan."); 9940e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh possible = false; 9950e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh } 9960e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh 997ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 998cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log(String.format("isDataPossible(%s): possible=%b isDataAllowed=%b " + 999cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville "apnTypePossible=%b apnContextisEnabled=%b apnContextState()=%s", 1000cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnType, possible, dataAllowed, apnTypePossible, 1001cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContextIsEnabled, apnContextState)); 1002cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1003cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return possible; 1004cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1005cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1006cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1007cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void finalize() { 1008cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if(DBG) log("finalize"); 1009cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1010cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 10114a9b3afeb2ec4d573eca335a3706392ecf9f281eWink Saville private ApnContext addApnContext(String type, NetworkConfig networkConfig) { 10120e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu ApnContext apnContext = new ApnContext(mPhone, type, LOG_TAG, networkConfig, this); 1013cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mApnContexts.put(type, apnContext); 1014af5593594070f825032be46dced573cd195956e1Robert Greenwalt mApnContextsById.put(ApnContext.apnIdForApnName(type), apnContext); 10153fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt mPrioritySortedApnContexts.add(apnContext); 1016bce3d2575122929bb27ec8a37d56e96da39a3ca2Robert Greenwalt return apnContext; 1017cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1018c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 10191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void initApnContexts() { 1020d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt log("initApnContexts: E"); 1021d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt // Load device network attributes from resources 1022d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt String[] networkConfigStrings = mPhone.getContext().getResources().getStringArray( 1023d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt com.android.internal.R.array.networkAttributes); 1024d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt for (String networkConfigString : networkConfigStrings) { 1025d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt NetworkConfig networkConfig = new NetworkConfig(networkConfigString); 1026d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt ApnContext apnContext = null; 1027d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt 1028d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt switch (networkConfig.type) { 1029d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt case ConnectivityManager.TYPE_MOBILE: 1030d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt apnContext = addApnContext(PhoneConstants.APN_TYPE_DEFAULT, networkConfig); 1031d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt break; 1032d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt case ConnectivityManager.TYPE_MOBILE_MMS: 1033d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt apnContext = addApnContext(PhoneConstants.APN_TYPE_MMS, networkConfig); 1034d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt break; 1035d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt case ConnectivityManager.TYPE_MOBILE_SUPL: 1036d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt apnContext = addApnContext(PhoneConstants.APN_TYPE_SUPL, networkConfig); 1037d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt break; 1038d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt case ConnectivityManager.TYPE_MOBILE_DUN: 1039d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt apnContext = addApnContext(PhoneConstants.APN_TYPE_DUN, networkConfig); 1040d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt break; 1041d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt case ConnectivityManager.TYPE_MOBILE_HIPRI: 1042d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt apnContext = addApnContext(PhoneConstants.APN_TYPE_HIPRI, networkConfig); 1043d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt break; 1044d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt case ConnectivityManager.TYPE_MOBILE_FOTA: 1045d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt apnContext = addApnContext(PhoneConstants.APN_TYPE_FOTA, networkConfig); 1046d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt break; 1047d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt case ConnectivityManager.TYPE_MOBILE_IMS: 1048d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt apnContext = addApnContext(PhoneConstants.APN_TYPE_IMS, networkConfig); 1049d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt break; 1050d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt case ConnectivityManager.TYPE_MOBILE_CBS: 1051d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt apnContext = addApnContext(PhoneConstants.APN_TYPE_CBS, networkConfig); 1052d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt break; 1053d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt case ConnectivityManager.TYPE_MOBILE_IA: 1054d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt apnContext = addApnContext(PhoneConstants.APN_TYPE_IA, networkConfig); 1055d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt break; 1056cf5205f70eb1eac497164124187a088ecb03fff5Ram case ConnectivityManager.TYPE_MOBILE_EMERGENCY: 1057cf5205f70eb1eac497164124187a088ecb03fff5Ram apnContext = addApnContext(PhoneConstants.APN_TYPE_EMERGENCY, networkConfig); 1058cf5205f70eb1eac497164124187a088ecb03fff5Ram break; 1059d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt default: 1060d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt log("initApnContexts: skipping unknown type=" + networkConfig.type); 1061d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt continue; 1062d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt } 1063d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt log("initApnContexts: apnContext=" + apnContext); 1064d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt } 1065092e6bd60f1a4a3a55fb73ad0efca1122b8e15e2Jack Yu 1066092e6bd60f1a4a3a55fb73ad0efca1122b8e15e2Jack Yu if (VDBG) log("initApnContexts: X mApnContexts=" + mApnContexts); 1067d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt } 1068d32b58c8e7cea693c98f49b2291455e917cd9301Robert Greenwalt 1069cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public LinkProperties getLinkProperties(String apnType) { 1070cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnContext apnContext = mApnContexts.get(apnType); 1071cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext != null) { 1072454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcAsyncChannel dcac = apnContext.getDcAc(); 1073cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (dcac != null) { 1074cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("return link properites for " + apnType); 1075cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return dcac.getLinkPropertiesSync(); 1076cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1077cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1078cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("return new LinkProperties"); 1079cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return new LinkProperties(); 1080cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1081cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 1082608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt public NetworkCapabilities getNetworkCapabilities(String apnType) { 1083608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt ApnContext apnContext = mApnContexts.get(apnType); 1084608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt if (apnContext!=null) { 1085608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt DcAsyncChannel dataConnectionAc = apnContext.getDcAc(); 1086608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt if (dataConnectionAc != null) { 1087608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt if (DBG) { 1088608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt log("get active pdp is not null, return NetworkCapabilities for " + apnType); 1089608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt } 1090608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt return dataConnectionAc.getNetworkCapabilitiesSync(); 1091608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt } 1092608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt } 1093608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt if (DBG) log("return new NetworkCapabilities"); 1094608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt return new NetworkCapabilities(); 1095608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt } 1096cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1097cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Return all active apn types 1098cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public String[] getActiveApnTypes() { 1099cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("get all active apn types"); 1100cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ArrayList<String> result = new ArrayList<String>(); 1101cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 1102cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville for (ApnContext apnContext : mApnContexts.values()) { 1103187a39f896f88eb6c5e4306d9595546654825976Wink Saville if (mAttached.get() && apnContext.isReady()) { 1104cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville result.add(apnContext.getApnType()); 1105cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 1106cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 1107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1108cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return result.toArray(new String[0]); 1109cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1110cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1111cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Return active apn of specific apn type 1112cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public String getActiveApnString(String apnType) { 1113ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log( "get active apn string for type:" + apnType); 1114cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnContext apnContext = mApnContexts.get(apnType); 1115cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext != null) { 1116cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnSetting apnSetting = apnContext.getApnSetting(); 1117cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnSetting != null) { 1118cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return apnSetting.apn; 1119cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1120cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1121cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return null; 1122cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1123cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1124cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public boolean isApnTypeEnabled(String apnType) { 1125cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnContext apnContext = mApnContexts.get(apnType); 1126cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext == null) { 1127cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 1128cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1129cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return apnContext.isEnabled(); 1130cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1131cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 11321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void setState(DctConstants.State s) { 1133cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("setState should not be used in GSM" + s); 1134cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1135cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1136cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Return state of specific apn type 1137cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public DctConstants.State getState(String apnType) { 1138cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnContext apnContext = mApnContexts.get(apnType); 1139cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext != null) { 1140cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return apnContext.getState(); 1141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1142cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return DctConstants.State.FAILED; 1143cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1145c9b81a0c05128694c617fcdd67e73821895822feWink Saville // Return if apn type is a provisioning apn. 11461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean isProvisioningApn(String apnType) { 1147c9b81a0c05128694c617fcdd67e73821895822feWink Saville ApnContext apnContext = mApnContexts.get(apnType); 1148c9b81a0c05128694c617fcdd67e73821895822feWink Saville if (apnContext != null) { 1149c9b81a0c05128694c617fcdd67e73821895822feWink Saville return apnContext.isProvisioningApn(); 1150c9b81a0c05128694c617fcdd67e73821895822feWink Saville } 1151c9b81a0c05128694c617fcdd67e73821895822feWink Saville return false; 1152c9b81a0c05128694c617fcdd67e73821895822feWink Saville } 1153c9b81a0c05128694c617fcdd67e73821895822feWink Saville 1154cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Return state of overall 1155cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public DctConstants.State getOverallState() { 1156cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean isConnecting = false; 1157cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean isFailed = true; // All enabled Apns should be FAILED. 1158cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean isAnyEnabled = false; 1159cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1160cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville for (ApnContext apnContext : mApnContexts.values()) { 1161cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext.isEnabled()) { 1162cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville isAnyEnabled = true; 1163cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville switch (apnContext.getState()) { 1164cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case CONNECTED: 1165cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case DISCONNECTING: 11661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) log("overall state is CONNECTED"); 1167cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return DctConstants.State.CONNECTED; 1168ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case RETRYING: 1169cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case CONNECTING: 1170cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville isConnecting = true; 1171cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville isFailed = false; 1172cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 1173cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case IDLE: 1174cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case SCANNING: 1175cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville isFailed = false; 1176cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 1177cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville default: 1178cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville isAnyEnabled = true; 1179cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 1180cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1181cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1184cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (!isAnyEnabled) { // Nothing enabled. return IDLE. 11851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) log( "overall state is IDLE"); 1186cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return DctConstants.State.IDLE; 1187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1189cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (isConnecting) { 11901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) log( "overall state is CONNECTING"); 1191cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return DctConstants.State.CONNECTING; 1192cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else if (!isFailed) { 11931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) log( "overall state is IDLE"); 1194cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return DctConstants.State.IDLE; 1195cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 11961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) log( "overall state is FAILED"); 1197cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return DctConstants.State.FAILED; 1198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1201cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /** 1202cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Report on whether data connectivity is enabled for any APN. 1203cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return {@code false} if data connectivity has been explicitly disabled, 1204cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * {@code true} otherwise. 1205cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */ 1206cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public boolean getAnyDataEnabled() { 1207cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville synchronized (mDataEnabledLock) { 1208cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (!(mInternalDataEnabled && mUserDataEnabled && sPolicyDataEnabled)) return false; 12099c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu StringBuilder failureReason = new StringBuilder(); 12109c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (!isDataAllowed(failureReason)) { 12119c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (DBG) log(failureReason.toString()); 12129c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu return false; 12139c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu } 1214cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville for (ApnContext apnContext : mApnContexts.values()) { 1215cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Make sure we don't have a context that is going down 1216cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // and is explicitly disabled. 12179c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (isDataAllowedForApn(apnContext)) { 1218cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 1219cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1220cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1221cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 1222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean getAnyDataEnabled(boolean checkUserDataEnabled) { 1226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mDataEnabledLock) { 1227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!(mInternalDataEnabled && (!checkUserDataEnabled || mUserDataEnabled) 1228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville && (!checkUserDataEnabled || sPolicyDataEnabled))) 1229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 1230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 12319c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu StringBuilder failureReason = new StringBuilder(); 12329c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (!isDataAllowed(failureReason)) { 12339c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (DBG) log(failureReason.toString()); 12349c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu return false; 12359c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu } 1236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (ApnContext apnContext : mApnContexts.values()) { 1237a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Make sure we dont have a context that going down 1238a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // and is explicitly disabled. 12399c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (isDataAllowedForApn(apnContext)) { 1240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 1241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 1244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 12479c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu private boolean isDataAllowedForApn(ApnContext apnContext) { 12480e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh //If RAT is iwlan then dont allow default/IA PDP at all. 12490e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh //Rest of APN types can be evaluated for remaining conditions. 12500e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh if ((apnContext.getApnType().equals(PhoneConstants.APN_TYPE_DEFAULT) 12510e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh || apnContext.getApnType().equals(PhoneConstants.APN_TYPE_IA)) 12520e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh && (mPhone.getServiceState().getRilDataRadioTechnology() 12530e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) { 12540e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh log("Default data call activation not allowed in iwlan."); 12550e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh return false; 12560e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh } 12579c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu 12589c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu return apnContext.isReady(); 1259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1261cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville //****** Called from ServiceStateTracker 1262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1263cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Invoked when ServiceStateTracker observes a transition from GPRS 1264cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * attach to detach. 1265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 12661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onDataConnectionDetached() { 1267cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /* 1268cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * We presently believe it is unnecessary to tear down the PDP context 1269cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * when GPRS detaches, but we should stop the network polling. 1270cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */ 1271cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log ("onDataConnectionDetached: stop polling and notify detached"); 1272cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville stopNetStatPoll(); 1273cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville stopDataStallAlarm(); 1274cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyDataConnection(Phone.REASON_DATA_DETACHED); 1275187a39f896f88eb6c5e4306d9595546654825976Wink Saville mAttached.set(false); 1276cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1278cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private void onDataConnectionAttached() { 1279cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onDataConnectionAttached"); 12807ab10e4710bdb54c6d9a5ee01cd443a42a2689f5Sungmin Choi mAttached.set(true); 1281cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (getOverallState() == DctConstants.State.CONNECTED) { 1282cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onDataConnectionAttached: start polling notify attached"); 1283cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville startNetStatPoll(); 1284cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); 1285cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyDataConnection(Phone.REASON_DATA_ATTACHED); 1286cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 1287cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // update APN availability so that APN can be enabled. 1288cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyOffApnsOfAvailability(Phone.REASON_DATA_ATTACHED); 1289cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 129012fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao if (mAutoAttachOnCreationConfig) { 1291aacc11b299ac047e73e1e712aa396ea0a6a80158Robert Greenwalt mAutoAttachOnCreation.set(true); 129212fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao } 1293ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setupDataOnConnectableApns(Phone.REASON_DATA_ATTACHED); 1294cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12969c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu private boolean isDataAllowed(StringBuilder failureReason) { 1297cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville final boolean internalDataEnabled; 1298cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville synchronized (mDataEnabledLock) { 1299cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville internalDataEnabled = mInternalDataEnabled; 1300cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1301cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 13029894b3fb2f35e21d9cfd45f233ed093589e14c26sy.yun boolean attachedState = mAttached.get(); 1303cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean desiredPowerState = mPhone.getServiceStateTracker().getDesiredPowerState(); 13040e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh int radioTech = mPhone.getServiceState().getRilDataRadioTechnology(); 13050e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh if (radioTech == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN) { 13060e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh desiredPowerState = true; 13070e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh } 13080e42864afb21261d6bd2e9b4aa97f6d01d039a25Yashdev Singh 1309cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville IccRecords r = mIccRecords.get(); 13102b0f0da4f9fe8449c578632b491e2f158c201bd5Stuart Scott boolean recordsLoaded = false; 13112b0f0da4f9fe8449c578632b491e2f158c201bd5Stuart Scott if (r != null) { 13122b0f0da4f9fe8449c578632b491e2f158c201bd5Stuart Scott recordsLoaded = r.getRecordsLoaded(); 13139232dafa7ea833fc0b3a6024d6c7e23fc8e961eaRobert Greenwalt if (DBG && !recordsLoaded) log("isDataAllowed getRecordsLoaded=" + recordsLoaded); 13142b0f0da4f9fe8449c578632b491e2f158c201bd5Stuart Scott } 1315cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 131638ca51d0f643405df51e78fce6c546424e9f410dShishir Agrawal int dataSub = SubscriptionManager.getDefaultDataSubscriptionId(); 1317434fa420329b093f68d83862a637c7ded93a4dafCraig Lafayette boolean defaultDataSelected = SubscriptionManager.isValidSubscriptionId(dataSub); 1318b79f845a0451895b0f0b8a926a8571511d476ce8Libin.Tang@motorola.com PhoneConstants.State state = PhoneConstants.State.IDLE; 13190710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // Note this is explicitly not using mPhone.getState. See b/19090488. 13200710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // mPhone.getState reports the merge of CS and PS (volte) voice call state 13210710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // but we only care about CS calls here for data/voice concurrency issues. 13220710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // Calling getCallTracker currently gives you just the CS side where the 13230710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // ImsCallTracker is held internally where applicable. 13240710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // This should be redesigned to ask explicitly what we want: 13250710ff7ae80f217782f08528c5406f6d26a29f75Robert Greenwalt // voiceCallStateAllowDataCall, or dataCallAllowed or something similar. 1326b79f845a0451895b0f0b8a926a8571511d476ce8Libin.Tang@motorola.com if (mPhone.getCallTracker() != null) { 1327b79f845a0451895b0f0b8a926a8571511d476ce8Libin.Tang@motorola.com state = mPhone.getCallTracker().getState(); 1328b79f845a0451895b0f0b8a926a8571511d476ce8Libin.Tang@motorola.com } 13291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1330cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean allowed = 1331aacc11b299ac047e73e1e712aa396ea0a6a80158Robert Greenwalt (attachedState || mAutoAttachOnCreation.get()) && 1332cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville recordsLoaded && 1333b79f845a0451895b0f0b8a926a8571511d476ce8Libin.Tang@motorola.com (state == PhoneConstants.State.IDLE || 1334cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) && 1335cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville internalDataEnabled && 13362b0f0da4f9fe8449c578632b491e2f158c201bd5Stuart Scott defaultDataSelected && 1337ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao (!mPhone.getServiceState().getDataRoaming() || getDataOnRoamingEnabled()) && 13381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu !mIsPsRestricted && 1339cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville desiredPowerState; 13409c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (!allowed && failureReason != null) { 13419c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu failureReason.setLength(0); 13429c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu failureReason.append("isDataAllowed: No"); 1343aacc11b299ac047e73e1e712aa396ea0a6a80158Robert Greenwalt if (!(attachedState || mAutoAttachOnCreation.get())) { 13449c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu failureReason.append(" - Attached= " + attachedState); 1345cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 13469c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (!recordsLoaded) failureReason.append(" - SIM not loaded"); 1347b79f845a0451895b0f0b8a926a8571511d476ce8Libin.Tang@motorola.com if (state != PhoneConstants.State.IDLE && 1348cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { 13499c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu failureReason.append(" - PhoneState= " + state); 13509c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu failureReason.append(" - Concurrent voice and data not allowed"); 1351cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 13529c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (!internalDataEnabled) failureReason.append(" - mInternalDataEnabled= false"); 13539c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (!defaultDataSelected) failureReason.append(" - defaultDataSelected= false"); 1354ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao if (mPhone.getServiceState().getDataRoaming() && !getDataOnRoamingEnabled()) { 13559c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu failureReason.append(" - Roaming and data roaming not enabled"); 1356cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 13579c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (mIsPsRestricted) failureReason.append(" - mIsPsRestricted= true"); 13589c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (!desiredPowerState) failureReason.append(" - desiredPowerState= false"); 1359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1360cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return allowed; 1361cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1363c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt // arg for setupDataOnConnectableApns 1364c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt private enum RetryFailures { 1365c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt // retry failed networks always (the old default) 1366c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt ALWAYS, 13670e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // retry only when a substantial change has occurred. Either: 1368c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt // 1) we were restricted by voice/data concurrency and aren't anymore 1369c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt // 2) our apn list has change 1370c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt ONLY_ON_CHANGE 1371c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt }; 1372c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt 1373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void setupDataOnConnectableApns(String reason) { 1374c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt setupDataOnConnectableApns(reason, RetryFailures.ALWAYS); 1375c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } 1376c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt 1377c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt private void setupDataOnConnectableApns(String reason, RetryFailures retryFailures) { 13789c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (VDBG) log("setupDataOnConnectableApns: " + reason); 13793fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt 1380c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu if (DBG && !VDBG) { 1381c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu StringBuilder sb = new StringBuilder(120); 1382c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu for (ApnContext apnContext : mPrioritySortedApnContexts) { 1383c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu sb.append(apnContext.getApnType()); 1384c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu sb.append(":[state="); 1385c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu sb.append(apnContext.getState()); 1386c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu sb.append(",enabled="); 1387c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu sb.append(apnContext.isEnabled()); 1388c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu sb.append("] "); 1389c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu } 13909c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu log("setupDataOnConnectableApns: " + reason + " " + sb); 1391c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu } 1392c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu 13933fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt for (ApnContext apnContext : mPrioritySortedApnContexts) { 1394735bc2f4524d68155765351912ffae11306c3bd5Chris Manton ArrayList<ApnSetting> waitingApns = null; 1395735bc2f4524d68155765351912ffae11306c3bd5Chris Manton 1396c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu if (VDBG) log("setupDataOnConnectableApns: apnContext " + apnContext); 1397c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu 1398735bc2f4524d68155765351912ffae11306c3bd5Chris Manton if (apnContext.getState() == DctConstants.State.FAILED 13990e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu || apnContext.getState() == DctConstants.State.SCANNING) { 1400c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt if (retryFailures == RetryFailures.ALWAYS) { 1401ee665b78ad648abd98b019a9c9047f206ed22994Robert Greenwalt apnContext.releaseDataConnection(reason); 1402c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } else if (apnContext.isConcurrentVoiceAndDataAllowed() == false && 14030e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { 1404c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt // RetryFailures.ONLY_ON_CHANGE - check if voice concurrency has changed 1405ee665b78ad648abd98b019a9c9047f206ed22994Robert Greenwalt apnContext.releaseDataConnection(reason); 1406c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } else { 1407c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt // RetryFailures.ONLY_ON_CHANGE - check if the apns have changed 1408c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt int radioTech = mPhone.getServiceState().getRilDataRadioTechnology(); 14090e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu ArrayList<ApnSetting> originalApns = apnContext.getWaitingApns(); 1410c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt if (originalApns != null && originalApns.isEmpty() == false) { 1411c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt waitingApns = buildWaitingApns(apnContext.getApnType(), radioTech); 1412c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt if (originalApns.size() != waitingApns.size() || 1413c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt originalApns.containsAll(waitingApns) == false) { 1414ee665b78ad648abd98b019a9c9047f206ed22994Robert Greenwalt apnContext.releaseDataConnection(reason); 1415b290ce3d172215e5ab7cd43c8e7bbee9551ab29eRobert Greenwalt } else { 1416b290ce3d172215e5ab7cd43c8e7bbee9551ab29eRobert Greenwalt continue; 1417c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } 1418b290ce3d172215e5ab7cd43c8e7bbee9551ab29eRobert Greenwalt } else { 1419b290ce3d172215e5ab7cd43c8e7bbee9551ab29eRobert Greenwalt continue; 1420c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } 1421c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } 1422cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (apnContext.isConnectable()) { 14249c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu log("isConnectable() call trySetupData"); 1425ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnContext.setReason(reason); 1426c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt trySetupData(apnContext, waitingApns); 1427cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1428cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isEmergency() { 14321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final boolean result; 14331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu synchronized (mDataEnabledLock) { 14341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu result = mPhone.isInEcm() || mPhone.isInEmergencyCall(); 14351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("isEmergency: result=" + result); 14371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return result; 14381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1440cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private boolean trySetupData(ApnContext apnContext) { 1441c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt return trySetupData(apnContext, null); 1442c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } 1443c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt 1444c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt private boolean trySetupData(ApnContext apnContext, ArrayList<ApnSetting> waitingApns) { 1445cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 1446cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("trySetupData for type:" + apnContext.getApnType() + 14479c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu " due to " + apnContext.getReason() + ", mIsPsRestricted=" + mIsPsRestricted); 1448cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 14492dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog("trySetupData due to " + apnContext.getReason()); 1450cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1451cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (mPhone.getSimulatedRadioControl() != null) { 1452cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Assume data is connected on the simulator 1453cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // FIXME this can be improved 1454cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setState(DctConstants.State.CONNECTED); 1455cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType()); 1456cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1457cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("trySetupData: X We're on the simulator; assuming connected retValue=true"); 1458cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 1459cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1460cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1461cf5205f70eb1eac497164124187a088ecb03fff5Ram // Allow SETUP_DATA request for E-APN to be completed during emergency call 1462cf5205f70eb1eac497164124187a088ecb03fff5Ram // and MOBILE DATA On/Off cases as well. 1463cf5205f70eb1eac497164124187a088ecb03fff5Ram boolean isEmergencyApn = apnContext.getApnType().equals(PhoneConstants.APN_TYPE_EMERGENCY); 1464c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt final ServiceStateTracker sst = mPhone.getServiceStateTracker(); 14650e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 1466a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean checkUserDataEnabled = 1467a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville !(apnContext.getApnType().equals(PhoneConstants.APN_TYPE_IMS)); 1468cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 14699c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu StringBuilder failureReason = new StringBuilder(); 1470cf5205f70eb1eac497164124187a088ecb03fff5Ram if (apnContext.isConnectable() && (isEmergencyApn || 14719c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu (isDataAllowed(failureReason) && isDataAllowedForApn(apnContext) && 1472cf5205f70eb1eac497164124187a088ecb03fff5Ram getAnyDataEnabled(checkUserDataEnabled) && !isEmergency()))) { 1473ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (apnContext.getState() == DctConstants.State.FAILED) { 14742dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str ="trySetupData: make a FAILED ApnContext IDLE so its reusable"; 14752dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 14762dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog(str); 1477ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnContext.setState(DctConstants.State.IDLE); 1478ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1479203e588e3c42a81aa8a56f595119c181a63b12caWink Saville int radioTech = mPhone.getServiceState().getRilDataRadioTechnology(); 1480c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt apnContext.setConcurrentVoiceAndDataAllowed(sst.isConcurrentVoiceAndDataAllowed()); 1481cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext.getState() == DctConstants.State.IDLE) { 1482c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt if (waitingApns == null) { 1483c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt waitingApns = buildWaitingApns(apnContext.getApnType(), radioTech); 1484c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt } 1485cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (waitingApns.isEmpty()) { 1486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville notifyNoData(DcFailCause.MISSING_UNKNOWN_APN, apnContext); 1487cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyOffApnsOfAvailability(apnContext.getReason()); 14882dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "trySetupData: X No APN found retValue=false"; 14892dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 14902dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog(str); 1491cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 1492cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 1493cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setWaitingApns(waitingApns); 1494cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 1495ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log ("trySetupData: Create from mAllApnSettings : " 1496ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + apnListToString(mAllApnSettings)); 1497cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1498cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1499cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1500cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1501203e588e3c42a81aa8a56f595119c181a63b12caWink Saville boolean retValue = setupData(apnContext, radioTech); 1502cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyOffApnsOfAvailability(apnContext.getReason()); 1503cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1504cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("trySetupData: X retValue=" + retValue); 1505cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return retValue; 1506cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 1507cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (!apnContext.getApnType().equals(PhoneConstants.APN_TYPE_DEFAULT) 1508ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville && apnContext.isConnectable()) { 1509cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.notifyDataConnectionFailed(apnContext.getReason(), apnContext.getApnType()); 1510ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1511cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyOffApnsOfAvailability(apnContext.getReason()); 15122e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu 15132e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu StringBuilder str = new StringBuilder(); 15142e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu 15152e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu str.append("trySetupData failed. apnContext = [type=" + apnContext.getApnType() + 15162e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu ", mState=" + apnContext.getState() + ", mDataEnabled=" + 15172e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu apnContext.isEnabled() + ", mDependencyMet=" + 15182e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu apnContext.getDependencyMet() + "] "); 15192e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu 15202e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu if (!apnContext.isConnectable()) { 15212e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu str.append("isConnectable = false. "); 15222dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt } 15232e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu if (!isDataAllowed(failureReason)) { 15242e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu str.append("data not allowed: " + failureReason.toString() + ". "); 15252e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu } 15262e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu if (!isDataAllowedForApn(apnContext)) { 15272e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu str.append("isDataAllowedForApn = false. RAT = " + 15282e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu mPhone.getServiceState().getRilDataRadioTechnology()); 15292e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu } 15302e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu if (!getAnyDataEnabled(checkUserDataEnabled)) { 15312e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu str.append("getAnyDataEnabled(" + checkUserDataEnabled + ") = false. " + 15322e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu "mInternalDataEnabled = " + mInternalDataEnabled + " , mUserDataEnabled = " 15332e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu + mUserDataEnabled + ", sPolicyDataEnabled = " + sPolicyDataEnabled + " "); 15342e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu } 15352e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu if (isEmergency()) { 15362e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu str.append("emergency = true"); 15372e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu } 15382e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu 15392e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu if (DBG) log(str.toString()); 15402e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu apnContext.requestLog(str.toString()); 15412e3470722434dbc91dcc2095f5a410f6aaad620aJack Yu 1542cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 1543cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15460e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // Disabled apn's still need avail/unavail notifications - send them out 15471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void notifyOffApnsOfAvailability(String reason) { 15489c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (DBG) { 15499c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu StringBuilder failureReason = new StringBuilder(); 15509c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu isDataAllowed(failureReason); 15519c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (!failureReason.toString().isEmpty()) { 15529c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu log(failureReason.toString()); 15539c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu } 15549c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu } 1555cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville for (ApnContext apnContext : mApnContexts.values()) { 1556187a39f896f88eb6c5e4306d9595546654825976Wink Saville if (!mAttached.get() || !apnContext.isReady()) { 1557ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) log("notifyOffApnOfAvailability type:" + apnContext.getApnType()); 1558cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.notifyDataConnection(reason != null ? reason : apnContext.getReason(), 1559cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.getApnType(), 1560cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville PhoneConstants.DataState.DISCONNECTED); 1561cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 1562ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 1563187a39f896f88eb6c5e4306d9595546654825976Wink Saville log("notifyOffApnsOfAvailability skipped apn due to attached && isReady " + 1564cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.toString()); 1565cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1570cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /** 1571cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * If tearDown is true, this only tears down a CONNECTED session. Presently, 1572cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * there is no mechanism for abandoning an CONNECTING session, 1573cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * but would likely involve cancelling pending async requests or 1574cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * setting a flag or new state to ignore them when they came in 1575cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param tearDown true if the underlying DataConnection should be 1576cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * disconnected. 1577cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param reason reason for the clean up. 15783fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt * @return boolean - true if we did cleanup any connections, false if they 15793fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt * were already all disconnected. 1580cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */ 15811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean cleanUpAllConnections(boolean tearDown, String reason) { 1582cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("cleanUpAllConnections: tearDown=" + tearDown + " reason=" + reason); 15833fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt boolean didDisconnect = false; 1584a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean specificdisable = false; 1585a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1586a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!TextUtils.isEmpty(reason)) { 1587a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville specificdisable = reason.equals(Phone.REASON_DATA_SPECIFIC_DISABLED); 1588a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1589cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1590cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville for (ApnContext apnContext : mApnContexts.values()) { 15913fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (apnContext.isDisconnected() == false) didDisconnect = true; 1592a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (specificdisable) { 1593a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!apnContext.getApnType().equals(PhoneConstants.APN_TYPE_IMS)) { 1594a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) log("ApnConextType: " + apnContext.getApnType()); 1595a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville apnContext.setReason(reason); 1596a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cleanUpConnection(tearDown, apnContext); 1597a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1598a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 1599a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // TODO - only do cleanup if not disconnected 1600a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville apnContext.setReason(reason); 1601a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cleanUpConnection(tearDown, apnContext); 1602a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1604cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1605cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville stopNetStatPoll(); 1606cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville stopDataStallAlarm(); 1607cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1608cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // TODO: Do we need mRequestedApnType? 1609cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mRequestedApnType = PhoneConstants.APN_TYPE_DEFAULT; 1610a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1611a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("cleanUpConnection: mDisconnectPendingCount = " + mDisconnectPendingCount); 1612a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (tearDown && mDisconnectPendingCount == 0) { 1613a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyDataDisconnectComplete(); 1614a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyAllDataDisconnected(); 1615a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1616a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 16173fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt return didDisconnect; 1618cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1619cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1620cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /** 1621cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Cleanup all connections. 1622cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * 1623cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * TODO: Cleanup only a specified connection passed as a parameter. 1624cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Also, make sure when you clean up a conn, if it is last apply 1625cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * logic as though it is cleanupAllConnections 1626cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * 1627cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param cause for the clean up. 1628cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */ 16291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onCleanUpAllConnections(String cause) { 1630cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cleanUpAllConnections(true, cause); 1631cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1632cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 16331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu void sendCleanUpConnection(boolean tearDown, ApnContext apnContext) { 16341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("sendCleanUpConnection: tearDown=" + tearDown + " apnContext=" + apnContext); 16351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message msg = obtainMessage(DctConstants.EVENT_CLEAN_UP_CONNECTION); 16361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.arg1 = tearDown ? 1 : 0; 16371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.arg2 = 0; 16381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.obj = apnContext; 16391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(msg); 16401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1641cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 16421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void cleanUpConnection(boolean tearDown, ApnContext apnContext) { 1643cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext == null) { 1644cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("cleanUpConnection: apn context is null"); 1645cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return; 1646cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1647cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1648454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcAsyncChannel dcac = apnContext.getDcAc(); 16492dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str = "cleanUpConnection: tearDown=" + tearDown + " reason=" + 16502dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.getReason(); 16519c32a1e9495f06905377c9e2b91c0ef9cdb0528fJack Yu if (VDBG) log(str + " apnContext=" + apnContext); 16522dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog(str); 1653cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (tearDown) { 1654cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext.isDisconnected()) { 1655cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // The request is tearDown and but ApnContext is not connected. 1656cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // If apnContext is not enabled anymore, break the linkage to the DCAC/DC. 1657cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setState(DctConstants.State.IDLE); 1658cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (!apnContext.isReady()) { 16594750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville if (dcac != null) { 16600e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu str = "cleanUpConnection: teardown, disconnected, !ready"; 16612dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str + " apnContext=" + apnContext); 16622dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog(str); 16634750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville dcac.tearDown(apnContext, "", null); 16644750c8c11836338b024e159f04f0cbd13c7444b9Wink Saville } 1665cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setDataConnectionAc(null); 1666cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1667cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 1668cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Connection is still there. Try to clean up. 1669cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (dcac != null) { 1670cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext.getState() != DctConstants.State.DISCONNECTING) { 1671cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean disconnectAll = false; 1672cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (PhoneConstants.APN_TYPE_DUN.equals(apnContext.getApnType())) { 1673a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // CAF_MSIM is this below condition required. 1674a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // if (PhoneConstants.APN_TYPE_DUN.equals(PhoneConstants.APN_TYPE_DEFAULT)) { 16751484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (teardownForDun()) { 167645eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville if (DBG) { 167745eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville log("cleanUpConnection: disconnectAll DUN connection"); 167845eaa2335e64a8ff1ad8d5e8224c580ef996f370Wink Saville } 1679cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // we need to tear it down - we brought it up just for dun and 1680cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // other people are camped on it and now dun is done. We need 1681cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // to stop using it and let the normal apn list get used to find 1682cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // connections for the remaining desired connections 1683cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville disconnectAll = true; 1684cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1685cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 16861a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt final int generation = apnContext.getConnectionGeneration(); 16871a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt str = "cleanUpConnection: tearing down" + (disconnectAll ? " all" : "") + 16881a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt " using gen#" + generation; 16892dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str + "apnContext=" + apnContext); 16902dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog(str); 169137cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt Pair<ApnContext, Integer> pair = 16921a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt new Pair<ApnContext, Integer>(apnContext, generation); 169337cacdfe7ed079d89fb9e80317b5dfd2acb975e5Robert Greenwalt Message msg = obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, pair); 1694cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (disconnectAll) { 1695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnContext.getDcAc().tearDownAll(apnContext.getReason(), msg); 1696cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 1697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnContext.getDcAc() 1698cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville .tearDown(apnContext, apnContext.getReason(), msg); 1699cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1700cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setState(DctConstants.State.DISCONNECTING); 1701a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDisconnectPendingCount++; 1702cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1703cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 1704cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // apn is connected but no reference to dcac. 1705cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Should not be happen, but reset the state in case. 1706cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setState(DctConstants.State.IDLE); 17072dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog("cleanUpConnection: connected, bug no DCAC"); 1708cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.notifyDataConnection(apnContext.getReason(), 1709cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.getApnType()); 1710cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1711cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1712cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 1713cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // force clean up the data connection. 1714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dcac != null) dcac.reqReset(); 1715cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setState(DctConstants.State.IDLE); 1716cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType()); 1717cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setDataConnectionAc(null); 1718cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1719cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1720ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Make sure reconnection alarm is cleaned up if there is no ApnContext 1721cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // associated to the connection. 1722cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (dcac != null) { 1723ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cancelReconnectAlarm(apnContext); 1724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 17252dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt str = "cleanUpConnection: X tearDown=" + tearDown + " reason=" + apnContext.getReason(); 17262dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str + " apnContext=" + apnContext + " dcac=" + apnContext.getDcAc()); 17272dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog(str); 1728cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ApnSetting fetchDunApn() { 17311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (SystemProperties.getBoolean("net.tethering.noprovisioning", false)) { 17321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("fetchDunApn: net.tethering.noprovisioning=true ret: null"); 17331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 17341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int bearer = mPhone.getServiceState().getRilDataRadioTechnology(); 17361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ApnSetting retDunSetting = null; 17371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String apnData = Settings.Global.getString(mResolver, Settings.Global.TETHER_DUN_APN); 17381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu List<ApnSetting> dunSettings = ApnSetting.arrayFromString(apnData); 17391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 17401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (ApnSetting dunSetting : dunSettings) { 17411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String operator = (r != null) ? r.getOperatorNumeric() : ""; 17421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!ServiceState.bitmaskHasTech(dunSetting.bearerBitmask, bearer)) continue; 17431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dunSetting.numeric.equals(operator)) { 17441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dunSetting.hasMvnoParams()) { 17451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (r != null && ApnSetting.mvnoMatches(r, dunSetting.mvnoType, 17461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dunSetting.mvnoMatchData)) { 17471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) { 17481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("fetchDunApn: global TETHER_DUN_APN dunSetting=" + dunSetting); 17491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return dunSetting; 17511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (mMvnoMatched == false) { 17531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) log("fetchDunApn: global TETHER_DUN_APN dunSetting=" + dunSetting); 17541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return dunSetting; 17551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Context c = mPhone.getContext(); 17601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String[] apnArrayData = c.getResources().getStringArray(R.array.config_tether_apndata); 17611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (String apn : apnArrayData) { 17621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ApnSetting dunSetting = ApnSetting.fromString(apn); 17631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dunSetting != null) { 17641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!ServiceState.bitmaskHasTech(dunSetting.bearerBitmask, bearer)) continue; 17651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dunSetting.hasMvnoParams()) { 17661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (r != null && ApnSetting.mvnoMatches(r, dunSetting.mvnoType, 17671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dunSetting.mvnoMatchData)) { 17681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) { 17691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("fetchDunApn: config_tether_apndata mvno dunSetting=" + dunSetting); 17701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return dunSetting; 17721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (mMvnoMatched == false) { 17741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu retDunSetting = dunSetting; 17751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) log("fetchDunApn: config_tether_apndata dunSetting=" + retDunSetting); 17801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return retDunSetting; 17811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean hasMatchedTetherApnSetting() { 17841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ApnSetting matched = fetchDunApn(); 17851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("hasMatchedTetherApnSetting: APN=" + matched); 17861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return matched != null; 17871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1789cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /** 17901484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt * Determine if DUN connection is special and we need to teardown on start/stop 17911484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt */ 17921484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt private boolean teardownForDun() { 17931484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // CDMA always needs to do this the profile id is correct 17941484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt final int rilRat = mPhone.getServiceState().getRilDataRadioTechnology(); 17951484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (ServiceState.isCdma(rilRat)) return true; 17961484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt 17971484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt return (fetchDunApn() != null); 17981484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt } 17991484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt 18001484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt /** 1801ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Cancels the alarm associated with apnContext. 1802cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * 1803ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * @param apnContext on which the alarm should be stopped. 1804cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */ 1805ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void cancelReconnectAlarm(ApnContext apnContext) { 1806ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (apnContext == null) return; 1807cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1808ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville PendingIntent intent = apnContext.getReconnectIntent(); 1809cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1810cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (intent != null) { 1811cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville AlarmManager am = 1812cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE); 1813cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville am.cancel(intent); 1814ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnContext.setReconnectIntent(null); 1815cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1818cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /** 1819cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param types comma delimited list of APN types 1820cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return array of APN types 1821cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */ 1822cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private String[] parseTypes(String types) { 1823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String[] result; 1824cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // If unset, set to DEFAULT. 1825cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (types == null || types.equals("")) { 1826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville result = new String[1]; 1827cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville result[0] = PhoneConstants.APN_TYPE_ALL; 1828cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 1829cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville result = types.split(","); 1830c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return result; 1832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 18341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isPermanentFail(DcFailCause dcFailCause) { 1835796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan return (dcFailCause.isPermanentFail() && 1836796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan (mAttached.get() == false || dcFailCause != DcFailCause.SIGNAL_LOST)); 1837796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan } 1838796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan 1839fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi private ApnSetting makeApnSetting(Cursor cursor) { 1840fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi String[] types = parseTypes( 1841fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.TYPE))); 1842fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi ApnSetting apn = new ApnSetting( 1843fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers._ID)), 1844fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NUMERIC)), 1845fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NAME)), 1846fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.APN)), 1847fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi NetworkUtils.trimV4AddrZeros( 1848fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString( 1849fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getColumnIndexOrThrow(Telephony.Carriers.PROXY))), 1850fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PORT)), 1851fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi NetworkUtils.trimV4AddrZeros( 1852fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString( 1853fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSC))), 1854fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi NetworkUtils.trimV4AddrZeros( 1855fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString( 1856fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPROXY))), 1857fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPORT)), 1858fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)), 1859fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)), 18601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)), 1861fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi types, 1862fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)), 1863fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getString(cursor.getColumnIndexOrThrow( 1864fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi Telephony.Carriers.ROAMING_PROTOCOL)), 1865fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi cursor.getInt(cursor.getColumnIndexOrThrow( 1866fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi Telephony.Carriers.CARRIER_ENABLED)) == 1, 18679d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.BEARER)), 1868aaf0e8d623b1e94004557573aef9235177ca19e3Amit Mahajan cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.BEARER_BITMASK)), 18699d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROFILE_ID)), 18709d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan cursor.getInt(cursor.getColumnIndexOrThrow( 18719d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan Telephony.Carriers.MODEM_COGNITIVE)) == 1, 18729d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MAX_CONNS)), 18739d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan cursor.getInt(cursor.getColumnIndexOrThrow( 18749d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan Telephony.Carriers.WAIT_TIME)), 1875e9701717e43cc5aacbcf624f77a53be92350662cw cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MAX_CONNS_TIME)), 18763262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MTU)), 18773262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_TYPE)), 18783262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_MATCH_DATA))); 1879fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi return apn; 1880fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi } 1881fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi 1882cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private ArrayList<ApnSetting> createApnList(Cursor cursor) { 18833262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal ArrayList<ApnSetting> mnoApns = new ArrayList<ApnSetting>(); 18843262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal ArrayList<ApnSetting> mvnoApns = new ArrayList<ApnSetting>(); 1885fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi IccRecords r = mIccRecords.get(); 1886fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi 1887cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (cursor.moveToFirst()) { 1888cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville do { 18893262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal ApnSetting apn = makeApnSetting(cursor); 18903262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal if (apn == null) { 18913262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal continue; 18923262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal } 18933262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal 18943262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal if (apn.hasMvnoParams()) { 189563913dc903872c45bab7d2483d633d845dd9c5d6Amit Mahajan if (r != null && ApnSetting.mvnoMatches(r, apn.mvnoType, apn.mvnoMatchData)) { 18963262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal mvnoApns.add(apn); 1897fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi } 1898fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi } else { 18993262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal mnoApns.add(apn); 1900fd5de4dae153c57e13bf8979d6f7a8aa86e3dedeSungmin Choi } 1901cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } while (cursor.moveToNext()); 1902cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 19033262c21feb1eede2917450cfdfd3faa86ee70cabShishir Agrawal 19041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ArrayList<ApnSetting> result; 19051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mvnoApns.isEmpty()) { 19061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu result = mnoApns; 19071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mMvnoMatched = false; 19081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 19091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu result = mvnoApns; 19101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mMvnoMatched = true; 19111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1912cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("createApnList: X result=" + result); 1913c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return result; 1914c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1916454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private boolean dataConnectionNotInUse(DcAsyncChannel dcac) { 1917ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("dataConnectionNotInUse: check if dcac is inuse dcac=" + dcac); 1918cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville for (ApnContext apnContext : mApnContexts.values()) { 1919ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (apnContext.getDcAc() == dcac) { 1920cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("dataConnectionNotInUse: in use by apnContext=" + apnContext); 1921cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 1922cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1923cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1924cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // TODO: Fix retry handling so free DataConnections have empty apnlists. 1925cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Probably move retry handling into DataConnections and reduce complexity 1926cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // of DCT. 1927cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("dataConnectionNotInUse: tearDownAll"); 1928ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dcac.tearDownAll("No connection", null); 1929cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("dataConnectionNotInUse: not in use return true"); 1930cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 1931cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1932cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1933454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private DcAsyncChannel findFreeDataConnection() { 1934454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville for (DcAsyncChannel dcac : mDataConnectionAcHashMap.values()) { 1935cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (dcac.isInactiveSync() && dataConnectionNotInUse(dcac)) { 1936cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 1937cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("findFreeDataConnection: found free DataConnection=" + 1938ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville " dcac=" + dcac); 1939cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1940ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return dcac; 1941cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1942cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1943cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("findFreeDataConnection: NO free DataConnection"); 1944cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return null; 1945cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1946cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1947203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private boolean setupData(ApnContext apnContext, int radioTech) { 1948cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("setupData: apnContext=" + apnContext); 19492dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog("setupData"); 1950ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting; 19511484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt DcAsyncChannel dcac = null; 1952cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 19530e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu apnSetting = apnContext.getNextApnSetting(); 19540e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 1955ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (apnSetting == null) { 1956cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("setupData: return for no apn found!"); 1957cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 1958cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 1959cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 1960231c3c6271a27b5f03444f4d24b52c41c46566abEtan Cohen int profileId = apnSetting.profileId; 1961231c3c6271a27b5f03444f4d24b52c41c46566abEtan Cohen if (profileId == 0) { 1962231c3c6271a27b5f03444f4d24b52c41c46566abEtan Cohen profileId = getApnProfileID(apnContext.getApnType()); 1963231c3c6271a27b5f03444f4d24b52c41c46566abEtan Cohen } 1964231c3c6271a27b5f03444f4d24b52c41c46566abEtan Cohen 19651484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // On CDMA, if we're explicitly asking for DUN, we need have 19661484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // a dun-profiled connection so we can't share an existing one 19671484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // On GSM/LTE we can share existing apn connections provided they support 19681484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // this type. 19691484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (apnContext.getApnType() != PhoneConstants.APN_TYPE_DUN || 19701484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt teardownForDun() == false) { 19711484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt dcac = checkForCompatibleConnectedApnContext(apnContext); 19721484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (dcac != null) { 19731484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // Get the dcacApnSetting for the connection we want to share. 19741484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt ApnSetting dcacApnSetting = dcac.getApnSettingSync(); 19751484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (dcacApnSetting != null) { 19761484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // Setting is good, so use it. 19771484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt apnSetting = dcacApnSetting; 19781484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt } 1979ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1980ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1981ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dcac == null) { 19823fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (isOnlySingleDcAllowed(radioTech)) { 19833fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (isHigherPriorityApnContextActive(apnContext)) { 19843fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (DBG) { 19853fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt log("setupData: Higher priority ApnContext active. Ignoring call"); 19863fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 19873fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt return false; 19883fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 19893fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt 19903fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt // Only lower priority calls left. Disconnect them all in this single PDP case 19913fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt // so that we can bring up the requested higher priority call (once we receive 19920e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // response for deactivate request for the calls we are about to disconnect 19933fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (cleanUpAllConnections(true, Phone.REASON_SINGLE_PDN_ARBITRATION)) { 19943fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt // If any call actually requested to be disconnected, means we can't 19953fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt // bring up this connection yet as we need to wait for those data calls 19963fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt // to be disconnected. 19973fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (DBG) log("setupData: Some calls are disconnecting first. Wait and retry"); 19983fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt return false; 19993fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 20003fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt 20013fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt // No other calls are active, so proceed 20023fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (DBG) log("setupData: Single pdp. Continue setting up data call."); 20033fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 20043fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt 2005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dcac = findFreeDataConnection(); 2006cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2007ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dcac == null) { 2008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville dcac = createDataConnection(); 2009cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2010cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (dcac == null) { 2012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("setupData: No free DataConnection and couldn't create one, WEIRD"); 2013cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 2014cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2015cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 20161a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt final int generation = apnContext.incAndGetConnectionGeneration(); 20171a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt if (DBG) { 20181a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt log("setupData: dcac=" + dcac + " apnSetting=" + apnSetting + " gen#=" + generation); 20191a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt } 2020cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2021cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setDataConnectionAc(dcac); 2022ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnContext.setApnSetting(apnSetting); 2023cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setState(DctConstants.State.CONNECTING); 2024cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType()); 2025cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2026cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Message msg = obtainMessage(); 2027cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville msg.what = DctConstants.EVENT_DATA_SETUP_COMPLETE; 20281a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt msg.obj = new Pair<ApnContext, Integer>(apnContext, generation); 20290e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu dcac.bringUp(apnContext, profileId, radioTech, msg, generation); 2030cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2031cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("setupData: initing!"); 2032cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 2033cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2034cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 20351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void setInitialAttachApn() { 20361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ApnSetting iaApnSetting = null; 20371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ApnSetting defaultApnSetting = null; 20381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ApnSetting firstApnSetting = null; 20391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("setInitialApn: E mPreferredApn=" + mPreferredApn); 20411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mAllApnSettings != null && !mAllApnSettings.isEmpty()) { 20431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu firstApnSetting = mAllApnSettings.get(0); 20441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("setInitialApn: firstApnSetting=" + firstApnSetting); 20451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Search for Initial APN setting and the first apn that can handle default 20471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (ApnSetting apn : mAllApnSettings) { 20481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Can't use apn.canHandleType(), as that returns true for APNs that have no type. 20491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ArrayUtils.contains(apn.types, PhoneConstants.APN_TYPE_IA) && 20501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu apn.carrierEnabled) { 20511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // The Initial Attach APN is highest priority so use it if there is one 20521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("setInitialApn: iaApnSetting=" + apn); 20531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu iaApnSetting = apn; 20541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 20551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if ((defaultApnSetting == null) 20561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && (apn.canHandleType(PhoneConstants.APN_TYPE_DEFAULT))) { 20571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Use the first default apn if no better choice 20581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("setInitialApn: defaultApnSetting=" + apn); 20591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu defaultApnSetting = apn; 20601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // The priority of apn candidates from highest to lowest is: 20650e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // 1) APN_TYPE_IA (Initial Attach) 20661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // 2) mPreferredApn, i.e. the current preferred apn 20671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // 3) The first apn that than handle APN_TYPE_DEFAULT 20681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // 4) The first APN we can find. 20691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ApnSetting initialAttachApnSetting = null; 20711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (iaApnSetting != null) { 20721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("setInitialAttachApn: using iaApnSetting"); 20731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu initialAttachApnSetting = iaApnSetting; 20741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (mPreferredApn != null) { 20751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("setInitialAttachApn: using mPreferredApn"); 20761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu initialAttachApnSetting = mPreferredApn; 20771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (defaultApnSetting != null) { 20781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("setInitialAttachApn: using defaultApnSetting"); 20791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu initialAttachApnSetting = defaultApnSetting; 20801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (firstApnSetting != null) { 20811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("setInitialAttachApn: using firstApnSetting"); 20821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu initialAttachApnSetting = firstApnSetting; 20831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (initialAttachApnSetting == null) { 20861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("setInitialAttachApn: X There in no available apn"); 20871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 20881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("setInitialAttachApn: X selected Apn=" + initialAttachApnSetting); 20891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.mCi.setInitialAttachApn(initialAttachApnSetting.apn, 20911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu initialAttachApnSetting.protocol, initialAttachApnSetting.authType, 20921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu initialAttachApnSetting.user, initialAttachApnSetting.password, null); 20931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2096c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 2097cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Handles changes to the APN database. 2098c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 2099cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private void onApnChanged() { 2100cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville DctConstants.State overallState = getOverallState(); 2101cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean isDisconnected = (overallState == DctConstants.State.IDLE || 2102cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville overallState == DctConstants.State.FAILED); 2103cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 21041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mPhone instanceof GsmCdmaPhone) { 2105cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // The "current" may no longer be valid. MMS depends on this to send properly. TBD 21061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ((GsmCdmaPhone)mPhone).updateCurrentCarrierInProvider(); 2107cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2108cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2109cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // TODO: It'd be nice to only do this if the changed entrie(s) 2110cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // match the current operator. 2111cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onApnChanged: createAllApnList and cleanUpAllConnections"); 2112cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville createAllApnList(); 21135d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi setInitialAttachApn(); 21149a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang cleanUpConnectionsOnUpdatedApns(!isDisconnected); 2115bda761320929f714951c328bfec6a51a1978db97Wink Saville 21168f6f52e4f7598e44cea1f9e5f4781291f9060d1dWink Saville // FIXME: See bug 17426028 maybe no conditional is needed. 211738ca51d0f643405df51e78fce6c546424e9f410dShishir Agrawal if (mPhone.getSubId() == SubscriptionManager.getDefaultDataSubscriptionId()) { 2118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setupDataOnConnectableApns(Phone.REASON_APN_CHANGED); 2119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 2123cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param cid Connection id provided from RIL. 2124cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return DataConnectionAc associated with specified cid. 2125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 2126454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private DcAsyncChannel findDataConnectionAcByCid(int cid) { 2127454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville for (DcAsyncChannel dcac : mDataConnectionAcHashMap.values()) { 2128cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (dcac.getCidSync() == cid) { 2129cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return dcac; 2130cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2132cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return null; 2133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2135cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // TODO: For multiple Active APNs not exactly sure how to do this. 21361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void gotoIdleAndNotifyDataConnection(String reason) { 2137cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("gotoIdleAndNotifyDataConnection: reason=" + reason); 2138cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyDataConnection(reason); 2139cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2140cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 21413fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt /** 21423fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt * "Active" here means ApnContext isEnabled() and not in FAILED state 21433fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt * @param apnContext to compare with 21443fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt * @return true if higher priority active apn found 21453fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt */ 21463fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt private boolean isHigherPriorityApnContextActive(ApnContext apnContext) { 21473fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt for (ApnContext otherContext : mPrioritySortedApnContexts) { 21483fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (apnContext.getApnType().equalsIgnoreCase(otherContext.getApnType())) return false; 21493fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (otherContext.isEnabled() && otherContext.getState() != DctConstants.State.FAILED) { 21503fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt return true; 21513fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 21523fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 21533fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt return false; 21543fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 21553fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt 21563fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt /** 21573fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt * Reports if we support multiple connections or not. 21583fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt * This is a combination of factors, based on carrier and RAT. 21593fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt * @param rilRadioTech the RIL Radio Tech currently in use 21603fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt * @return true if only single DataConnection is allowed 21613fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt */ 21623fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt private boolean isOnlySingleDcAllowed(int rilRadioTech) { 21633fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt int[] singleDcRats = mPhone.getContext().getResources().getIntArray( 21643fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt com.android.internal.R.array.config_onlySingleDcAllowed); 21653fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt boolean onlySingleDcAllowed = false; 21663fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (Build.IS_DEBUGGABLE && 21673fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt SystemProperties.getBoolean("persist.telephony.test.singleDc", false)) { 21683fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt onlySingleDcAllowed = true; 21693fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 21703fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (singleDcRats != null) { 21713fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt for (int i=0; i < singleDcRats.length && onlySingleDcAllowed == false; i++) { 21723fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (rilRadioTech == singleDcRats[i]) onlySingleDcAllowed = true; 21733fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 21743fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 21753fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt 21763fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (DBG) log("isOnlySingleDcAllowed(" + rilRadioTech + "): " + onlySingleDcAllowed); 21773fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt return onlySingleDcAllowed; 21783fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 21793fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt 21801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu void sendRestartRadio() { 21811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG)log("sendRestartRadio:"); 21821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message msg = obtainMessage(DctConstants.EVENT_RESTART_RADIO); 21831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(msg); 21841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 21851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void restartRadio() { 2187cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("restartRadio: ************TURN OFF RADIO**************"); 2188cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cleanUpAllConnections(true, Phone.REASON_RADIO_TURNED_OFF); 2189cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.getServiceStateTracker().powerOffRadioSafely(this); 2190cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /* Note: no need to call setRadioPower(true). Assuming the desired 2191cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * radio power state is still ON (as tracked by ServiceStateTracker), 2192cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * ServiceStateTracker will call setRadioPower when it receives the 2193cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * RADIO_STATE_CHANGED notification for the power off. And if the 2194cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * desired power state has changed in the interim, we don't want to 2195cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * override it with an unconditional power on. 2196cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */ 2197cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2198cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville int reset = Integer.parseInt(SystemProperties.get("net.ppp.reset-by-timeout", "0")); 21990e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu SystemProperties.set("net.ppp.reset-by-timeout", String.valueOf(reset + 1)); 2200cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2201cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2202cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /** 2203cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Return true if data connection need to be setup after disconnected due to 2204cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * reason. 2205cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * 22060e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu * @param apnContext APN context 2207cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return true if try setup data connection is need for this reason 2208cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */ 22093fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt private boolean retryAfterDisconnected(ApnContext apnContext) { 2210cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean retry = true; 22113fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt String reason = apnContext.getReason(); 2212cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 22133fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if ( Phone.REASON_RADIO_TURNED_OFF.equals(reason) || 22143fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt (isOnlySingleDcAllowed(mPhone.getServiceState().getRilDataRadioTechnology()) 22153fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt && isHigherPriorityApnContextActive(apnContext))) { 2216cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville retry = false; 2217cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2218cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return retry; 2219cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2220cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 22210e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu private void startAlarmForReconnect(long delay, ApnContext apnContext) { 2222cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String apnType = apnContext.getApnType(); 222374672e8ee972f12406b72551261b4cc7e0651933Wink Saville 222474672e8ee972f12406b72551261b4cc7e0651933Wink Saville Intent intent = new Intent(INTENT_RECONNECT_ALARM + "." + apnType); 222574672e8ee972f12406b72551261b4cc7e0651933Wink Saville intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, apnContext.getReason()); 2226cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE, apnType); 222767d43cfed4b996c20780bfec8fde1ae8c1391779Junda Liu intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); 2228cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Get current sub id. 223038ca51d0f643405df51e78fce6c546424e9f410dShishir Agrawal int subId = SubscriptionManager.getDefaultDataSubscriptionId(); 2231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); 2232a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 223374672e8ee972f12406b72551261b4cc7e0651933Wink Saville if (DBG) { 223474672e8ee972f12406b72551261b4cc7e0651933Wink Saville log("startAlarmForReconnect: delay=" + delay + " action=" + intent.getAction() 223574672e8ee972f12406b72551261b4cc7e0651933Wink Saville + " apn=" + apnContext); 223674672e8ee972f12406b72551261b4cc7e0651933Wink Saville } 223774672e8ee972f12406b72551261b4cc7e0651933Wink Saville 22380e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu PendingIntent alarmIntent = PendingIntent.getBroadcast(mPhone.getContext(), 0, 2239cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville intent, PendingIntent.FLAG_UPDATE_CURRENT); 2240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnContext.setReconnectIntent(alarmIntent); 22417d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu 22427d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu // Use the exact timer instead of the inexact one to provide better user experience. 22437d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu // In some extreme cases, we saw the retry was delayed for few minutes. 22447d6d7d6cb68ee37b4bee33588ba2594e9cf0c197Jack Yu mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, 2245cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville SystemClock.elapsedRealtime() + delay, alarmIntent); 2246cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2247cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private void notifyNoData(DcFailCause lastFailCauseCode, 2249cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnContext apnContext) { 2250cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log( "notifyNoData: type=" + apnContext.getApnType()); 2251796d3c22f21041116110735c92d7e2c3a7c8f60dAmit Mahajan if (isPermanentFail(lastFailCauseCode) 2252cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville && (!apnContext.getApnType().equals(PhoneConstants.APN_TYPE_DEFAULT))) { 2253cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.notifyDataConnectionFailed(apnContext.getReason(), apnContext.getApnType()); 2254cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2255cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2256cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 22571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean getAutoAttachOnCreation() { 22581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mAutoAttachOnCreation.get(); 22591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onRecordsLoadedOrSubIdChanged() { 22621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("onRecordsLoadedOrSubIdChanged: createAllApnList"); 226312fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao mAutoAttachOnCreationConfig = mPhone.getContext().getResources() 226412fffcf0d8df6b8268806d9aa7cc7a662e73743bJing Zhao .getBoolean(com.android.internal.R.bool.config_auto_attach_data_on_creation); 2265bda761320929f714951c328bfec6a51a1978db97Wink Saville 2266cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville createAllApnList(); 22675d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi setInitialAttachApn(); 226822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPhone.mCi.getRadioState().isOn()) { 22691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("onRecordsLoadedOrSubIdChanged: notifying data availability"); 2270cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyOffApnsOfAvailability(Phone.REASON_SIM_LOADED); 2271cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2272bda761320929f714951c328bfec6a51a1978db97Wink Saville setupDataOnConnectableApns(Phone.REASON_SIM_LOADED); 2273cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2274cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 22750469925aace7a2254e0cef90bd7398fbd72622faShishir Agrawal private void onSimNotReady() { 22760469925aace7a2254e0cef90bd7398fbd72622faShishir Agrawal if (DBG) log("onSimNotReady"); 22770469925aace7a2254e0cef90bd7398fbd72622faShishir Agrawal 22780469925aace7a2254e0cef90bd7398fbd72622faShishir Agrawal cleanUpAllConnections(true, Phone.REASON_SIM_NOT_READY); 22790469925aace7a2254e0cef90bd7398fbd72622faShishir Agrawal mAllApnSettings = null; 22800469925aace7a2254e0cef90bd7398fbd72622faShishir Agrawal mAutoAttachOnCreationConfig = false; 22810469925aace7a2254e0cef90bd7398fbd72622faShishir Agrawal } 22820469925aace7a2254e0cef90bd7398fbd72622faShishir Agrawal 22831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onSetDependencyMet(String apnType, boolean met) { 2284cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // don't allow users to tweak hipri to work around default dependency not met 2285cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (PhoneConstants.APN_TYPE_HIPRI.equals(apnType)) return; 2286cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2287cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnContext apnContext = mApnContexts.get(apnType); 2288cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext == null) { 2289cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville loge("onSetDependencyMet: ApnContext not found in onSetDependencyMet(" + 2290cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnType + ", " + met + ")"); 2291cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return; 2292cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2293cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville applyNewState(apnContext, apnContext.isEnabled(), met); 2294cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (PhoneConstants.APN_TYPE_DEFAULT.equals(apnType)) { 2295cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // tie actions on default to similar actions on HIPRI regarding dependencyMet 2296cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext = mApnContexts.get(PhoneConstants.APN_TYPE_HIPRI); 2297cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext != null) applyNewState(apnContext, apnContext.isEnabled(), met); 2298cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2299cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 23011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onSetPolicyDataEnabled(boolean enabled) { 23021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu synchronized (mDataEnabledLock) { 23031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final boolean prevEnabled = getAnyDataEnabled(); 23041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (sPolicyDataEnabled != enabled) { 23051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sPolicyDataEnabled = enabled; 23061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (prevEnabled != getAnyDataEnabled()) { 23071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!prevEnabled) { 23081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onTrySetupData(Phone.REASON_DATA_ENABLED); 23091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 23101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onCleanUpAllConnections(Phone.REASON_DATA_SPECIFIC_DISABLED); 23111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 23171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2318cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private void applyNewState(ApnContext apnContext, boolean enabled, boolean met) { 2319cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean cleanup = false; 2320cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean trySetup = false; 23212dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt String str ="applyNewState(" + apnContext.getApnType() + ", " + enabled + 23222dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt "(" + apnContext.isEnabled() + "), " + met + "(" + 23232dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.getDependencyMet() +"))"; 23242dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt if (DBG) log(str); 23252dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog(str); 23262dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt 2327cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext.isReady()) { 2328305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt cleanup = true; 23292428693913ae731d4ace3414429f5e91af24ea36Wink Saville if (enabled && met) { 23302428693913ae731d4ace3414429f5e91af24ea36Wink Saville DctConstants.State state = apnContext.getState(); 23312428693913ae731d4ace3414429f5e91af24ea36Wink Saville switch(state) { 23322428693913ae731d4ace3414429f5e91af24ea36Wink Saville case CONNECTING: 23332428693913ae731d4ace3414429f5e91af24ea36Wink Saville case SCANNING: 23342428693913ae731d4ace3414429f5e91af24ea36Wink Saville case CONNECTED: 23352428693913ae731d4ace3414429f5e91af24ea36Wink Saville case DISCONNECTING: 23362428693913ae731d4ace3414429f5e91af24ea36Wink Saville // We're "READY" and active so just return 23372428693913ae731d4ace3414429f5e91af24ea36Wink Saville if (DBG) log("applyNewState: 'ready' so return"); 23382dde8b1659b1eb231e667bc19307ef294b627bebRobert Greenwalt apnContext.requestLog("applyNewState state=" + state + ", so return"); 23392428693913ae731d4ace3414429f5e91af24ea36Wink Saville return; 23402428693913ae731d4ace3414429f5e91af24ea36Wink Saville case IDLE: 23412428693913ae731d4ace3414429f5e91af24ea36Wink Saville // fall through: this is unexpected but if it happens cleanup and try setup 23422428693913ae731d4ace3414429f5e91af24ea36Wink Saville case FAILED: 23432428693913ae731d4ace3414429f5e91af24ea36Wink Saville case RETRYING: { 23442428693913ae731d4ace3414429f5e91af24ea36Wink Saville // We're "READY" but not active so disconnect (cleanup = true) and 23452428693913ae731d4ace3414429f5e91af24ea36Wink Saville // connect (trySetup = true) to be sure we retry the connection. 23462428693913ae731d4ace3414429f5e91af24ea36Wink Saville trySetup = true; 23472428693913ae731d4ace3414429f5e91af24ea36Wink Saville apnContext.setReason(Phone.REASON_DATA_ENABLED); 23482428693913ae731d4ace3414429f5e91af24ea36Wink Saville break; 23492428693913ae731d4ace3414429f5e91af24ea36Wink Saville } 23502428693913ae731d4ace3414429f5e91af24ea36Wink Saville } 2351305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt } else if (met) { 2352cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setReason(Phone.REASON_DATA_DISABLED); 2353305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt // If ConnectivityService has disabled this network, stop trying to bring 2354305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt // it up, but do not tear it down - ConnectivityService will do that 2355305122cd621385652826cf7d8cd4e651dc6b5e9fRobert Greenwalt // directly by talking with the DataConnection. 23561484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // 23571484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // This doesn't apply to DUN, however. Those connections have special 23581484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // requirements from carriers and we need stop using them when the dun 23591484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // request goes away. This applies to both CDMA and GSM because they both 23601484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // can declare the DUN APN sharable by default traffic, thus still satisfying 23611484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt // those requests and not torn down organically. 23621484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt if (apnContext.getApnType() == PhoneConstants.APN_TYPE_DUN && teardownForDun()) { 23631484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt cleanup = true; 23641484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt } else { 23651484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt cleanup = false; 23661484bfe9c58cfd2ddf59a5b8dad7373a36de946dRobert Greenwalt } 2367cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 2368cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setReason(Phone.REASON_DATA_DEPENDENCY_UNMET); 2369cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2370cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 2371cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (enabled && met) { 2372cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext.isEnabled()) { 2373cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setReason(Phone.REASON_DATA_DEPENDENCY_MET); 2374cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 2375cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setReason(Phone.REASON_DATA_ENABLED); 2376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2377cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext.getState() == DctConstants.State.FAILED) { 2378cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setState(DctConstants.State.IDLE); 2379cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2380cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville trySetup = true; 2381cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2382cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2383cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setEnabled(enabled); 2384cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setDependencyMet(met); 2385cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (cleanup) cleanUpConnection(true, apnContext); 23860d2abb5518d6a86619d2c2db04867c338b2092d4Robert Greenwalt if (trySetup) { 23870d2abb5518d6a86619d2c2db04867c338b2092d4Robert Greenwalt apnContext.resetErrorCodeRetries(); 23880d2abb5518d6a86619d2c2db04867c338b2092d4Robert Greenwalt trySetupData(apnContext); 23890d2abb5518d6a86619d2c2db04867c338b2092d4Robert Greenwalt } 2390cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2392454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private DcAsyncChannel checkForCompatibleConnectedApnContext(ApnContext apnContext) { 2393cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String apnType = apnContext.getApnType(); 2394cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnSetting dunSetting = null; 2395cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2396cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (PhoneConstants.APN_TYPE_DUN.equals(apnType)) { 2397cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville dunSetting = fetchDunApn(); 2398cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2399ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) { 2400ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("checkForCompatibleConnectedApnContext: apnContext=" + apnContext ); 2401ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2402cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2403454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcAsyncChannel potentialDcac = null; 2404ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnContext potentialApnCtx = null; 2405ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (ApnContext curApnCtx : mApnContexts.values()) { 2406454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcAsyncChannel curDcac = curApnCtx.getDcAc(); 2407ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (curDcac != null) { 2408ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville ApnSetting apnSetting = curApnCtx.getApnSetting(); 2409a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("apnSetting: " + apnSetting); 2410cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (dunSetting != null) { 2411cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (dunSetting.equals(apnSetting)) { 2412ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (curApnCtx.getState()) { 2413cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case CONNECTED: 2414cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 2415ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("checkForCompatibleConnectedApnContext:" 2416ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " found dun conn=" + curDcac 2417ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " curApnCtx=" + curApnCtx); 2418cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2419ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return curDcac; 2420ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case RETRYING: 2421cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case CONNECTING: 2422ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville potentialDcac = curDcac; 2423ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville potentialApnCtx = curApnCtx; 2424cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville default: 2425cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Not connected, potential unchanged 2426cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 2427cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2428cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2429cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else if (apnSetting != null && apnSetting.canHandleType(apnType)) { 2430ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville switch (curApnCtx.getState()) { 2431cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case CONNECTED: 2432cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 2433ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("checkForCompatibleConnectedApnContext:" 2434ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " found canHandle conn=" + curDcac 2435ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " curApnCtx=" + curApnCtx); 2436cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2437ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return curDcac; 2438ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville case RETRYING: 2439cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case CONNECTING: 2440ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville potentialDcac = curDcac; 2441ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville potentialApnCtx = curApnCtx; 2442cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville default: 2443cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Not connected, potential unchanged 2444cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 2445cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2446cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2447ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 2448ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (VDBG) { 2449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("checkForCompatibleConnectedApnContext: not conn curApnCtx=" + curApnCtx); 2450ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2451cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2452cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (potentialDcac != null) { 2454cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 2455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("checkForCompatibleConnectedApnContext: found potential conn=" + potentialDcac 2456ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville + " curApnCtx=" + potentialApnCtx); 2457cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2458ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return potentialDcac; 2459cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2461ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("checkForCompatibleConnectedApnContext: NO conn apnContext=" + apnContext); 2462cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return null; 2463cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 246527b650c406018355a88a41528db7859e232728a0Jack Yu public void setEnabled(int id, boolean enable) { 24661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message msg = obtainMessage(DctConstants.EVENT_ENABLE_NEW_APN); 24671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.arg1 = id; 24681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.arg2 = (enable ? DctConstants.ENABLED : DctConstants.DISABLED); 24691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(msg); 24701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 24721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onEnableApn(int apnId, int enabled) { 2473af5593594070f825032be46dced573cd195956e1Robert Greenwalt ApnContext apnContext = mApnContextsById.get(apnId); 2474cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext == null) { 2475cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville loge("onEnableApn(" + apnId + ", " + enabled + "): NO ApnContext"); 2476cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return; 2477cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2478cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // TODO change our retry manager to use the appropriate numbers for the new APN 2479cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onEnableApn: apnContext=" + apnContext + " call applyNewState"); 2480cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville applyNewState(apnContext, enabled == DctConstants.ENABLED, apnContext.getDependencyMet()); 2481cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2483cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // TODO: We shouldnt need this. 24841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean onTrySetupData(String reason) { 2485cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onTrySetupData: reason=" + reason); 2486ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setupDataOnConnectableApns(reason); 2487cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 2488cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 24901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean onTrySetupData(ApnContext apnContext) { 2491cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onTrySetupData: apnContext=" + apnContext); 2492cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return trySetupData(apnContext); 2493cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 24951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 24961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Return current {@link android.provider.Settings.Global#MOBILE_DATA} value. 24971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 24981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean getDataEnabled() { 2499f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt final int device_provisioned = 2500f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt Settings.Global.getInt(mResolver, Settings.Global.DEVICE_PROVISIONED, 0); 2501f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt 25021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean retVal = "true".equalsIgnoreCase(SystemProperties.get( 25031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "ro.com.android.mobiledata", "true")); 2504f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt if (TelephonyManager.getDefault().getSimCount() == 1) { 2505f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt retVal = Settings.Global.getInt(mResolver, Settings.Global.MOBILE_DATA, 2506f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt retVal ? 1 : 0) != 0; 2507f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } else { 2508f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt int phoneSubId = mPhone.getSubId(); 2509f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt try { 2510f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt retVal = TelephonyManager.getIntWithSubId(mResolver, 2511f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt Settings.Global.MOBILE_DATA, phoneSubId) != 0; 2512f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } catch (SettingNotFoundException e) { 2513f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt // use existing retVal 2514f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } 2515f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt } 2516f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt if (VDBG) log("getDataEnabled: retVal=" + retVal); 2517f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt if (device_provisioned == 0) { 2518f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt // device is still getting provisioned - use whatever setting they 2519f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt // want during this process 2520f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt // 2521f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt // use the normal data_enabled setting (retVal, determined above) 2522f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt // as the default if nothing else is set 2523f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt final String prov_property = SystemProperties.get("ro.com.android.prov_mobiledata", 2524f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt retVal ? "true" : "false"); 2525f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt retVal = "true".equalsIgnoreCase(prov_property); 2526f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt 2527f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt final int prov_mobile_data = Settings.Global.getInt(mResolver, 2528f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt Settings.Global.DEVICE_PROVISIONING_MOBILE_DATA_ENABLED, 2529f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt retVal ? 1 : 0); 2530f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt retVal = prov_mobile_data != 0; 2531f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt log("getDataEnabled during provisioning retVal=" + retVal + " - (" + prov_property + 2532f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt ", " + prov_mobile_data + ")"); 25331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2534f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt 25351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return retVal; 25361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 25391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Modify {@link android.provider.Settings.Global#DATA_ROAMING} value. 25401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 25411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setDataOnRoamingEnabled(boolean enabled) { 25421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final int phoneSubId = mPhone.getSubId(); 25431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getDataOnRoamingEnabled() != enabled) { 25441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int roaming = enabled ? 1 : 0; 25451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // For single SIM phones, this is a per phone property. 25471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (TelephonyManager.getDefault().getSimCount() == 1) { 25481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.putInt(mResolver, Settings.Global.DATA_ROAMING, roaming); 25491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 25501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.putInt(mResolver, Settings.Global.DATA_ROAMING + 25511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu phoneSubId, roaming); 25521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSubscriptionManager.setDataRoaming(roaming, phoneSubId); 25551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // will trigger handleDataOnRoamingChange() through observer 25561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 25571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("setDataOnRoamingEnabled: set phoneSubId=" + phoneSubId 25581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " isRoaming=" + enabled); 25591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 25611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 25621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("setDataOnRoamingEnabled: unchanged phoneSubId=" + phoneSubId 25631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " isRoaming=" + enabled); 25641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 25691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Return current {@link android.provider.Settings.Global#DATA_ROAMING} value. 25701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 25711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean getDataOnRoamingEnabled() { 25721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isDataRoamingEnabled = "true".equalsIgnoreCase(SystemProperties.get( 25731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "ro.com.android.dataroaming", "false")); 25741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final int phoneSubId = mPhone.getSubId(); 25751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 25771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // For single SIM phones, this is a per phone property. 25781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (TelephonyManager.getDefault().getSimCount() == 1) { 25791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isDataRoamingEnabled = Settings.Global.getInt(mResolver, 25801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.DATA_ROAMING, isDataRoamingEnabled ? 1 : 0) != 0; 25811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 25821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isDataRoamingEnabled = TelephonyManager.getIntWithSubId(mResolver, 25831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.DATA_ROAMING, phoneSubId) != 0; 25841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (SettingNotFoundException snfe) { 25861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("getDataOnRoamingEnabled: SettingNofFoundException snfe=" + snfe); 25871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) { 25891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("getDataOnRoamingEnabled: phoneSubId=" + phoneSubId + 25901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " isDataRoamingEnabled=" + isDataRoamingEnabled); 25911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return isDataRoamingEnabled; 25931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onRoamingOff() { 2596cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onRoamingOff"); 2597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 25986bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (!mUserDataEnabled) return; 2599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2600bda761320929f714951c328bfec6a51a1978db97Wink Saville if (getDataOnRoamingEnabled() == false) { 2601cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyOffApnsOfAvailability(Phone.REASON_ROAMING_OFF); 2602bda761320929f714951c328bfec6a51a1978db97Wink Saville setupDataOnConnectableApns(Phone.REASON_ROAMING_OFF); 2603cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 2604cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyDataConnection(Phone.REASON_ROAMING_OFF); 2605cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2606cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2607cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 26081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onRoamingOn() { 26096bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (DBG) log("onRoamingOn"); 2610bda761320929f714951c328bfec6a51a1978db97Wink Saville 26116bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (!mUserDataEnabled) return; 2612cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2613bda761320929f714951c328bfec6a51a1978db97Wink Saville if (getDataOnRoamingEnabled()) { 2614cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onRoamingOn: setup data on roaming"); 2615ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville setupDataOnConnectableApns(Phone.REASON_ROAMING_ON); 2616cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyDataConnection(Phone.REASON_ROAMING_ON); 2617cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 2618cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onRoamingOn: Tear down data connection on roaming."); 2619cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cleanUpAllConnections(true, Phone.REASON_ROAMING_ON); 2620cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON); 2621cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2622cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2623cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 26241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onRadioAvailable() { 2625cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onRadioAvailable"); 2626cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (mPhone.getSimulatedRadioControl() != null) { 2627cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Assume data is connected on the simulator 2628cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // FIXME this can be improved 2629cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // setState(DctConstants.State.CONNECTED); 2630cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyDataConnection(null); 2631cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2632cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("onRadioAvailable: We're on the simulator; assuming data is connected"); 2633cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2634cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2635cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville IccRecords r = mIccRecords.get(); 2636cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (r != null && r.getRecordsLoaded()) { 2637cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyOffApnsOfAvailability(null); 2638cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2639cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2640cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (getOverallState() != DctConstants.State.IDLE) { 2641cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cleanUpConnection(true, null); 2642cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2643cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2644cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 26451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onRadioOffOrNotAvailable() { 2646cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Make sure our reconnect delay starts at the initial value 2647cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // next time the radio comes on 2648cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2649cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mReregisterOnReconnectFailure = false; 2650cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2651cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (mPhone.getSimulatedRadioControl() != null) { 2652cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Assume data is connected on the simulator 2653cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // FIXME this can be improved 2654cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("We're on the simulator; assuming radio off is meaningless"); 2655cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 2656cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onRadioOffOrNotAvailable: is off and clean up all connections"); 2657cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cleanUpAllConnections(false, Phone.REASON_RADIO_TURNED_OFF); 2658cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2659cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyOffApnsOfAvailability(null); 2660cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2661cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 26621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void completeConnection(ApnContext apnContext) { 2663c9b81a0c05128694c617fcdd67e73821895822feWink Saville 2664c9b81a0c05128694c617fcdd67e73821895822feWink Saville if (DBG) log("completeConnection: successful, notify the world apnContext=" + apnContext); 2665c9b81a0c05128694c617fcdd67e73821895822feWink Saville 2666c9b81a0c05128694c617fcdd67e73821895822feWink Saville if (mIsProvisioning && !TextUtils.isEmpty(mProvisioningUrl)) { 2667c9b81a0c05128694c617fcdd67e73821895822feWink Saville if (DBG) { 2668c9b81a0c05128694c617fcdd67e73821895822feWink Saville log("completeConnection: MOBILE_PROVISIONING_ACTION url=" 2669c9b81a0c05128694c617fcdd67e73821895822feWink Saville + mProvisioningUrl); 2670c9b81a0c05128694c617fcdd67e73821895822feWink Saville } 2671c8dc0c8244aac9f3985a53bc94b8ec2e295db430Robert Greenwalt Intent newIntent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, 2672c8dc0c8244aac9f3985a53bc94b8ec2e295db430Robert Greenwalt Intent.CATEGORY_APP_BROWSER); 2673c8dc0c8244aac9f3985a53bc94b8ec2e295db430Robert Greenwalt newIntent.setData(Uri.parse(mProvisioningUrl)); 2674c9b81a0c05128694c617fcdd67e73821895822feWink Saville newIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | 2675c9b81a0c05128694c617fcdd67e73821895822feWink Saville Intent.FLAG_ACTIVITY_NEW_TASK); 2676c9b81a0c05128694c617fcdd67e73821895822feWink Saville try { 2677c9b81a0c05128694c617fcdd67e73821895822feWink Saville mPhone.getContext().startActivity(newIntent); 2678c9b81a0c05128694c617fcdd67e73821895822feWink Saville } catch (ActivityNotFoundException e) { 2679c9b81a0c05128694c617fcdd67e73821895822feWink Saville loge("completeConnection: startActivityAsUser failed" + e); 2680c9b81a0c05128694c617fcdd67e73821895822feWink Saville } 2681c9b81a0c05128694c617fcdd67e73821895822feWink Saville } 2682c9b81a0c05128694c617fcdd67e73821895822feWink Saville mIsProvisioning = false; 2683c9b81a0c05128694c617fcdd67e73821895822feWink Saville mProvisioningUrl = null; 26842b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen if (mProvisioningSpinner != null) { 26852b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen sendMessage(obtainMessage(DctConstants.CMD_CLEAR_PROVISIONING_SPINNER, 26862b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner)); 26872b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen } 2688c9b81a0c05128694c617fcdd67e73821895822feWink Saville 2689c9b81a0c05128694c617fcdd67e73821895822feWink Saville mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType()); 2690c9b81a0c05128694c617fcdd67e73821895822feWink Saville startNetStatPoll(); 2691c9b81a0c05128694c617fcdd67e73821895822feWink Saville startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); 2692c9b81a0c05128694c617fcdd67e73821895822feWink Saville } 2693c9b81a0c05128694c617fcdd67e73821895822feWink Saville 2694ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2695ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * A SETUP (aka bringUp) has completed, possibly with an error. If 2696ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * there is an error this method will call {@link #onDataSetupCompleteError}. 2697ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 26981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onDataSetupComplete(AsyncResult ar) { 2699608588e9af271f0f5640236809f27c626f9d98e9Robert Greenwalt 2700ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DcFailCause cause = DcFailCause.UNKNOWN; 2701cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean handleError = false; 2702ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt ApnContext apnContext = getValidApnContext(ar, "onDataSetupComplete"); 2703cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2704ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if (apnContext == null) return; 2705cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2706cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (ar.exception == null) { 2707454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcAsyncChannel dcac = apnContext.getDcAc(); 2708cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2709cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (RADIO_TESTS) { 2710cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Note: To change radio.test.onDSC.null.dcac from command line you need to 2711cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // adb root and adb remount and from the command line you can only change the 2712cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // value to 1 once. To change it a second time you can reboot or execute 2713cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // adb shell stop and then adb shell start. The command line to set the value is: 2714ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // adb shell sqlite3 /data/data/com.android.providers.settings/databases/settings.db "insert into system (name,value) values ('radio.test.onDSC.null.dcac', '1');" 2715cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ContentResolver cr = mPhone.getContext().getContentResolver(); 2716cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String radioTestProperty = "radio.test.onDSC.null.dcac"; 2717cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (Settings.System.getInt(cr, radioTestProperty, 0) == 1) { 2718cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("onDataSetupComplete: " + radioTestProperty + 2719cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville " is true, set dcac to null and reset property to false"); 2720cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville dcac = null; 2721cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Settings.System.putInt(cr, radioTestProperty, 0); 2722cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("onDataSetupComplete: " + radioTestProperty + "=" + 2723cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Settings.System.getInt(mPhone.getContext().getContentResolver(), 2724cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville radioTestProperty, -1)); 2725cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2727cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (dcac == null) { 2728cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("onDataSetupComplete: no connection to DC, handle as error"); 2729ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = DcFailCause.CONNECTION_TO_DATACONNECTIONAC_BROKEN; 2730cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville handleError = true; 2731cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 2732cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnSetting apn = apnContext.getApnSetting(); 2733cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 2734cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("onDataSetupComplete: success apn=" + (apn == null ? "unknown" : apn.apn)); 2735cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2736cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apn != null && apn.proxy != null && apn.proxy.length() != 0) { 2737cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville try { 2738cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String port = apn.port; 2739cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (TextUtils.isEmpty(port)) port = "8080"; 27409c180aedfc9f0d20525c0128487d3500e6c0a715Jason Monk ProxyInfo proxy = new ProxyInfo(apn.proxy, 2741cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Integer.parseInt(port), null); 2742cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville dcac.setLinkPropertiesHttpProxySync(proxy); 2743cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } catch (NumberFormatException e) { 2744cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville loge("onDataSetupComplete: NumberFormatException making ProxyProperties (" + 2745cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apn.port + "): " + e); 2746cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2747cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2748cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2749cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // everything is setup 2750cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if(TextUtils.equals(apnContext.getApnType(),PhoneConstants.APN_TYPE_DEFAULT)) { 275127b650c406018355a88a41528db7859e232728a0Jack Yu try { 275227b650c406018355a88a41528db7859e232728a0Jack Yu SystemProperties.set(PUPPET_MASTER_RADIO_STRESS_TEST, "true"); 275327b650c406018355a88a41528db7859e232728a0Jack Yu } catch (RuntimeException ex) { 275427b650c406018355a88a41528db7859e232728a0Jack Yu log("Failed to set PUPPET_MASTER_RADIO_STRESS_TEST to true"); 275527b650c406018355a88a41528db7859e232728a0Jack Yu } 275622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mCanSetPreferApn && mPreferredApn == null) { 27570e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (DBG) log("onDataSetupComplete: PREFERRED APN is null"); 2758cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPreferredApn = apn; 2759cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (mPreferredApn != null) { 2760cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville setPreferredApn(mPreferredApn.id); 2761cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2762cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2763cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 276427b650c406018355a88a41528db7859e232728a0Jack Yu try { 276527b650c406018355a88a41528db7859e232728a0Jack Yu SystemProperties.set(PUPPET_MASTER_RADIO_STRESS_TEST, "false"); 276627b650c406018355a88a41528db7859e232728a0Jack Yu } catch (RuntimeException ex) { 276727b650c406018355a88a41528db7859e232728a0Jack Yu log("Failed to set PUPPET_MASTER_RADIO_STRESS_TEST to false"); 276827b650c406018355a88a41528db7859e232728a0Jack Yu } 2769cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2770c9b81a0c05128694c617fcdd67e73821895822feWink Saville 2771c9b81a0c05128694c617fcdd67e73821895822feWink Saville // A connection is setup 2772c9b81a0c05128694c617fcdd67e73821895822feWink Saville apnContext.setState(DctConstants.State.CONNECTED); 27730e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 2774c9b81a0c05128694c617fcdd67e73821895822feWink Saville boolean isProvApn = apnContext.isProvisioningApn(); 2775b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen final ConnectivityManager cm = ConnectivityManager.from(mPhone.getContext()); 2776b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen if (mProvisionBroadcastReceiver != null) { 2777b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen mPhone.getContext().unregisterReceiver(mProvisionBroadcastReceiver); 2778b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen mProvisionBroadcastReceiver = null; 2779b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen } 2780c9b81a0c05128694c617fcdd67e73821895822feWink Saville if ((!isProvApn) || mIsProvisioning) { 2781b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // Hide any provisioning notification. 2782b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen cm.setProvisioningNotificationVisible(false, ConnectivityManager.TYPE_MOBILE, 2783b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen mProvisionActionName); 2784c9b81a0c05128694c617fcdd67e73821895822feWink Saville // Complete the connection normally notifying the world we're connected. 2785c9b81a0c05128694c617fcdd67e73821895822feWink Saville // We do this if this isn't a special provisioning apn or if we've been 2786c9b81a0c05128694c617fcdd67e73821895822feWink Saville // told its time to provision. 2787c9b81a0c05128694c617fcdd67e73821895822feWink Saville completeConnection(apnContext); 2788c9b81a0c05128694c617fcdd67e73821895822feWink Saville } else { 2789c9b81a0c05128694c617fcdd67e73821895822feWink Saville // This is a provisioning APN that we're reporting as connected. Later 2790c9b81a0c05128694c617fcdd67e73821895822feWink Saville // when the user desires to upgrade this to a "default" connection, 2791c9b81a0c05128694c617fcdd67e73821895822feWink Saville // mIsProvisioning == true, we'll go through the code path above. 2792c9b81a0c05128694c617fcdd67e73821895822feWink Saville // mIsProvisioning becomes true when CMD_ENABLE_MOBILE_PROVISIONING 2793c9b81a0c05128694c617fcdd67e73821895822feWink Saville // is sent to the DCT. 2794c9b81a0c05128694c617fcdd67e73821895822feWink Saville if (DBG) { 2795c9b81a0c05128694c617fcdd67e73821895822feWink Saville log("onDataSetupComplete: successful, BUT send connected to prov apn as" 2796c9b81a0c05128694c617fcdd67e73821895822feWink Saville + " mIsProvisioning:" + mIsProvisioning + " == false" 2797c9b81a0c05128694c617fcdd67e73821895822feWink Saville + " && (isProvisioningApn:" + isProvApn + " == true"); 2798c9b81a0c05128694c617fcdd67e73821895822feWink Saville } 2799c9b81a0c05128694c617fcdd67e73821895822feWink Saville 2800b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // While radio is up, grab provisioning URL. The URL contains ICCID which 2801b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // disappears when radio is off. 2802b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen mProvisionBroadcastReceiver = new ProvisionNotificationBroadcastReceiver( 28032b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen cm.getMobileProvisioningUrl(), 28042b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen TelephonyManager.getDefault().getNetworkOperatorName()); 2805b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen mPhone.getContext().registerReceiver(mProvisionBroadcastReceiver, 2806b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen new IntentFilter(mProvisionActionName)); 2807b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // Put up user notification that sign-in is required. 2808b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen cm.setProvisioningNotificationVisible(true, ConnectivityManager.TYPE_MOBILE, 2809b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen mProvisionActionName); 2810b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // Turn off radio to save battery and avoid wasting carrier resources. 2811b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen // The network isn't usable and network validation will just fail anyhow. 2812b449dc75ef4b9cb996c34a11e758f7e6ca193240Paul Jensen setRadio(false); 2813c9b81a0c05128694c617fcdd67e73821895822feWink Saville } 2814c9b81a0c05128694c617fcdd67e73821895822feWink Saville if (DBG) { 2815c9b81a0c05128694c617fcdd67e73821895822feWink Saville log("onDataSetupComplete: SETUP complete type=" + apnContext.getApnType() 2816c9b81a0c05128694c617fcdd67e73821895822feWink Saville + ", reason:" + apnContext.getReason()); 2817c9b81a0c05128694c617fcdd67e73821895822feWink Saville } 2818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2819cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 2820ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville cause = (DcFailCause) (ar.result); 2821cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 2822cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnSetting apn = apnContext.getApnSetting(); 2823cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log(String.format("onDataSetupComplete: error apn=%s cause=%s", 2824cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville (apn == null ? "unknown" : apn.apn), cause)); 2825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2826cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (cause.isEventLoggable()) { 2827cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Log this failure to the Event Logs. 2828cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville int cid = getCellLocationId(); 2829cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville EventLog.writeEvent(EventLogTags.PDP_SETUP_FAIL, 2830cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cause.ordinal(), cid, TelephonyManager.getDefault().getNetworkType()); 2831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 28320742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela ApnSetting apn = apnContext.getApnSetting(); 28330742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela mPhone.notifyPreciseDataConnectionFailed(apnContext.getReason(), 28340742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela apnContext.getApnType(), apn != null ? apn.apn : "unknown", cause.toString()); 2835cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 28360e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (cause.isRestartRadioFail() || apnContext.restartOnError(cause.getErrorCode())) { 28370e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (DBG) log("Modem restarted."); 28380e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu sendRestartRadio(); 28390e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 2840cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 28410e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // If the data call failure cause is a permanent failure, we mark the APN as permanent 28420e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // failed. 28430e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (isPermanentFail(cause)) { 28440e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu log("cause = " + cause + ", mark apn as permanent failed. apn = " + apn); 28450e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu apnContext.markApnPermanentFailed(apn); 2846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 28470e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 2848cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville handleError = true; 2849cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2850cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2851cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (handleError) { 2852ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville onDataSetupCompleteError(ar); 2853ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2854a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2855a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* If flag is set to false after SETUP_DATA_CALL is invoked, we need 2856a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * to clean data connections. 2857a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 2858a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!mInternalDataEnabled) { 2859a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cleanUpAllConnections(null); 2860a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2861a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2862ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 2863cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2864ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 2865ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt * check for obsolete messages. Return ApnContext if valid, null if not 2866ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt */ 2867ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt private ApnContext getValidApnContext(AsyncResult ar, String logString) { 2868ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if (ar != null && ar.userObj instanceof Pair) { 2869ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt Pair<ApnContext, Integer>pair = (Pair<ApnContext, Integer>)ar.userObj; 2870ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt ApnContext apnContext = pair.first; 2871ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if (apnContext != null) { 28721a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt final int generation = apnContext.getConnectionGeneration(); 28731a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt if (DBG) { 28741a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt log("getValidApnContext (" + logString + ") on " + apnContext + " got " + 28751a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt generation + " vs " + pair.second); 28761a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt } 28771a1cc3f5759471edcf51294439f0e0b71922d6a0Robert Greenwalt if (generation == pair.second) { 2878ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt return apnContext; 2879ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt } else { 2880ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt log("ignoring obsolete " + logString); 2881ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt return null; 2882ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt } 2883ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt } 2884ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt } 2885ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt throw new RuntimeException(logString + ": No apnContext"); 2886ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt } 2887ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt 2888ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt /** 2889ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Error has occurred during the SETUP {aka bringUP} request and the DCT 2890ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * should either try the next waiting APN or start over from the 2891ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * beginning if the list is empty. Between each SETUP request there will 2892ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville * be a delay defined by {@link #getApnDelay()}. 2893ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 28941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onDataSetupCompleteError(AsyncResult ar) { 28950e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 2896ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt ApnContext apnContext = getValidApnContext(ar, "onDataSetupCompleteError"); 2897ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 2898ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if (apnContext == null) return; 2899ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 29000e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu long delay = apnContext.getDelayForNextApn(mFailFast); 2901ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 29020e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // Check if we need to retry or not. 29030e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (delay > 0) { 29040e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (DBG) log("onDataSetupCompleteError: Try next APN. delay = " + delay); 2905ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnContext.setState(DctConstants.State.SCANNING); 2906ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // Wait a bit before trying the next APN, so that 2907ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // we're not tying up the RIL command channel 29080e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu startAlarmForReconnect(delay, apnContext); 29090e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } else { 29100e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // If we are not going to retry any APN, set this APN context to failed state. 29110e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // This would be the final state of a data connection. 29120e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu apnContext.setState(DctConstants.State.FAILED); 29130e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu mPhone.notifyDataConnection(Phone.REASON_APN_FAILED, apnContext.getApnType()); 29140e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu apnContext.setDataConnectionAc(null); 29150e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu log("onDataSetupCompleteError: Stop retrying APNs."); 2916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2918c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2919c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 2920cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Called when EVENT_DISCONNECT_DONE is received. 2921c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 29221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onDisconnectDone(AsyncResult ar) { 2923ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt ApnContext apnContext = getValidApnContext(ar, "onDisconnectDone"); 2924ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if (apnContext == null) return; 2925c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2926cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if(DBG) log("onDisconnectDone: EVENT_DISCONNECT_DONE apnContext=" + apnContext); 2927cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setState(DctConstants.State.IDLE); 2928cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2929cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType()); 2930cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 2931cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // if all data connection are gone, check whether Airplane mode request was 2932cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // pending. 2933cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (isDisconnected()) { 2934cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (mPhone.getServiceStateTracker().processPendingRadioPowerOffAfterDataOff()) { 2935449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville if(DBG) log("onDisconnectDone: radio will be turned off, no retries"); 2936cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Radio will be turned off. No need to retry data setup 2937cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setApnSetting(null); 2938cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setDataConnectionAc(null); 2939a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2940a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Need to notify disconnect as well, in the case of switching Airplane mode. 2941a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Otherwise, it would cause 30s delayed to turn on Airplane mode. 29420e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (mDisconnectPendingCount > 0) { 2943a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDisconnectPendingCount--; 29440e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 2945a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2946a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mDisconnectPendingCount == 0) { 2947a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyDataDisconnectComplete(); 2948a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyAllDataDisconnected(); 2949a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2950cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return; 2951cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 2952c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2954cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // If APN is still enabled, try to bring it back up automatically 29553fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (mAttached.get() && apnContext.isReady() && retryAfterDisconnected(apnContext)) { 295627b650c406018355a88a41528db7859e232728a0Jack Yu try { 295727b650c406018355a88a41528db7859e232728a0Jack Yu SystemProperties.set(PUPPET_MASTER_RADIO_STRESS_TEST, "false"); 295827b650c406018355a88a41528db7859e232728a0Jack Yu } catch (RuntimeException ex) { 295927b650c406018355a88a41528db7859e232728a0Jack Yu log("Failed to set PUPPET_MASTER_RADIO_STRESS_TEST to false"); 296027b650c406018355a88a41528db7859e232728a0Jack Yu } 2961cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Wait a bit before trying the next APN, so that 2962cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // we're not tying up the RIL command channel. 2963cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // This also helps in any external dependency to turn off the context. 29640e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (DBG) log("onDisconnectDone: attached, ready and retry after disconnect"); 29650e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu long delay = apnContext.getInterApnDelay(mFailFast); 29660e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (delay > 0) { 29670e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // Data connection is in IDLE state, so when we reconnect later, we'll rebuild 29680e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // the waiting APN list, which will also reset/reconfigure the retry manager. 29690e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu startAlarmForReconnect(delay, apnContext); 29700e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 2971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 2972449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville boolean restartRadioAfterProvisioning = mPhone.getContext().getResources().getBoolean( 2973449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville com.android.internal.R.bool.config_restartRadioAfterProvisioning); 2974449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville 2975449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville if (apnContext.isProvisioningApn() && restartRadioAfterProvisioning) { 2976449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville log("onDisconnectDone: restartRadio after provisioning"); 2977449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville restartRadio(); 2978449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville } 2979cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setApnSetting(null); 2980cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setDataConnectionAc(null); 29813fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (isOnlySingleDcAllowed(mPhone.getServiceState().getRilDataRadioTechnology())) { 2982449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville if(DBG) log("onDisconnectDone: isOnlySigneDcAllowed true so setup single apn"); 29833fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt setupDataOnConnectableApns(Phone.REASON_SINGLE_PDN_ARBITRATION); 2984449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville } else { 2985449cbf85380bd1d6716b7ab002da1efb9493bb02Wink Saville if(DBG) log("onDisconnectDone: not retrying"); 29863fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 2987c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 2988a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2989a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mDisconnectPendingCount > 0) 2990a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDisconnectPendingCount--; 2991a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2992a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mDisconnectPendingCount == 0) { 2993c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt apnContext.setConcurrentVoiceAndDataAllowed( 2994c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()); 2995a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyDataDisconnectComplete(); 2996a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyAllDataDisconnected(); 2997a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 2998a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3001ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** 3002ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Called when EVENT_DISCONNECT_DC_RETRYING is received. 3003ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 30041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onDisconnectDcRetrying(AsyncResult ar) { 3005ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // We could just do this in DC!!! 3006ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt ApnContext apnContext = getValidApnContext(ar, "onDisconnectDcRetrying"); 3007ea763d93b231bccf7e476b625fa028bef7874bf8Robert Greenwalt if (apnContext == null) return; 3008ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 3009ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville apnContext.setState(DctConstants.State.RETRYING); 3010ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if(DBG) log("onDisconnectDcRetrying: apnContext=" + apnContext); 3011ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 3012ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType()); 3013ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 3014ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 30151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onVoiceCallStarted() { 3016cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onVoiceCallStarted"); 3017ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville mInVoiceCall = true; 3018cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (isConnected() && ! mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { 3019cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onVoiceCallStarted stop polling"); 3020cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville stopNetStatPoll(); 3021cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville stopDataStallAlarm(); 3022cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyDataConnection(Phone.REASON_VOICE_CALL_STARTED); 3023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3025c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 30261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onVoiceCallEnded() { 3027cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onVoiceCallEnded"); 3028ec107cb8a36181fa26e61ab51f423ba862deb0faWink Saville mInVoiceCall = false; 3029cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (isConnected()) { 3030cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (!mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { 3031cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville startNetStatPoll(); 3032cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); 3033cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED); 3034cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 3035cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // clean slate after call end. 3036cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville resetPollStats(); 3037c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3038c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3039bda761320929f714951c328bfec6a51a1978db97Wink Saville // reset reconnect timer 3040bda761320929f714951c328bfec6a51a1978db97Wink Saville setupDataOnConnectableApns(Phone.REASON_VOICE_CALL_ENDED); 3041c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3042c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 30431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onCleanUpConnection(boolean tearDown, int apnId, String reason) { 3044cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("onCleanUpConnection"); 3045af5593594070f825032be46dced573cd195956e1Robert Greenwalt ApnContext apnContext = mApnContextsById.get(apnId); 3046cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apnContext != null) { 3047cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.setReason(reason); 3048cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cleanUpConnection(tearDown, apnContext); 3049c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3050c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3051c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 30521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean isConnected() { 3053cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville for (ApnContext apnContext : mApnContexts.values()) { 3054ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (apnContext.getState() == DctConstants.State.CONNECTED) { 3055cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // At least one context is connected, return true 3056cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 3057c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3058c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3059cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // There are not any contexts connected, return false 3060cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 3061c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3062c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3063cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public boolean isDisconnected() { 3064cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville for (ApnContext apnContext : mApnContexts.values()) { 3065cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (!apnContext.isDisconnected()) { 3066cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // At least one context was not disconnected return false 3067cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return false; 3068cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3069c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3070cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // All contexts were disconnected so return true 3071cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return true; 3072c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3073c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 30741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void notifyDataConnection(String reason) { 3075cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("notifyDataConnection: reason=" + reason); 3076cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville for (ApnContext apnContext : mApnContexts.values()) { 3077187a39f896f88eb6c5e4306d9595546654825976Wink Saville if (mAttached.get() && apnContext.isReady()) { 3078187a39f896f88eb6c5e4306d9595546654825976Wink Saville if (DBG) log("notifyDataConnection: type:" + apnContext.getApnType()); 3079cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPhone.notifyDataConnection(reason != null ? reason : apnContext.getReason(), 3080cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnContext.getApnType()); 3081cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3082c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3083cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville notifyOffApnsOfAvailability(reason); 3084c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3085c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 30861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void setDataProfilesAsNeeded() { 30871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("setDataProfilesAsNeeded"); 30881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mAllApnSettings != null && !mAllApnSettings.isEmpty()) { 30891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ArrayList<DataProfile> dps = new ArrayList<DataProfile>(); 30901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (ApnSetting apn : mAllApnSettings) { 30911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (apn.modemCognitive) { 30921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DataProfile dp = new DataProfile(apn, 30931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceState().getDataRoaming()); 30941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isDup = false; 30951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for(DataProfile dpIn : dps) { 30961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dp.equals(dpIn)) { 30971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isDup = true; 30981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 30991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isDup) { 31021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dps.add(dp); 31031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if(dps.size() > 0) { 31071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.mCi.setDataProfile(dps.toArray(new DataProfile[0]), null); 31081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 3113cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Based on the sim operator numeric, create a list for all possible 3114cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Data Connections and setup the preferredApn. 3115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 3116cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private void createAllApnList() { 31171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mMvnoMatched = false; 3118ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAllApnSettings = new ArrayList<ApnSetting>(); 3119cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville IccRecords r = mIccRecords.get(); 3120cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String operator = (r != null) ? r.getOperatorNumeric() : ""; 3121cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (operator != null) { 3122cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String selection = "numeric = '" + operator + "'"; 312360bc489803a3557526e1f95e34c237e70f28bc50Sungmin Choi String orderBy = "_id"; 3124cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // query only enabled apn. 3125cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // carrier_enabled : 1 means enabled apn, 0 disabled apn. 31269d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan // selection += " and carrier_enabled = 1"; 3127cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("createAllApnList: selection=" + selection); 3128cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3129cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Cursor cursor = mPhone.getContext().getContentResolver().query( 313060bc489803a3557526e1f95e34c237e70f28bc50Sungmin Choi Telephony.Carriers.CONTENT_URI, null, selection, null, orderBy); 3131cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3132cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (cursor != null) { 3133cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (cursor.getCount() > 0) { 3134ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mAllApnSettings = createApnList(cursor); 3135cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3136cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cursor.close(); 3137cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 314076f43316a5a6082d601bffd4b6898d0bd81e11fcram addEmergencyApnSetting(); 314176f43316a5a6082d601bffd4b6898d0bd81e11fcram 314229c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt dedupeApnSettings(); 314329c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt 3144ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAllApnSettings.isEmpty()) { 3145cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("createAllApnList: No APN found for carrier: " + operator); 3146cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPreferredApn = null; 3147ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // TODO: What is the right behavior? 3148cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville //notifyNoData(DataConnection.FailCause.MISSING_UNKNOWN_APN); 3149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 3150cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPreferredApn = getPreferredApn(); 3151cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (mPreferredApn != null && !mPreferredApn.numeric.equals(operator)) { 3152cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPreferredApn = null; 3153cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville setPreferredApn(-1); 3154cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3155cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("createAllApnList: mPreferredApn=" + mPreferredApn); 3156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3157ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("createAllApnList: X mAllApnSettings=" + mAllApnSettings); 31589d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan 31599d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan setDataProfilesAsNeeded(); 3160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 316229c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt private void dedupeApnSettings() { 316329c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt ArrayList<ApnSetting> resultApns = new ArrayList<ApnSetting>(); 316429c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt 316529c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt // coalesce APNs if they are similar enough to prevent 316629c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt // us from bringing up two data calls with the same interface 316729c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt int i = 0; 316829c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt while (i < mAllApnSettings.size() - 1) { 316929c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt ApnSetting first = mAllApnSettings.get(i); 317029c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt ApnSetting second = null; 317129c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt int j = i + 1; 317229c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt while (j < mAllApnSettings.size()) { 317329c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt second = mAllApnSettings.get(j); 317429c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt if (apnsSimilar(first, second)) { 317529c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt ApnSetting newApn = mergeApns(first, second); 317629c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt mAllApnSettings.set(i, newApn); 317729c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt first = newApn; 317829c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt mAllApnSettings.remove(j); 317929c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt } else { 318029c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt j++; 318129c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt } 318229c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt } 318329c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt i++; 318429c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt } 318529c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt } 318629c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt 3187d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe //check whether the types of two APN same (even only one type of each APN is same) 3188d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe private boolean apnTypeSameAny(ApnSetting first, ApnSetting second) { 3189d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe if(VDBG) { 3190d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe StringBuilder apnType1 = new StringBuilder(first.apn + ": "); 3191d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe for(int index1 = 0; index1 < first.types.length; index1++) { 3192d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe apnType1.append(first.types[index1]); 3193d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe apnType1.append(","); 3194d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe } 3195d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe 3196d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe StringBuilder apnType2 = new StringBuilder(second.apn + ": "); 3197d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe for(int index1 = 0; index1 < second.types.length; index1++) { 3198d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe apnType2.append(second.types[index1]); 3199d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe apnType2.append(","); 3200d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe } 3201d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe log("APN1: is " + apnType1); 3202d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe log("APN2: is " + apnType2); 3203d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe } 3204d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe 3205d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe for(int index1 = 0; index1 < first.types.length; index1++) { 3206d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe for(int index2 = 0; index2 < second.types.length; index2++) { 3207d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe if(first.types[index1].equals(PhoneConstants.APN_TYPE_ALL) || 3208d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe second.types[index2].equals(PhoneConstants.APN_TYPE_ALL) || 3209d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe first.types[index1].equals(second.types[index2])) { 3210d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe if(VDBG)log("apnTypeSameAny: return true"); 3211d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe return true; 3212d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe } 3213d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe } 3214d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe } 3215d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe 3216d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe if(VDBG)log("apnTypeSameAny: return false"); 3217d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe return false; 3218d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe } 3219d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe 322029c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt // Check if neither mention DUN and are substantially similar 322129c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt private boolean apnsSimilar(ApnSetting first, ApnSetting second) { 322229c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt return (first.canHandleType(PhoneConstants.APN_TYPE_DUN) == false && 322329c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt second.canHandleType(PhoneConstants.APN_TYPE_DUN) == false && 322429c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt Objects.equals(first.apn, second.apn) && 3225d86df358b8fe07160caa12147b6e4ad34d378ce6xinhe !apnTypeSameAny(first, second) && 322661cdbcf2de392d043de0e4a533fbc615fc423000Amit Mahajan xorEquals(first.proxy, second.proxy) && 322761cdbcf2de392d043de0e4a533fbc615fc423000Amit Mahajan xorEquals(first.port, second.port) && 322829c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt first.carrierEnabled == second.carrierEnabled && 3229aaf0e8d623b1e94004557573aef9235177ca19e3Amit Mahajan first.bearerBitmask == second.bearerBitmask && 323029c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt first.profileId == second.profileId && 323129c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt Objects.equals(first.mvnoType, second.mvnoType) && 323229c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt Objects.equals(first.mvnoMatchData, second.mvnoMatchData) && 323329c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt xorEquals(first.mmsc, second.mmsc) && 323429c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt xorEquals(first.mmsProxy, second.mmsProxy) && 323529c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt xorEquals(first.mmsPort, second.mmsPort)); 323629c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt } 323729c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt 323829c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt // equal or one is not specified 323929c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt private boolean xorEquals(String first, String second) { 324029c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt return (Objects.equals(first, second) || 324129c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt TextUtils.isEmpty(first) || 324229c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt TextUtils.isEmpty(second)); 324329c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt } 324429c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt 324529c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt private ApnSetting mergeApns(ApnSetting dest, ApnSetting src) { 3246bca51fc3a191d3ca30df627b75374db0941571c5Sungmin Choi int id = dest.id; 324729c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt ArrayList<String> resultTypes = new ArrayList<String>(); 324829c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt resultTypes.addAll(Arrays.asList(dest.types)); 324929c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt for (String srcType : src.types) { 325029c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt if (resultTypes.contains(srcType) == false) resultTypes.add(srcType); 3251bca51fc3a191d3ca30df627b75374db0941571c5Sungmin Choi if (srcType.equals(PhoneConstants.APN_TYPE_DEFAULT)) id = src.id; 325229c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt } 325329c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt String mmsc = (TextUtils.isEmpty(dest.mmsc) ? src.mmsc : dest.mmsc); 325429c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt String mmsProxy = (TextUtils.isEmpty(dest.mmsProxy) ? src.mmsProxy : dest.mmsProxy); 325529c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt String mmsPort = (TextUtils.isEmpty(dest.mmsPort) ? src.mmsPort : dest.mmsPort); 325661cdbcf2de392d043de0e4a533fbc615fc423000Amit Mahajan String proxy = (TextUtils.isEmpty(dest.proxy) ? src.proxy : dest.proxy); 325761cdbcf2de392d043de0e4a533fbc615fc423000Amit Mahajan String port = (TextUtils.isEmpty(dest.port) ? src.port : dest.port); 325861cdbcf2de392d043de0e4a533fbc615fc423000Amit Mahajan String protocol = src.protocol.equals("IPV4V6") ? src.protocol : dest.protocol; 325961cdbcf2de392d043de0e4a533fbc615fc423000Amit Mahajan String roamingProtocol = src.roamingProtocol.equals("IPV4V6") ? src.roamingProtocol : 326061cdbcf2de392d043de0e4a533fbc615fc423000Amit Mahajan dest.roamingProtocol; 3261aaf0e8d623b1e94004557573aef9235177ca19e3Amit Mahajan int bearerBitmask = (dest.bearerBitmask == 0 || src.bearerBitmask == 0) ? 3262aaf0e8d623b1e94004557573aef9235177ca19e3Amit Mahajan 0 : (dest.bearerBitmask | src.bearerBitmask); 326329c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt 3264bca51fc3a191d3ca30df627b75374db0941571c5Sungmin Choi return new ApnSetting(id, dest.numeric, dest.carrier, dest.apn, 326561cdbcf2de392d043de0e4a533fbc615fc423000Amit Mahajan proxy, port, mmsc, mmsProxy, mmsPort, dest.user, dest.password, 326661cdbcf2de392d043de0e4a533fbc615fc423000Amit Mahajan dest.authType, resultTypes.toArray(new String[0]), protocol, 3267aaf0e8d623b1e94004557573aef9235177ca19e3Amit Mahajan roamingProtocol, dest.carrierEnabled, 0, bearerBitmask, dest.profileId, 326829c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt (dest.modemCognitive || src.modemCognitive), dest.maxConns, dest.waitTime, 326929c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt dest.maxConnsTime, dest.mtu, dest.mvnoType, dest.mvnoMatchData); 327029c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt } 327129c6659c8767212d23d417f2b7f032b6c0d82119Robert Greenwalt 3272ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville /** Return the DC AsyncChannel for the new data connection */ 3273454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville private DcAsyncChannel createDataConnection() { 3274cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("createDataConnection E"); 3275cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3276cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville int id = mUniqueIdGenerator.getAndIncrement(); 3277ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville DataConnection conn = DataConnection.makeDataConnection(mPhone, id, 3278ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville this, mDcTesterFailBringUpAll, mDcc); 3279cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mDataConnections.put(id, conn); 3280454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville DcAsyncChannel dcac = new DcAsyncChannel(conn, LOG_TAG); 3281cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville int status = dcac.fullyConnectSync(mPhone.getContext(), this, conn.getHandler()); 3282cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (status == AsyncChannel.STATUS_SUCCESSFUL) { 3283ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mDataConnectionAcHashMap.put(dcac.getDataConnectionIdSync(), dcac); 3284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 3285ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville loge("createDataConnection: Could not connect to dcac=" + dcac + " status=" + status); 3286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3287cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3288cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("createDataConnection() X id=" + id + " dc=" + conn); 3289ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville return dcac; 3290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3292cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private void destroyDataConnections() { 3293cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if(mDataConnections != null) { 3294cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("destroyDataConnections: clear mDataConnectionList"); 3295cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mDataConnections.clear(); 3296cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 3297cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("destroyDataConnections: mDataConnecitonList is empty, ignore"); 3298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 3302cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Build a list of APNs to be used to create PDP's. 3303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 3304cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @param requestedApnType 3305cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * @return waitingApns list to be used to create PDP 3306cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * error when waitingApns.isEmpty() 3307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 3308203e588e3c42a81aa8a56f595119c181a63b12caWink Saville private ArrayList<ApnSetting> buildWaitingApns(String requestedApnType, int radioTech) { 3309cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("buildWaitingApns: E requestedApnType=" + requestedApnType); 3310cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ArrayList<ApnSetting> apnList = new ArrayList<ApnSetting>(); 3311cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3312cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (requestedApnType.equals(PhoneConstants.APN_TYPE_DUN)) { 3313cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ApnSetting dun = fetchDunApn(); 3314cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (dun != null) { 3315cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnList.add(dun); 3316cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("buildWaitingApns: X added APN_TYPE_DUN apnList=" + apnList); 3317cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return apnList; 3318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3321cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville IccRecords r = mIccRecords.get(); 3322cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String operator = (r != null) ? r.getOperatorNumeric() : ""; 3323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3324cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // This is a workaround for a bug (7305641) where we don't failover to other 3325cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // suitable APNs if our preferred APN fails. On prepaid ATT sims we need to 3326cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // failover to a provisioning APN, but once we've used their default data 3327cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // connection we are locked to it for life. This change allows ATT devices 3328cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // to say they don't want to use preferred at all. 3329cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean usePreferred = true; 3330cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville try { 3331cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville usePreferred = ! mPhone.getContext().getResources().getBoolean(com.android. 3332cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville internal.R.bool.config_dontPreferApn); 3333cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } catch (Resources.NotFoundException e) { 3334cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("buildWaitingApns: usePreferred NotFoundException set to true"); 3335cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville usePreferred = true; 3336cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3337bf660a4647db8151609cdfa0ecc4c96e1518947fSungmin Choi if (usePreferred) { 3338bf660a4647db8151609cdfa0ecc4c96e1518947fSungmin Choi mPreferredApn = getPreferredApn(); 3339bf660a4647db8151609cdfa0ecc4c96e1518947fSungmin Choi } 3340cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 3341cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("buildWaitingApns: usePreferred=" + usePreferred 334222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " canSetPreferApn=" + mCanSetPreferApn 3343cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville + " mPreferredApn=" + mPreferredApn 3344cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville + " operator=" + operator + " radioTech=" + radioTech 3345cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville + " IccRecords r=" + r); 3346cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 334822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (usePreferred && mCanSetPreferApn && mPreferredApn != null && 3349cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPreferredApn.canHandleType(requestedApnType)) { 3350cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 3351cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("buildWaitingApns: Preferred APN:" + operator + ":" 3352cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville + mPreferredApn.numeric + ":" + mPreferredApn); 3353cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3354cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (mPreferredApn.numeric.equals(operator)) { 3355aaf0e8d623b1e94004557573aef9235177ca19e3Amit Mahajan if (ServiceState.bitmaskHasTech(mPreferredApn.bearerBitmask, radioTech)) { 3356cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnList.add(mPreferredApn); 3357cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("buildWaitingApns: X added preferred apnList=" + apnList); 3358cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return apnList; 3359cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 3360cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("buildWaitingApns: no preferred APN"); 3361cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville setPreferredApn(-1); 3362cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPreferredApn = null; 3363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3364cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 3365cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("buildWaitingApns: no preferred APN"); 3366cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville setPreferredApn(-1); 3367cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPreferredApn = null; 3368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3370ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mAllApnSettings != null) { 3371ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("buildWaitingApns: mAllApnSettings=" + mAllApnSettings); 3372ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for (ApnSetting apn : mAllApnSettings) { 3373cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (apn.canHandleType(requestedApnType)) { 3374aaf0e8d623b1e94004557573aef9235177ca19e3Amit Mahajan if (ServiceState.bitmaskHasTech(apn.bearerBitmask, radioTech)) { 33759232dafa7ea833fc0b3a6024d6c7e23fc8e961eaRobert Greenwalt if (DBG) log("buildWaitingApns: adding apn=" + apn); 3376cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville apnList.add(apn); 3377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 3378cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) { 3379aaf0e8d623b1e94004557573aef9235177ca19e3Amit Mahajan log("buildWaitingApns: bearerBitmask:" + apn.bearerBitmask + " does " + 3380aaf0e8d623b1e94004557573aef9235177ca19e3Amit Mahajan "not include radioTech:" + radioTech); 3381cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 33839232dafa7ea833fc0b3a6024d6c7e23fc8e961eaRobert Greenwalt } else if (DBG) { 338427b650c406018355a88a41528db7859e232728a0Jack Yu log("buildWaitingApns: couldn't handle requested ApnType=" 3385cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville + requestedApnType); 3386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3388cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 33894bd0ae43eb0cb9969dee4f30cddc18a71da68190Jack Yu loge("mAllApnSettings is null!"); 3390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 33910e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu if (DBG) log("buildWaitingApns: " + apnList.size() + " APNs in the list: " + apnList); 3392cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return apnList; 3393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3395cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private String apnListToString (ArrayList<ApnSetting> apns) { 3396cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville StringBuilder result = new StringBuilder(); 3397cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville for (int i = 0, size = apns.size(); i < size; i++) { 3398cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville result.append('[') 3399cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville .append(apns.get(i).toString()) 3400cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville .append(']'); 3401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3402cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return result.toString(); 3403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 3404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3405cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private void setPreferredApn(int pos) { 340622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mCanSetPreferApn) { 3407cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("setPreferredApn: X !canSEtPreferApn"); 3408cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return; 3409cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3410cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 34116bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville String subId = Long.toString(mPhone.getSubId()); 34126bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville Uri uri = Uri.withAppendedPath(PREFERAPN_NO_UPDATE_URI_USING_SUBID, subId); 3413cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("setPreferredApn: delete"); 3414cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ContentResolver resolver = mPhone.getContext().getContentResolver(); 34156bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville resolver.delete(uri, null, null); 3416cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3417cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (pos >= 0) { 3418cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("setPreferredApn: insert"); 3419cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ContentValues values = new ContentValues(); 3420cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville values.put(APN_ID, pos); 34216bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville resolver.insert(uri, values); 3422cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3423cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3424cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3425cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private ApnSetting getPreferredApn() { 34264bd0ae43eb0cb9969dee4f30cddc18a71da68190Jack Yu if (mAllApnSettings == null || mAllApnSettings.isEmpty()) { 34274bd0ae43eb0cb9969dee4f30cddc18a71da68190Jack Yu log("getPreferredApn: mAllApnSettings is " + ((mAllApnSettings == null)?"null":"empty")); 3428cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return null; 3429cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3430cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 34316bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville String subId = Long.toString(mPhone.getSubId()); 34326bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville Uri uri = Uri.withAppendedPath(PREFERAPN_NO_UPDATE_URI_USING_SUBID, subId); 3433cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Cursor cursor = mPhone.getContext().getContentResolver().query( 34346bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville uri, new String[] { "_id", "name", "apn" }, 3435cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville null, null, Telephony.Carriers.DEFAULT_SORT_ORDER); 3436cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3437cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (cursor != null) { 343822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCanSetPreferApn = true; 3439cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 344022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCanSetPreferApn = false; 3441cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3442cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("getPreferredApn: mRequestedApnType=" + mRequestedApnType + " cursor=" + cursor 3443cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville + " cursor.count=" + ((cursor != null) ? cursor.getCount() : 0)); 3444cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 344522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mCanSetPreferApn && cursor.getCount() > 0) { 3446cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville int pos; 3447cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cursor.moveToFirst(); 3448cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville pos = cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers._ID)); 3449ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville for(ApnSetting p : mAllApnSettings) { 3450cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("getPreferredApn: apnSetting=" + p); 3451cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (p.id == pos && p.canHandleType(mRequestedApnType)) { 3452cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("getPreferredApn: X found apnSetting" + p); 3453cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cursor.close(); 3454cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return p; 3455cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3456cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3457cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3458cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3459cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (cursor != null) { 3460cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cursor.close(); 3461cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3462cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3463cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("getPreferredApn: X not found"); 3464cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return null; 3465cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3466cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3467cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3468cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public void handleMessage (Message msg) { 34691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) log("handleMessage msg=" + msg); 3470cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3471cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville switch (msg.what) { 3472cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case DctConstants.EVENT_RECORDS_LOADED: 34731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If onRecordsLoadedOrSubIdChanged() is not called here, it should be called on 34741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // onSubscriptionsChanged() when a valid subId is available. 34751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int subId = mPhone.getSubId(); 34761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (SubscriptionManager.isValidSubscriptionId(subId)) { 34771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onRecordsLoadedOrSubIdChanged(); 34781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 34791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("Ignoring EVENT_RECORDS_LOADED as subId is not valid: " + subId); 34801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3481cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 3482cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3483cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case DctConstants.EVENT_DATA_CONNECTION_DETACHED: 3484cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville onDataConnectionDetached(); 3485cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 3486cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3487cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case DctConstants.EVENT_DATA_CONNECTION_ATTACHED: 3488bda761320929f714951c328bfec6a51a1978db97Wink Saville onDataConnectionAttached(); 3489cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 3490cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3491cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case DctConstants.EVENT_DO_RECOVERY: 3492cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville doRecovery(); 3493cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 3494cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3495cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case DctConstants.EVENT_APN_CHANGED: 3496cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville onApnChanged(); 3497cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 3498cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3499cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case DctConstants.EVENT_PS_RESTRICT_ENABLED: 3500cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /** 3501cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * We don't need to explicitly to tear down the PDP context 3502cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * when PS restricted is enabled. The base band will deactive 3503cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * PDP context and notify us with PDP_CONTEXT_CHANGED. 3504cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * But we should stop the network polling and prevent reset PDP. 3505cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */ 3506cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("EVENT_PS_RESTRICT_ENABLED " + mIsPsRestricted); 3507cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville stopNetStatPoll(); 3508cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville stopDataStallAlarm(); 3509cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mIsPsRestricted = true; 3510cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla break; 3511cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3512cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case DctConstants.EVENT_PS_RESTRICT_DISABLED: 3513cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville /** 3514cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * When PS restrict is removed, we need setup PDP connection if 3515cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * PDP connection is down. 3516cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville */ 3517cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("EVENT_PS_RESTRICT_DISABLED " + mIsPsRestricted); 3518cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mIsPsRestricted = false; 3519cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (isConnected()) { 3520cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville startNetStatPoll(); 3521cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); 3522cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 3523cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // TODO: Should all PDN states be checked to fail? 3524ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (mState == DctConstants.State.FAILED) { 3525cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cleanUpAllConnections(false, Phone.REASON_PS_RESTRICT_ENABLED); 3526cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mReregisterOnReconnectFailure = false; 3527cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3528af5593594070f825032be46dced573cd195956e1Robert Greenwalt ApnContext apnContext = mApnContextsById.get(DctConstants.APN_DEFAULT_ID); 35293fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (apnContext != null) { 35303fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt apnContext.setReason(Phone.REASON_PS_RESTRICT_ENABLED); 35313fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt trySetupData(apnContext); 35323fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } else { 35333fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt loge("**** Default ApnContext not found ****"); 35343fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt if (Build.IS_DEBUGGABLE) { 35353fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt throw new RuntimeException("Default ApnContext not found"); 35363fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 35373fad7daba62dcb7aafc4adc7f8cc123726ed5a7cRobert Greenwalt } 3538cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3539cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla break; 3540ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 3541cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case DctConstants.EVENT_TRY_SETUP_DATA: 3542cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (msg.obj instanceof ApnContext) { 3543cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville onTrySetupData((ApnContext)msg.obj); 3544cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else if (msg.obj instanceof String) { 3545cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville onTrySetupData((String)msg.obj); 3546cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 3547cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville loge("EVENT_TRY_SETUP request w/o apnContext or String"); 3548cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3549cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla break; 3550cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 3551cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case DctConstants.EVENT_CLEAN_UP_CONNECTION: 3552cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville boolean tearDown = (msg.arg1 == 0) ? false : true; 3553cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("EVENT_CLEAN_UP_CONNECTION tearDown=" + tearDown); 3554cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (msg.obj instanceof ApnContext) { 3555cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cleanUpConnection(tearDown, (ApnContext)msg.obj); 3556cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 35571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onCleanUpConnection(tearDown, msg.arg2, (String) msg.obj); 3558cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3559cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla break; 35601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_SET_INTERNAL_DATA_ENABLE: { 35611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false; 3562a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onSetInternalDataEnabled(enabled, (Message) msg.obj); 3563a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 35641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3565a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case DctConstants.EVENT_CLEAN_UP_ALL_CONNECTIONS: 35661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((msg.obj != null) && (msg.obj instanceof String == false)) { 35671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.obj = null; 3568a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 35691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onCleanUpAllConnections((String) msg.obj); 3570a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 3571ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 3572220d43e0611edd0f3a2eb7a33bb38a008fff0868Wink Saville case DctConstants.EVENT_DATA_RAT_CHANGED: 3573220d43e0611edd0f3a2eb7a33bb38a008fff0868Wink Saville //May new Network allow setupData, so try it here 3574c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt setupDataOnConnectableApns(Phone.REASON_NW_TYPE_CHANGED, 3575c2d1d6b2725b4611360d2725624a0d8905d75694Robert Greenwalt RetryFailures.ONLY_ON_CHANGE); 3576220d43e0611edd0f3a2eb7a33bb38a008fff0868Wink Saville break; 3577220d43e0611edd0f3a2eb7a33bb38a008fff0868Wink Saville 35782b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen case DctConstants.CMD_CLEAR_PROVISIONING_SPINNER: 35792b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen // Check message sender intended to clear the current spinner. 35802b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen if (mProvisioningSpinner == msg.obj) { 35812b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner.dismiss(); 35822b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen mProvisioningSpinner = null; 35832b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen } 35842b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen break; 35851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 35861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("DISCONNECTED_CONNECTED: msg=" + msg); 35871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DcAsyncChannel dcac = (DcAsyncChannel) msg.obj; 35881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDataConnectionAcHashMap.remove(dcac.getDataConnectionIdSync()); 35891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dcac.disconnected(); 35901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 35911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 35921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_ENABLE_NEW_APN: 35931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onEnableApn(msg.arg1, msg.arg2); 35941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 35951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 35961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_DATA_STALL_ALARM: 35971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onDataStallAlarm(msg.arg1); 35981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 35991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 36001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_ROAMING_OFF: 36011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onRoamingOff(); 36021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 36041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_ROAMING_ON: 36051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onRoamingOn(); 36061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3608f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt case DctConstants.EVENT_DEVICE_PROVISIONED_CHANGE: 3609f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt onDeviceProvisionedChange(); 3610f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt break; 3611f299322eabb18e1234c81fe1e356b550b6687772Robert Greenwalt 36121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_RADIO_AVAILABLE: 36131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onRadioAvailable(); 36141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 36161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_RADIO_OFF_OR_NOT_AVAILABLE: 36171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onRadioOffOrNotAvailable(); 36181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 36201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_DATA_SETUP_COMPLETE: 36211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onDataSetupComplete((AsyncResult) msg.obj); 36221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 36241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR: 36251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onDataSetupCompleteError((AsyncResult) msg.obj); 36261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_DISCONNECT_DONE: 36281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("DataConnectionTracker.handleMessage: EVENT_DISCONNECT_DONE msg=" + msg); 36291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onDisconnectDone((AsyncResult) msg.obj); 36301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 36321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_DISCONNECT_DC_RETRYING: 36331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("DataConnectionTracker.handleMessage: EVENT_DISCONNECT_DC_RETRYING msg=" + msg); 36341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onDisconnectDcRetrying((AsyncResult) msg.obj); 36351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 36371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_VOICE_CALL_STARTED: 36381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onVoiceCallStarted(); 36391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 36411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_VOICE_CALL_ENDED: 36421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onVoiceCallEnded(); 36431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 36451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_RESET_DONE: { 36461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("EVENT_RESET_DONE"); 36471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onResetDone((AsyncResult) msg.obj); 36481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 36501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.CMD_SET_USER_DATA_ENABLE: { 36511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false; 36521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("CMD_SET_USER_DATA_ENABLE enabled=" + enabled); 36531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onSetUserDataEnabled(enabled); 36541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 36561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // TODO - remove 36571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.CMD_SET_DEPENDENCY_MET: { 36581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean met = (msg.arg1 == DctConstants.ENABLED) ? true : false; 36591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("CMD_SET_DEPENDENCY_MET met=" + met); 36601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Bundle bundle = msg.getData(); 36611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (bundle != null) { 36621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String apnType = (String)bundle.get(DctConstants.APN_TYPE_KEY); 36631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (apnType != null) { 36641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onSetDependencyMet(apnType, met); 36651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 36661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 36671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 36691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.CMD_SET_POLICY_DATA_ENABLE: { 36701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false; 36711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onSetPolicyDataEnabled(enabled); 36721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 36731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 36741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: { 36751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sEnableFailFastRefCounter += (msg.arg1 == DctConstants.ENABLED) ? 1 : -1; 36761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 36771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: " 36781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " sEnableFailFastRefCounter=" + sEnableFailFastRefCounter); 36791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 36801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (sEnableFailFastRefCounter < 0) { 36811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final String s = "CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: " 36821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + "sEnableFailFastRefCounter:" + sEnableFailFastRefCounter + " < 0"; 36831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge(s); 36841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sEnableFailFastRefCounter = 0; 36851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 36861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final boolean enabled = sEnableFailFastRefCounter > 0; 36871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 36881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: enabled=" + enabled 36891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " sEnableFailFastRefCounter=" + sEnableFailFastRefCounter); 36901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 36911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mFailFast != enabled) { 36921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mFailFast = enabled; 36930e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 36941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDataStallDetectionEnabled = !enabled; 36951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mDataStallDetectionEnabled 36961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && (getOverallState() == DctConstants.State.CONNECTED) 36971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && (!mInVoiceCall || 36981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker() 36991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu .isConcurrentVoiceAndDataAllowed())) { 37001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: start data stall"); 37011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu stopDataStallAlarm(); 37021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); 37031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 37041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: stop data stall"); 37051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu stopDataStallAlarm(); 37061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37082b7b6016c7a5f2c3ce9c7e623ea10a9fe9239dc2Paul Jensen 37091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 37101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.CMD_ENABLE_MOBILE_PROVISIONING: { 37121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Bundle bundle = msg.getData(); 37131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (bundle != null) { 37141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 37151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mProvisioningUrl = (String)bundle.get(DctConstants.PROVISIONING_URL_KEY); 37161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch(ClassCastException e) { 37171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioning url not a string" + e); 37181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mProvisioningUrl = null; 37191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (TextUtils.isEmpty(mProvisioningUrl)) { 37221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioning url is empty, ignoring"); 37231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsProvisioning = false; 37241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mProvisioningUrl = null; 37251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 37261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioningUrl=" + mProvisioningUrl); 37271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsProvisioning = true; 37281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu startProvisioningApnAlarm(); 37291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 37311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_PROVISIONING_APN_ALARM: { 37331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("EVENT_PROVISIONING_APN_ALARM"); 3734af5593594070f825032be46dced573cd195956e1Robert Greenwalt ApnContext apnCtx = mApnContextsById.get(DctConstants.APN_DEFAULT_ID); 37351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (apnCtx.isProvisioningApn() && apnCtx.isConnectedOrConnecting()) { 37361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mProvisioningApnAlarmTag == msg.arg1) { 37371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("EVENT_PROVISIONING_APN_ALARM: Disconnecting"); 37381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsProvisioning = false; 37391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mProvisioningUrl = null; 37401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu stopProvisioningApnAlarm(); 37411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendCleanUpConnection(true, apnCtx); 37421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 37431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 37441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("EVENT_PROVISIONING_APN_ALARM: ignore stale tag," 37451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " mProvisioningApnAlarmTag:" + mProvisioningApnAlarmTag 37461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " != arg1:" + msg.arg1); 37471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 37501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("EVENT_PROVISIONING_APN_ALARM: Not connected ignore"); 37511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 37531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.CMD_IS_PROVISIONING_APN: { 37551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("CMD_IS_PROVISIONING_APN"); 37561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isProvApn; 37571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 37581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String apnType = null; 37591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Bundle bundle = msg.getData(); 37601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (bundle != null) { 37611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu apnType = (String)bundle.get(DctConstants.APN_TYPE_KEY); 37621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (TextUtils.isEmpty(apnType)) { 37641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("CMD_IS_PROVISIONING_APN: apnType is empty"); 37651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isProvApn = false; 37661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 37671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isProvApn = isProvisioningApn(apnType); 37681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (ClassCastException e) { 37701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("CMD_IS_PROVISIONING_APN: NO provisioning url ignoring"); 37711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isProvApn = false; 37721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("CMD_IS_PROVISIONING_APN: ret=" + isProvApn); 37741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mReplyAc.replyToMessage(msg, DctConstants.CMD_IS_PROVISIONING_APN, 37751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isProvApn ? DctConstants.ENABLED : DctConstants.DISABLED); 37761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 37771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_ICC_CHANGED: { 37791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onUpdateIcc(); 37801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 37811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_RESTART_RADIO: { 37831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu restartRadio(); 37841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 37851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.CMD_NET_STAT_POLL: { 37871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (msg.arg1 == DctConstants.ENABLED) { 37881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleStartNetStatPoll((DctConstants.Activity)msg.obj); 37891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (msg.arg1 == DctConstants.DISABLED) { 37901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleStopNetStatPoll((DctConstants.Activity)msg.obj); 37911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 37931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 37941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DctConstants.EVENT_DATA_STATE_CHANGED: { 37951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // no longer do anything, but still registered - clean up log 37961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // TODO - why are we still registering? 37971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 37981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3799cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla default: 38001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e("DcTracker", "Unhandled event=" + msg); 3801cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 38021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3803cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3804cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3805cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 38061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private int getApnProfileID(String apnType) { 3807cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_IMS)) { 3808cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return RILConstants.DATA_PROFILE_IMS; 3809cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_FOTA)) { 3810cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return RILConstants.DATA_PROFILE_FOTA; 3811cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_CBS)) { 3812cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return RILConstants.DATA_PROFILE_CBS; 38131b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville } else if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_IA)) { 38141b5fe200e47f40f82f0e28502a5f40bce64a82e6Wink Saville return RILConstants.DATA_PROFILE_DEFAULT; // DEFAULT for now 381545df26444864daad60afdd4d121ab4043da3834bSungmin Choi } else if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_DUN)) { 381645df26444864daad60afdd4d121ab4043da3834bSungmin Choi return RILConstants.DATA_PROFILE_TETHERED; 3817cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else { 3818cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return RILConstants.DATA_PROFILE_DEFAULT; 3819cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3820cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 3821cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3822cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private int getCellLocationId() { 3823cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville int cid = -1; 3824cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville CellLocation loc = mPhone.getCellLocation(); 3825cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3826cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (loc != null) { 3827cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (loc instanceof GsmCellLocation) { 3828cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cid = ((GsmCellLocation)loc).getCid(); 3829cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } else if (loc instanceof CdmaCellLocation) { 3830cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville cid = ((CdmaCellLocation)loc).getBaseStationId(); 3831cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3832cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3833cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville return cid; 3834cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3835cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3836a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private IccRecords getUiccRecords(int appFamily) { 3837a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mUiccController.getIccRecords(mPhone.getPhoneId(), appFamily); 3838a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3839a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3840a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 38411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onUpdateIcc() { 3842cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (mUiccController == null ) { 3843cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla return; 3844cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3845cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3846a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville IccRecords newIccRecords = getUiccRecords(UiccController.APP_FAM_3GPP); 3847cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3848cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville IccRecords r = mIccRecords.get(); 3849cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (r != newIccRecords) { 3850cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (r != null) { 3851cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("Removing stale icc objects."); 3852cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville r.unregisterForRecordsLoaded(this); 3853cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mIccRecords.set(null); 38549aaa228cbb37657d12a87b5058676e449866f2acJeevaka Badrappan } 3855cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (newIccRecords != null) { 38561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (SubscriptionManager.isValidSubscriptionId(mPhone.getSubId())) { 3857aa863054476b152fe9323defd197fa946a47033fSungmin Choi log("New records found."); 3858aa863054476b152fe9323defd197fa946a47033fSungmin Choi mIccRecords.set(newIccRecords); 3859aa863054476b152fe9323defd197fa946a47033fSungmin Choi newIccRecords.registerForRecordsLoaded( 3860aa863054476b152fe9323defd197fa946a47033fSungmin Choi this, DctConstants.EVENT_RECORDS_LOADED, null); 3861aa863054476b152fe9323defd197fa946a47033fSungmin Choi } 38620469925aace7a2254e0cef90bd7398fbd72622faShishir Agrawal } else { 38630469925aace7a2254e0cef90bd7398fbd72622faShishir Agrawal onSimNotReady(); 38649aaa228cbb37657d12a87b5058676e449866f2acJeevaka Badrappan } 38659aaa228cbb37657d12a87b5058676e449866f2acJeevaka Badrappan } 3866cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3867cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3868a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void update() { 3869a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("update sub = " + mPhone.getSubId()); 3870bda761320929f714951c328bfec6a51a1978db97Wink Saville log("update(): Active DDS, register for all events now!"); 3871bda761320929f714951c328bfec6a51a1978db97Wink Saville onUpdateIcc(); 3872a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 38732bb2331aa5c5285f70a7404d61ee71ede4831056Shishir Agrawal mUserDataEnabled = getDataEnabled(); 3874bda761320929f714951c328bfec6a51a1978db97Wink Saville 38751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ((GsmCdmaPhone)mPhone).updateCurrentCarrierInProvider(); 3876a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3877a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3878a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void cleanUpAllConnections(String cause) { 3879a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cleanUpAllConnections(cause, null); 3880a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3881a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3882a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void updateRecords() { 3883bda761320929f714951c328bfec6a51a1978db97Wink Saville onUpdateIcc(); 3884a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3885a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3886a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void cleanUpAllConnections(String cause, Message disconnectAllCompleteMsg) { 3887a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("cleanUpAllConnections"); 3888a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (disconnectAllCompleteMsg != null) { 3889a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDisconnectAllCompleteMsgList.add(disconnectAllCompleteMsg); 3890a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3891a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3892a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message msg = obtainMessage(DctConstants.EVENT_CLEAN_UP_ALL_CONNECTIONS); 3893a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville msg.obj = cause; 3894a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendMessage(msg); 3895a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3896a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 38971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void notifyDataDisconnectComplete() { 3898a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("notifyDataDisconnectComplete"); 3899a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (Message m: mDisconnectAllCompleteMsgList) { 3900a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville m.sendToTarget(); 3901a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3902a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDisconnectAllCompleteMsgList.clear(); 3903a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3904a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3905a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 39061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void notifyAllDataDisconnected() { 3907a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sEnableFailFastRefCounter = 0; 3908a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mFailFast = false; 3909a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAllDataDisconnectedRegistrants.notifyRegistrants(); 3910a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3911a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3912a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void registerForAllDataDisconnected(Handler h, int what, Object obj) { 3913a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAllDataDisconnectedRegistrants.addUnique(h, what, obj); 3914a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3915a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (isDisconnected()) { 3916a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("notify All Data Disconnected"); 3917a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville notifyAllDataDisconnected(); 3918a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3919a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3920a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3921a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void unregisterForAllDataDisconnected(Handler h) { 3922a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAllDataDisconnectedRegistrants.remove(h); 3923a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3924a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3925a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 39261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onSetInternalDataEnabled(boolean enabled, Message onCompleteMsg) { 39276bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (DBG) log("onSetInternalDataEnabled: enabled=" + enabled); 3928a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville boolean sendOnComplete = true; 3929a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3930a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mDataEnabledLock) { 3931a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mInternalDataEnabled = enabled; 3932a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (enabled) { 3933a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("onSetInternalDataEnabled: changed to enabled, try to setup data call"); 3934a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onTrySetupData(Phone.REASON_DATA_ENABLED); 3935a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 3936a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendOnComplete = false; 3937a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("onSetInternalDataEnabled: changed to disabled, cleanUpAllConnections"); 3938a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville cleanUpAllConnections(null, onCompleteMsg); 3939a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3940a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3941a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3942a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (sendOnComplete) { 3943a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (onCompleteMsg != null) { 3944a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onCompleteMsg.sendToTarget(); 3945a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3946a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3947a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3948a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3949a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean setInternalDataEnabledFlag(boolean enable) { 39506bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (DBG) log("setInternalDataEnabledFlag(" + enable + ")"); 3951a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3952a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mInternalDataEnabled != enable) { 3953a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mInternalDataEnabled = enable; 3954a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3955a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 3956a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3957a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3958a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean setInternalDataEnabled(boolean enable) { 3959a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return setInternalDataEnabled(enable, null); 3960a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3961a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3962a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean setInternalDataEnabled(boolean enable, Message onCompleteMsg) { 39636bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (DBG) log("setInternalDataEnabled(" + enable + ")"); 3964a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3965a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Message msg = obtainMessage(DctConstants.EVENT_SET_INTERNAL_DATA_ENABLE, onCompleteMsg); 3966a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville msg.arg1 = (enable ? DctConstants.ENABLED : DctConstants.DISABLED); 3967a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville sendMessage(msg); 3968a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return true; 3969a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3970a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 3971a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void setDataAllowed(boolean enable, Message response) { 39726bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (DBG) log("setDataAllowed: enable=" + enable); 39731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isCleanupRequired.set(!enable); 3974a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mPhone.mCi.setDataAllowed(enable, response); 3975a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mInternalDataEnabled = enable; 3976a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 3977a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 39781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void log(String s) { 3979a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(LOG_TAG, "[" + mPhone.getPhoneId() + "]" + s); 3980cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3981cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 39821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void loge(String s) { 3983a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.e(LOG_TAG, "[" + mPhone.getPhoneId() + "]" + s); 3984cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla } 3985cebb2cc576c652dd642d7f419532ec04e0f59d7dNaveen Kalla 3986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 39871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println("DcTracker:"); 39881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" RADIO_TESTS=" + RADIO_TESTS); 39891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mInternalDataEnabled=" + mInternalDataEnabled); 39901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mUserDataEnabled=" + mUserDataEnabled); 39911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" sPolicyDataEnabed=" + sPolicyDataEnabled); 39921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.flush(); 39931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mRequestedApnType=" + mRequestedApnType); 39941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mPhone=" + mPhone.getPhoneName()); 39951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mActivity=" + mActivity); 39961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mState=" + mState); 39971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mTxPkts=" + mTxPkts); 39981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mRxPkts=" + mRxPkts); 39991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mNetStatPollPeriod=" + mNetStatPollPeriod); 40001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mNetStatPollEnabled=" + mNetStatPollEnabled); 40011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mDataStallTxRxSum=" + mDataStallTxRxSum); 40021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mDataStallAlarmTag=" + mDataStallAlarmTag); 40031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mDataStallDetectionEanbled=" + mDataStallDetectionEnabled); 40041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mSentSinceLastRecv=" + mSentSinceLastRecv); 40051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mNoRecvPollCount=" + mNoRecvPollCount); 40061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mResolver=" + mResolver); 40071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mIsWifiConnected=" + mIsWifiConnected); 40081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mReconnectIntent=" + mReconnectIntent); 40091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mAutoAttachOnCreation=" + mAutoAttachOnCreation.get()); 40101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mIsScreenOn=" + mIsScreenOn); 40111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mUniqueIdGenerator=" + mUniqueIdGenerator); 40121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.flush(); 40131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" ***************************************"); 40141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DcController dcc = mDcc; 40151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dcc != null) { 40161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dcc.dump(fd, pw, args); 40171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 40181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mDcc=null"); 40191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 40201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" ***************************************"); 40211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu HashMap<Integer, DataConnection> dcs = mDataConnections; 40221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dcs != null) { 40231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Set<Entry<Integer, DataConnection> > mDcSet = mDataConnections.entrySet(); 40241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mDataConnections: count=" + mDcSet.size()); 40251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (Entry<Integer, DataConnection> entry : mDcSet) { 40261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.printf(" *** mDataConnection[%d] \n", entry.getKey()); 40271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu entry.getValue().dump(fd, pw, args); 40281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 40291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 40301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println("mDataConnections=null"); 40311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 40321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" ***************************************"); 40331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.flush(); 40341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu HashMap<String, Integer> apnToDcId = mApnToDataConnectionId; 40351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (apnToDcId != null) { 40361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Set<Entry<String, Integer>> apnToDcIdSet = apnToDcId.entrySet(); 40371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mApnToDataConnectonId size=" + apnToDcIdSet.size()); 40381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (Entry<String, Integer> entry : apnToDcIdSet) { 40391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.printf(" mApnToDataConnectonId[%s]=%d\n", entry.getKey(), entry.getValue()); 40401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 40411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 40421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println("mApnToDataConnectionId=null"); 40431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 40441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" ***************************************"); 40451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.flush(); 40461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ConcurrentHashMap<String, ApnContext> apnCtxs = mApnContexts; 40471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (apnCtxs != null) { 40481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Set<Entry<String, ApnContext>> apnCtxsSet = apnCtxs.entrySet(); 40491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mApnContexts size=" + apnCtxsSet.size()); 40501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (Entry<String, ApnContext> entry : apnCtxsSet) { 40511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu entry.getValue().dump(fd, pw, args); 40521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 40531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" ***************************************"); 40541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 40551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mApnContexts=null"); 40561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 40571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.flush(); 40581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ArrayList<ApnSetting> apnSettings = mAllApnSettings; 40591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (apnSettings != null) { 40601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mAllApnSettings size=" + apnSettings.size()); 40611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (int i=0; i < apnSettings.size(); i++) { 40621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.printf(" mAllApnSettings[%d]: %s\n", i, apnSettings.get(i)); 40631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 40641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.flush(); 40651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 40661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mAllApnSettings=null"); 40671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 40681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mPreferredApn=" + mPreferredApn); 40691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mIsPsRestricted=" + mIsPsRestricted); 40701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mIsDisposed=" + mIsDisposed); 40711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mIntentReceiver=" + mIntentReceiver); 4072cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville pw.println(" mReregisterOnReconnectFailure=" + mReregisterOnReconnectFailure); 407322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" canSetPreferApn=" + mCanSetPreferApn); 4074cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville pw.println(" mApnObserver=" + mApnObserver); 4075cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville pw.println(" getOverallState=" + getOverallState()); 4076ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville pw.println(" mDataConnectionAsyncChannels=%s\n" + mDataConnectionAcHashMap); 4077187a39f896f88eb6c5e4306d9595546654825976Wink Saville pw.println(" mAttached=" + mAttached.get()); 40781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.flush(); 4079c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 4080a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 4081bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram public String[] getPcscfAddress(String apnType) { 4082a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("getPcscfAddress()"); 4083bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram ApnContext apnContext = null; 4084bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram 4085bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram if(apnType == null){ 4086bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram log("apnType is null, return null"); 4087bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram return null; 4088bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram } 4089a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 4090bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_EMERGENCY)) { 4091af5593594070f825032be46dced573cd195956e1Robert Greenwalt apnContext = mApnContextsById.get(DctConstants.APN_EMERGENCY_ID); 4092bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram } else if (TextUtils.equals(apnType, PhoneConstants.APN_TYPE_IMS)) { 4093af5593594070f825032be46dced573cd195956e1Robert Greenwalt apnContext = mApnContextsById.get(DctConstants.APN_IMS_ID); 4094bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram } else { 4095bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram log("apnType is invalid, return null"); 4096bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram return null; 4097bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram } 4098a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 4099a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (apnContext == null) { 4100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("apnContext is null, return null"); 4101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 4102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 4103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 4104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville DcAsyncChannel dcac = apnContext.getDcAc(); 4105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String[] result = null; 4106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 4107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (dcac != null) { 4108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville result = dcac.getPcscfAddr(); 4109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 4110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville for (int i = 0; i < result.length; i++) { 4111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("Pcscf[" + i + "]: " + result[i]); 4112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 4113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return result; 4114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 4115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 4116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 4117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 411876f43316a5a6082d601bffd4b6898d0bd81e11fcram /** 411976f43316a5a6082d601bffd4b6898d0bd81e11fcram * Read APN configuration from Telephony.db for Emergency APN 412076f43316a5a6082d601bffd4b6898d0bd81e11fcram * All opertors recognize the connection request for EPDN based on APN type 412176f43316a5a6082d601bffd4b6898d0bd81e11fcram * PLMN name,APN name are not mandatory parameters 412276f43316a5a6082d601bffd4b6898d0bd81e11fcram */ 412376f43316a5a6082d601bffd4b6898d0bd81e11fcram private void initEmergencyApnSetting() { 412476f43316a5a6082d601bffd4b6898d0bd81e11fcram // Operator Numeric is not available when sim records are not loaded. 412576f43316a5a6082d601bffd4b6898d0bd81e11fcram // Query Telephony.db with APN type as EPDN request does not 412676f43316a5a6082d601bffd4b6898d0bd81e11fcram // require APN name, plmn and all operators support same APN config. 412776f43316a5a6082d601bffd4b6898d0bd81e11fcram // DB will contain only one entry for Emergency APN 412876f43316a5a6082d601bffd4b6898d0bd81e11fcram String selection = "type=\"emergency\""; 412976f43316a5a6082d601bffd4b6898d0bd81e11fcram Cursor cursor = mPhone.getContext().getContentResolver().query( 413076f43316a5a6082d601bffd4b6898d0bd81e11fcram Telephony.Carriers.CONTENT_URI, null, selection, null, null); 413176f43316a5a6082d601bffd4b6898d0bd81e11fcram 413276f43316a5a6082d601bffd4b6898d0bd81e11fcram if (cursor != null) { 413376f43316a5a6082d601bffd4b6898d0bd81e11fcram if (cursor.getCount() > 0) { 413476f43316a5a6082d601bffd4b6898d0bd81e11fcram if (cursor.moveToFirst()) { 413576f43316a5a6082d601bffd4b6898d0bd81e11fcram mEmergencyApn = makeApnSetting(cursor); 413676f43316a5a6082d601bffd4b6898d0bd81e11fcram } 413776f43316a5a6082d601bffd4b6898d0bd81e11fcram } 413876f43316a5a6082d601bffd4b6898d0bd81e11fcram cursor.close(); 413976f43316a5a6082d601bffd4b6898d0bd81e11fcram } 414076f43316a5a6082d601bffd4b6898d0bd81e11fcram } 414176f43316a5a6082d601bffd4b6898d0bd81e11fcram 414276f43316a5a6082d601bffd4b6898d0bd81e11fcram /** 414376f43316a5a6082d601bffd4b6898d0bd81e11fcram * Add the Emergency APN settings to APN settings list 414476f43316a5a6082d601bffd4b6898d0bd81e11fcram */ 414576f43316a5a6082d601bffd4b6898d0bd81e11fcram private void addEmergencyApnSetting() { 414676f43316a5a6082d601bffd4b6898d0bd81e11fcram if(mEmergencyApn != null) { 414776f43316a5a6082d601bffd4b6898d0bd81e11fcram if(mAllApnSettings == null) { 414876f43316a5a6082d601bffd4b6898d0bd81e11fcram mAllApnSettings = new ArrayList<ApnSetting>(); 414976f43316a5a6082d601bffd4b6898d0bd81e11fcram } else { 415076f43316a5a6082d601bffd4b6898d0bd81e11fcram boolean hasEmergencyApn = false; 415176f43316a5a6082d601bffd4b6898d0bd81e11fcram for (ApnSetting apn : mAllApnSettings) { 415276f43316a5a6082d601bffd4b6898d0bd81e11fcram if (ArrayUtils.contains(apn.types, PhoneConstants.APN_TYPE_EMERGENCY)) { 415376f43316a5a6082d601bffd4b6898d0bd81e11fcram hasEmergencyApn = true; 415476f43316a5a6082d601bffd4b6898d0bd81e11fcram break; 415576f43316a5a6082d601bffd4b6898d0bd81e11fcram } 415676f43316a5a6082d601bffd4b6898d0bd81e11fcram } 415776f43316a5a6082d601bffd4b6898d0bd81e11fcram 415876f43316a5a6082d601bffd4b6898d0bd81e11fcram if(hasEmergencyApn == false) { 415976f43316a5a6082d601bffd4b6898d0bd81e11fcram mAllApnSettings.add(mEmergencyApn); 416076f43316a5a6082d601bffd4b6898d0bd81e11fcram } else { 416176f43316a5a6082d601bffd4b6898d0bd81e11fcram log("addEmergencyApnSetting - E-APN setting is already present"); 416276f43316a5a6082d601bffd4b6898d0bd81e11fcram } 416376f43316a5a6082d601bffd4b6898d0bd81e11fcram } 416476f43316a5a6082d601bffd4b6898d0bd81e11fcram } 416576f43316a5a6082d601bffd4b6898d0bd81e11fcram } 41669a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang 41679a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang private void cleanUpConnectionsOnUpdatedApns(boolean tearDown) { 41689a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (DBG) log("cleanUpConnectionsOnUpdatedApns: tearDown=" + tearDown); 41699a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (mAllApnSettings.isEmpty()) { 41709a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang cleanUpAllConnections(tearDown, Phone.REASON_APN_CHANGED); 41719a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } else { 41729a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang for (ApnContext apnContext : mApnContexts.values()) { 41739a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (VDBG) log("cleanUpConnectionsOnUpdatedApns for "+ apnContext); 41749a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang 41759a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang boolean cleanUpApn = true; 41769a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang ArrayList<ApnSetting> currentWaitingApns = apnContext.getWaitingApns(); 41779a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang 41789a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if ((currentWaitingApns != null) && (!apnContext.isDisconnected())) { 41799a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang int radioTech = mPhone.getServiceState().getRilDataRadioTechnology(); 41809a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang ArrayList<ApnSetting> waitingApns = buildWaitingApns( 41819a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang apnContext.getApnType(), radioTech); 41829a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (VDBG) log("new waitingApns:" + waitingApns); 41839a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (waitingApns.size() == currentWaitingApns.size()) { 41849a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang cleanUpApn = false; 41859a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang for (int i = 0; i < waitingApns.size(); i++) { 41869a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (!currentWaitingApns.get(i).equals(waitingApns.get(i))) { 41879a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (VDBG) log("new waiting apn is different at " + i); 41889a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang cleanUpApn = true; 41899a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang apnContext.setWaitingApns(waitingApns); 41909a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang break; 41919a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } 41929a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } 41939a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } 41949a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } 41959a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang 41969a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (cleanUpApn) { 41979a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang apnContext.setReason(Phone.REASON_APN_CHANGED); 41989a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang cleanUpConnection(true, apnContext); 41999a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } 42009a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } 42019a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } 42029a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang 42039a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (!isConnected()) { 42049a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang stopNetStatPoll(); 42059a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang stopDataStallAlarm(); 42069a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } 42079a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang 42089a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang mRequestedApnType = PhoneConstants.APN_TYPE_DEFAULT; 42099a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang 42109a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (DBG) log("mDisconnectPendingCount = " + mDisconnectPendingCount); 42119a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang if (tearDown && mDisconnectPendingCount == 0) { 42129a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang notifyDataDisconnectComplete(); 42139a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang notifyAllDataDisconnected(); 42149a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } 42159a90f1dde8fa4bd7b1606742909c2f2f28a28a2fHui Wang } 42161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 42181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Polling stuff 42191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 42201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void resetPollStats() { 42211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mTxPkts = -1; 42221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mRxPkts = -1; 42231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNetStatPollPeriod = POLL_NETSTAT_MILLIS; 42241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void startNetStatPoll() { 42271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getOverallState() == DctConstants.State.CONNECTED 42281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && mNetStatPollEnabled == false) { 42291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 42301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("startNetStatPoll"); 42311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu resetPollStats(); 42331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNetStatPollEnabled = true; 42341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPollNetStat.run(); 42351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mPhone != null) { 42371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.notifyDataActivity(); 42381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void stopNetStatPoll() { 42421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNetStatPollEnabled = false; 42431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu removeCallbacks(mPollNetStat); 42441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 42451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("stopNetStatPoll"); 42461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // To sync data activity icon in the case of switching data connection to send MMS. 42491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mPhone != null) { 42501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.notifyDataActivity(); 42511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void sendStartNetStatPoll(DctConstants.Activity activity) { 42551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message msg = obtainMessage(DctConstants.CMD_NET_STAT_POLL); 42561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.arg1 = DctConstants.ENABLED; 42571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.obj = activity; 42581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(msg); 42591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void handleStartNetStatPoll(DctConstants.Activity activity) { 42621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu startNetStatPoll(); 42631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); 42641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setActivity(activity); 42651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void sendStopNetStatPoll(DctConstants.Activity activity) { 42681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message msg = obtainMessage(DctConstants.CMD_NET_STAT_POLL); 42691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.arg1 = DctConstants.DISABLED; 42701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.obj = activity; 42711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(msg); 42721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void handleStopNetStatPoll(DctConstants.Activity activity) { 42751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu stopNetStatPoll(); 42761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu stopDataStallAlarm(); 42771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setActivity(activity); 42781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void updateDataActivity() { 42811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu long sent, received; 42821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DctConstants.Activity newActivity; 42841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TxRxSum preTxRxSum = new TxRxSum(mTxPkts, mRxPkts); 42861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TxRxSum curTxRxSum = new TxRxSum(); 42871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu curTxRxSum.updateTxRxSum(); 42881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mTxPkts = curTxRxSum.txPkts; 42891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mRxPkts = curTxRxSum.rxPkts; 42901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) { 42921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("updateDataActivity: curTxRxSum=" + curTxRxSum + " preTxRxSum=" + preTxRxSum); 42931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 42941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mNetStatPollEnabled && (preTxRxSum.txPkts > 0 || preTxRxSum.rxPkts > 0)) { 42961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sent = mTxPkts - preTxRxSum.txPkts; 42971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu received = mRxPkts - preTxRxSum.rxPkts; 42981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 42991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) 43001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("updateDataActivity: sent=" + sent + " received=" + received); 43011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (sent > 0 && received > 0) { 43021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newActivity = DctConstants.Activity.DATAINANDOUT; 43031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (sent > 0 && received == 0) { 43041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newActivity = DctConstants.Activity.DATAOUT; 43051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (sent == 0 && received > 0) { 43061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newActivity = DctConstants.Activity.DATAIN; 43071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 43081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newActivity = (mActivity == DctConstants.Activity.DORMANT) ? 43091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mActivity : DctConstants.Activity.NONE; 43101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 43111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 43121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mActivity != newActivity && mIsScreenOn) { 43131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) 43141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("updateDataActivity: newActivity=" + newActivity); 43151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mActivity = newActivity; 43161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.notifyDataActivity(); 43171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 43181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 43191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 43201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 43211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 43221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Data-Stall 43231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 43241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Recovery action taken in case of data stall 43251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static class RecoveryAction { 43261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public static final int GET_DATA_CALL_LIST = 0; 43271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public static final int CLEANUP = 1; 43281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public static final int REREGISTER = 2; 43291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public static final int RADIO_RESTART = 3; 43301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public static final int RADIO_RESTART_WITH_PROP = 4; 43311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 43321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static boolean isAggressiveRecovery(int value) { 43331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return ((value == RecoveryAction.CLEANUP) || 43341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (value == RecoveryAction.REREGISTER) || 43351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (value == RecoveryAction.RADIO_RESTART) || 43361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (value == RecoveryAction.RADIO_RESTART_WITH_PROP)); 43371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 43381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 43391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 43401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private int getRecoveryAction() { 43411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int action = Settings.System.getInt(mResolver, 43421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "radio.data.stall.recovery.action", RecoveryAction.GET_DATA_CALL_LIST); 43431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) log("getRecoveryAction: " + action); 43441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return action; 43451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 43461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 43471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void putRecoveryAction(int action) { 43481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.System.putInt(mResolver, "radio.data.stall.recovery.action", action); 43491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) log("putRecoveryAction: " + action); 43501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 43511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 43521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void doRecovery() { 43531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getOverallState() == DctConstants.State.CONNECTED) { 43541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Go through a series of recovery steps, each action transitions to the next action 43551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int recoveryAction = getRecoveryAction(); 43561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switch (recoveryAction) { 43571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case RecoveryAction.GET_DATA_CALL_LIST: 43581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_GET_DATA_CALL_LIST, 43591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSentSinceLastRecv); 43601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("doRecovery() get data call list"); 43611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.mCi.getDataCallList(obtainMessage(DctConstants.EVENT_DATA_STATE_CHANGED)); 43621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu putRecoveryAction(RecoveryAction.CLEANUP); 43631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 43641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case RecoveryAction.CLEANUP: 43651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_CLEANUP, mSentSinceLastRecv); 43661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("doRecovery() cleanup all connections"); 43671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu cleanUpAllConnections(Phone.REASON_PDP_RESET); 43681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu putRecoveryAction(RecoveryAction.REREGISTER); 43691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 43701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case RecoveryAction.REREGISTER: 43711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_REREGISTER, 43721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSentSinceLastRecv); 43731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("doRecovery() re-register"); 43741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPhone.getServiceStateTracker().reRegisterNetwork(null); 43751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu putRecoveryAction(RecoveryAction.RADIO_RESTART); 43761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 43771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case RecoveryAction.RADIO_RESTART: 43781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_RADIO_RESTART, 43791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSentSinceLastRecv); 43801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("restarting radio"); 43811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu putRecoveryAction(RecoveryAction.RADIO_RESTART_WITH_PROP); 43821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu restartRadio(); 43831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 43841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case RecoveryAction.RADIO_RESTART_WITH_PROP: 43851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // This is in case radio restart has not recovered the data. 43861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // It will set an additional "gsm.radioreset" property to tell 43871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // RIL or system to take further action. 43881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // The implementation of hard reset recovery action is up to OEM product. 43891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Once RADIO_RESET property is consumed, it is expected to set back 43901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // to false by RIL. 43911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu EventLog.writeEvent(EventLogTags.DATA_STALL_RECOVERY_RADIO_RESTART_WITH_PROP, -1); 43921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("restarting radio with gsm.radioreset to true"); 43931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SystemProperties.set(RADIO_RESET_PROPERTY, "true"); 43941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // give 1 sec so property change can be notified. 43951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 43961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Thread.sleep(1000); 43971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (InterruptedException e) {} 43981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu restartRadio(); 43991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu putRecoveryAction(RecoveryAction.GET_DATA_CALL_LIST); 44001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 44011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu default: 44021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu throw new RuntimeException("doRecovery: Invalid recoveryAction=" + 44031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu recoveryAction); 44041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSentSinceLastRecv = 0; 44061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void updateDataStallInfo() { 44101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu long sent, received; 44111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TxRxSum preTxRxSum = new TxRxSum(mDataStallTxRxSum); 44131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDataStallTxRxSum.updateTxRxSum(); 44141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) { 44161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("updateDataStallInfo: mDataStallTxRxSum=" + mDataStallTxRxSum + 44171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " preTxRxSum=" + preTxRxSum); 44181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sent = mDataStallTxRxSum.txPkts - preTxRxSum.txPkts; 44211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu received = mDataStallTxRxSum.rxPkts - preTxRxSum.rxPkts; 44221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (RADIO_TESTS) { 44241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (SystemProperties.getBoolean("radio.test.data.stall", false)) { 44251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("updateDataStallInfo: radio.test.data.stall true received = 0;"); 44261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu received = 0; 44271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ( sent > 0 && received > 0 ) { 44301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) log("updateDataStallInfo: IN/OUT"); 44311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSentSinceLastRecv = 0; 44321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu putRecoveryAction(RecoveryAction.GET_DATA_CALL_LIST); 44331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (sent > 0 && received == 0) { 44341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mPhone.getState() == PhoneConstants.State.IDLE) { 44351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSentSinceLastRecv += sent; 44361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 44371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSentSinceLastRecv = 0; 44381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 44401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("updateDataStallInfo: OUT sent=" + sent + 44411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " mSentSinceLastRecv=" + mSentSinceLastRecv); 44421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (sent == 0 && received > 0) { 44441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) log("updateDataStallInfo: IN"); 44451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSentSinceLastRecv = 0; 44461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu putRecoveryAction(RecoveryAction.GET_DATA_CALL_LIST); 44471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 44481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) log("updateDataStallInfo: NONE"); 44491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onDataStallAlarm(int tag) { 44531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mDataStallAlarmTag != tag) { 44541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 44551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("onDataStallAlarm: ignore, tag=" + tag + " expecting " + mDataStallAlarmTag); 44561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 44581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu updateDataStallInfo(); 44601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int hangWatchdogTrigger = Settings.Global.getInt(mResolver, 44621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.PDP_WATCHDOG_TRIGGER_PACKET_COUNT, 44631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu NUMBER_SENT_PACKETS_OF_HANG); 44641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean suspectedStall = DATA_STALL_NOT_SUSPECTED; 44661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mSentSinceLastRecv >= hangWatchdogTrigger) { 44671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 44681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("onDataStallAlarm: tag=" + tag + " do recovery action=" + getRecoveryAction()); 44691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu suspectedStall = DATA_STALL_SUSPECTED; 44711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(obtainMessage(DctConstants.EVENT_DO_RECOVERY)); 44721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 44731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) { 44741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("onDataStallAlarm: tag=" + tag + " Sent " + String.valueOf(mSentSinceLastRecv) + 44751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " pkts since last received, < watchdogTrigger=" + hangWatchdogTrigger); 44761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu startDataStallAlarm(suspectedStall); 44791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void startDataStallAlarm(boolean suspectedStall) { 44821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int nextAction = getRecoveryAction(); 44831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int delayInMs; 44841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mDataStallDetectionEnabled && getOverallState() == DctConstants.State.CONNECTED) { 44861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If screen is on or data stall is currently suspected, set the alarm 44870e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu // with an aggressive timeout. 44881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mIsScreenOn || suspectedStall || RecoveryAction.isAggressiveRecovery(nextAction)) { 44891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu delayInMs = Settings.Global.getInt(mResolver, 44901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS, 44911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT); 44921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 44931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu delayInMs = Settings.Global.getInt(mResolver, 44941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS, 44951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT); 44961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 44971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDataStallAlarmTag += 1; 44991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) { 45001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("startDataStallAlarm: tag=" + mDataStallAlarmTag + 45011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " delay=" + (delayInMs / 1000) + "s"); 45021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Intent intent = new Intent(INTENT_DATA_STALL_ALARM); 45041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu intent.putExtra(DATA_STALL_ALARM_TAG_EXTRA, mDataStallAlarmTag); 45051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDataStallAlarmIntent = PendingIntent.getBroadcast(mPhone.getContext(), 0, intent, 45061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu PendingIntent.FLAG_UPDATE_CURRENT); 45071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 45081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SystemClock.elapsedRealtime() + delayInMs, mDataStallAlarmIntent); 45091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 45101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) { 45111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("startDataStallAlarm: NOT started, no connection tag=" + mDataStallAlarmTag); 45121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 45161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void stopDataStallAlarm() { 45171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) { 45181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("stopDataStallAlarm: current tag=" + mDataStallAlarmTag + 45191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " mDataStallAlarmIntent=" + mDataStallAlarmIntent); 45201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDataStallAlarmTag += 1; 45221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mDataStallAlarmIntent != null) { 45231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mAlarmManager.cancel(mDataStallAlarmIntent); 45241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDataStallAlarmIntent = null; 45251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 45281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void restartDataStallAlarm() { 45291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isConnected() == false) return; 45301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // To be called on screen status change. 45311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Do not cancel the alarm if it is set with aggressive timeout. 45321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int nextAction = getRecoveryAction(); 45331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 45341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (RecoveryAction.isAggressiveRecovery(nextAction)) { 45351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("restartDataStallAlarm: action is pending. not resetting the alarm."); 45361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 45371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG_STALL) log("restartDataStallAlarm: stop then start."); 45391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu stopDataStallAlarm(); 45401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); 45411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 45431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 45441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Provisioning APN 45451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 45461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void onActionIntentProvisioningApnAlarm(Intent intent) { 45471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) log("onActionIntentProvisioningApnAlarm: action=" + intent.getAction()); 45481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message msg = obtainMessage(DctConstants.EVENT_PROVISIONING_APN_ALARM, 45491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu intent.getAction()); 45501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu msg.arg1 = intent.getIntExtra(PROVISIONING_APN_ALARM_TAG_EXTRA, 0); 45511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(msg); 45521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 45541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void startProvisioningApnAlarm() { 45551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int delayInMs = Settings.Global.getInt(mResolver, 45561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Global.PROVISIONING_APN_ALARM_DELAY_IN_MS, 45571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu PROVISIONING_APN_ALARM_DELAY_IN_MS_DEFAULT); 45581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (Build.IS_DEBUGGABLE) { 45591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Allow debug code to use a system property to provide another value 45601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String delayInMsStrg = Integer.toString(delayInMs); 45611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu delayInMsStrg = System.getProperty(DEBUG_PROV_APN_ALARM, delayInMsStrg); 45621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 45631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu delayInMs = Integer.parseInt(delayInMsStrg); 45641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (NumberFormatException e) { 45651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("startProvisioningApnAlarm: e=" + e); 45661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mProvisioningApnAlarmTag += 1; 45691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 45701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("startProvisioningApnAlarm: tag=" + mProvisioningApnAlarmTag + 45711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " delay=" + (delayInMs / 1000) + "s"); 45721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Intent intent = new Intent(INTENT_PROVISIONING_APN_ALARM); 45741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu intent.putExtra(PROVISIONING_APN_ALARM_TAG_EXTRA, mProvisioningApnAlarmTag); 45751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mProvisioningApnAlarmIntent = PendingIntent.getBroadcast(mPhone.getContext(), 0, intent, 45761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu PendingIntent.FLAG_UPDATE_CURRENT); 45771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 45781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SystemClock.elapsedRealtime() + delayInMs, mProvisioningApnAlarmIntent); 45791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 45811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void stopProvisioningApnAlarm() { 45821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 45831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log("stopProvisioningApnAlarm: current tag=" + mProvisioningApnAlarmTag + 45841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " mProvsioningApnAlarmIntent=" + mProvisioningApnAlarmIntent); 45851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mProvisioningApnAlarmTag += 1; 45871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mProvisioningApnAlarmIntent != null) { 45881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mAlarmManager.cancel(mProvisioningApnAlarmIntent); 45891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mProvisioningApnAlarmIntent = null; 45901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 45921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 4594