19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.telephony.gsm; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.AlarmManager; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 239587f8696aa8a2bb6db4f3203a842e06170b62c3John Huangimport android.content.ContentValues; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.ContentObserver; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.NetworkInfo; 319587f8696aa8a2bb6db4f3203a842e06170b62c3John Huangimport android.net.Uri; 329c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganeshimport android.net.wifi.WifiManager; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.AsyncResult; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.INetStatService; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.preference.PreferenceManager; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Checkin; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Telephony; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.ServiceState; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.gsm.GsmCellLocation; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport com.android.internal.telephony.DataCallState; 52767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.DataConnection; 53767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.DataConnectionTracker; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.Phone; 553918e13b24d4e7ad410089eb615721ca026bec01Wink Savilleimport com.android.internal.telephony.RetryManager; 56767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.TelephonyEventLog; 579c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganeshimport com.android.internal.telephony.DataConnection.FailCause; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 65767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic final class GsmDataConnectionTracker extends DataConnectionTracker { 6625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected final String LOG_TAG = "GSM"; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh private GSMPhone mGsmPhone; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handles changes to the APN db. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ApnChangeObserver extends ContentObserver { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ApnChangeObserver () { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(mDataConnectionTracker); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChange(boolean selfChange) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessage(obtainMessage(EVENT_APN_CHANGED)); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Instance Variables 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INetStatService netstat; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Indicates baseband will not auto-attach 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean noAutoAttach = false; 883918e13b24d4e7ad410089eb615721ca026bec01Wink Saville 89e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh private boolean mReregisterOnReconnectFailure = false; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ContentResolver mResolver; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mPingTestActive = false; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Count of PDP reset attempts; reset when we see incoming, 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // call reRegisterNetwork, or pingTest succeeds. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mPdpResetCount = 0; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIsScreenOn = true; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 983918e13b24d4e7ad410089eb615721ca026bec01Wink Saville /** Delay between APN attempts */ 993918e13b24d4e7ad410089eb615721ca026bec01Wink Saville protected static final int APN_DELAY_MILLIS = 5000; 1003918e13b24d4e7ad410089eb615721ca026bec01Wink Saville 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //useful for debugging 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean failNextConnect = false; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allApns holds all apns for this sim spn, retrieved from 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the Carrier DB. 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create once after simcard info is loaded 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<ApnSetting> allApns = null; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * waitingApns holds all apns that are waiting to be connected 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It is a subset of allApns and has the same format 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<ApnSetting> waitingApns = null; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang private ApnSetting preferredApn = null; 1209587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 12125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt /* Currently active APN */ 12225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected ApnSetting mActiveApn; 12325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pdpList holds all the PDP connection, i.e. IP Link in GPRS 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 127767a662ecde33c3979bf02b793d392aca0403162Wink Saville private ArrayList<DataConnection> pdpList; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Currently active PdpConnection */ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PdpConnection mActivePdp; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project /** Is packet service restricted by network */ 1334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project private boolean mIsPsRestricted = false; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Constants 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Increase this to match the max number of simultaneous 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // PDP contexts we plan to support. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pool size of PdpConnection objects. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PDP_CONNECTION_POOL_SIZE = 1; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int POLL_PDP_MILLIS = 5 * 1000; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String INTENT_RECONNECT_ALARM = "com.android.internal.telephony.gprs-reconnect"; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String INTENT_RECONNECT_ALARM_EXTRA_REASON = "reason"; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang static final Uri PREFERAPN_URI = Uri.parse("content://telephony/carriers/preferapn"); 1509587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang static final String APN_ID = "apn_id"; 1519587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang private boolean canSetPreferApn = false; 1529587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 15389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt // for tracking retrys on the default APN 15489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt private RetryManager mDefaultRetryManager; 15589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt // for tracking retrys on a secondary APN 15689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt private RetryManager mSecondaryRetryManager; 15789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BroadcastReceiver mIntentReceiver = new BroadcastReceiver () 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String action = intent.getAction(); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (action.equals(Intent.ACTION_SCREEN_ON)) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsScreenOn = true; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopNetStatPoll(); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startNetStatPoll(); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsScreenOn = false; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopNetStatPoll(); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startNetStatPoll(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (action.equals((INTENT_RECONNECT_ALARM))) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "GPRS reconnect alarm. Previous state was " + state); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String reason = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.FAILED) { 1779c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION); 1789c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh msg.arg1 = 0; // tearDown is false 1799c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh msg.obj = (String) reason; 1809c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh sendMessage(msg); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA)); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final android.net.NetworkInfo networkInfo = (NetworkInfo) 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsWifiConnected = (networkInfo != null && networkInfo.isConnected()); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!enabled) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when wifi got disabeled, the NETWORK_STATE_CHANGED_ACTION 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // quit and wont report disconnected til next enalbing. 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsWifiConnected = false; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Watches for changes to the APN db. */ 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ApnChangeObserver apnObserver; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Constructor 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 205767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmDataConnectionTracker(GSMPhone p) { 206767a662ecde33c3979bf02b793d392aca0403162Wink Saville super(p); 207e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone = p; 208767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mCM.registerForAvailable (this, EVENT_RADIO_AVAILABLE, null); 209767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); 210767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mSIMRecords.registerForRecordsLoaded(this, EVENT_RECORDS_LOADED, null); 211767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mCM.registerForDataStateChanged (this, EVENT_DATA_STATE_CHANGED, null); 212767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mCT.registerForVoiceCallEnded (this, EVENT_VOICE_CALL_ENDED, null); 213767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mCT.registerForVoiceCallStarted (this, EVENT_VOICE_CALL_STARTED, null); 214767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mSST.registerForGprsAttached(this, EVENT_GPRS_ATTACHED, null); 215767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mSST.registerForGprsDetached(this, EVENT_GPRS_DETACHED, null); 216767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mSST.registerForRoamingOn(this, EVENT_ROAMING_ON, null); 217767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mSST.registerForRoamingOff(this, EVENT_ROAMING_OFF, null); 218767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mSST.registerForPsRestrictedEnabled(this, EVENT_PS_RESTRICT_ENABLED, null); 219767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.mSST.registerForPsRestrictedDisabled(this, EVENT_PS_RESTRICT_DISABLED, null); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.netstat = INetStatService.Stub.asInterface(ServiceManager.getService("netstat")); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter = new IntentFilter(); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(INTENT_RECONNECT_ALARM); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(Intent.ACTION_SCREEN_ON); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(Intent.ACTION_SCREEN_OFF); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 230a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville // TODO: Why is this registering the phone as the receiver of the intent 231a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville // and not its own handler? 232a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville p.getContext().registerReceiver(mIntentReceiver, filter, null, p); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionTracker = this; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResolver = phone.getContext().getContentResolver(); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apnObserver = new ApnChangeObserver(); 239767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.getContext().getContentResolver().registerContentObserver( 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Telephony.Carriers.CONTENT_URI, true, apnObserver); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createAllPdpList(); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This preference tells us 1) initial condition for "dataEnabled", 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and 2) whether the RIL will setup the baseband to auto-PS attach. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(phone.getContext()); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dataEnabled[APN_DEFAULT_ID] = !sp.getBoolean(GSMPhone.DATA_DISABLED_ON_BOOT_KEY, false); 24842acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt if (dataEnabled[APN_DEFAULT_ID]) { 24942acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt enabledCount++; 25042acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project noAutoAttach = !dataEnabled[APN_DEFAULT_ID]; 2523918e13b24d4e7ad410089eb615721ca026bec01Wink Saville 2533918e13b24d4e7ad410089eb615721ca026bec01Wink Saville if (!mRetryMgr.configure(SystemProperties.get("ro.gsm.data_retry_config"))) { 2543918e13b24d4e7ad410089eb615721ca026bec01Wink Saville if (!mRetryMgr.configure(DEFAULT_DATA_RETRY_CONFIG)) { 2553918e13b24d4e7ad410089eb615721ca026bec01Wink Saville // Should never happen, log an error and default to a simple linear sequence. 2563918e13b24d4e7ad410089eb615721ca026bec01Wink Saville Log.e(LOG_TAG, "Could not configure using DEFAULT_DATA_RETRY_CONFIG=" 2573918e13b24d4e7ad410089eb615721ca026bec01Wink Saville + DEFAULT_DATA_RETRY_CONFIG); 2583918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.configure(20, 2000, 1000); 2593918e13b24d4e7ad410089eb615721ca026bec01Wink Saville } 2603918e13b24d4e7ad410089eb615721ca026bec01Wink Saville } 26189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 26289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mDefaultRetryManager = mRetryMgr; 26389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mSecondaryRetryManager = new RetryManager(); 26489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 26589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (!mSecondaryRetryManager.configure(SystemProperties.get( 26689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt "ro.gsm.2nd_data_retry_config"))) { 26789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (!mSecondaryRetryManager.configure(SECONDARY_DATA_RETRY_CONFIG)) { 26889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt // Should never happen, log an error and default to a simple sequence. 26989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt Log.e(LOG_TAG, "Could note configure using SECONDARY_DATA_RETRY_CONFIG=" 27089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt + SECONDARY_DATA_RETRY_CONFIG); 27189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mSecondaryRetryManager.configure("max_retries=3, 333, 333, 333"); 27289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 27389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 276767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void dispose() { 277767a662ecde33c3979bf02b793d392aca0403162Wink Saville //Unregister for all events 278767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.mCM.unregisterForAvailable(this); 279767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.mCM.unregisterForOffOrNotAvailable(this); 280e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSIMRecords.unregisterForRecordsLoaded(this); 281767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.mCM.unregisterForDataStateChanged(this); 282e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mCT.unregisterForVoiceCallEnded(this); 283e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mCT.unregisterForVoiceCallStarted(this); 284e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForGprsAttached(this); 285e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForGprsDetached(this); 286e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForRoamingOn(this); 287e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForRoamingOff(this); 288e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForPsRestrictedEnabled(this); 289e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForPsRestrictedDisabled(this); 2909c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 291767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.getContext().unregisterReceiver(this.mIntentReceiver); 292767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.getContext().getContentResolver().unregisterContentObserver(this.apnObserver); 293767a662ecde33c3979bf02b793d392aca0403162Wink Saville 294767a662ecde33c3979bf02b793d392aca0403162Wink Saville destroyAllPdpList(); 295767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 296767a662ecde33c3979bf02b793d392aca0403162Wink Saville 297767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void finalize() { 298767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(DBG) Log.d(LOG_TAG, "GsmDataConnectionTracker finalized"); 299767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 300767a662ecde33c3979bf02b793d392aca0403162Wink Saville 30125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected void setState(State s) { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log ("setState: " + s); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state != s) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == State.INITING) { // request PDP context 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Checkin.updateStats( 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.getContext().getContentResolver(), 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Checkin.Stats.Tag.PHONE_GPRS_ATTEMPTED, 1, 0.0); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == State.CONNECTED) { // pppd is up 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Checkin.updateStats( 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.getContext().getContentResolver(), 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Checkin.Stats.Tag.PHONE_GPRS_CONNECTED, 1, 0.0); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = s; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.FAILED) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (waitingApns != null) 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project waitingApns.clear(); // when teardown the connection and set to IDLE 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt public String[] getActiveApnTypes() { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] result; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActiveApn != null) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = mActiveApn.types; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = new String[1]; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result[0] = Phone.APN_TYPE_DEFAULT; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 336767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String getActiveApnString() { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String result = null; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActiveApn != null) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = mActiveApn.apn; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The data connection is expected to be setup while device 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1. has sim card 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2. registered to gprs service 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3. user doesn't explicitly disable data service 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4. wifi is not on 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return false while no data connection if all above requirements are met. 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 353767a662ecde33c3979bf02b793d392aca0403162Wink Saville public boolean isDataConnectionAsDesired() { 35437b80ee451a7404c288738255725f78a5af02130John Wang boolean roaming = phone.getServiceState().getRoaming(); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 356e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh if (mGsmPhone.mSIMRecords.getRecordsLoaded() && 357e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.getCurrentGprsState() == ServiceState.STATE_IN_SERVICE && 358767a662ecde33c3979bf02b793d392aca0403162Wink Saville (!roaming || getDataOnRoamingEnabled()) && 3599c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh !mIsWifiConnected && 3604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project !mIsPsRestricted ) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (state == State.CONNECTED); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt @Override 36725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected boolean isApnTypeActive(String type) { 36825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt // TODO: support simultaneous with List instead 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActiveApn != null && mActiveApn.canHandleType(type); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt @Override 37325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected boolean isApnTypeAvailable(String type) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (allApns != null) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (ApnSetting apn : allApns) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (apn.canHandleType(type)) { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 384767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 385767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Formerly this method was ArrayList<PdpConnection> getAllPdps() 386767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 387767a662ecde33c3979bf02b793d392aca0403162Wink Saville public ArrayList<DataConnection> getAllDataConnections() { 388767a662ecde33c3979bf02b793d392aca0403162Wink Saville ArrayList<DataConnection> pdps = (ArrayList<DataConnection>)pdpList.clone(); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pdps; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean isDataAllowed() { 39337b80ee451a7404c288738255725f78a5af02130John Wang boolean roaming = phone.getServiceState().getRoaming(); 394984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt return getAnyDataEnabled() && (!roaming || getDataOnRoamingEnabled()) && 395984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt mMasterDataEnabled; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //****** Called from ServiceStateTracker 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Invoked when ServiceStateTracker observes a transition from GPRS 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attach to detach. 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 403767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onGprsDetached() { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We presently believe it is unnecessary to tear down the PDP context 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when GPRS detaches, but we should stop the network polling. 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopNetStatPoll(); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(Phone.REASON_GPRS_DETACHED); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void onGprsAttached() { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.CONNECTED) { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startNetStatPoll(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(Phone.REASON_GPRS_ATTACHED); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.FAILED) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cleanUpConnection(false, Phone.REASON_GPRS_ATTACHED); 4193918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project trySetupData(Phone.REASON_GPRS_ATTACHED); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 425767a662ecde33c3979bf02b793d392aca0403162Wink Saville private boolean trySetupData(String reason) { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("***trySetupData due to " + (reason == null ? "(unspecified)" : reason)); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Log.d(LOG_TAG, "[DSAC DEB] " + "trySetupData with mIsPsRestricted=" + mIsPsRestricted); 4299c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (phone.getSimulatedRadioControl() != null) { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Assume data is connected on the simulator 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME this can be improved 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setState(State.CONNECTED); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(reason); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(LOG_TAG, "(fix?) We're on the simulator; assuming data is connected"); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 440e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh int gprsState = mGsmPhone.mSST.getCurrentGprsState(); 441e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh boolean desiredPowerState = mGsmPhone.mSST.getDesiredPowerState(); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((state == State.IDLE || state == State.SCANNING) 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (gprsState == ServiceState.STATE_IN_SERVICE || noAutoAttach) 445e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh && mGsmPhone.mSIMRecords.getRecordsLoaded() 446faf4413dffdc9079683b951736088ff2a01073a4jsh && phone.getState() == Phone.State.IDLE 4474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project && isDataAllowed() 448cf2119a9755d9e2713ce78e84d0826d430a11a62Jaikumar Ganesh && !mIsPsRestricted 449cf2119a9755d9e2713ce78e84d0826d430a11a62Jaikumar Ganesh && desiredPowerState ) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.IDLE) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project waitingApns = buildWaitingApns(); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (waitingApns.isEmpty()) { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("No APN found"); 45559cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh notifyNoData(PdpConnection.FailCause.MISSING_UKNOWN_APN); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log ("Create from allApns : " + apnListToString(allApns)); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) { 46342acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt log ("Setup waitngApns : " + apnListToString(waitingApns)); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return setupData(reason); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("trySetupData: Not ready for data: " + 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " dataState=" + state + 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " gprsState=" + gprsState + 471e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh " sim=" + mGsmPhone.mSIMRecords.getRecordsLoaded() + 472e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh " UMTS=" + mGsmPhone.mSST.isConcurrentVoiceAndData() + 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " phoneState=" + phone.getState() + 47442acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt " isDataAllowed=" + isDataAllowed() + 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " dataEnabled=" + getAnyDataEnabled() + 47637b80ee451a7404c288738255725f78a5af02130John Wang " roaming=" + phone.getServiceState().getRoaming() + 4774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project " dataOnRoamingEnable=" + getDataOnRoamingEnabled() + 478cf2119a9755d9e2713ce78e84d0826d430a11a62Jaikumar Ganesh " ps restricted=" + mIsPsRestricted + 479984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt " desiredPowerState=" + desiredPowerState + 480984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt " MasterDataEnabled=" + mMasterDataEnabled); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If tearDown is true, this only tears down a CONNECTED session. Presently, 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there is no mechanism for abandoning an INITING/CONNECTING session, 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but would likely involve cancelling pending async requests or 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setting a flag or new state to ignore them when they came in 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tearDown true if the underlying PdpConnection should be 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disconnected. 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param reason reason for the clean up. 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void cleanUpConnection(boolean tearDown, String reason) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("Clean up connection due to " + reason); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Clear the reconnect alarm, if set. 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mReconnectIntent != null) { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AlarmManager am = 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (AlarmManager) phone.getContext().getSystemService(Context.ALARM_SERVICE); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am.cancel(mReconnectIntent); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReconnectIntent = null; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 505bbf7c00e06c0f6f39e26f7fdedbc7105b2f5c415Jaikumar Ganesh setState(State.DISCONNECTING); 506bbf7c00e06c0f6f39e26f7fdedbc7105b2f5c415Jaikumar Ganesh 507767a662ecde33c3979bf02b793d392aca0403162Wink Saville for (DataConnection conn : pdpList) { 508767a662ecde33c3979bf02b793d392aca0403162Wink Saville PdpConnection pdp = (PdpConnection) conn; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tearDown) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = obtainMessage(EVENT_DISCONNECT_DONE, reason); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pdp.disconnect(msg); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pdp.clearSettings(); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopNetStatPoll(); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!tearDown) { 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setState(State.IDLE); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(reason); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActiveApn = null; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param types comma delimited list of APN types 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return array of APN types 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] parseTypes(String types) { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] result; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If unset, set to DEFAULT. 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (types == null || types.equals("")) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = new String[1]; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result[0] = Phone.APN_TYPE_ALL; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = types.split(","); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<ApnSetting> createApnList(Cursor cursor) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<ApnSetting> result = new ArrayList<ApnSetting>(); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] types = parseTypes( 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.TYPE))); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApnSetting apn = new ApnSetting( 5489587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers._ID)), 5499587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NUMERIC)), 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NAME)), 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.APN)), 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROXY)), 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PORT)), 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSC)), 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPROXY)), 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPORT)), 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)), 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)), 5592811f1625ebdb7f7483b8b866694474f89112d8cJaikumar Ganesh cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)), 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project types); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result.add(apn); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (cursor.moveToNext()); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PdpConnection findFreePdp() { 568767a662ecde33c3979bf02b793d392aca0403162Wink Saville for (DataConnection conn : pdpList) { 569767a662ecde33c3979bf02b793d392aca0403162Wink Saville PdpConnection pdp = (PdpConnection) conn; 570767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (pdp.getState() == DataConnection.State.INACTIVE) { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pdp; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean setupData(String reason) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApnSetting apn; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PdpConnection pdp; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apn = getNextApn(); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (apn == null) return false; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pdp = findFreePdp(); 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pdp == null) { 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("setupData: No free PdpConnection found!"); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActiveApn = apn; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivePdp = pdp; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = obtainMessage(); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.what = EVENT_DATA_SETUP_COMPLETE; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.obj = reason; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pdp.connect(apn, msg); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setState(State.INITING); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(reason); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected String getInterfaceName(String apnType) { 602c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt if (mActivePdp != null && 603c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (apnType == null || 604c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivePdp.getInterface(); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 610767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String getIpAddress(String apnType) { 611c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt if (mActivePdp != null && 612c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (apnType == null || 613c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivePdp.getIpAddress(); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt public String getGateway(String apnType) { 620c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt if (mActivePdp != null && 621c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (apnType == null || 622c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivePdp.getGatewayAddress(); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 628767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String[] getDnsServers(String apnType) { 629c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt if (mActivePdp != null && 630c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (apnType == null || 631c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivePdp.getDnsServers(); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean 638e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville pdpStatesHasCID (ArrayList<DataCallState> states, int cid) { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, s = states.size() ; i < s ; i++) { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (states.get(i).cid == cid) return true; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean 647e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville pdpStatesHasActiveCID (ArrayList<DataCallState> states, int cid) { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, s = states.size() ; i < s ; i++) { 649e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if ((states.get(i).cid == cid) && (states.get(i).active != 0)) { 650e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville return true; 651e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handles changes to the APN database. 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void onApnChanged() { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isConnected; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isConnected = (state != State.IDLE && state != State.FAILED); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The "current" may no longer be valid. MMS depends on this to send properly. 666e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.updateCurrentCarrierInProvider(); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: It'd be nice to only do this if the changed entrie(s) 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // match the current operator. 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createAllApnList(); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state != State.DISCONNECTING) { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cleanUpConnection(isConnected, Phone.REASON_APN_CHANGED); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isConnected) { 674bbf7c00e06c0f6f39e26f7fdedbc7105b2f5c415Jaikumar Ganesh // reset reconnect timer 6753918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 676e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = false; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project trySetupData(Phone.REASON_APN_CHANGED); 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param explicitPoll if true, indicates that *we* polled for this 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * update while state == CONNECTED rather than having it delivered 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * via an unsolicited response (which could have happened at any 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous state 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 688767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onPdpStateChanged (AsyncResult ar, boolean explicitPoll) { 689e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville ArrayList<DataCallState> pdpStates; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 691e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville pdpStates = (ArrayList<DataCallState>)(ar.result); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ar.exception != null) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is probably "radio not available" or something 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of that sort. If so, the whole connection is going 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to come down soon anyway 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7003de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink if (state == State.CONNECTED) { 7013de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // The way things are supposed to work, the PDP list 7023de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // should not contain the CID after it disconnects. 7033de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // However, the way things really work, sometimes the PDP 7043de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // context is still listed with active = false, which 7053de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // makes it hard to distinguish an activating context from 7063de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // an activated-and-then deactivated one. 7073de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink if (!pdpStatesHasCID(pdpStates, cidActive)) { 7083de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // It looks like the PDP context has deactivated. 7093de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // Tear everything down and try to reconnect. 7103de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink 7113de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink Log.i(LOG_TAG, "PDP connection has dropped. Reconnecting"); 7123de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink 7133de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // Add an event log when the network drops PDP 7143de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink int cid = -1; 7153de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation()); 7163de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink if (loc != null) cid = loc.getCid(); 7173de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink EventLog.List val = new EventLog.List(cid, 7183de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink TelephonyManager.getDefault().getNetworkType()); 7193de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_NETWORK_DROP, val); 7203de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink 7213de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink cleanUpConnection(true, null); 7223de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink return; 7233de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink } else if (!pdpStatesHasActiveCID(pdpStates, cidActive)) { 7243de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // Here, we only consider this authoritative if we asked for the 7253de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // PDP list. If it was an unsolicited response, we poll again 7263de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // to make sure everyone agrees on the initial state. 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!explicitPoll) { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We think it disconnected but aren't sure...poll from our side 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.mCM.getPDPContextList( 7313de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink this.obtainMessage(EVENT_GET_PDP_LIST_COMPLETE)); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(LOG_TAG, "PDP connection has dropped (active=false case). " 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Reconnecting"); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log the network drop on the event log. 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cid = -1; 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation()); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (loc != null) cid = loc.getCid(); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EventLog.List val = new EventLog.List(cid, 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TelephonyManager.getDefault().getNetworkType()); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_NETWORK_DROP, val); 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cleanUpConnection(true, null); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void notifyDefaultData(String reason) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setState(State.CONNECTED); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(reason); 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startNetStatPoll(); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // reset reconnect timer 7553918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 756e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = false; 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a kludge to deal with the fact that 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the PDP state change notification doesn't always work 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with certain RIL impl's/basebands 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 765767a662ecde33c3979bf02b793d392aca0403162Wink Saville private void startPeriodicPdpPoll() { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeMessages(EVENT_POLL_PDP); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessageDelayed(obtainMessage(EVENT_POLL_PDP), POLL_PDP_MILLIS); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void resetPollStats() { 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project txPkts = -1; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rxPkts = -1; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv = 0; 775767a662ecde33c3979bf02b793d392aca0403162Wink Saville netStatPollPeriod = POLL_NETSTAT_MILLIS; 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoRecvPollCount = 0; 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void doRecovery() { 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.CONNECTED) { 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int maxPdpReset = Settings.Gservices.getInt(mResolver, 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.Gservices.PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT, 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DEFAULT_MAX_PDP_RESET_FAIL); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPdpResetCount < maxPdpReset) { 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPdpResetCount++; 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_RESET, sentSinceLastRecv); 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cleanUpConnection(true, Phone.REASON_PDP_RESET); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPdpResetCount = 0; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_REREGISTER_NETWORK, sentSinceLastRecv); 791e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.reRegisterNetwork(null); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Add increasingly drastic recovery steps, eg, 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // reset the radio, reset the device. 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 798767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void startNetStatPoll() { 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.CONNECTED && mPingTestActive == false && netStatPollEnabled == false) { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "[DataConnection] Start poll NetStat"); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resetPollStats(); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project netStatPollEnabled = true; 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPollNetStat.run(); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 807767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void stopNetStatPoll() { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project netStatPollEnabled = false; 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeCallbacks(mPollNetStat); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "[DataConnection] Stop poll NetStat"); 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 813767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void restartRadio() { 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "************TURN OFF RADIO**************"); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cleanUpConnection(true, Phone.REASON_RADIO_TURNED_OFF); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.mCM.setRadioPower(false, null); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Note: no need to call setRadioPower(true). Assuming the desired 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * radio power state is still ON (as tracked by ServiceStateTracker), 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ServiceStateTracker will call setRadioPower when it receives the 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * RADIO_STATE_CHANGED notification for the power off. And if the 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * desired power state has changed in the interim, we don't want to 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * override it with an unconditional power on. 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int reset = Integer.parseInt(SystemProperties.get("net.ppp.reset-by-timeout", "0")); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemProperties.set("net.ppp.reset-by-timeout", String.valueOf(reset+1)); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829767a662ecde33c3979bf02b793d392aca0403162Wink Saville private Runnable mPollNetStat = new Runnable() 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long sent, received; 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long preTxPkts = -1, preRxPkts = -1; 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity newActivity; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preTxPkts = txPkts; 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preRxPkts = rxPkts; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project txPkts = netstat.getMobileTxPackets(); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rxPkts = netstat.getMobileRxPackets(); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project txPkts = 0; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rxPkts = 0; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.d(LOG_TAG, "rx " + String.valueOf(rxPkts) + " tx " + String.valueOf(txPkts)); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (netStatPollEnabled && (preTxPkts > 0 || preRxPkts > 0)) { 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sent = txPkts - preTxPkts; 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project received = rxPkts - preRxPkts; 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( sent > 0 && received > 0 ) { 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv = 0; 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = Activity.DATAINANDOUT; 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPdpResetCount = 0; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (sent > 0 && received == 0) { 860767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (phone.getState() == Phone.State.IDLE) { 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv += sent; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv = 0; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = Activity.DATAOUT; 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (sent == 0 && received > 0) { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv = 0; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = Activity.DATAIN; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPdpResetCount = 0; 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (sent == 0 && received == 0) { 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = Activity.NONE; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv = 0; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = Activity.NONE; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity != newActivity && mIsScreenOn) { 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project activity = newActivity; 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataActivity(); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int watchdogTrigger = Settings.Gservices.getInt(mResolver, 8849c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh Settings.Gservices.PDP_WATCHDOG_TRIGGER_PACKET_COUNT, 885767a662ecde33c3979bf02b793d392aca0403162Wink Saville NUMBER_SENT_PACKETS_OF_HANG); 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sentSinceLastRecv >= watchdogTrigger) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we already have NUMBER_SENT_PACKETS sent without ack 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNoRecvPollCount == 0) { 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_RADIO_RESET_COUNTDOWN_TRIGGERED, 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int noRecvPollLimit = Settings.Gservices.getInt(mResolver, 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.Gservices.PDP_WATCHDOG_ERROR_POLL_COUNT, NO_RECV_POLL_LIMIT); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNoRecvPollCount < noRecvPollLimit) { 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It's possible the PDP context went down and we weren't notified. 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start polling the context list in an attempt to recover. 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("no DATAIN in a while; polling PDP"); 901767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.mCM.getDataCallList(obtainMessage(EVENT_GET_PDP_LIST_COMPLETE)); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoRecvPollCount++; 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Slow down the poll interval to let things happen 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project netStatPollPeriod = Settings.Gservices.getInt(mResolver, 9079c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh Settings.Gservices.PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS, 908767a662ecde33c3979bf02b793d392aca0403162Wink Saville POLL_NETSTAT_SLOW_MILLIS); 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("Sent " + String.valueOf(sentSinceLastRecv) + 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " pkts since last received"); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We've exceeded the threshold. Run ping test as a final check; 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it will proceed with recovery if ping fails. 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopNetStatPoll(); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread pingTest = new Thread() { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runPingTest(); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPingTestActive = true; 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pingTest.start(); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoRecvPollCount = 0; 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsScreenOn) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project netStatPollPeriod = Settings.Gservices.getInt(mResolver, 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.Gservices.PDP_WATCHDOG_POLL_INTERVAL_MS, POLL_NETSTAT_MILLIS); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project netStatPollPeriod = Settings.Gservices.getInt(mResolver, 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.Gservices.PDP_WATCHDOG_LONG_POLL_INTERVAL_MS, 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project POLL_NETSTAT_SCREEN_OFF_MILLIS); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (netStatPollEnabled) { 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionTracker.postDelayed(this, netStatPollPeriod); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 9409c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runPingTest () { 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int status = -1; 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String address = Settings.Gservices.getString(mResolver, 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.Gservices.PDP_WATCHDOG_PING_ADDRESS); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int deadline = Settings.Gservices.getInt(mResolver, 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.Gservices.PDP_WATCHDOG_PING_DEADLINE, DEFAULT_PING_DEADLINE); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("pinging " + address + " for " + deadline + "s"); 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (address != null && !NULL_IP.equals(address)) { 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Process p = Runtime.getRuntime() 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .exec("ping -c 1 -i 1 -w "+ deadline + " " + address); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status = p.waitFor(); 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(LOG_TAG, "ping failed: IOException"); 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(LOG_TAG, "exception trying to ping"); 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status == 0) { 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ping succeeded. False alarm. Reset netStatPoll. 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ("-1" for this event indicates a false alarm) 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_PDP_RESET, -1); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPdpResetCount = 0; 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessage(obtainMessage(EVENT_START_NETSTAT_POLL)); 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ping failed. Proceed with recovery. 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessage(obtainMessage(EVENT_START_RECOVERY)); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the last fail cause is something that 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * seems like it deserves an error notification. 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Transient errors are ignored 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 977767a662ecde33c3979bf02b793d392aca0403162Wink Saville private boolean shouldPostNotification(PdpConnection.FailCause cause) { 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean shouldPost = true; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO CHECK 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if (dataLink != null) { 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // shouldPost = dataLink.getLastLinkExitCode() != DataLink.EXIT_OPEN_FAILED; 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //} 983767a662ecde33c3979bf02b793d392aca0403162Wink Saville return (shouldPost && cause != PdpConnection.FailCause.UNKNOWN); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if data connection need to be setup after disconnected due to 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reason. 9899c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh * 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param reason the reason why data is disconnected 9919c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh * @return true if try setup data connection is need for this reason 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean retryAfterDisconnected(String reason) { 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean retry = true; 9959c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 9966ce96faa0c8dc74ea6d1391aa54d9c6909810dc1Robert Greenwalt if ( Phone.REASON_RADIO_TURNED_OFF.equals(reason) ) { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project retry = false; 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return retry; 10009c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh } 1001767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1002767a662ecde33c3979bf02b793d392aca0403162Wink Saville private void reconnectAfterFail(FailCause lastFailCauseCode, String reason) { 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.FAILED) { 10043918e13b24d4e7ad410089eb615721ca026bec01Wink Saville if (!mRetryMgr.isRetryNeeded()) { 100589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (!mRequestedApnType.equals(Phone.APN_TYPE_DEFAULT)) { 100689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt // if no more retries on a secondary APN attempt, tell the world and revert. 100789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt phone.notifyDataConnection(Phone.REASON_APN_FAILED); 1008984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt onEnableApn(apnTypeToId(mRequestedApnType), DISABLED); 100989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt return; 101089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 1011e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh if (mReregisterOnReconnectFailure) { 10123918e13b24d4e7ad410089eb615721ca026bec01Wink Saville // We've re-registerd once now just retry forever. 10133918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.retryForeverUsingLastTimeout(); 1014e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh } else { 10153918e13b24d4e7ad410089eb615721ca026bec01Wink Saville // Try to re-register to the network. 1016e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh Log.d(LOG_TAG, "PDP activate failed, Reregistering to the network"); 1017e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = true; 1018e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.reRegisterNetwork(null); 10193918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 1020e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh return; 1021e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh } 1022e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh } 10233918e13b24d4e7ad410089eb615721ca026bec01Wink Saville 10243918e13b24d4e7ad410089eb615721ca026bec01Wink Saville int nextReconnectDelay = mRetryMgr.getRetryTimer(); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "PDP activate failed. Scheduling next attempt for " 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (nextReconnectDelay / 1000) + "s"); 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AlarmManager am = 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (AlarmManager) phone.getContext().getSystemService(Context.ALARM_SERVICE); 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(INTENT_RECONNECT_ALARM); 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, reason); 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReconnectIntent = PendingIntent.getBroadcast( 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.getContext(), 0, intent, 0); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.elapsedRealtime() + nextReconnectDelay, 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReconnectIntent); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10383918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.increaseRetryCount(); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!shouldPostNotification(lastFailCauseCode)) { 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG,"NOT Posting GPRS Unavailable notification " 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "-- likely transient error"); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyNoData(lastFailCauseCode); 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049767a662ecde33c3979bf02b793d392aca0403162Wink Saville private void notifyNoData(PdpConnection.FailCause lastFailCauseCode) { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setState(State.FAILED); 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1053767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onRecordsLoaded() { 1054767a662ecde33c3979bf02b793d392aca0403162Wink Saville createAllApnList(); 1055767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state == State.FAILED) { 1056767a662ecde33c3979bf02b793d392aca0403162Wink Saville cleanUpConnection(false, null); 1057767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1058faf4413dffdc9079683b951736088ff2a01073a4jsh sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA, Phone.REASON_SIM_LOADED)); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 106189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt @Override 1062767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onEnableNewApn() { 106389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt // change our retry manager to use the appropriate numbers for the new APN 106489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (mRequestedApnType.equals(Phone.APN_TYPE_DEFAULT)) { 106589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mRetryMgr = mDefaultRetryManager; 106689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } else { 106789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mRetryMgr = mSecondaryRetryManager; 106889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 106989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mRetryMgr.resetRetryCount(); 107089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 1071767a662ecde33c3979bf02b793d392aca0403162Wink Saville // TODO: To support simultaneous PDP contexts, this should really only call 1072767a662ecde33c3979bf02b793d392aca0403162Wink Saville // cleanUpConnection if it needs to free up a PdpConnection. 1073767a662ecde33c3979bf02b793d392aca0403162Wink Saville cleanUpConnection(true, Phone.REASON_APN_SWITCHED); 1074767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1076868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt protected boolean onTrySetupData(String reason) { 1077868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt return trySetupData(reason); 1078767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10808c6b883cd3c835df32cab4cbf395ebf648bb7d7eJohn Wang @Override 1081767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onRoamingOff() { 108237b80ee451a7404c288738255725f78a5af02130John Wang trySetupData(Phone.REASON_ROAMING_OFF); 1083767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10858c6b883cd3c835df32cab4cbf395ebf648bb7d7eJohn Wang @Override 1086767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onRoamingOn() { 108737b80ee451a7404c288738255725f78a5af02130John Wang if (getDataOnRoamingEnabled()) { 108837b80ee451a7404c288738255725f78a5af02130John Wang trySetupData(Phone.REASON_ROAMING_ON); 108937b80ee451a7404c288738255725f78a5af02130John Wang } else { 109037b80ee451a7404c288738255725f78a5af02130John Wang if (DBG) log("Tear down data connection on roaming."); 109137b80ee451a7404c288738255725f78a5af02130John Wang cleanUpConnection(true, Phone.REASON_ROAMING_ON); 1092767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1093767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1095767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onRadioAvailable() { 1096767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (phone.getSimulatedRadioControl() != null) { 1097767a662ecde33c3979bf02b793d392aca0403162Wink Saville // Assume data is connected on the simulator 1098767a662ecde33c3979bf02b793d392aca0403162Wink Saville // FIXME this can be improved 1099767a662ecde33c3979bf02b793d392aca0403162Wink Saville setState(State.CONNECTED); 1100767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.notifyDataConnection(null); 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1102767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.i(LOG_TAG, "We're on the simulator; assuming data is connected"); 1103767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1105767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state != State.IDLE) { 1106767a662ecde33c3979bf02b793d392aca0403162Wink Saville cleanUpConnection(true, null); 1107767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1108767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1110767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onRadioOffOrNotAvailable() { 1111767a662ecde33c3979bf02b793d392aca0403162Wink Saville // Make sure our reconnect delay starts at the initial value 1112767a662ecde33c3979bf02b793d392aca0403162Wink Saville // next time the radio comes on 11133918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 1114e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = false; 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1116767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (phone.getSimulatedRadioControl() != null) { 1117767a662ecde33c3979bf02b793d392aca0403162Wink Saville // Assume data is connected on the simulator 1118767a662ecde33c3979bf02b793d392aca0403162Wink Saville // FIXME this can be improved 1119767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.i(LOG_TAG, "We're on the simulator; assuming radio off is meaningless"); 1120767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1121767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (DBG) log("Radio is off and clean up all connection"); 1122767a662ecde33c3979bf02b793d392aca0403162Wink Saville // TODO: Should we reset mRequestedApnType to "default"? 1123767a662ecde33c3979bf02b793d392aca0403162Wink Saville cleanUpConnection(false, Phone.REASON_RADIO_TURNED_OFF); 1124767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1125767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1127767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onDataSetupComplete(AsyncResult ar) { 1128767a662ecde33c3979bf02b793d392aca0403162Wink Saville String reason = null; 1129767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (ar.userObj instanceof String) { 1130767a662ecde33c3979bf02b793d392aca0403162Wink Saville reason = (String) ar.userObj; 1131767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1132767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1133767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (ar.exception == null) { 1134767a662ecde33c3979bf02b793d392aca0403162Wink Saville // everything is setup 1135767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (isApnTypeActive(Phone.APN_TYPE_DEFAULT)) { 1136767a662ecde33c3979bf02b793d392aca0403162Wink Saville SystemProperties.set("gsm.defaultpdpcontext.active", "true"); 11379587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (canSetPreferApn && preferredApn == null) { 11389587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang Log.d(LOG_TAG, "PREFERED APN is null"); 11399587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang preferredApn = mActiveApn; 11409587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang setPreferredApn(preferredApn.id); 11419587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 1142767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1143767a662ecde33c3979bf02b793d392aca0403162Wink Saville SystemProperties.set("gsm.defaultpdpcontext.active", "false"); 1144767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1145767a662ecde33c3979bf02b793d392aca0403162Wink Saville notifyDefaultData(reason); 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1147767a662ecde33c3979bf02b793d392aca0403162Wink Saville // TODO: For simultaneous PDP support, we need to build another 1148767a662ecde33c3979bf02b793d392aca0403162Wink Saville // trigger another TRY_SETUP_DATA for the next APN type. (Note 1149767a662ecde33c3979bf02b793d392aca0403162Wink Saville // that the existing connection may service that type, in which 1150767a662ecde33c3979bf02b793d392aca0403162Wink Saville // case we should try the next type, etc. 1151767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1152767a662ecde33c3979bf02b793d392aca0403162Wink Saville PdpConnection.FailCause cause; 1153767a662ecde33c3979bf02b793d392aca0403162Wink Saville cause = (PdpConnection.FailCause) (ar.result); 1154767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(DBG) log("PDP setup failed " + cause); 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log this failure to the Event Logs. 115659cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh if (cause.isEventLoggable()) { 1157767a662ecde33c3979bf02b793d392aca0403162Wink Saville int cid = -1; 1158767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation()); 1159767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (loc != null) cid = loc.getCid(); 1160767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1161767a662ecde33c3979bf02b793d392aca0403162Wink Saville EventLog.List val = new EventLog.List( 11629c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh cause.ordinal(), cid, 1163767a662ecde33c3979bf02b793d392aca0403162Wink Saville TelephonyManager.getDefault().getNetworkType()); 1164767a662ecde33c3979bf02b793d392aca0403162Wink Saville EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_RADIO_PDP_SETUP_FAIL, val); 1165767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1167767a662ecde33c3979bf02b793d392aca0403162Wink Saville // No try for permanent failure 1168767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (cause.isPermanentFail()) { 1169767a662ecde33c3979bf02b793d392aca0403162Wink Saville notifyNoData(cause); 117089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (!mRequestedApnType.equals(Phone.APN_TYPE_DEFAULT)) { 117189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt phone.notifyDataConnection(Phone.REASON_APN_FAILED); 1172984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt onEnableApn(apnTypeToId(mRequestedApnType), DISABLED); 117389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 117459cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh return; 1175767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 117759cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh waitingApns.remove(0); 117859cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh if (waitingApns.isEmpty()) { 117959cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh // No more to try, start delayed retry 1180767a662ecde33c3979bf02b793d392aca0403162Wink Saville startDelayedRetry(cause, reason); 118159cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh } else { 118259cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh // we still have more apns to try 118359cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh setState(State.SCANNING); 118459cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh // Wait a bit before trying the next APN, so that 118559cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh // we're not tying up the RIL command channel 11863918e13b24d4e7ad410089eb615721ca026bec01Wink Saville sendMessageDelayed(obtainMessage(EVENT_TRY_SETUP_DATA, reason), APN_DELAY_MILLIS); 1187767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1188767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1189767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1191767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onDisconnectDone(AsyncResult ar) { 1192767a662ecde33c3979bf02b793d392aca0403162Wink Saville String reason = null; 1193767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(DBG) log("EVENT_DISCONNECT_DONE"); 1194767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (ar.userObj instanceof String) { 1195767a662ecde33c3979bf02b793d392aca0403162Wink Saville reason = (String) ar.userObj; 1196767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1197767a662ecde33c3979bf02b793d392aca0403162Wink Saville setState(State.IDLE); 1198767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.notifyDataConnection(reason); 1199767a662ecde33c3979bf02b793d392aca0403162Wink Saville mActiveApn = null; 1200767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (retryAfterDisconnected(reason)) { 1201767a662ecde33c3979bf02b793d392aca0403162Wink Saville trySetupData(reason); 1202767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1203767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1205767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onPollPdp() { 1206767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state == State.CONNECTED) { 1207767a662ecde33c3979bf02b793d392aca0403162Wink Saville // only poll when connected 1208767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.mCM.getPDPContextList(this.obtainMessage(EVENT_GET_PDP_LIST_COMPLETE)); 1209767a662ecde33c3979bf02b793d392aca0403162Wink Saville sendMessageDelayed(obtainMessage(EVENT_POLL_PDP), POLL_PDP_MILLIS); 1210767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1211767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1213767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onVoiceCallStarted() { 1214e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh if (state == State.CONNECTED && ! mGsmPhone.mSST.isConcurrentVoiceAndData()) { 1215767a662ecde33c3979bf02b793d392aca0403162Wink Saville stopNetStatPoll(); 1216767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.notifyDataConnection(Phone.REASON_VOICE_CALL_STARTED); 1217767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1218767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1220767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onVoiceCallEnded() { 1221767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state == State.CONNECTED) { 122234267f7e17214d182c0858f14a961aab0598093fJaikumar Ganesh if (!mGsmPhone.mSST.isConcurrentVoiceAndData()) { 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startNetStatPoll(); 1224767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED); 1225767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1226767a662ecde33c3979bf02b793d392aca0403162Wink Saville // clean slate after call end. 1227767a662ecde33c3979bf02b793d392aca0403162Wink Saville resetPollStats(); 1228767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1229767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1230bbf7c00e06c0f6f39e26f7fdedbc7105b2f5c415Jaikumar Ganesh // reset reconnect timer 12313918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 1232e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = false; 1233767a662ecde33c3979bf02b793d392aca0403162Wink Saville // in case data setup was attempted when we were on a voice call 1234767a662ecde33c3979bf02b793d392aca0403162Wink Saville trySetupData(Phone.REASON_VOICE_CALL_ENDED); 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12389c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh protected void onCleanUpConnection(boolean tearDown, String reason) { 12399c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh cleanUpConnection(tearDown, reason); 12409c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh } 12419c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Based on the sim operator numeric, create a list for all possible pdps 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with all apns associated with that pdp 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void createAllApnList() { 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allApns = new ArrayList<ApnSetting>(); 1250e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh String operator = mGsmPhone.mSIMRecords.getSIMOperatorNumeric(); 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (operator != null) { 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String selection = "numeric = '" + operator + "'"; 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = phone.getContext().getContentResolver().query( 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Telephony.Carriers.CONTENT_URI, null, selection, null, null); 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor != null) { 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.getCount() > 0) { 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allApns = createApnList(cursor); 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Figure out where this fits in. This basically just 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // writes the pap-secrets file. No longer tied to PdpConnection 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // object. Not used on current platform (no ppp). 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //PdpConnection pdp = pdpList.get(pdp_name); 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //if (pdp != null && pdp.dataLink != null) { 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pdp.dataLink.setPasswordInfo(cursor); 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //} 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (allApns.isEmpty()) { 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("No APN found for carrier: " + operator); 12751d4613c1ec6ddf8aec3f723a7cab4253d19f9e66John Huang preferredApn = null; 127659cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh notifyNoData(PdpConnection.FailCause.MISSING_UKNOWN_APN); 12779587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } else { 12789587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang preferredApn = getPreferredApn(); 12799587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang Log.d(LOG_TAG, "Get PreferredAPN"); 12809587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (preferredApn != null && !preferredApn.numeric.equals(operator)) { 12819587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang preferredApn = null; 12829587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang setPreferredApn(-1); 12839587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void createAllPdpList() { 1288767a662ecde33c3979bf02b793d392aca0403162Wink Saville pdpList = new ArrayList<DataConnection>(); 1289767a662ecde33c3979bf02b793d392aca0403162Wink Saville DataConnection pdp; 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < PDP_CONNECTION_POOL_SIZE; i++) { 1292e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh pdp = new PdpConnection(mGsmPhone); 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pdpList.add(pdp); 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1297767a662ecde33c3979bf02b793d392aca0403162Wink Saville private void destroyAllPdpList() { 1298767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(pdpList != null) { 1299767a662ecde33c3979bf02b793d392aca0403162Wink Saville PdpConnection pdp; 1300767a662ecde33c3979bf02b793d392aca0403162Wink Saville pdpList.removeAll(pdpList); 1301767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1302767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1303767a662ecde33c3979bf02b793d392aca0403162Wink Saville 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return waitingApns list to be used to create PDP 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error when waitingApns.isEmpty() 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<ApnSetting> buildWaitingApns() { 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<ApnSetting> apnList = new ArrayList<ApnSetting>(); 1311e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh String operator = mGsmPhone.mSIMRecords.getSIMOperatorNumeric(); 13129587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 13139587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (mRequestedApnType.equals(Phone.APN_TYPE_DEFAULT)) { 13149587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (canSetPreferApn && preferredApn != null) { 13159587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang Log.i(LOG_TAG, "Preferred APN:" + operator + ":" 13169587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang + preferredApn.numeric + ":" + preferredApn); 13179587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (preferredApn.numeric.equals(operator)) { 13189587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang Log.i(LOG_TAG, "Waiting APN set to preferred APN"); 13199587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang apnList.add(preferredApn); 13209587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang return apnList; 13219587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } else { 13229587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang setPreferredApn(-1); 13239587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang preferredApn = null; 13249587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13259587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13269587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (allApns != null) { 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (ApnSetting apn : allApns) { 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (apn.canHandleType(mRequestedApnType)) { 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apnList.add(apn); 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return apnList; 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get next apn in waitingApns 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the first apn found in waitingApns, null if none 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ApnSetting getNextApn() { 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<ApnSetting> list = waitingApns; 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApnSetting apn = null; 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (list != null) { 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!list.isEmpty()) { 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apn = list.get(0); 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return apn; 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String apnListToString (ArrayList<ApnSetting> apns) { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder result = new StringBuilder(); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, size = apns.size(); i < size; i++) { 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result.append('[') 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .append(apns.get(i).toString()) 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .append(']'); 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result.toString(); 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1364767a662ecde33c3979bf02b793d392aca0403162Wink Saville private void startDelayedRetry(PdpConnection.FailCause cause, String reason) { 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyNoData(cause); 136689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt reconnectAfterFail(cause, reason); 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13689587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 13699587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang private void setPreferredApn(int pos) { 13709587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (!canSetPreferApn) { 13719587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang return; 13729587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13739587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 13749587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang ContentResolver resolver = phone.getContext().getContentResolver(); 13759587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang resolver.delete(PREFERAPN_URI, null, null); 13769587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 13779c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh if (pos >= 0) { 13789587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang ContentValues values = new ContentValues(); 13799587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang values.put(APN_ID, pos); 13809587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang resolver.insert(PREFERAPN_URI, values); 13819587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13829587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13839587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 13849587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang private ApnSetting getPreferredApn() { 13859587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (allApns.isEmpty()) { 13869587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang return null; 13879587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13889587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 13899587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang Cursor cursor = phone.getContext().getContentResolver().query( 13909c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh PREFERAPN_URI, new String[] { "_id", "name", "apn" }, 13919587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang null, null, Telephony.Carriers.DEFAULT_SORT_ORDER); 13929587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 13939587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (cursor != null) { 13949587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang canSetPreferApn = true; 13959587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } else { 13969587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang canSetPreferApn = false; 13979587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13989587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 13999587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (canSetPreferApn && cursor.getCount() > 0) { 14009587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang int pos; 14019587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang cursor.moveToFirst(); 14029587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang pos = cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers._ID)); 14039587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang for(ApnSetting p:allApns) { 14041d4613c1ec6ddf8aec3f723a7cab4253d19f9e66John Huang if (p.id == pos && p.canHandleType(mRequestedApnType)) { 14059587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang cursor.close(); 14069587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang return p; 14079587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14089587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14099587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14109587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14119587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (cursor != null) { 14129587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang cursor.close(); 14139587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14149587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14159587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang return null; 14169587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 1417767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1418767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void handleMessage (Message msg) { 141942acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt if (DBG) Log.d(LOG_TAG,"GSMDataConnTrack handleMessage "+msg); 1420767a662ecde33c3979bf02b793d392aca0403162Wink Saville switch (msg.what) { 1421767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_RECORDS_LOADED: 1422767a662ecde33c3979bf02b793d392aca0403162Wink Saville onRecordsLoaded(); 1423767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1424767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1425767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_GPRS_DETACHED: 1426767a662ecde33c3979bf02b793d392aca0403162Wink Saville onGprsDetached(); 1427767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1428767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1429767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_GPRS_ATTACHED: 1430767a662ecde33c3979bf02b793d392aca0403162Wink Saville onGprsAttached(); 1431767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1432767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1433767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_DATA_STATE_CHANGED: 1434767a662ecde33c3979bf02b793d392aca0403162Wink Saville onPdpStateChanged((AsyncResult) msg.obj, false); 1435767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1436767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1437767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_GET_PDP_LIST_COMPLETE: 1438767a662ecde33c3979bf02b793d392aca0403162Wink Saville onPdpStateChanged((AsyncResult) msg.obj, true); 1439767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1440767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1441767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_POLL_PDP: 1442767a662ecde33c3979bf02b793d392aca0403162Wink Saville onPollPdp(); 1443767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1444767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1445767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_START_NETSTAT_POLL: 1446767a662ecde33c3979bf02b793d392aca0403162Wink Saville mPingTestActive = false; 1447767a662ecde33c3979bf02b793d392aca0403162Wink Saville startNetStatPoll(); 1448767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1449767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1450767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_START_RECOVERY: 1451767a662ecde33c3979bf02b793d392aca0403162Wink Saville mPingTestActive = false; 1452767a662ecde33c3979bf02b793d392aca0403162Wink Saville doRecovery(); 1453767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1454767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1455767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_APN_CHANGED: 1456767a662ecde33c3979bf02b793d392aca0403162Wink Saville onApnChanged(); 1457767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1458767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1459767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_PS_RESTRICT_ENABLED: 1460767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 1461767a662ecde33c3979bf02b793d392aca0403162Wink Saville * We don't need to explicitly to tear down the PDP context 1462767a662ecde33c3979bf02b793d392aca0403162Wink Saville * when PS restricted is enabled. The base band will deactive 1463767a662ecde33c3979bf02b793d392aca0403162Wink Saville * PDP context and notify us with PDP_CONTEXT_CHANGED. 1464767a662ecde33c3979bf02b793d392aca0403162Wink Saville * But we should stop the network polling and prevent reset PDP. 1465767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 14669c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh Log.d(LOG_TAG, "[DSAC DEB] " + "EVENT_PS_RESTRICT_ENABLED " + mIsPsRestricted); 1467767a662ecde33c3979bf02b793d392aca0403162Wink Saville stopNetStatPoll(); 14689c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh mIsPsRestricted = true; 1469767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1470767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1471767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_PS_RESTRICT_DISABLED: 1472767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 1473767a662ecde33c3979bf02b793d392aca0403162Wink Saville * When PS restrict is removed, we need setup PDP connection if 1474767a662ecde33c3979bf02b793d392aca0403162Wink Saville * PDP connection is down. 1475767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 1476767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.d(LOG_TAG, "[DSAC DEB] " + "EVENT_PS_RESTRICT_DISABLED " + mIsPsRestricted); 1477767a662ecde33c3979bf02b793d392aca0403162Wink Saville mIsPsRestricted = false; 1478767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state == State.CONNECTED) { 1479767a662ecde33c3979bf02b793d392aca0403162Wink Saville startNetStatPoll(); 1480767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1481767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state == State.FAILED) { 1482767a662ecde33c3979bf02b793d392aca0403162Wink Saville cleanUpConnection(false, Phone.REASON_PS_RESTRICT_ENABLED); 14833918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 1484e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = false; 1485767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1486767a662ecde33c3979bf02b793d392aca0403162Wink Saville trySetupData(Phone.REASON_PS_RESTRICT_ENABLED); 1487767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1488767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1489767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1490767a662ecde33c3979bf02b793d392aca0403162Wink Saville default: 1491767a662ecde33c3979bf02b793d392aca0403162Wink Saville // handle the message in the super class DataConnectionTracker 1492767a662ecde33c3979bf02b793d392aca0403162Wink Saville super.handleMessage(msg); 1493767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1494767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1495767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1496767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1497767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void log(String s) { 1498767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.d(LOG_TAG, "[GsmDataConnectionTracker] " + s); 1499767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1500767a662ecde33c3979bf02b793d392aca0403162Wink Saville 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1502