aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBrad Ebinger <breadley@google.com>2016-08-09 15:47:41 -0700
committerBrad Ebinger <breadley@google.com>2016-08-11 14:59:55 -0700
commitcdcf059efaf8f413cecc88f3ef8e05ef811fa5e9 (patch)
tree9e044710db56fb2c78587d3a26fd33a213178229 /src
parent508daf6f8286407cf34e32750148fad120009c13 (diff)
downloadandroid_frameworks_opt_telephony-cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9.tar.gz
android_frameworks_opt_telephony-cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9.tar.bz2
android_frameworks_opt_telephony-cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9.zip
Stop OUT_OF_SERVICE message during Emergency Call
Currently, the radio can report an OUT_OF_SERVICE (but Emergency calls are available) status from the radio during an emergency call if that call is made when there is no SIM card available or the SIM card is locked. If the remote party disconnects, we mistakenly show a "Cellular Network not Available" dialog when a call ends successfully because the disconnect cause is mapped to OUT_OF_SERVICE. We now check to see if the call was an emergency call before mapping to that disconnect cause. Bug: 30657253 Change-Id: I7bf16c502c12125506ed31a56278f68ea39737ac
Diffstat (limited to 'src')
-rwxr-xr-xsrc/java/com/android/internal/telephony/GsmCdmaCallTracker.java12
-rw-r--r--src/java/com/android/internal/telephony/GsmCdmaConnection.java81
2 files changed, 52 insertions, 41 deletions
diff --git a/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java b/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
index 2cc4336e5..993ac6d69 100755
--- a/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
@@ -298,9 +298,10 @@ public class GsmCdmaCallTracker extends CallTracker {
//we should have failed in !canDial() above before we get here
throw new CallStateException("cannot dial in current state");
}
-
+ boolean isEmergencyCall = PhoneNumberUtils.isLocalEmergencyNumber(mPhone.getContext(),
+ dialString);
mPendingMO = new GsmCdmaConnection(mPhone, checkForTestEmergencyNumber(dialString),
- this, mForegroundCall);
+ this, mForegroundCall, isEmergencyCall);
mHangupPendingMO = false;
if ( mPendingMO.getAddress() == null || mPendingMO.getAddress().length() == 0
@@ -411,7 +412,7 @@ public class GsmCdmaCallTracker extends CallTracker {
}
mPendingMO = new GsmCdmaConnection(mPhone, checkForTestEmergencyNumber(dialString),
- this, mForegroundCall);
+ this, mForegroundCall, isEmergencyCall);
mHangupPendingMO = false;
if ( mPendingMO.getAddress() == null || mPendingMO.getAddress().length() == 0
@@ -454,12 +455,13 @@ public class GsmCdmaCallTracker extends CallTracker {
//CDMA
private Connection dialThreeWay(String dialString) {
if (!mForegroundCall.isIdle()) {
- // Check data call
+ // Check data call and possibly set mIsInEmergencyCall
disableDataCallInEmergencyCall(dialString);
// Attach the new connection to foregroundCall
mPendingMO = new GsmCdmaConnection(mPhone,
- checkForTestEmergencyNumber(dialString), this, mForegroundCall);
+ checkForTestEmergencyNumber(dialString), this, mForegroundCall,
+ mIsInEmergencyCall);
// Some network need a empty flash before sending the normal one
m3WayCallFlashDelay = mPhone.getContext().getResources()
.getInteger(com.android.internal.R.integer.config_cdma_3waycall_flash_delay);
diff --git a/src/java/com/android/internal/telephony/GsmCdmaConnection.java b/src/java/com/android/internal/telephony/GsmCdmaConnection.java
index a195bd171..1530ada70 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaConnection.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaConnection.java
@@ -71,6 +71,8 @@ public class GsmCdmaConnection extends Connection {
private PowerManager.WakeLock mPartialWakeLock;
+ private boolean mIsEmergencyCall = false;
+
// The cached delay to be used between DTMF tones fetched from carrier config.
private int mDtmfToneDelay = 0;
@@ -116,7 +118,7 @@ public class GsmCdmaConnection extends Connection {
//***** Constructors
- /** This is probably an MT call that we first saw in a CLCC response */
+ /** This is probably an MT call that we first saw in a CLCC response or a hand over. */
public GsmCdmaConnection (GsmCdmaPhone phone, DriverCall dc, GsmCdmaCallTracker ct, int index) {
super(phone.getPhoneType());
createWakeLock(phone.getContext());
@@ -126,7 +128,7 @@ public class GsmCdmaConnection extends Connection {
mHandler = new MyHandler(mOwner.getLooper());
mAddress = dc.number;
-
+ mIsEmergencyCall = PhoneNumberUtils.isLocalEmergencyNumber(phone.getContext(), mAddress);
mIsIncoming = dc.isMT;
mCreateTime = System.currentTimeMillis();
mCnapName = dc.name;
@@ -144,7 +146,7 @@ public class GsmCdmaConnection extends Connection {
/** This is an MO call, created when dialing */
public GsmCdmaConnection (GsmCdmaPhone phone, String dialString, GsmCdmaCallTracker ct,
- GsmCdmaCall parent) {
+ GsmCdmaCall parent, boolean isEmergencyCall) {
super(phone.getPhoneType());
createWakeLock(phone.getContext());
acquireWakeLock();
@@ -155,13 +157,16 @@ public class GsmCdmaConnection extends Connection {
if (isPhoneTypeGsm()) {
mDialString = dialString;
} else {
- Rlog.d(LOG_TAG, "[GsmCdmaConn] GsmCdmaConnection: dialString=" + maskDialString(dialString));
+ Rlog.d(LOG_TAG, "[GsmCdmaConn] GsmCdmaConnection: dialString=" +
+ maskDialString(dialString));
dialString = formatDialString(dialString);
Rlog.d(LOG_TAG,
- "[GsmCdmaConn] GsmCdmaConnection:formated dialString=" + maskDialString(dialString));
+ "[GsmCdmaConn] GsmCdmaConnection:formated dialString=" +
+ maskDialString(dialString));
}
mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString);
+ mIsEmergencyCall = isEmergencyCall;
mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString);
mIndex = -1;
@@ -491,45 +496,49 @@ public class GsmCdmaConnection extends Connection {
int serviceState = phone.getServiceState().getState();
UiccCardApplication cardApp = phone.getUiccCardApplication();
AppState uiccAppState = (cardApp != null) ? cardApp.getState() :
- AppState.APPSTATE_UNKNOWN;
+ AppState.APPSTATE_UNKNOWN;
if (serviceState == ServiceState.STATE_POWER_OFF) {
return DisconnectCause.POWER_OFF;
- } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE
- || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) {
- return DisconnectCause.OUT_OF_SERVICE;
- } else {
- if (isPhoneTypeGsm()) {
- if (uiccAppState != AppState.APPSTATE_READY) {
+ }
+ if (!mIsEmergencyCall) {
+ // Only send OUT_OF_SERVICE if it is not an emergency call. We can still
+ // technically be in STATE_OUT_OF_SERVICE or STATE_EMERGENCY_ONLY during
+ // an emergency call and when it ends, we do not want to mistakenly generate
+ // an OUT_OF_SERVICE disconnect cause during normal call ending.
+ if ((serviceState == ServiceState.STATE_OUT_OF_SERVICE
+ || serviceState == ServiceState.STATE_EMERGENCY_ONLY)) {
+ return DisconnectCause.OUT_OF_SERVICE;
+ }
+ // If we are placing an emergency call and the SIM is currently PIN/PUK
+ // locked the AppState will always not be equal to APPSTATE_READY.
+ if (uiccAppState != AppState.APPSTATE_READY) {
+ if (isPhoneTypeGsm()) {
return DisconnectCause.ICC_ERROR;
- } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) {
- if (phone.mSST.mRestrictedState.isCsRestricted()) {
- return DisconnectCause.CS_RESTRICTED;
- } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) {
- return DisconnectCause.CS_RESTRICTED_EMERGENCY;
- } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) {
- return DisconnectCause.CS_RESTRICTED_NORMAL;
- } else {
- return DisconnectCause.ERROR_UNSPECIFIED;
+ } else { // CDMA
+ if (phone.mCdmaSubscriptionSource ==
+ CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM) {
+ return DisconnectCause.ICC_ERROR;
}
- } else if (causeCode == CallFailCause.NORMAL_CLEARING) {
- return DisconnectCause.NORMAL;
- } else {
- // If nothing else matches, report unknown call drop reason
- // to app, not NORMAL call end.
- return DisconnectCause.ERROR_UNSPECIFIED;
}
- } else {
- if (phone.mCdmaSubscriptionSource ==
- CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM
- && uiccAppState != AppState.APPSTATE_READY) {
- return DisconnectCause.ICC_ERROR;
- } else if (causeCode==CallFailCause.NORMAL_CLEARING) {
- return DisconnectCause.NORMAL;
- } else {
- return DisconnectCause.ERROR_UNSPECIFIED;
+ }
+ }
+ if (isPhoneTypeGsm()) {
+ if (causeCode == CallFailCause.ERROR_UNSPECIFIED) {
+ if (phone.mSST.mRestrictedState.isCsRestricted()) {
+ return DisconnectCause.CS_RESTRICTED;
+ } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) {
+ return DisconnectCause.CS_RESTRICTED_EMERGENCY;
+ } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) {
+ return DisconnectCause.CS_RESTRICTED_NORMAL;
}
}
}
+ if (causeCode == CallFailCause.NORMAL_CLEARING) {
+ return DisconnectCause.NORMAL;
+ }
+ // If nothing else matches, report unknown call drop reason
+ // to app, not NORMAL call end.
+ return DisconnectCause.ERROR_UNSPECIFIED;
}
}