summaryrefslogtreecommitdiffstats
path: root/telephony/java
diff options
context:
space:
mode:
authorWink Saville <wink@google.com>2009-09-18 15:02:35 -0700
committerWink Saville <wink@google.com>2009-09-21 09:25:45 -0700
commitb14300140d9f8b0af4d573eb0420035f814e2d03 (patch)
tree8f9f53540c37bc8aebb59c7efff7aa806fccdf51 /telephony/java
parenta953ed4bc08cf5fc98f17a399adbd8afdd8293d5 (diff)
downloadframeworks_base-b14300140d9f8b0af4d573eb0420035f814e2d03.zip
frameworks_base-b14300140d9f8b0af4d573eb0420035f814e2d03.tar.gz
frameworks_base-b14300140d9f8b0af4d573eb0420035f814e2d03.tar.bz2
Fix several CDMA call collision cases
1. Continous ringing after receiving a call waiting while in a call, and before user answers the call waiting, the 1st call drops. If another MT call comes in, while it rings, it also drops, the phone will keep ringing. 2. Data call is not re-initiated if emergency MO call collides with an MT call. Bug: 2123287 Change-Id: I6b12a900ec60b478691544ab5326eac4952ce834
Diffstat (limited to 'telephony/java')
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java58
1 files changed, 43 insertions, 15 deletions
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
index 5bf1a0f..9fe2038 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
@@ -437,7 +437,7 @@ public final class CdmaCallTracker extends CallTracker {
new AsyncResult(null, null, null));
}
if (Phone.DEBUG_PHONE) {
- log("update phone state, old= , new= , " + oldState + state);
+ log("update phone state, old=" + oldState + " new="+ state);
}
if (state != oldState) {
phone.notifyPhoneStateChanged();
@@ -522,37 +522,44 @@ public final class CdmaCallTracker extends CallTracker {
}
} else {
if (Phone.DEBUG_PHONE) {
- log("pending Mo= , dc= " + pendingMO + dc);
+ log("pendingMo=" + pendingMO + ", dc=" + dc);
}
// find if the MT call is a new ring or unknown connection
newRinging = checkMtFindNewRinging(dc,i);
if (newRinging == null) {
unknownConnectionAppeared = true;
}
+ checkAndEnableDataCallAfterEmergencyCallDropped();
}
hasNonHangupStateChanged = true;
} else if (conn != null && dc == null) {
+ // This case means the RIL has no more active call anymore and
+ // we need to clean up the foregroundCall and ringingCall.
+ // Loop through foreground call connections as
+ // it contains the known logical connections.
int count = foregroundCall.connections.size();
- if (count == 0) {
- // Handle an unanswered MO/MT call, there is no
- // foregroundCall connections at this time.
- droppedDuringPoll.add(conn);
- } else {
- // Loop through foreground call connections as
- // it contains the known logical connections.
- for (int n = 0; n < count; n++) {
- CdmaConnection cn = (CdmaConnection)foregroundCall.connections.get(n);
- droppedDuringPoll.add(cn);
- }
+ for (int n = 0; n < count; n++) {
+ if (Phone.DEBUG_PHONE) log("adding fgCall cn " + n + " to droppedDuringPoll");
+ CdmaConnection cn = (CdmaConnection)foregroundCall.connections.get(n);
+ droppedDuringPoll.add(cn);
+ }
+ count = ringingCall.connections.size();
+ // Loop through ringing call connections as
+ // it may contain the known logical connections.
+ for (int n = 0; n < count; n++) {
+ if (Phone.DEBUG_PHONE) log("adding rgCall cn " + n + " to droppedDuringPoll");
+ CdmaConnection cn = (CdmaConnection)ringingCall.connections.get(n);
+ droppedDuringPoll.add(cn);
}
foregroundCall.setGeneric(false);
+ ringingCall.setGeneric(false);
// Re-start Ecm timer when the connected emergency call ends
if (mIsEcmTimerCanceled) {
handleEcmTimer(phone.RESTART_ECM_TIMER);
- } else {
- mIsInEmergencyCall = false;
}
+ // If emergency call is not going through while dialing
+ checkAndEnableDataCallAfterEmergencyCallDropped();
// Dropped connections are removed from the CallTracker
// list but kept in the Call list
@@ -568,6 +575,7 @@ public final class CdmaCallTracker extends CallTracker {
if (newRinging == null) {
unknownConnectionAppeared = true;
}
+ checkAndEnableDataCallAfterEmergencyCallDropped();
} else {
// Call info stored in conn is not consistent with the call info from dc.
// We should follow the rule of MT calls taking precedence over MO calls
@@ -1030,10 +1038,30 @@ public final class CdmaCallTracker extends CallTracker {
*/
private void disableDataCallInEmergencyCall(String dialString) {
if (PhoneNumberUtils.isEmergencyNumber(dialString)) {
+ if (Phone.DEBUG_PHONE) log("disableDataCallInEmergencyCall");
phone.disableDataConnectivity();
mIsInEmergencyCall = true;
}
}
+
+ /**
+ * Check and enable data call after an emergency call is dropped if it's
+ * not in ECM
+ */
+ private void checkAndEnableDataCallAfterEmergencyCallDropped() {
+ if (mIsInEmergencyCall) {
+ String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
+ if (Phone.DEBUG_PHONE) {
+ log("checkAndEnableDataCallAfterEmergencyCallDropped,inEcm=" + inEcm);
+ }
+ if (inEcm.compareTo("false") == 0) {
+ // Re-initiate data connection
+ phone.mDataConnection.setDataEnabled(true);
+ }
+ mIsInEmergencyCall = false;
+ }
+ }
+
/**
* Check the MT call to see if it's a new ring or
* a unknown connection.