diff options
Diffstat (limited to 'telephony/java')
9 files changed, 441 insertions, 435 deletions
diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java index a3f1ad8..29e89b5 100644 --- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java @@ -24,14 +24,18 @@ import android.os.Message; import android.os.RemoteException; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; +import android.text.TextUtils; import android.util.Log; +import java.util.ArrayList; + /** * {@hide} * */ public abstract class DataConnectionTracker extends Handler { - private static final boolean DBG = true; + protected static final boolean DBG = true; + protected final String LOG_TAG = "DataConnectionTracker"; /** * IDLE: ready to start data connection setup, default state @@ -94,9 +98,24 @@ public abstract class DataConnectionTracker extends Handler { protected static final int EVENT_PS_RESTRICT_ENABLED = 32; protected static final int EVENT_PS_RESTRICT_DISABLED = 33; public static final int EVENT_CLEAN_UP_CONNECTION = 34; + protected static final int EVENT_CDMA_OTA_PROVISION = 35; //***** Constants + protected static final int APN_INVALID_ID = -1; + protected static final int APN_DEFAULT_ID = 0; + protected static final int APN_MMS_ID = 1; + protected static final int APN_SUPL_ID = 2; + protected static final int APN_DUN_ID = 3; + protected static final int APN_HIPRI_ID = 4; + protected static final int APN_NUM_TYPES = 5; + + protected boolean[] dataEnabled = new boolean[APN_NUM_TYPES]; + protected int enabledCount = 0; + + /* Currently requested APN type */ + protected String mRequestedApnType = Phone.APN_TYPE_DEFAULT; + /** Retry configuration: A doubling of retry times from 5secs to 30minutes */ protected static final String DEFAULT_DATA_RETRY_CONFIG = "default_randomization=2000," + "5000,10000,20000,40000,80000:5000,160000:5000," @@ -146,6 +165,9 @@ public abstract class DataConnectionTracker extends Handler { protected int mNoRecvPollCount = 0; protected boolean netStatPollEnabled = false; + /** Manage the behavior of data retry after failure */ + protected final RetryManager mRetryMgr = new RetryManager(); + // wifi connection status will be updated by sticky intent protected boolean mIsWifiConnected = false; @@ -163,6 +185,8 @@ public abstract class DataConnectionTracker extends Handler { this.phone = phone; } + public abstract void dispose(); + public Activity getActivity() { return activity; } @@ -202,10 +226,13 @@ public abstract class DataConnectionTracker extends Handler { if (getDataOnRoamingEnabled() != enabled) { Settings.Secure.putInt(phone.getContext().getContentResolver(), Settings.Secure.DATA_ROAMING, enabled ? 1 : 0); + if (phone.getServiceState().getRoaming()) { + if (enabled) { + mRetryMgr.resetRetryCount(); + } + sendMessage(obtainMessage(EVENT_ROAMING_ON)); + } } - Message roamingMsg = phone.getServiceState().getRoaming() ? - obtainMessage(EVENT_ROAMING_ON) : obtainMessage(EVENT_ROAMING_OFF); - sendMessage(roamingMsg); } //Retrieve the data roaming setting from the shared preferences. @@ -243,6 +270,9 @@ public abstract class DataConnectionTracker extends Handler { break; case EVENT_ROAMING_OFF: + if (getDataOnRoamingEnabled() == false) { + mRetryMgr.resetRetryCount(); + } onRoamingOff(); break; @@ -291,30 +321,182 @@ public abstract class DataConnectionTracker extends Handler { * @return {@code false} if data connectivity has been explicitly disabled, * {@code true} otherwise. */ - public abstract boolean getDataEnabled(); + public boolean getDataEnabled() { + return dataEnabled[APN_DEFAULT_ID]; + } /** * Report on whether data connectivity is enabled * @return {@code false} if data connectivity has been explicitly disabled, * {@code true} otherwise. */ - public abstract boolean getAnyDataEnabled(); + public boolean getAnyDataEnabled() { + return (enabledCount != 0); + } + + protected abstract void startNetStatPoll(); + + protected abstract void stopNetStatPoll(); + + protected abstract void restartRadio(); + + protected abstract void log(String s); + + protected int apnTypeToId(String type) { + if (TextUtils.equals(type, Phone.APN_TYPE_DEFAULT)) { + return APN_DEFAULT_ID; + } else if (TextUtils.equals(type, Phone.APN_TYPE_MMS)) { + return APN_MMS_ID; + } else if (TextUtils.equals(type, Phone.APN_TYPE_SUPL)) { + return APN_SUPL_ID; + } else if (TextUtils.equals(type, Phone.APN_TYPE_DUN)) { + return APN_DUN_ID; + } else if (TextUtils.equals(type, Phone.APN_TYPE_HIPRI)) { + return APN_HIPRI_ID; + } else { + return APN_INVALID_ID; + } + } + + protected abstract boolean isApnTypeActive(String type); + + protected abstract boolean isApnTypeAvailable(String type); + + protected abstract String[] getActiveApnTypes(); + + protected abstract String getActiveApnString(); + + public abstract ArrayList<DataConnection> getAllDataConnections(); + + protected abstract String getInterfaceName(String apnType); + + protected abstract String getIpAddress(String apnType); + + protected abstract String getGateway(String apnType); + + protected abstract String[] getDnsServers(String apnType); + + protected abstract void setState(State s); + + protected boolean isEnabled(int id) { + if (id != APN_INVALID_ID) { + return dataEnabled[id]; + } + return false; + } + + /** + * Ensure that we are connected to an APN of the specified type. + * @param type the APN type (currently the only valid values + * are {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}) + * @return the result of the operation. Success is indicated by + * a return value of either {@code Phone.APN_ALREADY_ACTIVE} or + * {@code Phone.APN_REQUEST_STARTED}. In the latter case, a broadcast + * will be sent by the ConnectivityManager when a connection to + * the APN has been established. + */ + public int enableApnType(String type) { + int id = apnTypeToId(type); + if (id == APN_INVALID_ID) { + return Phone.APN_REQUEST_FAILED; + } + + // If already active, return + if(DBG) Log.d(LOG_TAG, "enableApnType("+type+"), isApnTypeActive = " + + isApnTypeActive(type) + " and state = " + state); + + if (isApnTypeActive(type)) { + if (state == State.INITING) return Phone.APN_REQUEST_STARTED; + else if (state == State.CONNECTED) return Phone.APN_ALREADY_ACTIVE; + } + + if (!isApnTypeAvailable(type)) { + return Phone.APN_TYPE_NOT_AVAILABLE; + } + + setEnabled(id, true); + mRequestedApnType = type; + sendMessage(obtainMessage(EVENT_ENABLE_NEW_APN)); + return Phone.APN_REQUEST_STARTED; + } + + /** + * The APN of the specified type is no longer needed. Ensure that if + * use of the default APN has not been explicitly disabled, we are connected + * to the default APN. + * @param type the APN type. The only valid values are currently + * {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}. + * @return + */ + public int disableApnType(String type) { + if (DBG) Log.d(LOG_TAG, "disableApnType("+type+")"); + int id = apnTypeToId(type); + if (id == APN_INVALID_ID) { + return Phone.APN_REQUEST_FAILED; + } + if (isEnabled(id)) { + setEnabled(id, false); + if (isApnTypeActive(Phone.APN_TYPE_DEFAULT)) { + mRequestedApnType = Phone.APN_TYPE_DEFAULT; + if (dataEnabled[APN_DEFAULT_ID]) { + return Phone.APN_ALREADY_ACTIVE; + } else { + return Phone.APN_REQUEST_STARTED; + } + } else { + return Phone.APN_REQUEST_STARTED; + } + } else { + return Phone.APN_REQUEST_FAILED; + } + } + + protected synchronized void setEnabled(int id, boolean enable) { + if (DBG) Log.d(LOG_TAG, "setEnabled(" + id + ", " + enable + ')'); + if (dataEnabled[id] != enable) { + dataEnabled[id] = enable; + + if (enable) { + enabledCount++; + } else { + enabledCount--; + } + + if (enabledCount == 0) { + setPrivateDataEnabled(false); + } else if (enabledCount == 1) { + setPrivateDataEnabled(true); + } + } + } /** * Prevent mobile data connections from being established, * or once again allow mobile data connections. If the state * toggles, then either tear down or set up data, as * appropriate to match the new state. + * <p>This operation only affects the default APN, and if the same APN is + * currently being used for MMS traffic, the teardown will not happen + * even when {@code enable} is {@code false}.</p> * @param enable indicates whether to enable ({@code true}) or disable ({@code false}) data * @return {@code true} if the operation succeeded */ - public abstract boolean setDataEnabled(boolean enable); - - protected abstract void startNetStatPoll(); - - protected abstract void stopNetStatPoll(); + public boolean setDataEnabled(boolean enable) { + if (DBG) Log.d(LOG_TAG, "setDataEnabled("+enable+")"); + setEnabled(APN_DEFAULT_ID, enable); + return true; + } - protected abstract void restartRadio(); + private void setPrivateDataEnabled(boolean enable) { + if (DBG) Log.d(LOG_TAG, "setPrivateDataEnabled("+enable+")"); + if (enable) { + sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA)); + } else { + Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION); + msg.arg1 = 1; // tearDown is true + msg.obj = Phone.REASON_DATA_DISABLED; + sendMessage(msg); + } + } - protected abstract void log(String s); } diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java index b279527..6f4aef9 100644 --- a/telephony/java/com/android/internal/telephony/PhoneBase.java +++ b/telephony/java/com/android/internal/telephony/PhoneBase.java @@ -109,6 +109,7 @@ public abstract class PhoneBase implements Phone { public CommandsInterface mCM; protected IccFileHandler mIccFileHandler; boolean mDnsCheckDisabled = false; + public DataConnectionTracker mDataConnection; /** * Set a system property, unless we're in unit test mode @@ -824,4 +825,71 @@ public abstract class PhoneBase implements Phone { // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone. Log.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone."); } + + public String getInterfaceName(String apnType) { + return mDataConnection.getInterfaceName(apnType); + } + + public String getIpAddress(String apnType) { + return mDataConnection.getIpAddress(apnType); + } + + public boolean isDataConnectivityEnabled() { + return mDataConnection.getDataEnabled(); + } + + public String getGateway(String apnType) { + return mDataConnection.getGateway(apnType); + } + + public String[] getDnsServers(String apnType) { + return mDataConnection.getDnsServers(apnType); + } + + public String[] getActiveApnTypes() { + return mDataConnection.getActiveApnTypes(); + } + + public String getActiveApn() { + return mDataConnection.getActiveApnString(); + } + + public int enableApnType(String type) { + return mDataConnection.enableApnType(type); + } + + public int disableApnType(String type) { + return mDataConnection.disableApnType(type); + } + + /** + * simulateDataConnection + * + * simulates various data connection states. This messes with + * DataConnectionTracker's internal states, but doesn't actually change + * the underlying radio connection states. + * + * @param state Phone.DataState enum. + */ + public void simulateDataConnection(Phone.DataState state) { + DataConnectionTracker.State dcState; + + switch (state) { + case CONNECTED: + dcState = DataConnectionTracker.State.CONNECTED; + break; + case SUSPENDED: + dcState = DataConnectionTracker.State.CONNECTED; + break; + case DISCONNECTED: + dcState = DataConnectionTracker.State.FAILED; + break; + default: + dcState = DataConnectionTracker.State.CONNECTING; + break; + } + + mDataConnection.setState(dcState); + notifyDataConnection(null); + } } diff --git a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java index 46b39a5..39806e9 100644 --- a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java @@ -116,6 +116,7 @@ public abstract class ServiceStateTracker extends Handler { protected static final int EVENT_NV_READY = 35; protected static final int EVENT_ERI_FILE_LOADED = 36; protected static final int EVENT_OTA_PROVISION_STATUS_CHANGE = 37; + protected static final int EVENT_SET_RADIO_POWER_OFF = 38; //***** Time Zones protected static final String TIMEZONE_PROPERTY = "persist.sys.timezone"; diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java index 522fa1d..f0c0ea2 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java +++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java @@ -95,7 +95,6 @@ public class CDMAPhone extends PhoneBase { CdmaCallTracker mCT; CdmaSMSDispatcher mSMS; CdmaServiceStateTracker mSST; - CdmaDataConnectionTracker mDataConnection; RuimFileHandler mRuimFileHandler; RuimRecords mRuimRecords; RuimCard mRuimCard; @@ -369,42 +368,11 @@ public class CDMAPhone extends PhoneBase { return mCT.backgroundCall; } - public String getGateway(String apnType) { - return mDataConnection.getGateway(); - } - public boolean handleInCallMmiCommands(String dialString) { Log.e(LOG_TAG, "method handleInCallMmiCommands is NOT supported in CDMA!"); return false; } - public int enableApnType(String type) { - // This request is mainly used to enable MMS APN - // In CDMA there is no need to enable/disable a different APN for MMS - Log.d(LOG_TAG, "Request to enableApnType("+type+")"); - if (TextUtils.equals(type, Phone.APN_TYPE_MMS)) { - return Phone.APN_ALREADY_ACTIVE; - } else { - return Phone.APN_REQUEST_FAILED; - } - } - - public int disableApnType(String type) { - // This request is mainly used to disable MMS APN - // In CDMA there is no need to enable/disable a different APN for MMS - Log.d(LOG_TAG, "Request to disableApnType("+type+")"); - if (TextUtils.equals(type, Phone.APN_TYPE_MMS)) { - return Phone.APN_REQUEST_STARTED; - } else { - return Phone.APN_REQUEST_FAILED; - } - } - - public String getActiveApn() { - Log.d(LOG_TAG, "Request to getActiveApn()"); - return null; - } - public void setNetworkSelectionModeAutomatic(Message response) { Log.e(LOG_TAG, "method setNetworkSelectionModeAutomatic is NOT supported in CDMA!"); @@ -481,10 +449,6 @@ public class CDMAPhone extends PhoneBase { return false; } - public String getInterfaceName(String apnType) { - return mDataConnection.getInterfaceName(); - } - public CellLocation getCellLocation() { return mSST.cellLoc; } @@ -512,10 +476,6 @@ public class CDMAPhone extends PhoneBase { return false; } - public boolean isDataConnectivityEnabled() { - return mDataConnection.getDataEnabled(); - } - public boolean isDataConnectivityPossible() { boolean noData = mDataConnection.getDataEnabled() && getDataConnectionState() == DataState.DISCONNECTED; @@ -528,10 +488,6 @@ public class CDMAPhone extends PhoneBase { Log.e(LOG_TAG, "setLine1Number: not possible in CDMA"); } - public String[] getDnsServers(String apnType) { - return mDataConnection.getDnsServers(); - } - public IccCard getIccCard() { return mRuimCard; } @@ -584,10 +540,6 @@ public class CDMAPhone extends PhoneBase { mCT.unregisterForCallWaiting(h); } - public String getIpAddress(String apnType) { - return mDataConnection.getIpAddress(); - } - public void getNeighboringCids(Message response) { /* @@ -701,14 +653,6 @@ public class CDMAPhone extends PhoneBase { Log.e(LOG_TAG, "getAvailableNetworks: not possible in CDMA"); } - public String[] getActiveApnTypes() { - String[] result; - Log.d(LOG_TAG, "Request to getActiveApn()"); - result = new String[1]; - result[0] = Phone.APN_TYPE_DEFAULT; - return result; - } - public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode, Message onComplete) { Log.e(LOG_TAG, "setOutgoingCallerIdDisplay: not possible in CDMA"); } diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java index 38bc24d..d02d33e 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java @@ -48,6 +48,7 @@ import com.android.internal.telephony.DataConnection.FailCause; import com.android.internal.telephony.DataConnectionTracker; import com.android.internal.telephony.RetryManager; import com.android.internal.telephony.Phone; +import com.android.internal.telephony.ServiceStateTracker; import com.android.internal.telephony.TelephonyEventLog; import java.util.ArrayList; @@ -56,8 +57,7 @@ import java.util.ArrayList; * {@hide} */ public final class CdmaDataConnectionTracker extends DataConnectionTracker { - private static final String LOG_TAG = "CDMA"; - private static final boolean DBG = true; + protected final String LOG_TAG = "CDMA"; private CDMAPhone mCdmaPhone; @@ -76,15 +76,6 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { /** Currently active CdmaDataConnection */ private CdmaDataConnection mActiveDataConnection; - /** Manage the behavior of data retry after failure */ - private final RetryManager mRetryMgr = new RetryManager(); - - /** Defined cdma connection profiles */ - private static final int EXTERNAL_NETWORK_DEFAULT_ID = 0; - private static final int EXTERNAL_NETWORK_NUM_TYPES = 1; - - private boolean[] dataEnabled = new boolean[EXTERNAL_NETWORK_NUM_TYPES]; - /** * Pool size of CdmaDataConnection objects. */ @@ -103,6 +94,11 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { private static final int DATA_CONNECTION_ACTIVE_PH_LINK_DOWN = 1; private static final int DATA_CONNECTION_ACTIVE_PH_LINK_UP = 2; + private static final String[] mSupportedApnTypes = { + Phone.APN_TYPE_DEFAULT, + Phone.APN_TYPE_MMS, + Phone.APN_TYPE_HIPRI }; + // Possibly promoate to base class, the only difference is // the INTENT_RECONNECT_ALARM action is a different string. // Do consider technology changes if it is promoted. @@ -163,6 +159,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { p.mSST.registerForCdmaDataConnectionDetached(this, EVENT_CDMA_DATA_DETACHED, null); p.mSST.registerForRoamingOn(this, EVENT_ROAMING_ON, null); p.mSST.registerForRoamingOff(this, EVENT_ROAMING_OFF, null); + p.mCM.registerForCdmaOtaProvision(this, EVENT_CDMA_OTA_PROVISION, null); this.netstat = INetStatService.Stub.asInterface(ServiceManager.getService("netstat")); @@ -183,9 +180,12 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { // and 2) whether the RIL will setup the baseband to auto-PS attach. SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(phone.getContext()); - dataEnabled[EXTERNAL_NETWORK_DEFAULT_ID] = + dataEnabled[APN_DEFAULT_ID] = !sp.getBoolean(CDMAPhone.DATA_DISABLED_ON_BOOT_KEY, false); - noAutoAttach = !dataEnabled[EXTERNAL_NETWORK_DEFAULT_ID]; + if (dataEnabled[APN_DEFAULT_ID]) { + enabledCount++; + } + noAutoAttach = !dataEnabled[APN_DEFAULT_ID]; if (!mRetryMgr.configure(SystemProperties.get("ro.cdma.data_retry_config"))) { if (!mRetryMgr.configure(DEFAULT_DATA_RETRY_CONFIG)) { @@ -210,6 +210,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { mCdmaPhone.mSST.unregisterForCdmaDataConnectionDetached(this); mCdmaPhone.mSST.unregisterForRoamingOn(this); mCdmaPhone.mSST.unregisterForRoamingOff(this); + phone.mCM.unregisterForCdmaOtaProvision(this); phone.getContext().unregisterReceiver(this.mIntentReceiver); destroyAllDataConnectionList(); @@ -219,7 +220,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { if(DBG) Log.d(LOG_TAG, "CdmaDataConnectionTracker finalized"); } - void setState(State s) { + protected void setState(State s) { if (DBG) log ("setState: " + s); if (state != s) { if (s == State.INITING) { // request Data connection context @@ -236,39 +237,33 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { state = s; } - public int enableApnType(String type) { - // This request is mainly used to enable MMS APN - // In CDMA there is no need to enable/disable a different APN for MMS - Log.d(LOG_TAG, "Request to enableApnType("+type+")"); - if (TextUtils.equals(type, Phone.APN_TYPE_MMS)) { - return Phone.APN_ALREADY_ACTIVE; - } else if (TextUtils.equals(type, Phone.APN_TYPE_SUPL)) { - Log.w(LOG_TAG, "Phone.APN_TYPE_SUPL not enabled for CDMA"); - return Phone.APN_REQUEST_FAILED; - } else { - return Phone.APN_REQUEST_FAILED; - } + @Override + protected boolean isApnTypeActive(String type) { + return (isApnTypeAvailable(type) && + mCdmaPhone.mSST.getCurrentCdmaDataConnectionState() == + ServiceState.STATE_IN_SERVICE); } - public int disableApnType(String type) { - // This request is mainly used to disable MMS APN - // In CDMA there is no need to enable/disable a different APN for MMS - Log.d(LOG_TAG, "Request to disableApnType("+type+")"); - if (TextUtils.equals(type, Phone.APN_TYPE_MMS)) { - return Phone.APN_REQUEST_STARTED; - } else { - return Phone.APN_REQUEST_FAILED; + @Override + protected boolean isApnTypeAvailable(String type) { + for (String s : mSupportedApnTypes) { + if (TextUtils.equals(type, s)) { + return true; + } } + return false; } - private boolean isEnabled(int cdmaDataProfile) { - return dataEnabled[cdmaDataProfile]; + protected String[] getActiveApnTypes() { + if (mCdmaPhone.mSST.getCurrentCdmaDataConnectionState() == + ServiceState.STATE_IN_SERVICE) { + return mSupportedApnTypes.clone(); + } + return new String[0]; } - private void setEnabled(int cdmaDataProfile, boolean enable) { - Log.d(LOG_TAG, "setEnabled(" + cdmaDataProfile + ", " + enable + ')'); - dataEnabled[cdmaDataProfile] = enable; - Log.d(LOG_TAG, "dataEnabled[DEFAULT_PROFILE]=" + dataEnabled[EXTERNAL_NETWORK_DEFAULT_ID]); + protected String getActiveApnString() { + return null; } /** @@ -294,54 +289,6 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { return true; } - /** - * Prevent mobile data connections from being established, - * or once again allow mobile data connections. If the state - * toggles, then either tear down or set up data, as - * appropriate to match the new state. - * <p>This operation only affects the default connection - * @param enable indicates whether to enable ({@code true}) or disable ({@code false}) data - * @return {@code true} if the operation succeeded - */ - public boolean setDataEnabled(boolean enable) { - - boolean isEnabled = isEnabled(EXTERNAL_NETWORK_DEFAULT_ID); - - Log.d(LOG_TAG, "setDataEnabled("+enable+") isEnabled=" + isEnabled); - if (!isEnabled && enable) { - setEnabled(EXTERNAL_NETWORK_DEFAULT_ID, true); - sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA)); - } else if (!enable) { - setEnabled(EXTERNAL_NETWORK_DEFAULT_ID, false); - Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION); - msg.arg1 = 1; // tearDown is true - msg.obj = Phone.REASON_DATA_DISABLED; - sendMessage(msg); - } - return true; - } - - /** - * Report the current state of data connectivity (enabled or disabled) - * @return {@code false} if data connectivity has been explicitly disabled, - * {@code true} otherwise. - */ - public boolean getDataEnabled() { - return dataEnabled[EXTERNAL_NETWORK_DEFAULT_ID]; - } - - /** - * Report on whether data connectivity is enabled - * @return {@code false} if data connectivity has been explicitly disabled, - * {@code true} otherwise. - */ - public boolean getAnyDataEnabled() { - for (int i=0; i < EXTERNAL_NETWORK_NUM_TYPES; i++) { - if (isEnabled(i)) return true; - } - return false; - } - private boolean isDataAllowed() { boolean roaming = phone.getServiceState().getRoaming(); return getAnyDataEnabled() && (!roaming || getDataOnRoamingEnabled()); @@ -499,7 +446,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { protected void restartRadio() { Log.d(LOG_TAG, "************TURN OFF RADIO**************"); - cleanUpConnection(true, Phone.REASON_RADIO_TURNED_OFF); + cleanUpConnection(true, Phone.REASON_CDMA_DATA_DETACHED); phone.mCM.setRadioPower(false, null); /* Note: no need to call setRadioPower(true). Assuming the desired * radio power state is still ON (as tracked by ServiceStateTracker), @@ -771,6 +718,10 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { reason = (String) ar.userObj; } setState(State.IDLE); + + CdmaServiceStateTracker ssTracker = mCdmaPhone.mSST; + ssTracker.processPendingRadioPowerOffAfterDataOff(); + phone.notifyDataConnection(reason); if (retryAfterDisconnected(reason)) { trySetupData(reason); @@ -849,6 +800,22 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { } } + private void onCdmaOtaProvision(AsyncResult ar) { + if (ar.exception != null) { + int [] otaPrivision = (int [])ar.result; + if ((otaPrivision != null) && (otaPrivision.length > 1)) { + switch (otaPrivision[0]) { + case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED: + case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED: + mRetryMgr.resetRetryCount(); + break; + default: + break; + } + } + } + } + private void writeEventLogCdmaDataDrop() { CdmaCellLocation loc = (CdmaCellLocation)(phone.getCellLocation()); int bsid = (loc != null) ? loc.getBaseStationId() : -1; @@ -901,28 +868,28 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { } } - String getInterfaceName() { + protected String getInterfaceName(String apnType) { if (mActiveDataConnection != null) { return mActiveDataConnection.getInterface(); } return null; } - protected String getIpAddress() { + protected String getIpAddress(String apnType) { if (mActiveDataConnection != null) { return mActiveDataConnection.getIpAddress(); } return null; } - String getGateway() { + protected String getGateway(String apnType) { if (mActiveDataConnection != null) { return mActiveDataConnection.getGatewayAddress(); } return null; } - protected String[] getDnsServers() { + protected String[] getDnsServers(String apnType) { if (mActiveDataConnection != null) { return mActiveDataConnection.getDnsServers(); } @@ -957,6 +924,10 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { onDataStateChanged((AsyncResult) msg.obj); break; + case EVENT_CDMA_OTA_PROVISION: + onCdmaOtaProvision((AsyncResult) msg.obj); + break; + default: // handle the message in the super class DataConnectionTracker super.handleMessage(msg); diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java index b42cffd..b4de09b 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java @@ -131,6 +131,8 @@ final class CdmaServiceStateTracker extends ServiceStateTracker { private boolean isEriTextLoaded = false; private boolean isSubscriptionFromRuim = false; + private boolean mPendingRadioPowerOffAfterDataOff = false; + // Registration Denied Reason, General/Authentication Failure, used only for debugging purposes private String mRegistrationDeniedReason; @@ -520,6 +522,16 @@ final class CdmaServiceStateTracker extends ServiceStateTracker { } break; + case EVENT_SET_RADIO_POWER_OFF: + synchronized(this) { + if (mPendingRadioPowerOffAfterDataOff) { + if (DBG) log("EVENT_SET_RADIO_OFF, turn radio off now."); + cm.setRadioPower(false, null); + mPendingRadioPowerOffAfterDataOff = false; + } + } + break; + default: Log.e(LOG_TAG, "Unhandled message with number: " + msg.what); break; @@ -548,20 +560,23 @@ final class CdmaServiceStateTracker extends ServiceStateTracker { msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF; dcTracker.sendMessage(msg); - // Poll data state up to 50 times, with a 100ms delay - // totaling 5 sec. - // TODO: change the 5 seconds wait from blocking to non-blocking. - for (int i = 0; i < 50; i++) { - DataConnectionTracker.State currentState = dcTracker.getState(); - if (currentState != DataConnectionTracker.State.CONNECTED - && currentState != DataConnectionTracker.State.DISCONNECTING) { - if (DBG) log("Data shutdown complete."); - break; + synchronized(this) { + if (!mPendingRadioPowerOffAfterDataOff) { + DataConnectionTracker.State currentState = dcTracker.getState(); + if (currentState != DataConnectionTracker.State.CONNECTED + && currentState != DataConnectionTracker.State.DISCONNECTING) { + if (DBG) log("Data disconnected, turn off radio right away."); + cm.setRadioPower(false, null); + } + else if (sendEmptyMessageDelayed(EVENT_SET_RADIO_POWER_OFF, 5000)) { + if (DBG) log("Wait 5 sec for data to be disconnected, then turn off radio."); + mPendingRadioPowerOffAfterDataOff = true; + } else { + Log.w(LOG_TAG, "Cannot send delayed Msg, turn off radio right away."); + cm.setRadioPower(false, null); + } } - SystemClock.sleep(DATA_STATE_POLL_SLEEP_MS); } - // If it's on and available and we want it off.. - cm.setRadioPower(false, null); } // Otherwise, we're in the desired state } @@ -1582,4 +1597,22 @@ final class CdmaServiceStateTracker extends ServiceStateTracker { public boolean isMinInfoReady() { return mIsMinInfoReady; } + + /** + * process the pending request to turn radio off after data is disconnected + * + * return true if there is pending request to process; false otherwise. + */ + public boolean processPendingRadioPowerOffAfterDataOff() { + synchronized(this) { + if (mPendingRadioPowerOffAfterDataOff) { + if (DBG) log("Process pending request to turn radio off."); + removeMessages(EVENT_SET_RADIO_POWER_OFF); + cm.setRadioPower(false, null); + mPendingRadioPowerOffAfterDataOff = false; + return true; + } + return false; + } + } } diff --git a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java index 94d4344..bb04a43 100755 --- a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java +++ b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java @@ -102,7 +102,6 @@ public class GSMPhone extends PhoneBase { GsmCallTracker mCT; GsmServiceStateTracker mSST; GsmSMSDispatcher mSMS; - GsmDataConnectionTracker mDataConnection; SIMRecords mSIMRecords; SimCard mSimCard; StkService mStkService; @@ -280,14 +279,6 @@ public class GSMPhone extends PhoneBase { return "GSM"; } - public String[] getActiveApnTypes() { - return mDataConnection.getActiveApnTypes(); - } - - public String getActiveApn() { - return mDataConnection.getActiveApnString(); - } - public SignalStrength getSignalStrength() { return mSST.mSignalStrength; } @@ -1145,38 +1136,10 @@ public class GSMPhone extends PhoneBase { return mDataConnection.setDataEnabled(true); } - public int enableApnType(String type) { - return mDataConnection.enableApnType(type); - } - - public int disableApnType(String type) { - return mDataConnection.disableApnType(type); - } - public boolean disableDataConnectivity() { return mDataConnection.setDataEnabled(false); } - public String getInterfaceName(String apnType) { - return mDataConnection.getInterfaceName(apnType); - } - - public String getIpAddress(String apnType) { - return mDataConnection.getIpAddress(apnType); - } - - public String getGateway(String apnType) { - return mDataConnection.getGateway(apnType); - } - - public String[] getDnsServers(String apnType) { - return mDataConnection.getDnsServers(apnType); - } - - public boolean isDataConnectivityEnabled() { - return mDataConnection.getDataEnabled(); - } - /** * The only circumstances under which we report that data connectivity is not * possible are @@ -1543,36 +1506,6 @@ public class GSMPhone extends PhoneBase { } } } - /** - * simulateDataConnection - * - * simulates various data connection states. This messes with - * DataConnectionTracker's internal states, but doesn't actually change - * the underlying radio connection states. - * - * @param state Phone.DataState enum. - */ - public void simulateDataConnection(Phone.DataState state) { - DataConnectionTracker.State dcState; - - switch (state) { - case CONNECTED: - dcState = DataConnectionTracker.State.CONNECTED; - break; - case SUSPENDED: - dcState = DataConnectionTracker.State.CONNECTED; - break; - case DISCONNECTED: - dcState = DataConnectionTracker.State.FAILED; - break; - default: - dcState = DataConnectionTracker.State.CONNECTING; - break; - } - - mDataConnection.setState(dcState); - notifyDataConnection(null); - } /** * Retrieves the PhoneSubInfo of the GSMPhone diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index bf60bfe..b9688f3 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -63,8 +63,7 @@ import java.util.ArrayList; * {@hide} */ public final class GsmDataConnectionTracker extends DataConnectionTracker { - private static final String LOG_TAG = "GSM"; - private static final boolean DBG = true; + protected final String LOG_TAG = "GSM"; private GSMPhone mGsmPhone; /** @@ -96,8 +95,6 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { private int mPdpResetCount = 0; private boolean mIsScreenOn = true; - private final RetryManager mRetryMgr = new RetryManager(); - /** Delay between APN attempts */ protected static final int APN_DELAY_MILLIS = 5000; @@ -121,31 +118,17 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { private ApnSetting preferredApn = null; + /* Currently active APN */ + protected ApnSetting mActiveApn; + /** * pdpList holds all the PDP connection, i.e. IP Link in GPRS */ private ArrayList<DataConnection> pdpList; - /** Currently requested APN type */ - private String mRequestedApnType = Phone.APN_TYPE_DEFAULT; - - /** Currently active APN */ - private ApnSetting mActiveApn; - /** Currently active PdpConnection */ private PdpConnection mActivePdp; - private static int APN_INVALID_ID = -1; - private static int APN_DEFAULT_ID = 0; - private static int APN_MMS_ID = 1; - private static int APN_SUPL_ID = 2; - private static int APN_DUN_ID = 3; - private static int APN_HIPRI_ID = 4; - private static int APN_NUM_TYPES = 5; - - private boolean[] dataEnabled = new boolean[APN_NUM_TYPES]; - private int enabledCount = 0; - /** Is packet service restricted by network */ private boolean mIsPsRestricted = false; @@ -295,7 +278,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { if(DBG) Log.d(LOG_TAG, "GsmDataConnectionTracker finalized"); } - void setState(State s) { + protected void setState(State s) { if (DBG) log ("setState: " + s); if (state != s) { if (s == State.INITING) { // request PDP context @@ -319,7 +302,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } } - String[] getActiveApnTypes() { + public String[] getActiveApnTypes() { String[] result; if (mActiveApn != null) { result = mActiveApn.types; @@ -338,87 +321,6 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return result; } - protected int apnTypeToId(String type) { - if (TextUtils.equals(type, Phone.APN_TYPE_DEFAULT)) { - return APN_DEFAULT_ID; - } else if (TextUtils.equals(type, Phone.APN_TYPE_MMS)) { - return APN_MMS_ID; - } else if (TextUtils.equals(type, Phone.APN_TYPE_SUPL)) { - return APN_SUPL_ID; - } else if (TextUtils.equals(type, Phone.APN_TYPE_DUN)) { - return APN_DUN_ID; - } else if (TextUtils.equals(type, Phone.APN_TYPE_HIPRI)) { - return APN_HIPRI_ID; - } else { - return APN_INVALID_ID; - } - } - - /** - * Ensure that we are connected to an APN of the specified type. - * @param type the APN type (currently the only valid values - * are {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}) - * @return the result of the operation. Success is indicated by - * a return value of either {@code Phone.APN_ALREADY_ACTIVE} or - * {@code Phone.APN_REQUEST_STARTED}. In the latter case, a broadcast - * will be sent by the ConnectivityManager when a connection to - * the APN has been established. - */ - protected int enableApnType(String type) { - int id = apnTypeToId(type); - if (id == APN_INVALID_ID) { - return Phone.APN_REQUEST_FAILED; - } - - // If already active, return - if(DBG) Log.d(LOG_TAG, "enableApnType("+type+"), isApnTypeActive = " - + isApnTypeActive(type) + " and state = " + state); - if (isApnTypeActive(type)) { - if (state == State.INITING) return Phone.APN_REQUEST_STARTED; - else if (state == State.CONNECTED) return Phone.APN_ALREADY_ACTIVE; - } - - if (!isApnTypeAvailable(type)) { - return Phone.APN_TYPE_NOT_AVAILABLE; - } - - setEnabled(id, true); - mRequestedApnType = type; - sendMessage(obtainMessage(EVENT_ENABLE_NEW_APN)); - return Phone.APN_REQUEST_STARTED; - } - - /** - * The APN of the specified type is no longer needed. Ensure that if - * use of the default APN has not been explicitly disabled, we are connected - * to the default APN. - * @param type the APN type. The only valid values are currently - * {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}. - * @return - */ - protected int disableApnType(String type) { - if (DBG) Log.d(LOG_TAG, "disableApnType("+type+")"); - int id = apnTypeToId(type); - if (id == APN_INVALID_ID) { - return Phone.APN_REQUEST_FAILED; - } - if (isEnabled(id)) { - setEnabled(id, false); - if (isApnTypeActive(Phone.APN_TYPE_DEFAULT)) { - mRequestedApnType = Phone.APN_TYPE_DEFAULT; - if (dataEnabled[APN_DEFAULT_ID]) { - return Phone.APN_ALREADY_ACTIVE; - } else { - return Phone.APN_REQUEST_STARTED; - } - } else { - return Phone.APN_REQUEST_STARTED; - } - } else { - return Phone.APN_REQUEST_FAILED; - } - } - /** * The data connection is expected to be setup while device * 1. has sim card @@ -429,7 +331,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { * @return false while no data connection if all above requirements are met. */ public boolean isDataConnectionAsDesired() { - boolean roaming = phone.getServiceState().getRoaming(); + boolean roaming = getDataRoaming(); if (mGsmPhone.mSIMRecords.getRecordsLoaded() && mGsmPhone.mSST.getCurrentGprsState() == ServiceState.STATE_IN_SERVICE && @@ -441,12 +343,18 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return true; } - private boolean isApnTypeActive(String type) { - // TODO: to support simultaneous, mActiveApn can be a List instead. + private boolean getDataRoaming() { + return mGsmPhone.mSST.getDataRoaming(); + } + + @Override + protected boolean isApnTypeActive(String type) { + // TODO: support simultaneous with List instead return mActiveApn != null && mActiveApn.canHandleType(type); } - private boolean isApnTypeAvailable(String type) { + @Override + protected boolean isApnTypeAvailable(String type) { if (allApns != null) { for (ApnSetting apn : allApns) { if (apn.canHandleType(type)) { @@ -457,80 +365,6 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return false; } - private boolean isEnabled(int id) { - if (id != APN_INVALID_ID) { - return dataEnabled[id]; - } - return false; - } - - private void setEnabled(int id, boolean enable) { - if (DBG) Log.d(LOG_TAG, "setEnabled(" + id + ", " + enable + ')'); - if (dataEnabled[id] != enable) { - dataEnabled[id] = enable; - - if (enable) { - enabledCount++; - } else { - enabledCount--; - } - - if (enabledCount == 0) { - setPrivateDataEnabled(false); - } else if (enabledCount == 1) { - setPrivateDataEnabled(true); - } - } - } - - /** - * Prevent mobile data connections from being established, - * or once again allow mobile data connections. If the state - * toggles, then either tear down or set up data, as - * appropriate to match the new state. - * <p>This operation only affects the default APN, and if the same APN is - * currently being used for MMS traffic, the teardown will not happen - * even when {@code enable} is {@code false}.</p> - * @param enable indicates whether to enable ({@code true}) or disable ({@code false}) data - * @return {@code true} if the operation succeeded - */ - public boolean setDataEnabled(boolean enable) { - if (DBG) Log.d(LOG_TAG, "setDataEnabled("+enable+")"); - setEnabled(APN_DEFAULT_ID, enable); - return true; - } - - private void setPrivateDataEnabled(boolean enable) { - if (DBG) Log.d(LOG_TAG, "setPrivateDataEnabled("+enable+")"); - if (enable) { - sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA)); - } else { - Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION); - msg.arg1 = 1; // tearDown is true - msg.obj = Phone.REASON_DATA_DISABLED; - sendMessage(msg); - } - } - - /** - * Report the current state of data connectivity (enabled or disabled) for - * the default APN. - * @return {@code false} if data connectivity has been explicitly disabled, - * {@code true} otherwise. - */ - public boolean getDataEnabled() { - return dataEnabled[APN_DEFAULT_ID]; - } - - /** - * Report on whether data connectivity is enabled for any APN. - * @return {@code false} if data connectivity has been explicitly disabled, - * {@code true} otherwise. - */ - public boolean getAnyDataEnabled() { - return (enabledCount != 0); - } - /** * Formerly this method was ArrayList<PdpConnection> getAllPdps() */ @@ -540,7 +374,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } private boolean isDataAllowed() { - boolean roaming = phone.getServiceState().getRoaming(); + boolean roaming = getDataRoaming(); return getAnyDataEnabled() && (!roaming || getDataOnRoamingEnabled()); } @@ -587,7 +421,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } int gprsState = mGsmPhone.mSST.getCurrentGprsState(); - boolean roaming = phone.getServiceState().getRoaming(); + boolean roaming = getDataRoaming(); boolean desiredPowerState = mGsmPhone.mSST.getDesiredPowerState(); if ((state == State.IDLE || state == State.SCANNING) @@ -746,7 +580,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return true; } - String getInterfaceName(String apnType) { + protected String getInterfaceName(String apnType) { if (mActivePdp != null && (apnType == null || mActiveApn.canHandleType(apnType))) { return mActivePdp.getInterface(); @@ -762,7 +596,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return null; } - String getGateway(String apnType) { + public String getGateway(String apnType) { if (mActivePdp != null && (apnType == null || mActiveApn.canHandleType(apnType))) { return mActivePdp.getGatewayAddress(); @@ -1244,16 +1078,38 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { trySetupData(reason); } + /** + * Check the data roaming consistency since this can be triggered by + * voice roaming flag of ServiceState in setDataOnRoamingEnabled() + * + * TODO make this triggered by data roaming state only + */ + @Override protected void onRoamingOff() { - trySetupData(Phone.REASON_ROAMING_OFF); + if (!getDataRoaming()) { //data roaming is off + trySetupData(Phone.REASON_ROAMING_OFF); + } else { // Inconsistent! data roaming is on + sendMessage(obtainMessage(EVENT_ROAMING_ON)); + } } + /** + * Check the data roaming consistency since this can be triggered by + * voice roaming flag of ServiceState in setDataOnRoamingEnabled() + * + * TODO make this triggered by data roaming state only + */ + @Override protected void onRoamingOn() { - if (getDataOnRoamingEnabled()) { - trySetupData(Phone.REASON_ROAMING_ON); - } else { - if (DBG) log("Tear down data connection on roaming."); - cleanUpConnection(true, Phone.REASON_ROAMING_ON); + if (getDataRoaming()) { // data roaming is on + if (getDataOnRoamingEnabled()) { + trySetupData(Phone.REASON_ROAMING_ON); + } else { + if (DBG) log("Tear down data connection on roaming."); + cleanUpConnection(true, Phone.REASON_ROAMING_ON); + } + } else { // Inconsistent! data roaming is off + sendMessage(obtainMessage(EVENT_ROAMING_OFF)); } } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java index 4178115..0c040e6 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java @@ -88,6 +88,9 @@ final class GsmServiceStateTracker extends ServiceStateTracker { private int newNetworkType = 0; /* gsm roaming status solely based on TS 27.007 7.2 CREG */ private boolean mGsmRoaming = false; + /* data roaming status solely based on TS 27.007 10.1.19 CGREG */ + private boolean mDataRoaming = false; + private boolean newDataRoaming = false; private RegistrantList gprsAttachedRegistrants = new RegistrantList(); private RegistrantList gprsDetachedRegistrants = new RegistrantList(); @@ -311,6 +314,10 @@ final class GsmServiceStateTracker extends ServiceStateTracker { psRestrictDisabledRegistrants.remove(h); } + /*protected*/ boolean getDataRoaming() { + return mDataRoaming; + } + //***** Called from GSMPhone public void getLacAndCid(Message onComplete) { @@ -668,6 +675,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { } } newGPRSState = regCodeToServiceState(regState); + newDataRoaming = regCodeIsRoaming(regState); newNetworkType = type; break; @@ -695,6 +703,11 @@ final class GsmServiceStateTracker extends ServiceStateTracker { if (pollingContext[0] == 0) { newSS.setRoaming(isRoamingBetweenOperators(mGsmRoaming, newSS)); + // when both roaming indicators are true but not roaming between + // operators, roaming should set to false. + if (newDataRoaming && mGsmRoaming && !newSS.getRoaming()) { + newDataRoaming = false; + } pollStateDone(); } @@ -724,6 +737,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { newCellLoc.setStateInvalid(); setSignalStrengthDefaultValues(); mGotCountryCode = false; + newDataRoaming = false; pollStateDone(); break; @@ -733,6 +747,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { newCellLoc.setStateInvalid(); setSignalStrengthDefaultValues(); mGotCountryCode = false; + newDataRoaming = false; pollStateDone(); break; @@ -747,6 +762,8 @@ final class GsmServiceStateTracker extends ServiceStateTracker { newCellLoc.setStateInvalid(); setSignalStrengthDefaultValues(); mGotCountryCode = false; + newDataRoaming = false; + mDataRoaming = false; //NOTE: pollStateDone() is not needed in this case break; @@ -831,9 +848,9 @@ final class GsmServiceStateTracker extends ServiceStateTracker { boolean hasChanged = !newSS.equals(ss); - boolean hasRoamingOn = !ss.getRoaming() && newSS.getRoaming(); + boolean hasRoamingOn = !mDataRoaming && newDataRoaming; - boolean hasRoamingOff = ss.getRoaming() && !newSS.getRoaming(); + boolean hasRoamingOff = mDataRoaming && !newDataRoaming; boolean hasLocationChanged = !newCellLoc.equals(cellLoc); @@ -850,6 +867,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { gprsState = newGPRSState; networkType = newNetworkType; + mDataRoaming = newDataRoaming; newSS.setStateOutOfService(); // clean slate for next time |