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; 30c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwaltimport android.net.ConnectivityManager; 31c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwaltimport android.net.IConnectivityManager; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.NetworkInfo; 332b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnorimport android.net.TrafficStats; 349587f8696aa8a2bb6db4f3203a842e06170b62c3John Huangimport android.net.Uri; 359c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganeshimport android.net.wifi.WifiManager; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.AsyncResult; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.preference.PreferenceManager; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Telephony; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.ServiceState; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.gsm.GsmCellLocation; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5177b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwaltimport com.android.internal.R; 52e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport com.android.internal.telephony.DataCallState; 53767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.DataConnection; 54767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.DataConnectionTracker; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.Phone; 563918e13b24d4e7ad410089eb615721ca026bec01Wink Savilleimport com.android.internal.telephony.RetryManager; 5718e939623556928f73fcc7511c85a537929a4a7eDan Egnorimport com.android.internal.telephony.EventLogTags; 589c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganeshimport com.android.internal.telephony.DataConnection.FailCause; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 66767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic final class GsmDataConnectionTracker extends DataConnectionTracker { 6725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected final String LOG_TAG = "GSM"; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh private GSMPhone mGsmPhone; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handles changes to the APN db. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ApnChangeObserver extends ContentObserver { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ApnChangeObserver () { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(mDataConnectionTracker); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChange(boolean selfChange) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessage(obtainMessage(EVENT_APN_CHANGED)); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Instance Variables 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 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; 118a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville private int waitingApnsPermanentFailureCountDown = 0; 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 12902722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville /** Currently active DataConnection */ 13002722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville private GsmDataConnection 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 /** 14002722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville * Pool size of DataConnection 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 153390de220248d05ccb9dc10a197700ad3c1595937Jake Hamby // for tracking retries on the default APN 15489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt private RetryManager mDefaultRetryManager; 155390de220248d05ccb9dc10a197700ad3c1595937Jake Hamby // for tracking retries 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) { 192390de220248d05ccb9dc10a197700ad3c1595937Jake Hamby // when wifi got disabled, the NETWORK_STATE_CHANGED_ACTION 193390de220248d05ccb9dc10a197700ad3c1595937Jake Hamby // quit and won't report disconnected til next enabling. 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 IntentFilter filter = new IntentFilter(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(INTENT_RECONNECT_ALARM); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(Intent.ACTION_SCREEN_ON); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(Intent.ACTION_SCREEN_OFF); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 228a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville // TODO: Why is this registering the phone as the receiver of the intent 229a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville // and not its own handler? 230a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville p.getContext().registerReceiver(mIntentReceiver, filter, null, p); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionTracker = this; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResolver = phone.getContext().getContentResolver(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apnObserver = new ApnChangeObserver(); 237767a662ecde33c3979bf02b793d392aca0403162Wink Saville p.getContext().getContentResolver().registerContentObserver( 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Telephony.Carriers.CONTENT_URI, true, apnObserver); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createAllPdpList(); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This preference tells us 1) initial condition for "dataEnabled", 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and 2) whether the RIL will setup the baseband to auto-PS attach. 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(phone.getContext()); 245c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwalt boolean dataEnabledSetting = true; 246c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwalt try { 247c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwalt dataEnabledSetting = IConnectivityManager.Stub.asInterface(ServiceManager. 248c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwalt getService(Context.CONNECTIVITY_SERVICE)).getMobileDataEnabled(); 249c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwalt } catch (Exception e) { 250c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwalt // nothing to do - use the old behavior and leave data on 251c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwalt } 252c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwalt dataEnabled[APN_DEFAULT_ID] = !sp.getBoolean(GSMPhone.DATA_DISABLED_ON_BOOT_KEY, false) && 253c03fa5014912684367174ff3cce664deb29f5e0eRobert Greenwalt dataEnabledSetting; 25442acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt if (dataEnabled[APN_DEFAULT_ID]) { 25542acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt enabledCount++; 25642acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project noAutoAttach = !dataEnabled[APN_DEFAULT_ID]; 2583918e13b24d4e7ad410089eb615721ca026bec01Wink Saville 2593918e13b24d4e7ad410089eb615721ca026bec01Wink Saville if (!mRetryMgr.configure(SystemProperties.get("ro.gsm.data_retry_config"))) { 2603918e13b24d4e7ad410089eb615721ca026bec01Wink Saville if (!mRetryMgr.configure(DEFAULT_DATA_RETRY_CONFIG)) { 2613918e13b24d4e7ad410089eb615721ca026bec01Wink Saville // Should never happen, log an error and default to a simple linear sequence. 2623918e13b24d4e7ad410089eb615721ca026bec01Wink Saville Log.e(LOG_TAG, "Could not configure using DEFAULT_DATA_RETRY_CONFIG=" 2633918e13b24d4e7ad410089eb615721ca026bec01Wink Saville + DEFAULT_DATA_RETRY_CONFIG); 2643918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.configure(20, 2000, 1000); 2653918e13b24d4e7ad410089eb615721ca026bec01Wink Saville } 2663918e13b24d4e7ad410089eb615721ca026bec01Wink Saville } 26789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 26889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mDefaultRetryManager = mRetryMgr; 26989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mSecondaryRetryManager = new RetryManager(); 27089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 27189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (!mSecondaryRetryManager.configure(SystemProperties.get( 27289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt "ro.gsm.2nd_data_retry_config"))) { 27389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (!mSecondaryRetryManager.configure(SECONDARY_DATA_RETRY_CONFIG)) { 27489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt // Should never happen, log an error and default to a simple sequence. 27589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt Log.e(LOG_TAG, "Could note configure using SECONDARY_DATA_RETRY_CONFIG=" 27689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt + SECONDARY_DATA_RETRY_CONFIG); 27789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mSecondaryRetryManager.configure("max_retries=3, 333, 333, 333"); 27889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 27989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 282767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void dispose() { 283767a662ecde33c3979bf02b793d392aca0403162Wink Saville //Unregister for all events 284767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.mCM.unregisterForAvailable(this); 285767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.mCM.unregisterForOffOrNotAvailable(this); 286e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSIMRecords.unregisterForRecordsLoaded(this); 287767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.mCM.unregisterForDataStateChanged(this); 288e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mCT.unregisterForVoiceCallEnded(this); 289e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mCT.unregisterForVoiceCallStarted(this); 290e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForGprsAttached(this); 291e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForGprsDetached(this); 292e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForRoamingOn(this); 293e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForRoamingOff(this); 294e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForPsRestrictedEnabled(this); 295e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.unregisterForPsRestrictedDisabled(this); 2969c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 297767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.getContext().unregisterReceiver(this.mIntentReceiver); 298767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.getContext().getContentResolver().unregisterContentObserver(this.apnObserver); 299767a662ecde33c3979bf02b793d392aca0403162Wink Saville 300767a662ecde33c3979bf02b793d392aca0403162Wink Saville destroyAllPdpList(); 301767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 302767a662ecde33c3979bf02b793d392aca0403162Wink Saville 303767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void finalize() { 304767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(DBG) Log.d(LOG_TAG, "GsmDataConnectionTracker finalized"); 305767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 306767a662ecde33c3979bf02b793d392aca0403162Wink Saville 30725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected void setState(State s) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log ("setState: " + s); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state != s) { 31018e939623556928f73fcc7511c85a537929a4a7eDan Egnor EventLog.writeEvent(EventLogTags.GSM_DATA_STATE_CHANGE, state.toString(), s.toString()); 31118e939623556928f73fcc7511c85a537929a4a7eDan Egnor state = s; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.FAILED) { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (waitingApns != null) 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project waitingApns.clear(); // when teardown the connection and set to IDLE 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt public String[] getActiveApnTypes() { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] result; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActiveApn != null) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = mActiveApn.types; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = new String[1]; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result[0] = Phone.APN_TYPE_DEFAULT; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 331767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String getActiveApnString() { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String result = null; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActiveApn != null) { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = mActiveApn.apn; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The data connection is expected to be setup while device 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1. has sim card 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2. registered to gprs service 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3. user doesn't explicitly disable data service 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4. wifi is not on 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return false while no data connection if all above requirements are met. 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 348767a662ecde33c3979bf02b793d392aca0403162Wink Saville public boolean isDataConnectionAsDesired() { 34937b80ee451a7404c288738255725f78a5af02130John Wang boolean roaming = phone.getServiceState().getRoaming(); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 351e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh if (mGsmPhone.mSIMRecords.getRecordsLoaded() && 352e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.getCurrentGprsState() == ServiceState.STATE_IN_SERVICE && 353767a662ecde33c3979bf02b793d392aca0403162Wink Saville (!roaming || getDataOnRoamingEnabled()) && 3549c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh !mIsWifiConnected && 3554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project !mIsPsRestricted ) { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (state == State.CONNECTED); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt @Override 36225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected boolean isApnTypeActive(String type) { 36325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt // TODO: support simultaneous with List instead 3644c89b14db431dc1c9c2c8d8f14b88f991a29ab62Robert Greenwalt if (Phone.APN_TYPE_DUN.equals(type)) { 3654c89b14db431dc1c9c2c8d8f14b88f991a29ab62Robert Greenwalt ApnSetting dunApn = fetchDunApn(); 3664c89b14db431dc1c9c2c8d8f14b88f991a29ab62Robert Greenwalt if (dunApn != null) { 3674c89b14db431dc1c9c2c8d8f14b88f991a29ab62Robert Greenwalt return ((mActiveApn != null) && (dunApn.toString().equals(mActiveApn.toString()))); 3684c89b14db431dc1c9c2c8d8f14b88f991a29ab62Robert Greenwalt } 3694c89b14db431dc1c9c2c8d8f14b88f991a29ab62Robert Greenwalt } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActiveApn != null && mActiveApn.canHandleType(type); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt @Override 37425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected boolean isApnTypeAvailable(String type) { 37577b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt if (type.equals(Phone.APN_TYPE_DUN)) { 37677b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt return (fetchDunApn() != null); 37777b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt } 37877b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (allApns != null) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (ApnSetting apn : allApns) { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (apn.canHandleType(type)) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 39002722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville * Formerly this method was ArrayList<GsmDataConnection> getAllPdps() 391767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 392767a662ecde33c3979bf02b793d392aca0403162Wink Saville public ArrayList<DataConnection> getAllDataConnections() { 393767a662ecde33c3979bf02b793d392aca0403162Wink Saville ArrayList<DataConnection> pdps = (ArrayList<DataConnection>)pdpList.clone(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pdps; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean isDataAllowed() { 39837b80ee451a7404c288738255725f78a5af02130John Wang boolean roaming = phone.getServiceState().getRoaming(); 399984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt return getAnyDataEnabled() && (!roaming || getDataOnRoamingEnabled()) && 400984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt mMasterDataEnabled; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //****** Called from ServiceStateTracker 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Invoked when ServiceStateTracker observes a transition from GPRS 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attach to detach. 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 408767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onGprsDetached() { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We presently believe it is unnecessary to tear down the PDP context 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when GPRS detaches, but we should stop the network polling. 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopNetStatPoll(); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(Phone.REASON_GPRS_DETACHED); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void onGprsAttached() { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.CONNECTED) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startNetStatPoll(); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(Phone.REASON_GPRS_ATTACHED); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.FAILED) { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cleanUpConnection(false, Phone.REASON_GPRS_ATTACHED); 4243918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project trySetupData(Phone.REASON_GPRS_ATTACHED); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 430767a662ecde33c3979bf02b793d392aca0403162Wink Saville private boolean trySetupData(String reason) { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("***trySetupData due to " + (reason == null ? "(unspecified)" : reason)); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project Log.d(LOG_TAG, "[DSAC DEB] " + "trySetupData with mIsPsRestricted=" + mIsPsRestricted); 4349c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (phone.getSimulatedRadioControl() != null) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Assume data is connected on the simulator 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME this can be improved 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setState(State.CONNECTED); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(reason); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(LOG_TAG, "(fix?) We're on the simulator; assuming data is connected"); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 445e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh int gprsState = mGsmPhone.mSST.getCurrentGprsState(); 446e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh boolean desiredPowerState = mGsmPhone.mSST.getDesiredPowerState(); 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((state == State.IDLE || state == State.SCANNING) 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (gprsState == ServiceState.STATE_IN_SERVICE || noAutoAttach) 450e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh && mGsmPhone.mSIMRecords.getRecordsLoaded() 451faf4413dffdc9079683b951736088ff2a01073a4jsh && phone.getState() == Phone.State.IDLE 4524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project && isDataAllowed() 453cf2119a9755d9e2713ce78e84d0826d430a11a62Jaikumar Ganesh && !mIsPsRestricted 454cf2119a9755d9e2713ce78e84d0826d430a11a62Jaikumar Ganesh && desiredPowerState ) { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.IDLE) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project waitingApns = buildWaitingApns(); 458a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville waitingApnsPermanentFailureCountDown = waitingApns.size(); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (waitingApns.isEmpty()) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("No APN found"); 4613aecdb9d7e92b1a91860600feefb5c0062b652cfThe Android Open Source Project notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log ("Create from allApns : " + apnListToString(allApns)); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) { 46942acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt log ("Setup waitngApns : " + apnListToString(waitingApns)); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return setupData(reason); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("trySetupData: Not ready for data: " + 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " dataState=" + state + 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " gprsState=" + gprsState + 477e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh " sim=" + mGsmPhone.mSIMRecords.getRecordsLoaded() + 478e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh " UMTS=" + mGsmPhone.mSST.isConcurrentVoiceAndData() + 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " phoneState=" + phone.getState() + 48042acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt " isDataAllowed=" + isDataAllowed() + 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " dataEnabled=" + getAnyDataEnabled() + 48237b80ee451a7404c288738255725f78a5af02130John Wang " roaming=" + phone.getServiceState().getRoaming() + 4834df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project " dataOnRoamingEnable=" + getDataOnRoamingEnabled() + 484cf2119a9755d9e2713ce78e84d0826d430a11a62Jaikumar Ganesh " ps restricted=" + mIsPsRestricted + 485984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt " desiredPowerState=" + desiredPowerState + 486984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt " MasterDataEnabled=" + mMasterDataEnabled); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If tearDown is true, this only tears down a CONNECTED session. Presently, 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there is no mechanism for abandoning an INITING/CONNECTING session, 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but would likely involve cancelling pending async requests or 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setting a flag or new state to ignore them when they came in 49602722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville * @param tearDown true if the underlying GsmDataConnection should be 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disconnected. 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param reason reason for the clean up. 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void cleanUpConnection(boolean tearDown, String reason) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("Clean up connection due to " + reason); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Clear the reconnect alarm, if set. 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mReconnectIntent != null) { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AlarmManager am = 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (AlarmManager) phone.getContext().getSystemService(Context.ALARM_SERVICE); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am.cancel(mReconnectIntent); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReconnectIntent = null; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 511bbf7c00e06c0f6f39e26f7fdedbc7105b2f5c415Jaikumar Ganesh setState(State.DISCONNECTING); 512bbf7c00e06c0f6f39e26f7fdedbc7105b2f5c415Jaikumar Ganesh 51316dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville boolean notificationDeferred = false; 514767a662ecde33c3979bf02b793d392aca0403162Wink Saville for (DataConnection conn : pdpList) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tearDown) { 51616dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville if (DBG) log("cleanUpConnection: teardown, call conn.disconnect"); 51716dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville conn.disconnect(obtainMessage(EVENT_DISCONNECT_DONE, reason)); 518abeff9479fae6b0b92e56bd7bd9d043cdfd9317aWink Saville notificationDeferred = true; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 520abeff9479fae6b0b92e56bd7bd9d043cdfd9317aWink Saville if (DBG) log("cleanUpConnection: !tearDown, call conn.resetSynchronously"); 521abeff9479fae6b0b92e56bd7bd9d043cdfd9317aWink Saville conn.resetSynchronously(); 522abeff9479fae6b0b92e56bd7bd9d043cdfd9317aWink Saville notificationDeferred = false; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopNetStatPoll(); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52716dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville if (!notificationDeferred) { 528abeff9479fae6b0b92e56bd7bd9d043cdfd9317aWink Saville if (DBG) log("cleanupConnection: !notificationDeferred"); 52916dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville gotoIdleAndNotifyDataConnection(reason); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param types comma delimited list of APN types 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return array of APN types 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] parseTypes(String types) { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] result; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If unset, set to DEFAULT. 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (types == null || types.equals("")) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = new String[1]; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result[0] = Phone.APN_TYPE_ALL; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = types.split(","); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<ApnSetting> createApnList(Cursor cursor) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<ApnSetting> result = new ArrayList<ApnSetting>(); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] types = parseTypes( 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.TYPE))); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApnSetting apn = new ApnSetting( 5569587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers._ID)), 5579587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NUMERIC)), 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NAME)), 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.APN)), 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROXY)), 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PORT)), 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSC)), 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPROXY)), 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPORT)), 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)), 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)), 5672811f1625ebdb7f7483b8b866694474f89112d8cJaikumar Ganesh cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)), 5683c4e929cfdfe5573e1be3ee0331fc6029e45c382Lorenzo Colitti types, 5693c4e929cfdfe5573e1be3ee0331fc6029e45c382Lorenzo Colitti cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)), 5703c4e929cfdfe5573e1be3ee0331fc6029e45c382Lorenzo Colitti cursor.getString(cursor.getColumnIndexOrThrow( 5713c4e929cfdfe5573e1be3ee0331fc6029e45c382Lorenzo Colitti Telephony.Carriers.ROAMING_PROTOCOL))); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result.add(apn); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (cursor.moveToNext()); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57802722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville private GsmDataConnection findFreePdp() { 579767a662ecde33c3979bf02b793d392aca0403162Wink Saville for (DataConnection conn : pdpList) { 58002722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville GsmDataConnection pdp = (GsmDataConnection) conn; 58102722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville if (pdp.isInactive()) { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pdp; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean setupData(String reason) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApnSetting apn; 59002722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville GsmDataConnection pdp; 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apn = getNextApn(); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (apn == null) return false; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pdp = findFreePdp(); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pdp == null) { 59602722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville if (DBG) log("setupData: No free GsmDataConnection found!"); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActiveApn = apn; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivePdp = pdp; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = obtainMessage(); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.what = EVENT_DATA_SETUP_COMPLETE; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.obj = reason; 60502722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville pdp.connect(msg, apn); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setState(State.INITING); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(reason); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected String getInterfaceName(String apnType) { 613c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt if (mActivePdp != null && 614c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (apnType == null || 615c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivePdp.getInterface(); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 621767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String getIpAddress(String apnType) { 622c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt if (mActivePdp != null && 623c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (apnType == null || 624c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivePdp.getIpAddress(); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt public String getGateway(String apnType) { 631c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt if (mActivePdp != null && 632c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (apnType == null || 633c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivePdp.getGatewayAddress(); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected String[] getDnsServers(String apnType) { 640c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt if (mActivePdp != null && 641c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (apnType == null || 642c46c255f7f8aa3e70a607493c550ffb863666ef1Robert Greenwalt (mActiveApn != null && mActiveApn.canHandleType(apnType)))) { 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivePdp.getDnsServers(); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean 649e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville pdpStatesHasCID (ArrayList<DataCallState> states, int cid) { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, s = states.size() ; i < s ; i++) { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (states.get(i).cid == cid) return true; 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 private boolean 658e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville pdpStatesHasActiveCID (ArrayList<DataCallState> states, int cid) { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, s = states.size() ; i < s ; i++) { 660e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if ((states.get(i).cid == cid) && (states.get(i).active != 0)) { 661e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville return true; 662e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handles changes to the APN database. 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void onApnChanged() { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isConnected; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isConnected = (state != State.IDLE && state != State.FAILED); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The "current" may no longer be valid. MMS depends on this to send properly. 677e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.updateCurrentCarrierInProvider(); 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: It'd be nice to only do this if the changed entrie(s) 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // match the current operator. 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createAllApnList(); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state != State.DISCONNECTING) { 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cleanUpConnection(isConnected, Phone.REASON_APN_CHANGED); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isConnected) { 685bbf7c00e06c0f6f39e26f7fdedbc7105b2f5c415Jaikumar Ganesh // reset reconnect timer 6863918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 687e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = false; 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project trySetupData(Phone.REASON_APN_CHANGED); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param explicitPoll if true, indicates that *we* polled for this 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * update while state == CONNECTED rather than having it delivered 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * via an unsolicited response (which could have happened at any 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous state 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 699767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onPdpStateChanged (AsyncResult ar, boolean explicitPoll) { 700e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville ArrayList<DataCallState> pdpStates; 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 702e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville pdpStates = (ArrayList<DataCallState>)(ar.result); 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ar.exception != null) { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is probably "radio not available" or something 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of that sort. If so, the whole connection is going 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to come down soon anyway 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7113de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink if (state == State.CONNECTED) { 7123de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // The way things are supposed to work, the PDP list 7133de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // should not contain the CID after it disconnects. 7143de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // However, the way things really work, sometimes the PDP 7153de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // context is still listed with active = false, which 7163de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // makes it hard to distinguish an activating context from 7173de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // an activated-and-then deactivated one. 7183de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink if (!pdpStatesHasCID(pdpStates, cidActive)) { 7193de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // It looks like the PDP context has deactivated. 7203de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // Tear everything down and try to reconnect. 7213de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink 7223de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink Log.i(LOG_TAG, "PDP connection has dropped. Reconnecting"); 7233de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink 7243de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // Add an event log when the network drops PDP 7253de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation()); 72618e939623556928f73fcc7511c85a537929a4a7eDan Egnor EventLog.writeEvent(EventLogTags.PDP_NETWORK_DROP, 72762136d3e1c1262fc31a1f77f6d6acbd75e5ea81dDan Egnor loc != null ? loc.getCid() : -1, 7283de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink TelephonyManager.getDefault().getNetworkType()); 7293de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink 7303de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink cleanUpConnection(true, null); 7313de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink return; 7323de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink } else if (!pdpStatesHasActiveCID(pdpStates, cidActive)) { 7333de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // Here, we only consider this authoritative if we asked for the 7343de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // PDP list. If it was an unsolicited response, we poll again 7353de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink // to make sure everyone agrees on the initial state. 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!explicitPoll) { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We think it disconnected but aren't sure...poll from our side 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.mCM.getPDPContextList( 7403de6da1f9699da8f3d221444195fe599c4233998Tammo Spalink this.obtainMessage(EVENT_GET_PDP_LIST_COMPLETE)); 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(LOG_TAG, "PDP connection has dropped (active=false case). " 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Reconnecting"); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log the network drop on the event log. 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation()); 74718e939623556928f73fcc7511c85a537929a4a7eDan Egnor EventLog.writeEvent(EventLogTags.PDP_NETWORK_DROP, 74862136d3e1c1262fc31a1f77f6d6acbd75e5ea81dDan Egnor loc != null ? loc.getCid() : -1, 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TelephonyManager.getDefault().getNetworkType()); 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cleanUpConnection(true, null); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void notifyDefaultData(String reason) { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setState(State.CONNECTED); 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataConnection(reason); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startNetStatPoll(); 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // reset reconnect timer 7623918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 763e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = false; 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 76616dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville private void gotoIdleAndNotifyDataConnection(String reason) { 76716dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville if (DBG) log("gotoIdleAndNotifyDataConnection: reason=" + reason); 76816dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville setState(State.IDLE); 76916dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville phone.notifyDataConnection(reason); 77016dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville mActiveApn = null; 77116dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville } 77216dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a kludge to deal with the fact that 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the PDP state change notification doesn't always work 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with certain RIL impl's/basebands 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779767a662ecde33c3979bf02b793d392aca0403162Wink Saville private void startPeriodicPdpPoll() { 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeMessages(EVENT_POLL_PDP); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessageDelayed(obtainMessage(EVENT_POLL_PDP), POLL_PDP_MILLIS); 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void resetPollStats() { 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project txPkts = -1; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rxPkts = -1; 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv = 0; 789767a662ecde33c3979bf02b793d392aca0403162Wink Saville netStatPollPeriod = POLL_NETSTAT_MILLIS; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoRecvPollCount = 0; 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void doRecovery() { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.CONNECTED) { 795edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker int maxPdpReset = Settings.Secure.getInt(mResolver, 796edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker Settings.Secure.PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT, 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DEFAULT_MAX_PDP_RESET_FAIL); 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPdpResetCount < maxPdpReset) { 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPdpResetCount++; 80018e939623556928f73fcc7511c85a537929a4a7eDan Egnor EventLog.writeEvent(EventLogTags.PDP_RADIO_RESET, sentSinceLastRecv); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cleanUpConnection(true, Phone.REASON_PDP_RESET); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPdpResetCount = 0; 80418e939623556928f73fcc7511c85a537929a4a7eDan Egnor EventLog.writeEvent(EventLogTags.PDP_REREGISTER_NETWORK, sentSinceLastRecv); 805e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.reRegisterNetwork(null); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Add increasingly drastic recovery steps, eg, 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // reset the radio, reset the device. 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 812767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void startNetStatPoll() { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.CONNECTED && mPingTestActive == false && netStatPollEnabled == false) { 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "[DataConnection] Start poll NetStat"); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resetPollStats(); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project netStatPollEnabled = true; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPollNetStat.run(); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 821767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void stopNetStatPoll() { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project netStatPollEnabled = false; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeCallbacks(mPollNetStat); 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "[DataConnection] Stop poll NetStat"); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 827767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void restartRadio() { 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "************TURN OFF RADIO**************"); 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cleanUpConnection(true, Phone.REASON_RADIO_TURNED_OFF); 8303805c7ca324f232972c959e06253de4242f83607John Wang mGsmPhone.mSST.powerOffRadioSafely(); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Note: no need to call setRadioPower(true). Assuming the desired 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * radio power state is still ON (as tracked by ServiceStateTracker), 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ServiceStateTracker will call setRadioPower when it receives the 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * RADIO_STATE_CHANGED notification for the power off. And if the 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * desired power state has changed in the interim, we don't want to 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * override it with an unconditional power on. 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int reset = Integer.parseInt(SystemProperties.get("net.ppp.reset-by-timeout", "0")); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemProperties.set("net.ppp.reset-by-timeout", String.valueOf(reset+1)); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 843767a662ecde33c3979bf02b793d392aca0403162Wink Saville private Runnable mPollNetStat = new Runnable() 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long sent, received; 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long preTxPkts = -1, preRxPkts = -1; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity newActivity; 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preTxPkts = txPkts; 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preRxPkts = rxPkts; 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8552b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor txPkts = TrafficStats.getMobileTxPackets(); 8562b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor rxPkts = TrafficStats.getMobileRxPackets(); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.d(LOG_TAG, "rx " + String.valueOf(rxPkts) + " tx " + String.valueOf(txPkts)); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (netStatPollEnabled && (preTxPkts > 0 || preRxPkts > 0)) { 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sent = txPkts - preTxPkts; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project received = rxPkts - preRxPkts; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( sent > 0 && received > 0 ) { 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv = 0; 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = Activity.DATAINANDOUT; 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPdpResetCount = 0; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (sent > 0 && received == 0) { 869767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (phone.getState() == Phone.State.IDLE) { 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv += sent; 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv = 0; 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = Activity.DATAOUT; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (sent == 0 && received > 0) { 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv = 0; 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = Activity.DATAIN; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPdpResetCount = 0; 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (sent == 0 && received == 0) { 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = Activity.NONE; 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv = 0; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = Activity.NONE; 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity != newActivity && mIsScreenOn) { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project activity = newActivity; 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyDataActivity(); 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 892edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker int watchdogTrigger = Settings.Secure.getInt(mResolver, 893edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker Settings.Secure.PDP_WATCHDOG_TRIGGER_PACKET_COUNT, 894767a662ecde33c3979bf02b793d392aca0403162Wink Saville NUMBER_SENT_PACKETS_OF_HANG); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sentSinceLastRecv >= watchdogTrigger) { 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we already have NUMBER_SENT_PACKETS sent without ack 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNoRecvPollCount == 0) { 89918e939623556928f73fcc7511c85a537929a4a7eDan Egnor EventLog.writeEvent(EventLogTags.PDP_RADIO_RESET_COUNTDOWN_TRIGGERED, 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sentSinceLastRecv); 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 903edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker int noRecvPollLimit = Settings.Secure.getInt(mResolver, 904edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker Settings.Secure.PDP_WATCHDOG_ERROR_POLL_COUNT, NO_RECV_POLL_LIMIT); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNoRecvPollCount < noRecvPollLimit) { 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It's possible the PDP context went down and we weren't notified. 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start polling the context list in an attempt to recover. 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("no DATAIN in a while; polling PDP"); 910767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.mCM.getDataCallList(obtainMessage(EVENT_GET_PDP_LIST_COMPLETE)); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoRecvPollCount++; 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Slow down the poll interval to let things happen 915edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker netStatPollPeriod = Settings.Secure.getInt(mResolver, 916edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker Settings.Secure.PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS, 917767a662ecde33c3979bf02b793d392aca0403162Wink Saville POLL_NETSTAT_SLOW_MILLIS); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("Sent " + String.valueOf(sentSinceLastRecv) + 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " pkts since last received"); 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We've exceeded the threshold. Run ping test as a final check; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it will proceed with recovery if ping fails. 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopNetStatPoll(); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread pingTest = new Thread() { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runPingTest(); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPingTestActive = true; 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pingTest.start(); 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoRecvPollCount = 0; 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsScreenOn) { 935edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker netStatPollPeriod = Settings.Secure.getInt(mResolver, 936edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker Settings.Secure.PDP_WATCHDOG_POLL_INTERVAL_MS, POLL_NETSTAT_MILLIS); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 938edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker netStatPollPeriod = Settings.Secure.getInt(mResolver, 939edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker Settings.Secure.PDP_WATCHDOG_LONG_POLL_INTERVAL_MS, 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project POLL_NETSTAT_SCREEN_OFF_MILLIS); 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (netStatPollEnabled) { 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionTracker.postDelayed(this, netStatPollPeriod); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 9499c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runPingTest () { 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int status = -1; 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 953edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker String address = Settings.Secure.getString(mResolver, 954edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker Settings.Secure.PDP_WATCHDOG_PING_ADDRESS); 955edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker int deadline = Settings.Secure.getInt(mResolver, 956edc5189c33de03f3e2f5f73edc0e007992b933c9Doug Zongker Settings.Secure.PDP_WATCHDOG_PING_DEADLINE, DEFAULT_PING_DEADLINE); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("pinging " + address + " for " + deadline + "s"); 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (address != null && !NULL_IP.equals(address)) { 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Process p = Runtime.getRuntime() 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .exec("ping -c 1 -i 1 -w "+ deadline + " " + address); 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status = p.waitFor(); 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(LOG_TAG, "ping failed: IOException"); 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(LOG_TAG, "exception trying to ping"); 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status == 0) { 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ping succeeded. False alarm. Reset netStatPoll. 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ("-1" for this event indicates a false alarm) 97218e939623556928f73fcc7511c85a537929a4a7eDan Egnor EventLog.writeEvent(EventLogTags.PDP_RADIO_RESET, -1); 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPdpResetCount = 0; 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessage(obtainMessage(EVENT_START_NETSTAT_POLL)); 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ping failed. Proceed with recovery. 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessage(obtainMessage(EVENT_START_RECOVERY)); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the last fail cause is something that 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * seems like it deserves an error notification. 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Transient errors are ignored 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 98602722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville private boolean shouldPostNotification(GsmDataConnection.FailCause cause) { 98702722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville return (cause != GsmDataConnection.FailCause.UNKNOWN); 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if data connection need to be setup after disconnected due to 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reason. 9939c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh * 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param reason the reason why data is disconnected 9959c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh * @return true if try setup data connection is need for this reason 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean retryAfterDisconnected(String reason) { 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean retry = true; 9999c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 10006ce96faa0c8dc74ea6d1391aa54d9c6909810dc1Robert Greenwalt if ( Phone.REASON_RADIO_TURNED_OFF.equals(reason) ) { 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project retry = false; 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return retry; 10049c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh } 1005767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1006767a662ecde33c3979bf02b793d392aca0403162Wink Saville private void reconnectAfterFail(FailCause lastFailCauseCode, String reason) { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == State.FAILED) { 10083918e13b24d4e7ad410089eb615721ca026bec01Wink Saville if (!mRetryMgr.isRetryNeeded()) { 100989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (!mRequestedApnType.equals(Phone.APN_TYPE_DEFAULT)) { 101089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt // if no more retries on a secondary APN attempt, tell the world and revert. 101189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt phone.notifyDataConnection(Phone.REASON_APN_FAILED); 1012984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt onEnableApn(apnTypeToId(mRequestedApnType), DISABLED); 101389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt return; 101489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 1015e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh if (mReregisterOnReconnectFailure) { 10163918e13b24d4e7ad410089eb615721ca026bec01Wink Saville // We've re-registerd once now just retry forever. 10173918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.retryForeverUsingLastTimeout(); 1018e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh } else { 10193918e13b24d4e7ad410089eb615721ca026bec01Wink Saville // Try to re-register to the network. 1020e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh Log.d(LOG_TAG, "PDP activate failed, Reregistering to the network"); 1021e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = true; 1022e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mGsmPhone.mSST.reRegisterNetwork(null); 10233918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 1024e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh return; 1025e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh } 1026e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh } 10273918e13b24d4e7ad410089eb615721ca026bec01Wink Saville 10283918e13b24d4e7ad410089eb615721ca026bec01Wink Saville int nextReconnectDelay = mRetryMgr.getRetryTimer(); 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "PDP activate failed. Scheduling next attempt for " 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (nextReconnectDelay / 1000) + "s"); 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AlarmManager am = 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (AlarmManager) phone.getContext().getSystemService(Context.ALARM_SERVICE); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(INTENT_RECONNECT_ALARM); 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, reason); 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReconnectIntent = PendingIntent.getBroadcast( 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.getContext(), 0, intent, 0); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.elapsedRealtime() + nextReconnectDelay, 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReconnectIntent); 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10423918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.increaseRetryCount(); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!shouldPostNotification(lastFailCauseCode)) { 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG,"NOT Posting GPRS Unavailable notification " 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "-- likely transient error"); 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyNoData(lastFailCauseCode); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 105302722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville private void notifyNoData(GsmDataConnection.FailCause lastFailCauseCode) { 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setState(State.FAILED); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1057767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onRecordsLoaded() { 1058767a662ecde33c3979bf02b793d392aca0403162Wink Saville createAllApnList(); 1059767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state == State.FAILED) { 1060767a662ecde33c3979bf02b793d392aca0403162Wink Saville cleanUpConnection(false, null); 1061767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1062faf4413dffdc9079683b951736088ff2a01073a4jsh sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA, Phone.REASON_SIM_LOADED)); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 106589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt @Override 1066767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onEnableNewApn() { 106789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt // change our retry manager to use the appropriate numbers for the new APN 106889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (mRequestedApnType.equals(Phone.APN_TYPE_DEFAULT)) { 106989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mRetryMgr = mDefaultRetryManager; 107089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } else { 107189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mRetryMgr = mSecondaryRetryManager; 107289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 107389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mRetryMgr.resetRetryCount(); 107489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 1075767a662ecde33c3979bf02b793d392aca0403162Wink Saville // TODO: To support simultaneous PDP contexts, this should really only call 107602722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville // cleanUpConnection if it needs to free up a GsmDataConnection. 1077767a662ecde33c3979bf02b793d392aca0403162Wink Saville cleanUpConnection(true, Phone.REASON_APN_SWITCHED); 1078767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1080868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt protected boolean onTrySetupData(String reason) { 1081868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt return trySetupData(reason); 1082767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10848c6b883cd3c835df32cab4cbf395ebf648bb7d7eJohn Wang @Override 1085767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onRoamingOff() { 108637b80ee451a7404c288738255725f78a5af02130John Wang trySetupData(Phone.REASON_ROAMING_OFF); 1087767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10898c6b883cd3c835df32cab4cbf395ebf648bb7d7eJohn Wang @Override 1090767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onRoamingOn() { 109137b80ee451a7404c288738255725f78a5af02130John Wang if (getDataOnRoamingEnabled()) { 109237b80ee451a7404c288738255725f78a5af02130John Wang trySetupData(Phone.REASON_ROAMING_ON); 109337b80ee451a7404c288738255725f78a5af02130John Wang } else { 109437b80ee451a7404c288738255725f78a5af02130John Wang if (DBG) log("Tear down data connection on roaming."); 109537b80ee451a7404c288738255725f78a5af02130John Wang cleanUpConnection(true, Phone.REASON_ROAMING_ON); 1096767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1097767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onRadioAvailable() { 1100767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (phone.getSimulatedRadioControl() != null) { 1101767a662ecde33c3979bf02b793d392aca0403162Wink Saville // Assume data is connected on the simulator 1102767a662ecde33c3979bf02b793d392aca0403162Wink Saville // FIXME this can be improved 1103767a662ecde33c3979bf02b793d392aca0403162Wink Saville setState(State.CONNECTED); 1104767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.notifyDataConnection(null); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1106767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.i(LOG_TAG, "We're on the simulator; assuming data is connected"); 1107767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state != State.IDLE) { 1110767a662ecde33c3979bf02b793d392aca0403162Wink Saville cleanUpConnection(true, null); 1111767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1112767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1114767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onRadioOffOrNotAvailable() { 1115767a662ecde33c3979bf02b793d392aca0403162Wink Saville // Make sure our reconnect delay starts at the initial value 1116767a662ecde33c3979bf02b793d392aca0403162Wink Saville // next time the radio comes on 11173918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 1118e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = false; 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1120767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (phone.getSimulatedRadioControl() != null) { 1121767a662ecde33c3979bf02b793d392aca0403162Wink Saville // Assume data is connected on the simulator 1122767a662ecde33c3979bf02b793d392aca0403162Wink Saville // FIXME this can be improved 1123767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.i(LOG_TAG, "We're on the simulator; assuming radio off is meaningless"); 1124767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1125767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (DBG) log("Radio is off and clean up all connection"); 1126767a662ecde33c3979bf02b793d392aca0403162Wink Saville // TODO: Should we reset mRequestedApnType to "default"? 1127767a662ecde33c3979bf02b793d392aca0403162Wink Saville cleanUpConnection(false, Phone.REASON_RADIO_TURNED_OFF); 1128767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1129767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1131767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onDataSetupComplete(AsyncResult ar) { 1132767a662ecde33c3979bf02b793d392aca0403162Wink Saville String reason = null; 1133767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (ar.userObj instanceof String) { 1134767a662ecde33c3979bf02b793d392aca0403162Wink Saville reason = (String) ar.userObj; 1135767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1136767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1137767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (ar.exception == null) { 1138767a662ecde33c3979bf02b793d392aca0403162Wink Saville // everything is setup 1139767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (isApnTypeActive(Phone.APN_TYPE_DEFAULT)) { 1140767a662ecde33c3979bf02b793d392aca0403162Wink Saville SystemProperties.set("gsm.defaultpdpcontext.active", "true"); 11419587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (canSetPreferApn && preferredApn == null) { 1142390de220248d05ccb9dc10a197700ad3c1595937Jake Hamby Log.d(LOG_TAG, "PREFERRED APN is null"); 11439587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang preferredApn = mActiveApn; 11449587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang setPreferredApn(preferredApn.id); 11459587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 1146767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1147767a662ecde33c3979bf02b793d392aca0403162Wink Saville SystemProperties.set("gsm.defaultpdpcontext.active", "false"); 1148767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1149767a662ecde33c3979bf02b793d392aca0403162Wink Saville notifyDefaultData(reason); 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1151767a662ecde33c3979bf02b793d392aca0403162Wink Saville // TODO: For simultaneous PDP support, we need to build another 1152767a662ecde33c3979bf02b793d392aca0403162Wink Saville // trigger another TRY_SETUP_DATA for the next APN type. (Note 1153767a662ecde33c3979bf02b793d392aca0403162Wink Saville // that the existing connection may service that type, in which 1154767a662ecde33c3979bf02b793d392aca0403162Wink Saville // case we should try the next type, etc. 1155767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 115602722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville GsmDataConnection.FailCause cause; 115702722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville cause = (GsmDataConnection.FailCause) (ar.result); 1158767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(DBG) log("PDP setup failed " + cause); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log this failure to the Event Logs. 116059cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh if (cause.isEventLoggable()) { 1161767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmCellLocation loc = ((GsmCellLocation)phone.getCellLocation()); 116218e939623556928f73fcc7511c85a537929a4a7eDan Egnor EventLog.writeEvent(EventLogTags.PDP_SETUP_FAIL, 116362136d3e1c1262fc31a1f77f6d6acbd75e5ea81dDan Egnor cause.ordinal(), loc != null ? loc.getCid() : -1, 1164767a662ecde33c3979bf02b793d392aca0403162Wink Saville TelephonyManager.getDefault().getNetworkType()); 1165767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1167a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville // Count permanent failures and remove the APN we just tried 1168a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville waitingApnsPermanentFailureCountDown -= cause.isPermanentFail() ? 1 : 0; 116959cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh waitingApns.remove(0); 1170a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville if (DBG) log(String.format("onDataSetupComplete: waitingApns.size=%d" + 1171a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville " waitingApnsPermanenatFailureCountDown=%d", 1172a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville waitingApns.size(), waitingApnsPermanentFailureCountDown)); 1173a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville 1174a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville // See if there are more APN's to try 117559cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh if (waitingApns.isEmpty()) { 1176a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville if (waitingApnsPermanentFailureCountDown == 0) { 1177a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville if (DBG) log("onDataSetupComplete: Permanent failures stop retrying"); 1178a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville notifyNoData(cause); 1179a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville phone.notifyDataConnection(Phone.REASON_APN_FAILED); 1180a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville } else { 1181a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville if (DBG) log("onDataSetupComplete: Not all permanent failures, retry"); 1182a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville startDelayedRetry(cause, reason); 1183a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville } 118459cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh } else { 1185a20d02c2e1a13c8cfb1ed4ed2dff84a29080d4e4Wink Saville if (DBG) log("onDataSetupComplete: Try next APN"); 118659cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh setState(State.SCANNING); 118759cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh // Wait a bit before trying the next APN, so that 118859cbd7c86f8e17de10fccc9e4828d33db92555a9Jaikumar Ganesh // we're not tying up the RIL command channel 11893918e13b24d4e7ad410089eb615721ca026bec01Wink Saville sendMessageDelayed(obtainMessage(EVENT_TRY_SETUP_DATA, reason), APN_DELAY_MILLIS); 1190767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1191767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1192767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 119416dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville /** 119516dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville * Called when EVENT_DISCONNECT_DONE is received. 119616dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville */ 1197767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onDisconnectDone(AsyncResult ar) { 1198767a662ecde33c3979bf02b793d392aca0403162Wink Saville String reason = null; 1199767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(DBG) log("EVENT_DISCONNECT_DONE"); 1200767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (ar.userObj instanceof String) { 1201767a662ecde33c3979bf02b793d392aca0403162Wink Saville reason = (String) ar.userObj; 1202767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1203767a662ecde33c3979bf02b793d392aca0403162Wink Saville setState(State.IDLE); 1204767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.notifyDataConnection(reason); 1205767a662ecde33c3979bf02b793d392aca0403162Wink Saville mActiveApn = null; 1206767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (retryAfterDisconnected(reason)) { 1207767a662ecde33c3979bf02b793d392aca0403162Wink Saville trySetupData(reason); 1208767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1209767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 121116dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville /** 121216dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville * Called when EVENT_RESET_DONE is received. 121316dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville */ 121416dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville @Override 121516dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville protected void onResetDone(AsyncResult ar) { 121616dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville if (DBG) log("EVENT_RESET_DONE"); 121716dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville String reason = null; 121816dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville if (ar.userObj instanceof String) { 121916dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville reason = (String) ar.userObj; 122016dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville } 122116dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville gotoIdleAndNotifyDataConnection(reason); 122216dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville } 122316dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville 1224767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onPollPdp() { 1225767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state == State.CONNECTED) { 1226767a662ecde33c3979bf02b793d392aca0403162Wink Saville // only poll when connected 1227767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.mCM.getPDPContextList(this.obtainMessage(EVENT_GET_PDP_LIST_COMPLETE)); 1228767a662ecde33c3979bf02b793d392aca0403162Wink Saville sendMessageDelayed(obtainMessage(EVENT_POLL_PDP), POLL_PDP_MILLIS); 1229767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1230767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1232767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onVoiceCallStarted() { 1233e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh if (state == State.CONNECTED && ! mGsmPhone.mSST.isConcurrentVoiceAndData()) { 1234767a662ecde33c3979bf02b793d392aca0403162Wink Saville stopNetStatPoll(); 1235767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.notifyDataConnection(Phone.REASON_VOICE_CALL_STARTED); 1236767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1237767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void onVoiceCallEnded() { 1240767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state == State.CONNECTED) { 124134267f7e17214d182c0858f14a961aab0598093fJaikumar Ganesh if (!mGsmPhone.mSST.isConcurrentVoiceAndData()) { 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startNetStatPoll(); 1243767a662ecde33c3979bf02b793d392aca0403162Wink Saville phone.notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED); 1244767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1245767a662ecde33c3979bf02b793d392aca0403162Wink Saville // clean slate after call end. 1246767a662ecde33c3979bf02b793d392aca0403162Wink Saville resetPollStats(); 1247767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1248767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1249bbf7c00e06c0f6f39e26f7fdedbc7105b2f5c415Jaikumar Ganesh // reset reconnect timer 12503918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 1251e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = false; 1252767a662ecde33c3979bf02b793d392aca0403162Wink Saville // in case data setup was attempted when we were on a voice call 1253767a662ecde33c3979bf02b793d392aca0403162Wink Saville trySetupData(Phone.REASON_VOICE_CALL_ENDED); 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12579c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh protected void onCleanUpConnection(boolean tearDown, String reason) { 12589c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh cleanUpConnection(tearDown, reason); 12599c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh } 12609c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Based on the sim operator numeric, create a list for all possible pdps 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with all apns associated with that pdp 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void createAllApnList() { 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allApns = new ArrayList<ApnSetting>(); 1269e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh String operator = mGsmPhone.mSIMRecords.getSIMOperatorNumeric(); 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (operator != null) { 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String selection = "numeric = '" + operator + "'"; 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor = phone.getContext().getContentResolver().query( 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Telephony.Carriers.CONTENT_URI, null, selection, null, null); 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor != null) { 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.getCount() > 0) { 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allApns = createApnList(cursor); 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Figure out where this fits in. This basically just 128102722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville // writes the pap-secrets file. No longer tied to GsmDataConnection 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // object. Not used on current platform (no ppp). 128302722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville //GsmDataConnection pdp = pdpList.get(pdp_name); 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //if (pdp != null && pdp.dataLink != null) { 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pdp.dataLink.setPasswordInfo(cursor); 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //} 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (allApns.isEmpty()) { 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) log("No APN found for carrier: " + operator); 12941d4613c1ec6ddf8aec3f723a7cab4253d19f9e66John Huang preferredApn = null; 12953aecdb9d7e92b1a91860600feefb5c0062b652cfThe Android Open Source Project notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN); 12969587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } else { 12979587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang preferredApn = getPreferredApn(); 12989587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang Log.d(LOG_TAG, "Get PreferredAPN"); 12999587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (preferredApn != null && !preferredApn.numeric.equals(operator)) { 13009587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang preferredApn = null; 13019587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang setPreferredApn(-1); 13029587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void createAllPdpList() { 1307767a662ecde33c3979bf02b793d392aca0403162Wink Saville pdpList = new ArrayList<DataConnection>(); 1308767a662ecde33c3979bf02b793d392aca0403162Wink Saville DataConnection pdp; 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < PDP_CONNECTION_POOL_SIZE; i++) { 131102722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville pdp = GsmDataConnection.makeDataConnection(mGsmPhone); 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pdpList.add(pdp); 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1316767a662ecde33c3979bf02b793d392aca0403162Wink Saville private void destroyAllPdpList() { 1317767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(pdpList != null) { 131802722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville GsmDataConnection pdp; 1319767a662ecde33c3979bf02b793d392aca0403162Wink Saville pdpList.removeAll(pdpList); 1320767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1321767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1322767a662ecde33c3979bf02b793d392aca0403162Wink Saville 132377b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt private ApnSetting fetchDunApn() { 132477b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt Context c = phone.getContext(); 132577b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt String apnData = Settings.Secure.getString(c.getContentResolver(), 132677b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt Settings.Secure.TETHER_DUN_APN); 132777b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt ApnSetting dunSetting = ApnSetting.fromString(apnData); 132877b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt if (dunSetting != null) return dunSetting; 132977b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt 133077b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt apnData = c.getResources().getString(R.string.config_tether_apndata); 133177b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt return ApnSetting.fromString(apnData); 133277b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt } 133377b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return waitingApns list to be used to create PDP 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error when waitingApns.isEmpty() 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<ApnSetting> buildWaitingApns() { 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<ApnSetting> apnList = new ArrayList<ApnSetting>(); 134177b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt 134277b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt if (mRequestedApnType.equals(Phone.APN_TYPE_DUN)) { 134377b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt ApnSetting dun = fetchDunApn(); 134477b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt if (dun != null) apnList.add(dun); 134577b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt return apnList; 134677b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt } 134777b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt 1348e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh String operator = mGsmPhone.mSIMRecords.getSIMOperatorNumeric(); 13499587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 13509587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (mRequestedApnType.equals(Phone.APN_TYPE_DEFAULT)) { 13519587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (canSetPreferApn && preferredApn != null) { 13529587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang Log.i(LOG_TAG, "Preferred APN:" + operator + ":" 13539587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang + preferredApn.numeric + ":" + preferredApn); 13549587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (preferredApn.numeric.equals(operator)) { 13559587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang Log.i(LOG_TAG, "Waiting APN set to preferred APN"); 13569587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang apnList.add(preferredApn); 13579587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang return apnList; 13589587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } else { 13599587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang setPreferredApn(-1); 13609587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang preferredApn = null; 13619587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13629587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13639587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (allApns != null) { 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (ApnSetting apn : allApns) { 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (apn.canHandleType(mRequestedApnType)) { 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apnList.add(apn); 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return apnList; 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get next apn in waitingApns 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the first apn found in waitingApns, null if none 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ApnSetting getNextApn() { 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<ApnSetting> list = waitingApns; 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApnSetting apn = null; 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (list != null) { 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!list.isEmpty()) { 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apn = list.get(0); 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return apn; 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String apnListToString (ArrayList<ApnSetting> apns) { 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder result = new StringBuilder(); 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, size = apns.size(); i < size; i++) { 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result.append('[') 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .append(apns.get(i).toString()) 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .append(']'); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result.toString(); 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 140102722fbd77fa22f60ed3778b806b1e8f176b88c1Wink Saville private void startDelayedRetry(GsmDataConnection.FailCause cause, String reason) { 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyNoData(cause); 140389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt reconnectAfterFail(cause, reason); 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14059587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14069587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang private void setPreferredApn(int pos) { 14079587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (!canSetPreferApn) { 14089587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang return; 14099587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14109587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14119587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang ContentResolver resolver = phone.getContext().getContentResolver(); 14129587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang resolver.delete(PREFERAPN_URI, null, null); 14139587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14149c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh if (pos >= 0) { 14159587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang ContentValues values = new ContentValues(); 14169587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang values.put(APN_ID, pos); 14179587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang resolver.insert(PREFERAPN_URI, values); 14189587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14199587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14209587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14219587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang private ApnSetting getPreferredApn() { 14229587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (allApns.isEmpty()) { 14239587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang return null; 14249587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14259587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14269587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang Cursor cursor = phone.getContext().getContentResolver().query( 14279c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh PREFERAPN_URI, new String[] { "_id", "name", "apn" }, 14289587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang null, null, Telephony.Carriers.DEFAULT_SORT_ORDER); 14299587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14309587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (cursor != null) { 14319587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang canSetPreferApn = true; 14329587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } else { 14339587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang canSetPreferApn = false; 14349587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14359587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14369587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (canSetPreferApn && cursor.getCount() > 0) { 14379587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang int pos; 14389587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang cursor.moveToFirst(); 14399587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang pos = cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers._ID)); 14409587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang for(ApnSetting p:allApns) { 14411d4613c1ec6ddf8aec3f723a7cab4253d19f9e66John Huang if (p.id == pos && p.canHandleType(mRequestedApnType)) { 14429587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang cursor.close(); 14439587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang return p; 14449587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14459587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14469587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14479587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14489587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang if (cursor != null) { 14499587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang cursor.close(); 14509587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 14519587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang 14529587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang return null; 14539587f8696aa8a2bb6db4f3203a842e06170b62c3John Huang } 1454767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1455767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void handleMessage (Message msg) { 145642acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt if (DBG) Log.d(LOG_TAG,"GSMDataConnTrack handleMessage "+msg); 1457d7d6fb39470e212ce53b05fdc1c4dd8a724e9db7Wink Saville 1458d7d6fb39470e212ce53b05fdc1c4dd8a724e9db7Wink Saville if (!mGsmPhone.mIsTheCurrentActivePhone) { 1459d7d6fb39470e212ce53b05fdc1c4dd8a724e9db7Wink Saville Log.d(LOG_TAG, "Ignore GSM msgs since GSM phone is inactive"); 1460d7d6fb39470e212ce53b05fdc1c4dd8a724e9db7Wink Saville return; 1461d7d6fb39470e212ce53b05fdc1c4dd8a724e9db7Wink Saville } 1462d7d6fb39470e212ce53b05fdc1c4dd8a724e9db7Wink Saville 1463767a662ecde33c3979bf02b793d392aca0403162Wink Saville switch (msg.what) { 1464767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_RECORDS_LOADED: 1465767a662ecde33c3979bf02b793d392aca0403162Wink Saville onRecordsLoaded(); 1466767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1467767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1468767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_GPRS_DETACHED: 1469767a662ecde33c3979bf02b793d392aca0403162Wink Saville onGprsDetached(); 1470767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1471767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1472767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_GPRS_ATTACHED: 1473767a662ecde33c3979bf02b793d392aca0403162Wink Saville onGprsAttached(); 1474767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1475767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1476767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_DATA_STATE_CHANGED: 1477767a662ecde33c3979bf02b793d392aca0403162Wink Saville onPdpStateChanged((AsyncResult) msg.obj, false); 1478767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1479767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1480767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_GET_PDP_LIST_COMPLETE: 1481767a662ecde33c3979bf02b793d392aca0403162Wink Saville onPdpStateChanged((AsyncResult) msg.obj, true); 1482767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1483767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1484767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_POLL_PDP: 1485767a662ecde33c3979bf02b793d392aca0403162Wink Saville onPollPdp(); 1486767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1487767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1488767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_START_NETSTAT_POLL: 1489767a662ecde33c3979bf02b793d392aca0403162Wink Saville mPingTestActive = false; 1490767a662ecde33c3979bf02b793d392aca0403162Wink Saville startNetStatPoll(); 1491767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1492767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1493767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_START_RECOVERY: 1494767a662ecde33c3979bf02b793d392aca0403162Wink Saville mPingTestActive = false; 1495767a662ecde33c3979bf02b793d392aca0403162Wink Saville doRecovery(); 1496767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1497767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1498767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_APN_CHANGED: 1499767a662ecde33c3979bf02b793d392aca0403162Wink Saville onApnChanged(); 1500767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1501767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1502767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_PS_RESTRICT_ENABLED: 1503767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 1504767a662ecde33c3979bf02b793d392aca0403162Wink Saville * We don't need to explicitly to tear down the PDP context 1505767a662ecde33c3979bf02b793d392aca0403162Wink Saville * when PS restricted is enabled. The base band will deactive 1506767a662ecde33c3979bf02b793d392aca0403162Wink Saville * PDP context and notify us with PDP_CONTEXT_CHANGED. 1507767a662ecde33c3979bf02b793d392aca0403162Wink Saville * But we should stop the network polling and prevent reset PDP. 1508767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 15099c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh Log.d(LOG_TAG, "[DSAC DEB] " + "EVENT_PS_RESTRICT_ENABLED " + mIsPsRestricted); 1510767a662ecde33c3979bf02b793d392aca0403162Wink Saville stopNetStatPoll(); 15119c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh mIsPsRestricted = true; 1512767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1513767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1514767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_PS_RESTRICT_DISABLED: 1515767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 1516767a662ecde33c3979bf02b793d392aca0403162Wink Saville * When PS restrict is removed, we need setup PDP connection if 1517767a662ecde33c3979bf02b793d392aca0403162Wink Saville * PDP connection is down. 1518767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 1519767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.d(LOG_TAG, "[DSAC DEB] " + "EVENT_PS_RESTRICT_DISABLED " + mIsPsRestricted); 1520767a662ecde33c3979bf02b793d392aca0403162Wink Saville mIsPsRestricted = false; 1521767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state == State.CONNECTED) { 1522767a662ecde33c3979bf02b793d392aca0403162Wink Saville startNetStatPoll(); 1523767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 1524767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (state == State.FAILED) { 1525767a662ecde33c3979bf02b793d392aca0403162Wink Saville cleanUpConnection(false, Phone.REASON_PS_RESTRICT_ENABLED); 15263918e13b24d4e7ad410089eb615721ca026bec01Wink Saville mRetryMgr.resetRetryCount(); 1527e7e12b44bc37ba971507dde265bb999b63a580e8Jaikumar Ganesh mReregisterOnReconnectFailure = false; 1528767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1529767a662ecde33c3979bf02b793d392aca0403162Wink Saville trySetupData(Phone.REASON_PS_RESTRICT_ENABLED); 1530767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1531767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1532767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1533767a662ecde33c3979bf02b793d392aca0403162Wink Saville default: 1534767a662ecde33c3979bf02b793d392aca0403162Wink Saville // handle the message in the super class DataConnectionTracker 1535767a662ecde33c3979bf02b793d392aca0403162Wink Saville super.handleMessage(msg); 1536767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 1537767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1538767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1539767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1540767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void log(String s) { 1541767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.d(LOG_TAG, "[GsmDataConnectionTracker] " + s); 1542767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1544