1767a662ecde33c3979bf02b793d392aca0403162Wink Saville/* 2767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Copyright (C) 2006 The Android Open Source Project 3767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 4767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5767a662ecde33c3979bf02b793d392aca0403162Wink Saville * you may not use this file except in compliance with the License. 6767a662ecde33c3979bf02b793d392aca0403162Wink Saville * You may obtain a copy of the License at 7767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 8767a662ecde33c3979bf02b793d392aca0403162Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 9767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 10767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Unless required by applicable law or agreed to in writing, software 11767a662ecde33c3979bf02b793d392aca0403162Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12767a662ecde33c3979bf02b793d392aca0403162Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13767a662ecde33c3979bf02b793d392aca0403162Wink Saville * See the License for the specific language governing permissions and 14767a662ecde33c3979bf02b793d392aca0403162Wink Saville * limitations under the License. 15767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 16767a662ecde33c3979bf02b793d392aca0403162Wink Saville 17767a662ecde33c3979bf02b793d392aca0403162Wink Savillepackage com.android.internal.telephony; 18767a662ecde33c3979bf02b793d392aca0403162Wink Saville 19767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.app.PendingIntent; 20767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.AsyncResult; 21767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Handler; 22767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Message; 23767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.RemoteException; 24767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.provider.Settings; 25767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.provider.Settings.SettingNotFoundException; 2625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwaltimport android.text.TextUtils; 27767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.util.Log; 28767a662ecde33c3979bf02b793d392aca0403162Wink Saville 2925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwaltimport java.util.ArrayList; 3025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 31767a662ecde33c3979bf02b793d392aca0403162Wink Saville/** 32767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@hide} 33767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 34767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 35767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic abstract class DataConnectionTracker extends Handler { 36cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn protected static final boolean DBG = false; 3725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected final String LOG_TAG = "DataConnectionTracker"; 38767a662ecde33c3979bf02b793d392aca0403162Wink Saville 39767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 40767a662ecde33c3979bf02b793d392aca0403162Wink Saville * IDLE: ready to start data connection setup, default state 41767a662ecde33c3979bf02b793d392aca0403162Wink Saville * INITING: state of issued setupDefaultPDP() but not finish yet 42767a662ecde33c3979bf02b793d392aca0403162Wink Saville * CONNECTING: state of issued startPppd() but not finish yet 43767a662ecde33c3979bf02b793d392aca0403162Wink Saville * SCANNING: data connection fails with one apn but other apns are available 44767a662ecde33c3979bf02b793d392aca0403162Wink Saville * ready to start data connection on other apns (before INITING) 45767a662ecde33c3979bf02b793d392aca0403162Wink Saville * CONNECTED: IP connection is setup 46767a662ecde33c3979bf02b793d392aca0403162Wink Saville * DISCONNECTING: Connection.disconnect() has been called, but PDP 47767a662ecde33c3979bf02b793d392aca0403162Wink Saville * context is not yet deactivated 48767a662ecde33c3979bf02b793d392aca0403162Wink Saville * FAILED: data connection fail for all apns settings 49767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 50767a662ecde33c3979bf02b793d392aca0403162Wink Saville * getDataConnectionState() maps State to DataState 51767a662ecde33c3979bf02b793d392aca0403162Wink Saville * FAILED or IDLE : DISCONNECTED 52767a662ecde33c3979bf02b793d392aca0403162Wink Saville * INITING or CONNECTING or SCANNING: CONNECTING 53767a662ecde33c3979bf02b793d392aca0403162Wink Saville * CONNECTED : CONNECTED or DISCONNECTING 54767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 55767a662ecde33c3979bf02b793d392aca0403162Wink Saville public enum State { 56767a662ecde33c3979bf02b793d392aca0403162Wink Saville IDLE, 57767a662ecde33c3979bf02b793d392aca0403162Wink Saville INITING, 58767a662ecde33c3979bf02b793d392aca0403162Wink Saville CONNECTING, 59767a662ecde33c3979bf02b793d392aca0403162Wink Saville SCANNING, 60767a662ecde33c3979bf02b793d392aca0403162Wink Saville CONNECTED, 61767a662ecde33c3979bf02b793d392aca0403162Wink Saville DISCONNECTING, 62767a662ecde33c3979bf02b793d392aca0403162Wink Saville FAILED 63767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 64767a662ecde33c3979bf02b793d392aca0403162Wink Saville 65767a662ecde33c3979bf02b793d392aca0403162Wink Saville public enum Activity { 66767a662ecde33c3979bf02b793d392aca0403162Wink Saville NONE, 67767a662ecde33c3979bf02b793d392aca0403162Wink Saville DATAIN, 68767a662ecde33c3979bf02b793d392aca0403162Wink Saville DATAOUT, 69e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville DATAINANDOUT, 70e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville DORMANT 71767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 72767a662ecde33c3979bf02b793d392aca0403162Wink Saville 73868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt /***** Event Codes *****/ 74767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_DATA_SETUP_COMPLETE = 1; 75767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_RADIO_AVAILABLE = 3; 76767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_RECORDS_LOADED = 4; 77767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_TRY_SETUP_DATA = 5; 78767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_DATA_STATE_CHANGED = 6; 79767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_POLL_PDP = 7; 80767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_GET_PDP_LIST_COMPLETE = 11; 81767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 12; 82767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_VOICE_CALL_STARTED = 14; 83767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_VOICE_CALL_ENDED = 15; 84767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_GPRS_DETACHED = 19; 85767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_LINK_STATE_CHANGED = 20; 86767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_ROAMING_ON = 21; 87767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_ROAMING_OFF = 22; 88767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_ENABLE_NEW_APN = 23; 89767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_RESTORE_DEFAULT_APN = 24; 90767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_DISCONNECT_DONE = 25; 91767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_GPRS_ATTACHED = 26; 92767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_START_NETSTAT_POLL = 27; 93767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_START_RECOVERY = 28; 94767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_APN_CHANGED = 29; 95767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_CDMA_DATA_DETACHED = 30; 96767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_NV_READY = 31; 97767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_PS_RESTRICT_ENABLED = 32; 98767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int EVENT_PS_RESTRICT_DISABLED = 33; 999c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh public static final int EVENT_CLEAN_UP_CONNECTION = 34; 100ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville protected static final int EVENT_CDMA_OTA_PROVISION = 35; 10125254db31a7c4190cc453d38cd50d65a17885305Yong Zhang protected static final int EVENT_RESTART_RADIO = 36; 102984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt protected static final int EVENT_SET_MASTER_DATA_ENABLE = 37; 10316dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville protected static final int EVENT_RESET_DONE = 38; 104767a662ecde33c3979bf02b793d392aca0403162Wink Saville 105868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt /***** Constants *****/ 106767a662ecde33c3979bf02b793d392aca0403162Wink Saville 10725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected static final int APN_INVALID_ID = -1; 10825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected static final int APN_DEFAULT_ID = 0; 10925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected static final int APN_MMS_ID = 1; 11025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected static final int APN_SUPL_ID = 2; 11125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected static final int APN_DUN_ID = 3; 11225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected static final int APN_HIPRI_ID = 4; 11325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected static final int APN_NUM_TYPES = 5; 11425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 115984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt protected static final int DISABLED = 0; 116984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt protected static final int ENABLED = 1; 117984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt 118984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt // responds to the setDataEnabled call - used independently from the APN requests 119984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt protected boolean mMasterDataEnabled = true; 120868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt 12125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected boolean[] dataEnabled = new boolean[APN_NUM_TYPES]; 12225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected int enabledCount = 0; 12325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 12425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt /* Currently requested APN type */ 12525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected String mRequestedApnType = Phone.APN_TYPE_DEFAULT; 12625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 1273918e13b24d4e7ad410089eb615721ca026bec01Wink Saville /** Retry configuration: A doubling of retry times from 5secs to 30minutes */ 1283918e13b24d4e7ad410089eb615721ca026bec01Wink Saville protected static final String DEFAULT_DATA_RETRY_CONFIG = "default_randomization=2000," 1293918e13b24d4e7ad410089eb615721ca026bec01Wink Saville + "5000,10000,20000,40000,80000:5000,160000:5000," 1303918e13b24d4e7ad410089eb615721ca026bec01Wink Saville + "320000:5000,640000:5000,1280000:5000,1800000:5000"; 131767a662ecde33c3979bf02b793d392aca0403162Wink Saville 13289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt /** Retry configuration for secondary networks: 4 tries in 20 sec */ 13389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt protected static final String SECONDARY_DATA_RETRY_CONFIG = 134aad261730c566332e7b4ab29e800cca3cee9a15cRobert Greenwalt "max_retries=3, 5000, 5000, 5000"; 13589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 136767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** Slow poll when attempting connection recovery. */ 137767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int POLL_NETSTAT_SLOW_MILLIS = 5000; 138767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** Default ping deadline, in seconds. */ 139faf4413dffdc9079683b951736088ff2a01073a4jsh protected static final int DEFAULT_PING_DEADLINE = 5; 140767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** Default max failure count before attempting to network re-registration. */ 141faf4413dffdc9079683b951736088ff2a01073a4jsh protected static final int DEFAULT_MAX_PDP_RESET_FAIL = 3; 142767a662ecde33c3979bf02b793d392aca0403162Wink Saville 143767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 144767a662ecde33c3979bf02b793d392aca0403162Wink Saville * After detecting a potential connection problem, this is the max number 145767a662ecde33c3979bf02b793d392aca0403162Wink Saville * of subsequent polls before attempting a radio reset. At this point, 146767a662ecde33c3979bf02b793d392aca0403162Wink Saville * poll interval is 5 seconds (POLL_NETSTAT_SLOW_MILLIS), so set this to 147767a662ecde33c3979bf02b793d392aca0403162Wink Saville * poll for about 2 more minutes. 148767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 149767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int NO_RECV_POLL_LIMIT = 24; 150767a662ecde33c3979bf02b793d392aca0403162Wink Saville 151767a662ecde33c3979bf02b793d392aca0403162Wink Saville // 1 sec. default polling interval when screen is on. 152767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int POLL_NETSTAT_MILLIS = 1000; 153767a662ecde33c3979bf02b793d392aca0403162Wink Saville // 10 min. default polling interval when screen is off. 154767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int POLL_NETSTAT_SCREEN_OFF_MILLIS = 1000*60*10; 155767a662ecde33c3979bf02b793d392aca0403162Wink Saville // 2 min for round trip time 156767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int POLL_LONGEST_RTT = 120 * 1000; 157767a662ecde33c3979bf02b793d392aca0403162Wink Saville // 10 for packets without ack 158767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int NUMBER_SENT_PACKETS_OF_HANG = 10; 159767a662ecde33c3979bf02b793d392aca0403162Wink Saville // how long to wait before switching back to default APN 160767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final int RESTORE_DEFAULT_APN_DELAY = 1 * 60 * 1000; 161767a662ecde33c3979bf02b793d392aca0403162Wink Saville // system property that can override the above value 162767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final String APN_RESTORE_DELAY_PROP_NAME = "android.telephony.apn-restore"; 163767a662ecde33c3979bf02b793d392aca0403162Wink Saville // represents an invalid IP address 164767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected static final String NULL_IP = "0.0.0.0"; 165767a662ecde33c3979bf02b793d392aca0403162Wink Saville 166767a662ecde33c3979bf02b793d392aca0403162Wink Saville 167767a662ecde33c3979bf02b793d392aca0403162Wink Saville // member variables 168767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected PhoneBase phone; 169767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected Activity activity = Activity.NONE; 170767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected State state = State.IDLE; 171767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected Handler mDataConnectionTracker = null; 172767a662ecde33c3979bf02b793d392aca0403162Wink Saville 173767a662ecde33c3979bf02b793d392aca0403162Wink Saville 174767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected long txPkts, rxPkts, sentSinceLastRecv; 175767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int netStatPollPeriod; 176767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int mNoRecvPollCount = 0; 177767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected boolean netStatPollEnabled = false; 178767a662ecde33c3979bf02b793d392aca0403162Wink Saville 179ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville /** Manage the behavior of data retry after failure */ 18089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt protected RetryManager mRetryMgr = new RetryManager(); 181ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville 182767a662ecde33c3979bf02b793d392aca0403162Wink Saville // wifi connection status will be updated by sticky intent 183767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected boolean mIsWifiConnected = false; 184767a662ecde33c3979bf02b793d392aca0403162Wink Saville 185767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** Intent sent when the reconnect alarm fires. */ 186767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected PendingIntent mReconnectIntent = null; 1879c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 188767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** CID of active data connection */ 189767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected int cidActive; 190767a662ecde33c3979bf02b793d392aca0403162Wink Saville 191767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 192767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Default constructor 193767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 194767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected DataConnectionTracker(PhoneBase phone) { 195767a662ecde33c3979bf02b793d392aca0403162Wink Saville super(); 196767a662ecde33c3979bf02b793d392aca0403162Wink Saville this.phone = phone; 197767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 198767a662ecde33c3979bf02b793d392aca0403162Wink Saville 19925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt public abstract void dispose(); 20025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 201767a662ecde33c3979bf02b793d392aca0403162Wink Saville public Activity getActivity() { 202767a662ecde33c3979bf02b793d392aca0403162Wink Saville return activity; 203767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 204767a662ecde33c3979bf02b793d392aca0403162Wink Saville 205767a662ecde33c3979bf02b793d392aca0403162Wink Saville public State getState() { 206767a662ecde33c3979bf02b793d392aca0403162Wink Saville return state; 207767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 208767a662ecde33c3979bf02b793d392aca0403162Wink Saville 209767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getStateInString() { 210767a662ecde33c3979bf02b793d392aca0403162Wink Saville switch (state) { 211767a662ecde33c3979bf02b793d392aca0403162Wink Saville case IDLE: return "IDLE"; 212767a662ecde33c3979bf02b793d392aca0403162Wink Saville case INITING: return "INIT"; 213767a662ecde33c3979bf02b793d392aca0403162Wink Saville case CONNECTING: return "CING"; 214767a662ecde33c3979bf02b793d392aca0403162Wink Saville case SCANNING: return "SCAN"; 215767a662ecde33c3979bf02b793d392aca0403162Wink Saville case CONNECTED: return "CNTD"; 216767a662ecde33c3979bf02b793d392aca0403162Wink Saville case DISCONNECTING: return "DING"; 217767a662ecde33c3979bf02b793d392aca0403162Wink Saville case FAILED: return "FAIL"; 218767a662ecde33c3979bf02b793d392aca0403162Wink Saville default: return "ERRO"; 219767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 220767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 221767a662ecde33c3979bf02b793d392aca0403162Wink Saville 222767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 223767a662ecde33c3979bf02b793d392aca0403162Wink Saville * The data connection is expected to be setup while device 224767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 1. has Icc card 225767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 2. registered for data service 226767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 3. user doesn't explicitly disable data service 227767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 4. wifi is not on 228767a662ecde33c3979bf02b793d392aca0403162Wink Saville * 229767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return false while no data connection if all above requirements are met. 230767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 231767a662ecde33c3979bf02b793d392aca0403162Wink Saville public abstract boolean isDataConnectionAsDesired(); 232767a662ecde33c3979bf02b793d392aca0403162Wink Saville 233767a662ecde33c3979bf02b793d392aca0403162Wink Saville //The data roaming setting is now located in the shared preferences. 234767a662ecde33c3979bf02b793d392aca0403162Wink Saville // See if the requested preference value is the same as that stored in 235767a662ecde33c3979bf02b793d392aca0403162Wink Saville // the shared values. If it is not, then update it. 236767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void setDataOnRoamingEnabled(boolean enabled) { 237767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (getDataOnRoamingEnabled() != enabled) { 238767a662ecde33c3979bf02b793d392aca0403162Wink Saville Settings.Secure.putInt(phone.getContext().getContentResolver(), 239767a662ecde33c3979bf02b793d392aca0403162Wink Saville Settings.Secure.DATA_ROAMING, enabled ? 1 : 0); 240ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville if (phone.getServiceState().getRoaming()) { 241ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville if (enabled) { 242ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville mRetryMgr.resetRetryCount(); 243ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville } 244ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville sendMessage(obtainMessage(EVENT_ROAMING_ON)); 245ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville } 246767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 247767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 248767a662ecde33c3979bf02b793d392aca0403162Wink Saville 249767a662ecde33c3979bf02b793d392aca0403162Wink Saville //Retrieve the data roaming setting from the shared preferences. 250767a662ecde33c3979bf02b793d392aca0403162Wink Saville public boolean getDataOnRoamingEnabled() { 251767a662ecde33c3979bf02b793d392aca0403162Wink Saville try { 252767a662ecde33c3979bf02b793d392aca0403162Wink Saville return Settings.Secure.getInt(phone.getContext().getContentResolver(), 253767a662ecde33c3979bf02b793d392aca0403162Wink Saville Settings.Secure.DATA_ROAMING) > 0; 254767a662ecde33c3979bf02b793d392aca0403162Wink Saville } catch (SettingNotFoundException snfe) { 255767a662ecde33c3979bf02b793d392aca0403162Wink Saville return false; 256767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 257767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 258767a662ecde33c3979bf02b793d392aca0403162Wink Saville 259767a662ecde33c3979bf02b793d392aca0403162Wink Saville // abstract handler methods 260868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt protected abstract boolean onTrySetupData(String reason); 261767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onRoamingOff(); 262767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onRoamingOn(); 263767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onRadioAvailable(); 264767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onRadioOffOrNotAvailable(); 265767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onDataSetupComplete(AsyncResult ar); 266767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onDisconnectDone(AsyncResult ar); 26716dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville protected abstract void onResetDone(AsyncResult ar); 268767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onVoiceCallStarted(); 269767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected abstract void onVoiceCallEnded(); 2709c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh protected abstract void onCleanUpConnection(boolean tearDown, String reason); 271767a662ecde33c3979bf02b793d392aca0403162Wink Saville 272868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt @Override 273767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void handleMessage (Message msg) { 274767a662ecde33c3979bf02b793d392aca0403162Wink Saville switch (msg.what) { 275767a662ecde33c3979bf02b793d392aca0403162Wink Saville 27689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt case EVENT_ENABLE_NEW_APN: 27789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt onEnableApn(msg.arg1, msg.arg2); 278868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt break; 279868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt 280767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_TRY_SETUP_DATA: 281faf4413dffdc9079683b951736088ff2a01073a4jsh String reason = null; 282faf4413dffdc9079683b951736088ff2a01073a4jsh if (msg.obj instanceof String) { 283faf4413dffdc9079683b951736088ff2a01073a4jsh reason = (String)msg.obj; 284faf4413dffdc9079683b951736088ff2a01073a4jsh } 285faf4413dffdc9079683b951736088ff2a01073a4jsh onTrySetupData(reason); 286767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 287767a662ecde33c3979bf02b793d392aca0403162Wink Saville 288767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_ROAMING_OFF: 289ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville if (getDataOnRoamingEnabled() == false) { 290ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville mRetryMgr.resetRetryCount(); 291ad4d9e5bebb5a9ba01c1459d941019887f4a7d6dWink Saville } 292767a662ecde33c3979bf02b793d392aca0403162Wink Saville onRoamingOff(); 293767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 294767a662ecde33c3979bf02b793d392aca0403162Wink Saville 295767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_ROAMING_ON: 296767a662ecde33c3979bf02b793d392aca0403162Wink Saville onRoamingOn(); 297767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 298767a662ecde33c3979bf02b793d392aca0403162Wink Saville 299767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_RADIO_AVAILABLE: 300767a662ecde33c3979bf02b793d392aca0403162Wink Saville onRadioAvailable(); 301767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 302767a662ecde33c3979bf02b793d392aca0403162Wink Saville 303767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_RADIO_OFF_OR_NOT_AVAILABLE: 304767a662ecde33c3979bf02b793d392aca0403162Wink Saville onRadioOffOrNotAvailable(); 305767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 306767a662ecde33c3979bf02b793d392aca0403162Wink Saville 307767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_DATA_SETUP_COMPLETE: 308767a662ecde33c3979bf02b793d392aca0403162Wink Saville cidActive = msg.arg1; 309767a662ecde33c3979bf02b793d392aca0403162Wink Saville onDataSetupComplete((AsyncResult) msg.obj); 310767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 311767a662ecde33c3979bf02b793d392aca0403162Wink Saville 312767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_DISCONNECT_DONE: 313767a662ecde33c3979bf02b793d392aca0403162Wink Saville onDisconnectDone((AsyncResult) msg.obj); 314767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 315767a662ecde33c3979bf02b793d392aca0403162Wink Saville 316767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_VOICE_CALL_STARTED: 317767a662ecde33c3979bf02b793d392aca0403162Wink Saville onVoiceCallStarted(); 318767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 319767a662ecde33c3979bf02b793d392aca0403162Wink Saville 320767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_VOICE_CALL_ENDED: 321767a662ecde33c3979bf02b793d392aca0403162Wink Saville onVoiceCallEnded(); 322767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 323767a662ecde33c3979bf02b793d392aca0403162Wink Saville 3249c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh case EVENT_CLEAN_UP_CONNECTION: 3259c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh boolean tearDown = (msg.arg1 == 0) ? false : true; 3269c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh onCleanUpConnection(tearDown, (String)msg.obj); 3279c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh break; 3289c2a3be8bad8867cc524d8813dc6468a7ffb3f09Jaikumar Ganesh 329984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt case EVENT_SET_MASTER_DATA_ENABLE: 330984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt boolean enabled = (msg.arg1 == ENABLED) ? true : false; 331984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt onSetDataEnabled(enabled); 332984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt break; 333984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt 33416dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville case EVENT_RESET_DONE: 33516dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville onResetDone((AsyncResult) msg.obj); 33616dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville break; 33716dc6dbf30d3682491f65ca702023a92481d32c4Wink Saville 338767a662ecde33c3979bf02b793d392aca0403162Wink Saville default: 339767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.e("DATA", "Unidentified event = " + msg.what); 340767a662ecde33c3979bf02b793d392aca0403162Wink Saville break; 341767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 342767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 343767a662ecde33c3979bf02b793d392aca0403162Wink Saville 344767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 345767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Report the current state of data connectivity (enabled or disabled) 346767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return {@code false} if data connectivity has been explicitly disabled, 347767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@code true} otherwise. 348767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 349868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt public synchronized boolean getDataEnabled() { 35025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return dataEnabled[APN_DEFAULT_ID]; 35125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 352767a662ecde33c3979bf02b793d392aca0403162Wink Saville 353767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 354767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Report on whether data connectivity is enabled 355767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return {@code false} if data connectivity has been explicitly disabled, 356767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@code true} otherwise. 357767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 35825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt public boolean getAnyDataEnabled() { 35925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return (enabledCount != 0); 36025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 36125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 36225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract void startNetStatPoll(); 36325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 36425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract void stopNetStatPoll(); 36525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 36625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract void restartRadio(); 36725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 36825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract void log(String s); 36925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 37025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected int apnTypeToId(String type) { 37125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt if (TextUtils.equals(type, Phone.APN_TYPE_DEFAULT)) { 37225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return APN_DEFAULT_ID; 37325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } else if (TextUtils.equals(type, Phone.APN_TYPE_MMS)) { 37425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return APN_MMS_ID; 37525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } else if (TextUtils.equals(type, Phone.APN_TYPE_SUPL)) { 37625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return APN_SUPL_ID; 37725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } else if (TextUtils.equals(type, Phone.APN_TYPE_DUN)) { 37825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return APN_DUN_ID; 37925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } else if (TextUtils.equals(type, Phone.APN_TYPE_HIPRI)) { 38025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return APN_HIPRI_ID; 38125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } else { 38225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return APN_INVALID_ID; 38325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 38425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 38525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 38689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt protected String apnIdToType(int id) { 38789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt switch (id) { 38889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt case APN_DEFAULT_ID: 38989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt return Phone.APN_TYPE_DEFAULT; 39089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt case APN_MMS_ID: 39189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt return Phone.APN_TYPE_MMS; 39289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt case APN_SUPL_ID: 39389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt return Phone.APN_TYPE_SUPL; 39489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt case APN_DUN_ID: 39589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt return Phone.APN_TYPE_DUN; 39689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt case APN_HIPRI_ID: 39789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt return Phone.APN_TYPE_HIPRI; 39889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt default: 39989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt Log.e(LOG_TAG, "Unknown id (" + id + ") in apnIdToType"); 40089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt return Phone.APN_TYPE_DEFAULT; 40189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 40289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 40389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 40425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract boolean isApnTypeActive(String type); 40525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 40625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract boolean isApnTypeAvailable(String type); 40725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 40825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract String[] getActiveApnTypes(); 40925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 41025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract String getActiveApnString(); 41125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 41225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt public abstract ArrayList<DataConnection> getAllDataConnections(); 41325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 41425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract String getInterfaceName(String apnType); 41525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 41625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract String getIpAddress(String apnType); 41725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 41825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract String getGateway(String apnType); 41925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 42025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract String[] getDnsServers(String apnType); 42125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 42225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt protected abstract void setState(State s); 42325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 424868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt protected synchronized boolean isEnabled(int id) { 42525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt if (id != APN_INVALID_ID) { 42625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return dataEnabled[id]; 42725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 42825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return false; 42925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 43025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 43125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt /** 43225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * Ensure that we are connected to an APN of the specified type. 43325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * @param type the APN type (currently the only valid values 43425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * are {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}) 43525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * @return the result of the operation. Success is indicated by 43625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * a return value of either {@code Phone.APN_ALREADY_ACTIVE} or 43725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * {@code Phone.APN_REQUEST_STARTED}. In the latter case, a broadcast 43825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * will be sent by the ConnectivityManager when a connection to 43925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * the APN has been established. 44025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt */ 441d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt public synchronized int enableApnType(String type) { 44225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt int id = apnTypeToId(type); 44325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt if (id == APN_INVALID_ID) { 44425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return Phone.APN_REQUEST_FAILED; 44525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 44625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 44765ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt if (DBG) Log.d(LOG_TAG, "enableApnType("+type+"), isApnTypeActive = " 44825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt + isApnTypeActive(type) + " and state = " + state); 44925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 45025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt if (!isApnTypeAvailable(type)) { 45165ae29bd852ff468ad003af241d5177fe016c74aRobert Greenwalt if (DBG) Log.d(LOG_TAG, "type not available"); 45225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return Phone.APN_TYPE_NOT_AVAILABLE; 45325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 45425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 455d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt // just because it's active doesn't mean we had it explicitly requested before 456d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt // (a broad default may handle many types). make sure we mark it enabled 457d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt // so if the default is disabled we keep the connection for others 45825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt setEnabled(id, true); 459d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt 460d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt if (isApnTypeActive(type)) { 461d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt if (state == State.INITING) return Phone.APN_REQUEST_STARTED; 462d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt else if (state == State.CONNECTED) return Phone.APN_ALREADY_ACTIVE; 463d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt } 46425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return Phone.APN_REQUEST_STARTED; 46525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 46625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 46725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt /** 46825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * The APN of the specified type is no longer needed. Ensure that if 46925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * use of the default APN has not been explicitly disabled, we are connected 47025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * to the default APN. 47125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * @param type the APN type. The only valid values are currently 47225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}. 47325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * @return 47425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt */ 475868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt public synchronized int disableApnType(String type) { 47625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt if (DBG) Log.d(LOG_TAG, "disableApnType("+type+")"); 47725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt int id = apnTypeToId(type); 47825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt if (id == APN_INVALID_ID) { 47925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return Phone.APN_REQUEST_FAILED; 48025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 48125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt if (isEnabled(id)) { 48225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt setEnabled(id, false); 48325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt if (isApnTypeActive(Phone.APN_TYPE_DEFAULT)) { 48425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt if (dataEnabled[APN_DEFAULT_ID]) { 48525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return Phone.APN_ALREADY_ACTIVE; 48625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } else { 48725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return Phone.APN_REQUEST_STARTED; 48825a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 48925a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } else { 49025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return Phone.APN_REQUEST_STARTED; 49125a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 49225a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } else { 49325a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return Phone.APN_REQUEST_FAILED; 49425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 49525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 49625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt 49789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt private void setEnabled(int id, boolean enable) { 4980badd0b700ed618dac421cb6cde4654b51acb3a4Robert Greenwalt if (DBG) Log.d(LOG_TAG, "setEnabled(" + id + ", " + enable + ") with old state = " + 4990badd0b700ed618dac421cb6cde4654b51acb3a4Robert Greenwalt dataEnabled[id] + " and enabledCount = " + enabledCount); 500868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt 50189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt Message msg = obtainMessage(EVENT_ENABLE_NEW_APN); 502868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt msg.arg1 = id; 503984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt msg.arg2 = (enable ? ENABLED : DISABLED); 504868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt sendMessage(msg); 50525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 506767a662ecde33c3979bf02b793d392aca0403162Wink Saville 50789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt protected synchronized void onEnableApn(int apnId, int enabled) { 50889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (DBG) { 509d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt Log.d(LOG_TAG, "EVENT_APN_ENABLE_REQUEST " + apnId + ", " + enabled); 510d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt Log.d(LOG_TAG, " dataEnabled = " + dataEnabled[apnId] + 511d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt ", enabledCount = " + enabledCount + 512d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt ", isApnTypeActive = " + isApnTypeActive(apnIdToType(apnId))); 51389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 514984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt if (enabled == ENABLED) { 51589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (!dataEnabled[apnId]) { 51689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt dataEnabled[apnId] = true; 51789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt enabledCount++; 51889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 519d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt String type = apnIdToType(apnId); 520d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt if (!isApnTypeActive(type)) { 521d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt mRequestedApnType = type; 522d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt onEnableNewApn(); 523d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt } 52489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } else { 52589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt // disable 52689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (dataEnabled[apnId]) { 52789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt dataEnabled[apnId] = false; 52889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt enabledCount--; 52989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt if (enabledCount == 0) { 53089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt onCleanUpConnection(true, Phone.REASON_DATA_DISABLED); 531d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt } else if (dataEnabled[APN_DEFAULT_ID] == true && 532d1aca6aa73b0f1e22229829db89b1f3513a16aa8Robert Greenwalt !isApnTypeActive(Phone.APN_TYPE_DEFAULT)) { 53389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt mRequestedApnType = Phone.APN_TYPE_DEFAULT; 53489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt onEnableNewApn(); 53589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 53689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 53789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 53889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 53989bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 54089bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt /** 54189bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt * Called when we switch APNs. 54289bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt * 54389bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt * mRequestedApnType is set prior to call 54489bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt * To be overridden. 54589bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt */ 54689bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt protected void onEnableNewApn() { 54789bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt } 54889bd269975cae2d44c871c997b4eb0d42ba1f43cRobert Greenwalt 549767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 550767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Prevent mobile data connections from being established, 551767a662ecde33c3979bf02b793d392aca0403162Wink Saville * or once again allow mobile data connections. If the state 552767a662ecde33c3979bf02b793d392aca0403162Wink Saville * toggles, then either tear down or set up data, as 553767a662ecde33c3979bf02b793d392aca0403162Wink Saville * appropriate to match the new state. 55425a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * <p>This operation only affects the default APN, and if the same APN is 55525a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * currently being used for MMS traffic, the teardown will not happen 55625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt * even when {@code enable} is {@code false}.</p> 557767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @param enable indicates whether to enable ({@code true}) or disable ({@code false}) data 558767a662ecde33c3979bf02b793d392aca0403162Wink Saville * @return {@code true} if the operation succeeded 559767a662ecde33c3979bf02b793d392aca0403162Wink Saville */ 56025a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt public boolean setDataEnabled(boolean enable) { 561868b34bd740a279fa243dce6803af40f8cc42db7Robert Greenwalt if (DBG) Log.d(LOG_TAG, "setDataEnabled(" + enable + ")"); 562984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt 563984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt Message msg = obtainMessage(EVENT_SET_MASTER_DATA_ENABLE); 564984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt msg.arg1 = (enable ? ENABLED : DISABLED); 565984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt sendMessage(msg); 56625a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt return true; 56725a5d3db3ff06b9952395832308bc3b48913c4eeRobert Greenwalt } 568767a662ecde33c3979bf02b793d392aca0403162Wink Saville 569984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt protected void onSetDataEnabled(boolean enable) { 570984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt if (mMasterDataEnabled != enable) { 571984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt mMasterDataEnabled = enable; 572984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt if (enable) { 573984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt mRetryMgr.resetRetryCount(); 574984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt onTrySetupData(Phone.REASON_DATA_ENABLED); 575984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt } else { 576984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt onCleanUpConnection(true, Phone.REASON_DATA_DISABLED); 577984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt } 578984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt } 579984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt } 580984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt 581984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt 582767a662ecde33c3979bf02b793d392aca0403162Wink Saville} 583