From e025391bf499e41650fe6508ac78f097559a31a4 Mon Sep 17 00:00:00 2001 From: Wink Saville Date: Mon, 17 Oct 2011 12:50:32 -0700 Subject: [PATCH] Add DataConnection#isEmergency and use in trySetupData. If an emergency is occurring we may not want to allow data calls. An emergency is defined as in an Emergency call or in the emergency call back mode. I've added isInEcm and isEmergencyCall to PhoneBase and CDMAPhone. And in DataConnectionTracker added isEmergency which is the or of isInEcm, isEmergencyCall. Also, removed some optimization code in DataConnectionTracker onSetInternalDataEnabled because mInternalDataEnabled defaults to true when a DCT is constructed and without this change trySetupData will not be called leaving ECM if the DCT was just created. Which is what is currently happening on the ICS lead device. Also see b/5471660 as there is similar optimizations in onSetUserDataEnabled and onSetPolicyDataEnabled. Bug: 5437885 Change-Id: Iba81366300fe46eaa9aa6e457d6659b42d6fe927 --- .../telephony/DataConnectionTracker.java | 28 +++++++++++-------- .../android/internal/telephony/PhoneBase.java | 16 +++++++++++ .../internal/telephony/cdma/CDMAPhone.java | 8 ++++++ .../cdma/CdmaDataConnectionTracker.java | 2 +- .../gsm/GsmDataConnectionTracker.java | 2 +- 5 files changed, 43 insertions(+), 13 deletions(-) diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java index ae152fb62da9a..6b5638df508f5 100644 --- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java @@ -679,6 +679,15 @@ public abstract class DataConnectionTracker extends Handler { return result; } + protected boolean isEmergency() { + final boolean result; + synchronized (mDataEnabledLock) { + result = mPhone.isInEcm() || mPhone.isInEmergencyCall(); + } + log("isEmergency: result=" + result); + return result; + } + protected int apnTypeToId(String type) { if (TextUtils.equals(type, Phone.APN_TYPE_DEFAULT)) { return APN_DEFAULT_ID; @@ -998,17 +1007,14 @@ public abstract class DataConnectionTracker extends Handler { protected void onSetInternalDataEnabled(boolean enabled) { synchronized (mDataEnabledLock) { - final boolean prevEnabled = getAnyDataEnabled(); - if (mInternalDataEnabled != enabled) { - mInternalDataEnabled = enabled; - if (prevEnabled != getAnyDataEnabled()) { - if (!prevEnabled) { - resetAllRetryCounts(); - onTrySetupData(Phone.REASON_DATA_ENABLED); - } else { - cleanUpAllConnections(null); - } - } + mInternalDataEnabled = enabled; + if (enabled) { + log("onSetInternalDataEnabled: changed to enabled, try to setup data call"); + resetAllRetryCounts(); + onTrySetupData(Phone.REASON_DATA_ENABLED); + } else { + log("onSetInternalDataEnabled: changed to disabled, cleanUpAllConnections"); + cleanUpAllConnections(null); } } } diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java index a7a4908074b2f..10121dd76a373 100644 --- a/telephony/java/com/android/internal/telephony/PhoneBase.java +++ b/telephony/java/com/android/internal/telephony/PhoneBase.java @@ -832,6 +832,22 @@ public abstract class PhoneBase extends Handler implements Phone { mNotifier.notifyOtaspChanged(this, otaspMode); } + /** + * @return true if a mobile originating emergency call is active + */ + public boolean isInEmergencyCall() { + return false; + } + + /** + * @return true if we are in the emergency call back mode. This is a period where + * the phone should be using as little power as possible and be ready to receive an + * incoming call from the emergency operator. + */ + public boolean isInEcm() { + return false; + } + public abstract String getPhoneName(); public abstract int getPhoneType(); diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java index 09ee28c9a448f..58e3e5f2ab092 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java +++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java @@ -848,6 +848,14 @@ public class CDMAPhone extends PhoneBase { mUnknownConnectionRegistrants.notifyResult(this); } + public boolean isInEmergencyCall() { + return mCT.isInEmergencyCall(); + } + + public boolean isInEcm() { + return mIsPhoneInEcmState; + } + void sendEmergencyCallbackModeChange(){ //Send an Intent Intent intent = new Intent(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java index 4dace82a371f5..ea6361d065429 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java @@ -248,7 +248,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { boolean desiredPowerState = mCdmaPhone.mSST.getDesiredPowerState(); if ((mState == State.IDLE || mState == State.SCANNING) && - isDataAllowed() && getAnyDataEnabled()) { + isDataAllowed() && getAnyDataEnabled() && !isEmergency()) { boolean retValue = setupData(reason); notifyOffApnsOfAvailability(reason, retValue); return retValue; diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index 78ba7ddd0ba96..4814f358be6ea 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -686,7 +686,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { boolean desiredPowerState = mPhone.getServiceStateTracker().getDesiredPowerState(); if ((apnContext.getState() == State.IDLE || apnContext.getState() == State.SCANNING) && - isDataAllowed(apnContext) && getAnyDataEnabled()) { + isDataAllowed(apnContext) && getAnyDataEnabled() && !isEmergency()) { if (apnContext.getState() == State.IDLE) { ArrayList waitingApns = buildWaitingApns(apnContext.getApnType());