diff options
author | Brad Ebinger <breadley@google.com> | 2016-08-09 15:47:41 -0700 |
---|---|---|
committer | Brad Ebinger <breadley@google.com> | 2016-08-11 14:59:55 -0700 |
commit | cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9 (patch) | |
tree | 9e044710db56fb2c78587d3a26fd33a213178229 /src | |
parent | 508daf6f8286407cf34e32750148fad120009c13 (diff) | |
download | android_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-x | src/java/com/android/internal/telephony/GsmCdmaCallTracker.java | 12 | ||||
-rw-r--r-- | src/java/com/android/internal/telephony/GsmCdmaConnection.java | 81 |
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; } } |