summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Kasick <mike@kasick.org>2012-02-03 16:23:03 -0500
committerScott <Tortel1210@gmail.com>2012-02-28 22:40:20 -0500
commitc9a82b44209001856b8b2cb633945006f6d55503 (patch)
tree8453199531842652e3cf08cbf0c2b385258eead1
parent87b1801966418e7d244add9af7813dc7b1553198 (diff)
downloadframeworks_base-c9a82b44209001856b8b2cb633945006f6d55503.zip
frameworks_base-c9a82b44209001856b8b2cb633945006f6d55503.tar.gz
frameworks_base-c9a82b44209001856b8b2cb633945006f6d55503.tar.bz2
Add more CDMA SamsungRIL fixes.
Adds a collection of CDMA device fixes to SamsungRIL. They include: - Overriding ERROR_UNSPECIFIED fail cause with NORMAL_CLEARING, to prevent far-end hangups from displaying the "Call Lost" dialog. - Adding, and ignoring the RIL_UNSOL_GPS_NOTI request, which is also ignored in the TW RIL, to keep the radio log clean of exceptions when the GPS is active. - Workaround for Samsung CDMA "ring of death" bug. See source comments for details on this problem. Change-Id: Ida4797718ad3463d073a6fc27246cc916526d487
-rw-r--r--telephony/java/com/android/internal/telephony/SamsungRIL.java78
1 files changed, 77 insertions, 1 deletions
diff --git a/telephony/java/com/android/internal/telephony/SamsungRIL.java b/telephony/java/com/android/internal/telephony/SamsungRIL.java
index 1df713a..9374374 100644
--- a/telephony/java/com/android/internal/telephony/SamsungRIL.java
+++ b/telephony/java/com/android/internal/telephony/SamsungRIL.java
@@ -32,6 +32,8 @@ import com.android.internal.telephony.RILConstants;
import com.android.internal.telephony.SmsResponse;
import com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
import com.android.internal.telephony.cdma.CdmaInformationRecords;
+import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaSignalInfoRec;
+import com.android.internal.telephony.cdma.SignalToneUtil;
import android.util.Log;
@@ -57,6 +59,7 @@ public SamsungRIL(Context context, int networkMode, int cdmaSubscription) {
static final int RIL_UNSOL_HSDPA_STATE_CHANGED = 11016;
static final int RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST = 11012;
static final int RIL_REQUEST_DIAL_EMERGENCY = 10016;
+ static final int RIL_UNSOL_GPS_NOTI = 11009;
@Override
public void
@@ -151,7 +154,7 @@ public SamsungRIL(Context context, int networkMode, int cdmaSubscription) {
case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: ret = responseVoid(p); break;
case RIL_REQUEST_CONFERENCE: ret = responseVoid(p); break;
case RIL_REQUEST_UDUB: ret = responseVoid(p); break;
- case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: ret = responseInts(p); break;
+ case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: ret = responseLastCallFailCause(p); break;
case RIL_REQUEST_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break;
case RIL_REQUEST_REGISTRATION_STATE: ret = responseStrings(p); break;
case RIL_REQUEST_GPRS_REGISTRATION_STATE: ret = responseStrings(p); break;
@@ -379,6 +382,7 @@ public SamsungRIL(Context context, int networkMode, int cdmaSubscription) {
case RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST: ret = responseVoid(p); break;
case RIL_UNSOL_STK_SEND_SMS_RESULT: ret = responseVoid(p); break;
case RIL_UNSOL_DEVICE_READY_NOTI: ret = responseVoid(p); break;
+ case RIL_UNSOL_GPS_NOTI: ret = responseVoid(p); break; // Ignored in TW RIL.
case RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_2: ret = responseVoid(p); break;
default:
@@ -797,6 +801,22 @@ public SamsungRIL(Context context, int networkMode, int cdmaSubscription) {
return response;
}
+
+ protected Object
+ responseLastCallFailCause(Parcel p) {
+ int response[] = (int[])responseInts(p);
+
+ if (mIsSamsungCdma && response.length > 0 &&
+ response[0] == com.android.internal.telephony.cdma.CallFailCause.ERROR_UNSPECIFIED) {
+
+ // Far-end hangup returns ERROR_UNSPECIFIED, which shows "Call Lost" dialog.
+ Log.d(LOG_TAG, "Overriding ERROR_UNSPECIFIED fail cause with NORMAL_CLEARING.");
+ response[0] = com.android.internal.telephony.cdma.CallFailCause.NORMAL_CLEARING;
+ }
+
+ return response;
+ }
+
@Override
protected Object
responseSignalStrength(Parcel p) {
@@ -842,6 +862,62 @@ public SamsungRIL(Context context, int networkMode, int cdmaSubscription) {
return response;
}
+
+ // Workaround for Samsung CDMA "ring of death" bug:
+ //
+ // Symptom: As soon as the phone receives notice of an incoming call, an
+ // audible "old fashioned ring" is emitted through the earpiece and
+ // persists through the duration of the call, or until reboot if the call
+ // isn't answered.
+ //
+ // Background: The CDMA telephony stack implements a number of "signal info
+ // tones" that are locally generated by ToneGenerator and mixed into the
+ // voice call path in response to radio RIL_UNSOL_CDMA_INFO_REC requests.
+ // One of these tones, IS95_CONST_IR_SIG_IS54B_L, is requested by the
+ // radio just prior to notice of an incoming call when the voice call
+ // path is muted. CallNotifier is responsible for stopping all signal
+ // tones (by "playing" the TONE_CDMA_SIGNAL_OFF tone) upon receipt of a
+ // "new ringing connection", prior to unmuting the voice call path.
+ //
+ // Problem: CallNotifier's incoming call path is designed to minimize
+ // latency to notify users of incoming calls ASAP. Thus,
+ // SignalInfoTonePlayer requests are handled asynchronously by spawning a
+ // one-shot thread for each. Unfortunately the ToneGenerator API does
+ // not provide a mechanism to specify an ordering on requests, and thus,
+ // unexpected thread interleaving may result in ToneGenerator processing
+ // them in the opposite order that CallNotifier intended. In this case,
+ // playing the "signal off" tone first, followed by playing the "old
+ // fashioned ring" indefinitely.
+ //
+ // Solution: An API change to ToneGenerator is required to enable
+ // SignalInfoTonePlayer to impose an ordering on requests (i.e., drop any
+ // request that's older than the most recent observed). Such a change,
+ // or another appropriate fix should be implemented in AOSP first.
+ //
+ // Workaround: Intercept RIL_UNSOL_CDMA_INFO_REC requests from the radio,
+ // check for a signal info record matching IS95_CONST_IR_SIG_IS54B_L, and
+ // drop it so it's never seen by CallNotifier. If other signal tones are
+ // observed to cause this problem, they should be dropped here as well.
+ @Override
+ protected void
+ notifyRegistrantsCdmaInfoRec(CdmaInformationRecords infoRec) {
+ final int response = RIL_UNSOL_CDMA_INFO_REC;
+
+ if (/* mIsSamsungCdma && */ infoRec.record instanceof CdmaSignalInfoRec) {
+ CdmaSignalInfoRec sir = (CdmaSignalInfoRec)infoRec.record;
+ if (sir != null && sir.isPresent &&
+ sir.signalType == SignalToneUtil.IS95_CONST_IR_SIGNAL_IS54B &&
+ sir.alertPitch == SignalToneUtil.IS95_CONST_IR_ALERT_MED &&
+ sir.signal == SignalToneUtil.IS95_CONST_IR_SIG_IS54B_L) {
+
+ Log.d(LOG_TAG, "Dropping \"" + responseToString(response) + " " +
+ retToString(response, sir) + "\" to prevent \"ring of death\" bug.");
+ return;
+ }
+ }
+
+ super.notifyRegistrantsCdmaInfoRec(infoRec);
+ }
protected class SamsungDriverCall extends DriverCall {
@Override