summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/java/com/android/internal/telephony/HTCQualcommRIL.java13
-rw-r--r--src/java/com/android/internal/telephony/QualcommSharedRIL.java13
-rw-r--r--src/java/com/android/internal/telephony/RIL.java5
-rw-r--r--src/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java493
-rw-r--r--src/java/com/android/internal/telephony/SamsungExynos4RIL.java13
-rw-r--r--src/java/com/android/internal/telephony/SamsungQualcommM3RIL.java92
-rw-r--r--src/java/com/android/internal/telephony/SamsungQualcommRIL.java329
-rw-r--r--src/java/com/android/internal/telephony/SamsungQualcommUiccRIL.java400
8 files changed, 334 insertions, 1024 deletions
diff --git a/src/java/com/android/internal/telephony/HTCQualcommRIL.java b/src/java/com/android/internal/telephony/HTCQualcommRIL.java
index 2adebe9..2284b40 100644
--- a/src/java/com/android/internal/telephony/HTCQualcommRIL.java
+++ b/src/java/com/android/internal/telephony/HTCQualcommRIL.java
@@ -178,17 +178,4 @@ public class HTCQualcommRIL extends RIL implements CommandsInterface {
}
}
}
-
- /**
- * Notify all registrants that the ril has connected or disconnected.
- *
- * @param rilVer is the version of the ril or -1 if disconnected.
- */
- private void notifyRegistrantsRilConnectionChanged(int rilVer) {
- mRilVersion = rilVer;
- if (mRilConnectedRegistrants != null) {
- mRilConnectedRegistrants.notifyRegistrants(
- new AsyncResult (null, new Integer(rilVer), null));
- }
- }
}
diff --git a/src/java/com/android/internal/telephony/QualcommSharedRIL.java b/src/java/com/android/internal/telephony/QualcommSharedRIL.java
index db22133..bbd84c4 100644
--- a/src/java/com/android/internal/telephony/QualcommSharedRIL.java
+++ b/src/java/com/android/internal/telephony/QualcommSharedRIL.java
@@ -616,19 +616,6 @@ public class QualcommSharedRIL extends RIL implements CommandsInterface {
}
}
- /**
- * Notify all registrants that the ril has connected or disconnected.
- *
- * @param rilVer is the version of the ril or -1 if disconnected.
- */
- private void notifyRegistrantsRilConnectionChanged(int rilVer) {
- mRilVersion = rilVer;
- if (mRilConnectedRegistrants != null) {
- mRilConnectedRegistrants.notifyRegistrants(
- new AsyncResult (null, new Integer(rilVer), null));
- }
- }
-
private void setRadioStateFromRILInt (int stateCode) {
CommandsInterface.RadioState radioState;
HandlerThread handlerThread;
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index ac43eb4..7f6813b 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -210,6 +210,7 @@ public class RIL extends BaseCommands implements CommandsInterface {
static final String LOG_TAG = "RILJ";
static final boolean RILJ_LOGD = true;
static final boolean RILJ_LOGV = false; // STOP SHIP if true
+ protected boolean samsungDriverCall = false;
/**
* Wake lock timeout should be longer than the longest timeout in
@@ -2968,7 +2969,7 @@ public class RIL extends BaseCommands implements CommandsInterface {
*
* @param rilVer is the version of the ril or -1 if disconnected.
*/
- private void notifyRegistrantsRilConnectionChanged(int rilVer) {
+ protected void notifyRegistrantsRilConnectionChanged(int rilVer) {
mRilVersion = rilVer;
if (mRilConnectedRegistrants != null) {
mRilConnectedRegistrants.notifyRegistrants(
@@ -3198,6 +3199,8 @@ public class RIL extends BaseCommands implements CommandsInterface {
dc.als = p.readInt();
voiceSettings = p.readInt();
dc.isVoice = (0 == voiceSettings) ? false : true;
+ if(samsungDriverCall)
+ p.readInt();
dc.isVoicePrivacy = (0 != p.readInt());
dc.number = p.readString();
int np = p.readInt();
diff --git a/src/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java b/src/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java
deleted file mode 100644
index 2d96169..0000000
--- a/src/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * Copyright (C) 2012 The CyanogenMod Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.telephony;
-
-import static com.android.internal.telephony.RILConstants.*;
-
-import android.content.Context;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Parcel;
-import android.telephony.SmsMessage;
-import android.os.SystemProperties;
-import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.Log;
-import android.telephony.SignalStrength;
-
-import android.telephony.PhoneNumberUtils;
-import com.android.internal.telephony.RILConstants;
-import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
-import com.android.internal.telephony.cdma.CdmaInformationRecords;
-import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaSignalInfoRec;
-import com.android.internal.telephony.cdma.SignalToneUtil;
-
-import java.util.ArrayList;
-import java.util.Collections;
-
-/**
- * As stands, the RIL supports calling get subscription source which can
- * handle both ruim and nv qc devices. The lteOnCdma property allows
- * for the devices to provision for multiple cdma dun types at run time. This
- * extension of shared merely fixes nuance issues arising from the differences
- * caused by embedded SIM and legacy CDMA.
- * {@hide}
- */
-public class SamsungCDMAQualcommRIL extends RIL implements
-CommandsInterface {
- protected HandlerThread mIccThread;
- protected IccHandler mIccHandler;
- private Object mSMSLock = new Object();
- private boolean mIsSendingSMS = false;
- public static final long SEND_SMS_TIMEOUT_IN_MS = 30000;
-
- private final int RIL_INT_RADIO_OFF = 0;
- private final int RIL_INT_RADIO_UNAVALIABLE = 1;
- private final int RIL_INT_RADIO_ON = 2;
-
- public SamsungCDMAQualcommRIL(Context context, int networkMode,
- int cdmaSubscription) {
- super(context, networkMode, cdmaSubscription);
- }
-
- @Override
- protected Object responseIccCardStatus(Parcel p) {
- IccCardApplicationStatus ca;
-
- IccCardStatus status = new IccCardStatus();
- status.setCardState(p.readInt());
- status.setUniversalPinState(p.readInt());
- status.mGsmUmtsSubscriptionAppIndex = p.readInt();
- status.mCdmaSubscriptionAppIndex = p.readInt();
- status.mImsSubscriptionAppIndex = p.readInt();
-
- int numApplications = p.readInt();
-
- // limit to maximum allowed applications
- if (numApplications > IccCardStatus.CARD_MAX_APPS) {
- numApplications = IccCardStatus.CARD_MAX_APPS;
- }
- status.mApplications = new IccCardApplicationStatus[numApplications];
-
- for (int i = 0; i < numApplications; i++) {
- ca = new IccCardApplicationStatus();
- ca.app_type = ca.AppTypeFromRILInt(p.readInt());
- ca.app_state = ca.AppStateFromRILInt(p.readInt());
- ca.perso_substate = ca.PersoSubstateFromRILInt(p.readInt());
- if ((ca.app_state == IccCardApplicationStatus.AppState.APPSTATE_SUBSCRIPTION_PERSO) &&
- ((ca.perso_substate == IccCardApplicationStatus.PersoSubState.PERSOSUBSTATE_READY) ||
- (ca.perso_substate == IccCardApplicationStatus.PersoSubState.PERSOSUBSTATE_UNKNOWN))) {
- // ridiculous hack for network SIM unlock pin
- ca.app_state = IccCardApplicationStatus.AppState.APPSTATE_UNKNOWN;
- Log.d(LOG_TAG, "ca.app_state == AppState.APPSTATE_SUBSCRIPTION_PERSO");
- Log.d(LOG_TAG, "ca.perso_substate == PersoSubState.PERSOSUBSTATE_READY");
- }
- ca.aid = p.readString();
- ca.app_label = p.readString();
- ca.pin1_replaced = p.readInt();
- ca.pin1 = ca.PinStateFromRILInt(p.readInt());
- ca.pin2 = ca.PinStateFromRILInt(p.readInt());
- p.readInt(); // remaining_count_pin1 - pin1_num_retries
- p.readInt(); // remaining_count_puk1 - puk1_num_retries
- p.readInt(); // remaining_count_pin2 - pin2_num_retries
- p.readInt(); // remaining_count_puk2 - puk2_num_retries
- p.readInt(); // - perso_unblock_retries
- status.mApplications[i] = ca;
- }
- return status;
- }
-
- @Override
- public void
- sendCdmaSms(byte[] pdu, Message result) {
- // Do not send a new SMS until the response for the previous SMS has been received
- // * for the error case where the response never comes back, time out after
- // 30 seconds and just try the next CDMA_SEND_SMS
- synchronized (mSMSLock) {
- long timeoutTime = SystemClock.elapsedRealtime() + SEND_SMS_TIMEOUT_IN_MS;
- long waitTimeLeft = SEND_SMS_TIMEOUT_IN_MS;
- while (mIsSendingSMS && (waitTimeLeft > 0)) {
- Log.d(LOG_TAG, "sendCdmaSms() waiting for response of previous CDMA_SEND_SMS");
- try {
- mSMSLock.wait(waitTimeLeft);
- } catch (InterruptedException ex) {
- // ignore the interrupt and rewait for the remainder
- }
- waitTimeLeft = timeoutTime - SystemClock.elapsedRealtime();
- }
- if (waitTimeLeft <= 0) {
- Log.e(LOG_TAG, "sendCdmaSms() timed out waiting for response of previous CDMA_SEND_SMS");
- }
- mIsSendingSMS = true;
- }
-
- super.sendCdmaSms(pdu, result);
- }
-
- @Override
- protected Object responseSignalStrength(Parcel p) {
- int numInts = 12;
- int response[];
-
- // This is a mashup of algorithms used in
- // SamsungQualcommUiccRIL.java
-
- // Get raw data
- response = new int[numInts];
- for (int i = 0; i < numInts; i++) {
- response[i] = p.readInt();
- }
- // Take just the least significant byte as the signal strength
- response[2] %= 256;
- response[4] %= 256;
-
- // RIL_LTE_SignalStrength
- if (response[7] == 99) {
- // If LTE is not enabled, clear LTE results
- // 7-11 must be -1 for GSM signal strength to be used (see
- // frameworks/base/telephony/java/android/telephony/SignalStrength.java)
- response[8] = -1;
- response[9] = -1;
- response[10] = -1;
- response[11] = -1;
- }
-
- return new SignalStrength(response[0], response[1], response[2], response[3], response[4], response[5], response[6], response[7], response[8], response[9], response[10], response[11], false);
-
- }
-
- @Override
- protected Object responseCallList(Parcel p) {
- int num;
- int voiceSettings;
- ArrayList<DriverCall> response;
- DriverCall dc;
-
- num = p.readInt();
- response = new ArrayList<DriverCall>(num);
-
- for (int i = 0; i < num; i++) {
- dc = new DriverCall();
-
- dc.state = DriverCall.stateFromCLCC(p.readInt());
- dc.index = p.readInt();
- dc.TOA = p.readInt();
- dc.isMpty = (0 != p.readInt());
- dc.isMT = (0 != p.readInt());
- dc.als = p.readInt();
- voiceSettings = p.readInt();
- dc.isVoice = (0 == voiceSettings) ? false : true;
- // Some Samsung magic data for Videocalls
- // hack taken from smdk4210ril class
- voiceSettings = p.readInt();
- // printing it to cosole for later investigation
- Log.d(LOG_TAG, "Samsung magic = " + voiceSettings);
- dc.isVoicePrivacy = (0 != p.readInt());
- dc.number = p.readString();
- int np = p.readInt();
- dc.numberPresentation = DriverCall.presentationFromCLIP(np);
- dc.name = p.readString();
- dc.namePresentation = p.readInt();
- int uusInfoPresent = p.readInt();
- if (uusInfoPresent == 1) {
- dc.uusInfo = new UUSInfo();
- dc.uusInfo.setType(p.readInt());
- dc.uusInfo.setDcs(p.readInt());
- byte[] userData = p.createByteArray();
- dc.uusInfo.setUserData(userData);
- riljLogv(String.format(
- "Incoming UUS : type=%d, dcs=%d, length=%d",
- dc.uusInfo.getType(), dc.uusInfo.getDcs(),
- dc.uusInfo.getUserData().length));
- riljLogv("Incoming UUS : data (string)="
- + new String(dc.uusInfo.getUserData()));
- riljLogv("Incoming UUS : data (hex): "
- + IccUtils.bytesToHexString(dc.uusInfo.getUserData()));
- } else {
- riljLogv("Incoming UUS : NOT present!");
- }
-
- // Make sure there's a leading + on addresses with a TOA of 145
- dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number,
- dc.TOA);
-
- response.add(dc);
-
- if (dc.isVoicePrivacy) {
- mVoicePrivacyOnRegistrants.notifyRegistrants();
- riljLog("InCall VoicePrivacy is enabled");
- } else {
- mVoicePrivacyOffRegistrants.notifyRegistrants();
- riljLog("InCall VoicePrivacy is disabled");
- }
- }
-
- Collections.sort(response);
-
- return response;
- }
-
- @Override
- protected void
- processUnsolicited (Parcel p) {
- Object ret;
- int dataPosition = p.dataPosition(); // save off position within the Parcel
- int response = p.readInt();
-
- switch(response) {
- case RIL_UNSOL_RIL_CONNECTED: ret = responseInts(p); break;
- case 1035: ret = responseVoid(p); break; // RIL_UNSOL_VOICE_RADIO_TECH_CHANGED
- case 1036: ret = responseVoid(p); break; // RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED
- case 1037: ret = responseVoid(p); break; // RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE
- case 1038: ret = responseVoid(p); break; // RIL_UNSOL_DATA_NETWORK_STATE_CHANGED
-
- default:
- // Rewind the Parcel
- p.setDataPosition(dataPosition);
-
- // Forward responses that we are not overriding to the super class
- super.processUnsolicited(p);
- return;
- }
-
- switch(response) {
- case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
- int state = p.readInt();
- setRadioStateFromRILInt(state);
- break;
- case RIL_UNSOL_RIL_CONNECTED:
- notifyRegistrantsRilConnectionChanged(((int[])ret)[0]);
- break;
- case 1035:
- case 1036:
- break;
- case 1037: // RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE
- if (mExitEmergencyCallbackModeRegistrants != null) {
- mExitEmergencyCallbackModeRegistrants.notifyRegistrants(
- new AsyncResult (null, null, null));
- }
- break;
- case 1038:
- break;
- }
- }
-
- /**
- * Notify all registrants that the ril has connected or disconnected.
- *
- * @param rilVer is the version of the ril or -1 if disconnected.
- */
- private void notifyRegistrantsRilConnectionChanged(int rilVer) {
- mRilVersion = rilVer;
- if (mRilConnectedRegistrants != null) {
- mRilConnectedRegistrants.notifyRegistrants(
- new AsyncResult (null, new Integer(rilVer), null));
- }
- }
-
- private void setRadioStateFromRILInt (int stateCode) {
- CommandsInterface.RadioState radioState;
- HandlerThread handlerThread;
- Looper looper;
- IccHandler iccHandler;
-
- switch (stateCode) {
- case RIL_INT_RADIO_OFF:
- radioState = CommandsInterface.RadioState.RADIO_OFF;
- if (mIccHandler != null) {
- mIccThread = null;
- mIccHandler = null;
- }
- break;
- case RIL_INT_RADIO_UNAVALIABLE:
- radioState = CommandsInterface.RadioState.RADIO_UNAVAILABLE;
- break;
- case RIL_INT_RADIO_ON:
- if (mIccHandler == null) {
- handlerThread = new HandlerThread("IccHandler");
- mIccThread = handlerThread;
-
- mIccThread.start();
-
- looper = mIccThread.getLooper();
- mIccHandler = new IccHandler(this,looper);
- mIccHandler.run();
- }
- radioState = CommandsInterface.RadioState.RADIO_ON;
- break;
- default:
- throw new RuntimeException("Unrecognized RIL_RadioState: " + stateCode);
- }
-
- setRadioState (radioState);
- }
-
- class IccHandler extends Handler implements Runnable {
- private static final int EVENT_RADIO_ON = 1;
- private static final int EVENT_ICC_STATUS_CHANGED = 2;
- private static final int EVENT_GET_ICC_STATUS_DONE = 3;
- private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 4;
-
- private RIL mRil;
- private boolean mRadioOn = false;
-
- public IccHandler (RIL ril, Looper looper) {
- super (looper);
- mRil = ril;
- }
-
- public void handleMessage (Message paramMessage) {
- switch (paramMessage.what) {
- case EVENT_RADIO_ON:
- mRadioOn = true;
- sendMessage(obtainMessage(EVENT_ICC_STATUS_CHANGED));
- break;
- case EVENT_GET_ICC_STATUS_DONE:
- AsyncResult asyncResult = (AsyncResult) paramMessage.obj;
- if (asyncResult.exception != null) {
- break;
- }
- IccCardStatus status = (IccCardStatus) asyncResult.result;
- if (status.mApplications == null || status.mApplications.length == 0) {
- if (!mRil.getRadioState().isOn()) {
- break;
- }
-
- mRil.setRadioState(CommandsInterface.RadioState.RADIO_ON);
- } else {
- int appIndex = status.mCdmaSubscriptionAppIndex;
- IccCardApplicationStatus application = status.mApplications[appIndex];
- IccCardApplicationStatus.AppState app_state = application.app_state;
- IccCardApplicationStatus.AppType app_type = application.app_type;
- switch (app_state) {
- case APPSTATE_PIN:
- case APPSTATE_PUK:
- switch (app_type) {
- case APPTYPE_USIM:
- case APPTYPE_RUIM:
- mRil.setRadioState(CommandsInterface.RadioState.RADIO_ON);
- break;
- default:
- return;
- }
- break;
- case APPSTATE_READY:
- switch (app_type) {
- case APPTYPE_USIM:
- case APPTYPE_RUIM:
- mRil.setRadioState(CommandsInterface.RadioState.RADIO_ON);
- break;
- default:
- return;
- }
- break;
- default:
- return;
- }
- }
- break;
- case EVENT_ICC_STATUS_CHANGED:
- if (mRadioOn) {
- mRil.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE, paramMessage.obj));
- }
- break;
- case EVENT_RADIO_OFF_OR_UNAVAILABLE:
- mRadioOn = false;
- default:
- break;
- }
- }
-
- public void run () {
- mRil.registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, null);
- Message msg = obtainMessage(EVENT_RADIO_ON);
- mRil.getIccCardStatus(msg);
- }
- }
-
- // 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 (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);
- }
-
- @Override
- protected Object
- responseSMS(Parcel p) {
- // Notify that sendSMS() can send the next SMS
- synchronized (mSMSLock) {
- mIsSendingSMS = false;
- mSMSLock.notify();
- }
-
- return super.responseSMS(p);
- }
-}
diff --git a/src/java/com/android/internal/telephony/SamsungExynos4RIL.java b/src/java/com/android/internal/telephony/SamsungExynos4RIL.java
index ce9667d..ee3a494 100644
--- a/src/java/com/android/internal/telephony/SamsungExynos4RIL.java
+++ b/src/java/com/android/internal/telephony/SamsungExynos4RIL.java
@@ -741,19 +741,6 @@ public class SamsungExynos4RIL extends RIL implements CommandsInterface {
}
/**
- * Notifiy all registrants that the ril has connected or disconnected.
- *
- * @param rilVer is the version of the ril or -1 if disconnected.
- */
- private void notifyRegistrantsRilConnectionChanged(int rilVer) {
- mRilVersion = rilVer;
- if (mRilConnectedRegistrants != null) {
- mRilConnectedRegistrants.notifyRegistrants(
- new AsyncResult (null, new Integer(rilVer), null));
- }
- }
-
- /**
* Set audio parameter "wb_amr" for HD-Voice (Wideband AMR).
*
* @param state: 0 = unsupported, 1 = supported.
diff --git a/src/java/com/android/internal/telephony/SamsungQualcommM3RIL.java b/src/java/com/android/internal/telephony/SamsungQualcommM3RIL.java
index 07681de..cc1483b 100644
--- a/src/java/com/android/internal/telephony/SamsungQualcommM3RIL.java
+++ b/src/java/com/android/internal/telephony/SamsungQualcommM3RIL.java
@@ -33,7 +33,7 @@ import java.util.ArrayList;
*
* {@hide}
*/
-public class SamsungQualcommM3RIL extends SamsungQualcommUiccRIL implements CommandsInterface {
+public class SamsungQualcommM3RIL extends SamsungQualcommRIL implements CommandsInterface {
public SamsungQualcommM3RIL(Context context, int networkMode, int cdmaSubscription) {
super(context, networkMode, cdmaSubscription);
@@ -91,94 +91,4 @@ public class SamsungQualcommM3RIL extends SamsungQualcommUiccRIL implements Comm
}
}
- @Override
- protected Object
- responseCallList(Parcel p) {
- int num;
- boolean isVideo;
- ArrayList<DriverCall> response;
- DriverCall dc;
- int dataAvail = p.dataAvail();
- int pos = p.dataPosition();
- int size = p.dataSize();
-
- Log.d(LOG_TAG, "Parcel size = " + size);
- Log.d(LOG_TAG, "Parcel pos = " + pos);
- Log.d(LOG_TAG, "Parcel dataAvail = " + dataAvail);
-
- //Samsung changes
- num = p.readInt();
-
- Log.d(LOG_TAG, "num = " + num);
- response = new ArrayList<DriverCall>(num);
-
- for (int i = 0 ; i < num ; i++) {
-
- dc = new DriverCall();
- dc.state = DriverCall.stateFromCLCC(p.readInt());
- dc.index = p.readInt();
- dc.TOA = p.readInt();
- dc.isMpty = (0 != p.readInt());
- dc.isMT = (0 != p.readInt());
- dc.als = p.readInt();
- dc.isVoice = (0 != p.readInt());
- isVideo = (0 != p.readInt());
- dc.isVoicePrivacy = (0 != p.readInt());
- dc.number = p.readString();
- int np = p.readInt();
- dc.numberPresentation = DriverCall.presentationFromCLIP(np);
- dc.name = p.readString();
- dc.namePresentation = p.readInt();
- int uusInfoPresent = p.readInt();
-
- Log.d(LOG_TAG, "state = " + dc.state);
- Log.d(LOG_TAG, "index = " + dc.index);
- Log.d(LOG_TAG, "state = " + dc.TOA);
- Log.d(LOG_TAG, "isMpty = " + dc.isMpty);
- Log.d(LOG_TAG, "isMT = " + dc.isMT);
- Log.d(LOG_TAG, "als = " + dc.als);
- Log.d(LOG_TAG, "isVoice = " + dc.isVoice);
- Log.d(LOG_TAG, "isVideo = " + isVideo);
- Log.d(LOG_TAG, "number = " + dc.number);
- Log.d(LOG_TAG, "np = " + np);
- Log.d(LOG_TAG, "name = " + dc.name);
- Log.d(LOG_TAG, "namePresentation = " + dc.namePresentation);
- Log.d(LOG_TAG, "uusInfoPresent = " + uusInfoPresent);
-
- if (uusInfoPresent == 1) {
- dc.uusInfo = new UUSInfo();
- dc.uusInfo.setType(p.readInt());
- dc.uusInfo.setDcs(p.readInt());
- byte[] userData = p.createByteArray();
- dc.uusInfo.setUserData(userData);
- Log
- .v(LOG_TAG, String.format("Incoming UUS : type=%d, dcs=%d, length=%d",
- dc.uusInfo.getType(), dc.uusInfo.getDcs(),
- dc.uusInfo.getUserData().length));
- Log.v(LOG_TAG, "Incoming UUS : data (string)="
- + new String(dc.uusInfo.getUserData()));
- Log.v(LOG_TAG, "Incoming UUS : data (hex): "
- + IccUtils.bytesToHexString(dc.uusInfo.getUserData()));
- } else {
- Log.v(LOG_TAG, "Incoming UUS : NOT present!");
- }
-
- // Make sure there's a leading + on addresses with a TOA of 145
- dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA);
-
- response.add(dc);
-
- if (dc.isVoicePrivacy) {
- mVoicePrivacyOnRegistrants.notifyRegistrants();
- Log.d(LOG_TAG, "InCall VoicePrivacy is enabled");
- } else {
- mVoicePrivacyOffRegistrants.notifyRegistrants();
- Log.d(LOG_TAG, "InCall VoicePrivacy is disabled");
- }
- }
-
- Collections.sort(response);
-
- return response;
- }
}
diff --git a/src/java/com/android/internal/telephony/SamsungQualcommRIL.java b/src/java/com/android/internal/telephony/SamsungQualcommRIL.java
new file mode 100644
index 0000000..002d5ad
--- /dev/null
+++ b/src/java/com/android/internal/telephony/SamsungQualcommRIL.java
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2012 The CyanogenMod Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.telephony;
+
+import static com.android.internal.telephony.RILConstants.*;
+
+import android.content.Context;
+import android.os.AsyncResult;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Parcel;
+import android.telephony.SmsMessage;
+import android.os.SystemProperties;
+import android.os.SystemClock;
+import android.text.TextUtils;
+import android.util.Log;
+import android.telephony.SignalStrength;
+
+import android.telephony.PhoneNumberUtils;
+import com.android.internal.telephony.RILConstants;
+import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
+import com.android.internal.telephony.cdma.CdmaInformationRecords;
+import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaSignalInfoRec;
+import com.android.internal.telephony.cdma.SignalToneUtil;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * Qualcomm RIL for the Samsung family.
+ * Quad core Exynos4 with Qualcomm modem and later is supported
+ * Snapdragon S3 and later is supported
+ * This RIL is univerisal meaning it supports CDMA and GSM radio.
+ * Handles most GSM and CDMA cases.
+ * {@hide}
+ */
+public class SamsungQualcommRIL extends RIL implements
+CommandsInterface {
+ private Object mSMSLock = new Object();
+ private boolean mIsSendingSMS = false;
+ private boolean isGSM = false;
+ public static final long SEND_SMS_TIMEOUT_IN_MS = 30000;
+
+ public SamsungQualcommRIL(Context context, int networkMode,
+ int cdmaSubscription) {
+ super(context, networkMode, cdmaSubscription);
+ }
+
+ @Override
+ protected Object
+ responseIccCardStatus(Parcel p) {
+ IccCardApplicationStatus appStatus;
+
+ IccCardStatus cardStatus = new IccCardStatus();
+ cardStatus.setCardState(p.readInt());
+ cardStatus.setUniversalPinState(p.readInt());
+ cardStatus.mGsmUmtsSubscriptionAppIndex = p.readInt();
+ cardStatus.mCdmaSubscriptionAppIndex = p.readInt();
+ cardStatus.mImsSubscriptionAppIndex = p.readInt();
+
+ int numApplications = p.readInt();
+
+ // limit to maximum allowed applications
+ if (numApplications > IccCardStatus.CARD_MAX_APPS) {
+ numApplications = IccCardStatus.CARD_MAX_APPS;
+ }
+ cardStatus.mApplications = new IccCardApplicationStatus[numApplications];
+
+ for (int i = 0 ; i < numApplications ; i++) {
+ appStatus = new IccCardApplicationStatus();
+
+
+
+ appStatus.app_type = appStatus.AppTypeFromRILInt(p.readInt());
+ appStatus.app_state = appStatus.AppStateFromRILInt(p.readInt());
+ appStatus.perso_substate = appStatus.PersoSubstateFromRILInt(p.readInt());
+ if ((appStatus.app_state == IccCardApplicationStatus.AppState.APPSTATE_SUBSCRIPTION_PERSO) &&
+ ((appStatus.perso_substate == IccCardApplicationStatus.PersoSubState.PERSOSUBSTATE_READY) ||
+ (appStatus.perso_substate == IccCardApplicationStatus.PersoSubState.PERSOSUBSTATE_UNKNOWN))) {
+ // ridiculous hack for network SIM unlock pin
+ appStatus.app_state = IccCardApplicationStatus.AppState.APPSTATE_UNKNOWN;
+ Log.d(LOG_TAG, "ca.app_state == AppState.APPSTATE_SUBSCRIPTION_PERSO");
+ Log.d(LOG_TAG, "ca.perso_substate == PersoSubState.PERSOSUBSTATE_READY");
+ }
+ appStatus.aid = p.readString();
+ appStatus.app_label = p.readString();
+ appStatus.pin1_replaced = p.readInt();
+ appStatus.pin1 = appStatus.PinStateFromRILInt(p.readInt());
+ appStatus.pin2 = appStatus.PinStateFromRILInt(p.readInt());
+ p.readInt(); // remaining_count_pin1 - pin1_num_retries
+ p.readInt(); // remaining_count_puk1 - puk1_num_retries
+ p.readInt(); // remaining_count_pin2 - pin2_num_retries
+ p.readInt(); // remaining_count_puk2 - puk2_num_retries
+ p.readInt(); // - perso_unblock_retries
+ cardStatus.mApplications[i] = appStatus;
+ }
+ return cardStatus;
+ }
+
+ @Override
+ public void
+ sendCdmaSms(byte[] pdu, Message result) {
+ smsLock();
+ super.sendCdmaSms(pdu, result);
+ }
+
+ @Override
+ public void
+ sendSMS (String smscPDU, String pdu, Message result) {
+ smsLock();
+ super.sendSMS(smscPDU, pdu, result);
+ }
+
+ private void smsLock(){
+ // Do not send a new SMS until the response for the previous SMS has been received
+ // * for the error case where the response never comes back, time out after
+ // 30 seconds and just try the next SEND_SMS
+ synchronized (mSMSLock) {
+ long timeoutTime = SystemClock.elapsedRealtime() + SEND_SMS_TIMEOUT_IN_MS;
+ long waitTimeLeft = SEND_SMS_TIMEOUT_IN_MS;
+ while (mIsSendingSMS && (waitTimeLeft > 0)) {
+ Log.d(LOG_TAG, "sendSMS() waiting for response of previous SEND_SMS");
+ try {
+ mSMSLock.wait(waitTimeLeft);
+ } catch (InterruptedException ex) {
+ // ignore the interrupt and rewait for the remainder
+ }
+ waitTimeLeft = timeoutTime - SystemClock.elapsedRealtime();
+ }
+ if (waitTimeLeft <= 0) {
+ Log.e(LOG_TAG, "sendSms() timed out waiting for response of previous CDMA_SEND_SMS");
+ }
+ mIsSendingSMS = true;
+ }
+
+ }
+
+ @Override
+ protected Object responseSignalStrength(Parcel p) {
+ int numInts = 12;
+ int response[];
+
+ // This is a mashup of algorithms used in
+ // SamsungQualcommUiccRIL.java
+
+ // Get raw data
+ response = new int[numInts];
+ for (int i = 0; i < numInts; i++) {
+ response[i] = p.readInt();
+ }
+ //gsm
+ response[0] &= 0xff; //gsmDbm
+
+ //cdma
+ // Take just the least significant byte as the signal strength
+ response[2] %= 256;
+ response[4] %= 256;
+
+ // RIL_LTE_SignalStrength
+ if (response[7] == 99) {
+ // If LTE is not enabled, clear LTE results
+ // 7-11 must be -1 for GSM signal strength to be used (see
+ // frameworks/base/telephony/java/android/telephony/SignalStrength.java)
+ response[8] = SignalStrength.INVALID;
+ response[9] = SignalStrength.INVALID;
+ response[10] = SignalStrength.INVALID;
+ response[11] = SignalStrength.INVALID;
+ }else{ // lte is gsm on samsung/qualcomm cdma stack
+ response[7] &= 0xff;
+ }
+
+ return new SignalStrength(response[0], response[1], response[2], response[3], response[4], response[5], response[6], response[7], response[8], response[9], response[10], response[11], isGSM);
+
+ }
+
+
+ @Override
+ protected void
+ processUnsolicited (Parcel p) {
+ Object ret;
+ int dataPosition = p.dataPosition(); // save off position within the Parcel
+ int response = p.readInt();
+
+ switch(response) {
+ case RIL_UNSOL_RIL_CONNECTED: // Fix for NV/RUIM setting on CDMA SIM devices
+ // skip getcdmascriptionsource as if qualcomm handles it in the ril binary
+ ret = responseInts(p);
+ setRadioPower(false, null);
+ setPreferredNetworkType(mPreferredNetworkType, null);
+ notifyRegistrantsRilConnectionChanged(((int[])ret)[0]);
+ samsungDriverCall = (needsOldRilFeature("newDriverCall") && !isGSM) || mRilVersion < 7 ? false : true;
+ isGSM = (mPhoneType != RILConstants.CDMA_PHONE);
+ break;
+ case RIL_UNSOL_NITZ_TIME_RECEIVED:
+ handleNitzTimeReceived(p);
+ break;
+ default:
+ // Rewind the Parcel
+ p.setDataPosition(dataPosition);
+
+ // Forward responses that we are not overriding to the super class
+ super.processUnsolicited(p);
+ return;
+ }
+
+ }
+
+ // 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 (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);
+ }
+
+ private void
+ handleNitzTimeReceived(Parcel p) {
+ String nitz = (String)responseString(p);
+ //if (RILJ_LOGD) unsljLogRet(RIL_UNSOL_NITZ_TIME_RECEIVED, nitz);
+
+ // has bonus long containing milliseconds since boot that the NITZ
+ // time was received
+ long nitzReceiveTime = p.readLong();
+
+ Object[] result = new Object[2];
+
+ String fixedNitz = nitz;
+ String[] nitzParts = nitz.split(",");
+ if (nitzParts.length == 4) {
+ // 0=date, 1=time+zone, 2=dst, 3=garbage that confuses GsmServiceStateTracker (so remove it)
+ fixedNitz = nitzParts[0]+","+nitzParts[1]+","+nitzParts[2]+",";
+ }
+
+ result[0] = fixedNitz;
+ result[1] = Long.valueOf(nitzReceiveTime);
+
+ boolean ignoreNitz = SystemProperties.getBoolean(
+ TelephonyProperties.PROPERTY_IGNORE_NITZ, false);
+
+ if (ignoreNitz) {
+ if (RILJ_LOGD) riljLog("ignoring UNSOL_NITZ_TIME_RECEIVED");
+ } else {
+ if (mNITZTimeRegistrant != null) {
+ mNITZTimeRegistrant
+ .notifyRegistrant(new AsyncResult (null, result, null));
+ } else {
+ // in case NITZ time registrant isnt registered yet
+ mLastNITZTimeInfo = result;
+ }
+ }
+ }
+
+ @Override
+ protected Object
+ responseSMS(Parcel p) {
+ // Notify that sendSMS() can send the next SMS
+ synchronized (mSMSLock) {
+ mIsSendingSMS = false;
+ mSMSLock.notify();
+ }
+
+ return super.responseSMS(p);
+ }
+}
diff --git a/src/java/com/android/internal/telephony/SamsungQualcommUiccRIL.java b/src/java/com/android/internal/telephony/SamsungQualcommUiccRIL.java
deleted file mode 100644
index d22f229..0000000
--- a/src/java/com/android/internal/telephony/SamsungQualcommUiccRIL.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Copyright (C) 2012 The CyanogenMod Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.telephony;
-
-import static com.android.internal.telephony.RILConstants.*;
-
-import android.content.Context;
-import android.os.Message;
-import android.os.Parcel;
-import android.os.SystemProperties;
-import android.os.SystemClock;
-import android.os.AsyncResult;
-import android.telephony.SignalStrength;
-import android.text.TextUtils;
-import android.util.Log;
-import android.telephony.PhoneNumberUtils;
-import com.android.internal.telephony.RILConstants;
-
-import java.util.Collections;
-import java.util.ArrayList;
-
-/**
- * Custom RIL to handle unique behavior of Hercules/Skyrocket/Note radio
- *
- * {@hide}
- */
-public class SamsungQualcommUiccRIL extends QualcommSharedRIL implements CommandsInterface {
- boolean RILJ_LOGV = true;
- boolean RILJ_LOGD = true;
-
- public static final int INVALID_SNR = 0x7fffffff;
- private boolean mSignalbarCount = SystemProperties.getBoolean("ro.telephony.sends_barcount", false);
- private Object mSMSLock = new Object();
- private boolean mIsSendingSMS = false;
- public static final long SEND_SMS_TIMEOUT_IN_MS = 30000;
-
- public SamsungQualcommUiccRIL(Context context, int networkMode, int cdmaSubscription) {
- super(context, networkMode, cdmaSubscription);
- mQANElements = 4;
- }
-
- @Override
- protected void
- processUnsolicited (Parcel p) {
- Object ret;
- int dataPosition = p.dataPosition(); // save off position within the Parcel
- int response = p.readInt();
-
- switch(response) {
- case RIL_UNSOL_NITZ_TIME_RECEIVED:
- handleNitzTimeReceived(p);
- return;
- case 1038: ret = responseVoid(p); break; // RIL_UNSOL_DATA_NETWORK_STATE_CHANGED
-
- default:
- // Rewind the Parcel
- p.setDataPosition(dataPosition);
-
- // Forward responses that we are not overriding to the super class
- super.processUnsolicited(p);
- return;
- }
-
- switch(response) {
- case 1038: // RIL_UNSOL_DATA_NETWORK_STATE_CHANGED
- if (RILJ_LOGD) unsljLog(response);
-
- // Notifying on voice state change since it just causes a
- // GsmServiceStateTracker::pollState() like CAF RIL does.
- mVoiceNetworkStateRegistrants
- .notifyRegistrants(new AsyncResult(null, null, null));
- break;
- }
- }
-
- protected void
- handleNitzTimeReceived(Parcel p) {
- String nitz = (String)responseString(p);
- if (RILJ_LOGD) unsljLogRet(RIL_UNSOL_NITZ_TIME_RECEIVED, nitz);
-
- // has bonus long containing milliseconds since boot that the NITZ
- // time was received
- long nitzReceiveTime = p.readLong();
-
- Object[] result = new Object[2];
-
- String fixedNitz = nitz;
- String[] nitzParts = nitz.split(",");
- if (nitzParts.length == 4) {
- // 0=date, 1=time+zone, 2=dst, 3=garbage that confuses GsmServiceStateTracker (so remove it)
- fixedNitz = nitzParts[0]+","+nitzParts[1]+","+nitzParts[2]+",";
- }
-
- result[0] = fixedNitz;
- result[1] = Long.valueOf(nitzReceiveTime);
-
- if (mNITZTimeRegistrant != null) {
-
- mNITZTimeRegistrant
- .notifyRegistrant(new AsyncResult (null, result, null));
- } else {
- // in case NITZ time registrant isnt registered yet
- mLastNITZTimeInfo = result;
- }
- }
-
- @Override
- public void
- sendSMS (String smscPDU, String pdu, Message result) {
- // Do not send a new SMS until the response for the previous SMS has been received
- // * for the error case where the response never comes back, time out after
- // 30 seconds and just try the next SEND_SMS
- synchronized (mSMSLock) {
- long timeoutTime = SystemClock.elapsedRealtime() + SEND_SMS_TIMEOUT_IN_MS;
- long waitTimeLeft = SEND_SMS_TIMEOUT_IN_MS;
- while (mIsSendingSMS && (waitTimeLeft > 0)) {
- Log.d(LOG_TAG, "sendSMS() waiting for response of previous SEND_SMS");
- try {
- mSMSLock.wait(waitTimeLeft);
- } catch (InterruptedException ex) {
- // ignore the interrupt and rewait for the remainder
- }
- waitTimeLeft = timeoutTime - SystemClock.elapsedRealtime();
- }
- if (waitTimeLeft <= 0) {
- Log.e(LOG_TAG, "sendSms() timed out waiting for response of previous CDMA_SEND_SMS");
- }
- mIsSendingSMS = true;
- }
-
- super.sendSMS(smscPDU, pdu, result);
- }
-
- @Override
- public void
- setNetworkSelectionModeManual(String operatorNumeric, Message response) {
- RILRequest rr
- = RILRequest.obtain(RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
- response);
-
- if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
- + " " + operatorNumeric);
-
- rr.mp.writeString(operatorNumeric);
-
- send(rr);
- }
-
- @Override
- protected Object
- responseIccCardStatus(Parcel p) {
- IccCardApplicationStatus ca;
-
- IccCardStatus status = new IccCardStatus();
- status.setCardState(p.readInt());
- status.setUniversalPinState(p.readInt());
- status.mGsmUmtsSubscriptionAppIndex = p.readInt();
- status.mCdmaSubscriptionAppIndex = p.readInt();
- status.mImsSubscriptionAppIndex = p.readInt();
-
- int numApplications = p.readInt();
-
- // limit to maximum allowed applications
- if (numApplications > IccCardStatus.CARD_MAX_APPS) {
- numApplications = IccCardStatus.CARD_MAX_APPS;
- }
- status.mApplications = new IccCardApplicationStatus[numApplications];
-
- for (int i = 0 ; i < numApplications ; i++) {
- ca = new IccCardApplicationStatus();
- ca.app_type = ca.AppTypeFromRILInt(p.readInt());
- ca.app_state = ca.AppStateFromRILInt(p.readInt());
- ca.perso_substate = ca.PersoSubstateFromRILInt(p.readInt());
- if ((ca.app_state == IccCardApplicationStatus.AppState.APPSTATE_SUBSCRIPTION_PERSO) &&
- ((ca.perso_substate == IccCardApplicationStatus.PersoSubState.PERSOSUBSTATE_READY) ||
- (ca.perso_substate == IccCardApplicationStatus.PersoSubState.PERSOSUBSTATE_UNKNOWN))) {
- // ridiculous hack for network SIM unlock pin
- ca.app_state = IccCardApplicationStatus.AppState.APPSTATE_UNKNOWN;
- Log.d(LOG_TAG, "ca.app_state == AppState.APPSTATE_SUBSCRIPTION_PERSO");
- Log.d(LOG_TAG, "ca.perso_substate == PersoSubState.PERSOSUBSTATE_READY");
- }
- ca.aid = p.readString();
- ca.app_label = p.readString();
- ca.pin1_replaced = p.readInt();
- ca.pin1 = ca.PinStateFromRILInt(p.readInt());
- ca.pin2 = ca.PinStateFromRILInt(p.readInt());
-
- p.readInt(); //remaining_count_pin1 - pin1_num_retries
- p.readInt(); //remaining_count_puk1 - puk1_num_retries
- p.readInt(); //remaining_count_pin2 - pin2_num_retries
- p.readInt(); //remaining_count_puk2 - puk2_num_retries
- p.readInt(); // - perso_unblock_retries
- status.mApplications[i] = ca;
- }
- int appIndex = -1;
- if (mPhoneType == RILConstants.CDMA_PHONE) {
- appIndex = status.mCdmaSubscriptionAppIndex;
- Log.d(LOG_TAG, "This is a CDMA PHONE " + appIndex);
- } else {
- appIndex = status.mGsmUmtsSubscriptionAppIndex;
- Log.d(LOG_TAG, "This is a GSM PHONE " + appIndex);
- }
-
- if (numApplications > 0) {
- IccCardApplicationStatus application = status.mApplications[appIndex];
- mAid = application.aid;
- mUSIM = application.app_type
- == IccCardApplicationStatus.AppType.APPTYPE_USIM;
- mSetPreferredNetworkType = mPreferredNetworkType;
-
- if (TextUtils.isEmpty(mAid))
- mAid = "";
- Log.d(LOG_TAG, "mAid " + mAid + " mUSIM=" + mUSIM + " mSetPreferredNetworkType=" + mSetPreferredNetworkType);
- }
-
- return status;
- }
-
- @Override
- protected Object
- responseCallList(Parcel p) {
- if (mRilVersion < 7)
- return super.responseCallList(p);
-
- int num;
- int voiceSettings;
- ArrayList<DriverCall> response;
- DriverCall dc;
-
- num = p.readInt();
- response = new ArrayList<DriverCall>(num);
-
- for (int i = 0 ; i < num ; i++) {
- dc = new DriverCall();
-
- dc.state = DriverCall.stateFromCLCC(p.readInt());
- dc.index = p.readInt();
- dc.TOA = p.readInt();
- dc.isMpty = (0 != p.readInt());
- dc.isMT = (0 != p.readInt());
- dc.als = p.readInt();
- voiceSettings = p.readInt();
- dc.isVoice = (0 == voiceSettings) ? false : true;
- //Some Samsung magic data for Videocalls
- // hack taken from smdk4210ril class
- voiceSettings = p.readInt();
- //printing it to cosole for later investigation
- Log.d(LOG_TAG, "Samsung magic = " + voiceSettings);
- dc.isVoicePrivacy = (0 != p.readInt());
- dc.number = p.readString();
- int np = p.readInt();
- dc.numberPresentation = DriverCall.presentationFromCLIP(np);
- dc.name = p.readString();
- dc.namePresentation = p.readInt();
- int uusInfoPresent = p.readInt();
- if (uusInfoPresent == 1) {
- dc.uusInfo = new UUSInfo();
- dc.uusInfo.setType(p.readInt());
- dc.uusInfo.setDcs(p.readInt());
- byte[] userData = p.createByteArray();
- dc.uusInfo.setUserData(userData);
- riljLogv(String.format("Incoming UUS : type=%d, dcs=%d, length=%d",
- dc.uusInfo.getType(), dc.uusInfo.getDcs(),
- dc.uusInfo.getUserData().length));
- riljLogv("Incoming UUS : data (string)="
- + new String(dc.uusInfo.getUserData()));
- riljLogv("Incoming UUS : data (hex): "
- + IccUtils.bytesToHexString(dc.uusInfo.getUserData()));
- } else {
- riljLogv("Incoming UUS : NOT present!");
- }
-
- // Make sure there's a leading + on addresses with a TOA of 145
- dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA);
-
- response.add(dc);
-
- if (dc.isVoicePrivacy) {
- mVoicePrivacyOnRegistrants.notifyRegistrants();
- riljLog("InCall VoicePrivacy is enabled");
- } else {
- mVoicePrivacyOffRegistrants.notifyRegistrants();
- riljLog("InCall VoicePrivacy is disabled");
- }
- }
-
- Collections.sort(response);
-
- return response;
- }
- @Override
- protected Object
- responseSignalStrength(Parcel p) {
- int numInts = 12;
- int response[];
-
- // This is a mashup of algorithms used in
- // LGEQualcommUiccRIL.java and SamsungHCRIL.java
-
- // Get raw data
- response = new int[numInts];
- for (int i = 0 ; i < numInts ; i++) {
- response[i] = p.readInt();
- }
- Log.d(LOG_TAG, "responseSignalStength BEFORE: mode=" + (mSignalbarCount ? "bars" : "raw") +
- " gsmDbm=" + response[0] + " gsmEcio=" + response[1] +
- " lteSignalStrength=" + response[7] + " lteRsrp=" + response[8] + " lteRsrq=" + response[9] +
- " lteRssnr=" + response[10] + " lteCqi=" + response[11]);
-
- // RIL_GW_SignalStrength
- if (mSignalbarCount) {
- //Samsung sends the count of bars that should be displayed instead of
- //a real signal strength
- int num_bars = (response[0] & 0xff00) >> 8;
-
- // Translate number of bars into something SignalStrength.java can understand
- switch (num_bars) {
- case 0 : response[0] = 1; break; // map to 0 bars
- case 1 : response[0] = 3; break; // map to 1 bar
- case 2 : response[0] = 5; break; // map to 2 bars
- case 3 : response[0] = 8; break; // map to 3 bars
- case 4 : response[0] = 12; break; // map to 4 bars
- case 5 : response[0] = 15; break; // map to 4 bars but give an extra 10 dBm
- default : response[0] &= 0xff; break; // no idea; just pass value through
- }
- } else {
- response[0] &= 0xff; //gsmDbm
- }
- response[1] = -1; // gsmEcio
-
- // RIL_CDMA_SignalStrength (unused)
- response[2] = -1; // cdmaDbm
- response[3] = -1; // cdmaEcio
-
- // RIL_EVDO_SignalStrength (unused)
- response[4] = -1; // evdoRssi
- response[5] = -1; // evdoEcio
- response[6] = -1; // evdoSNR
-
- // RIL_LTE_SignalStrength
- if (response[7] == 99) {
- // If LTE is not enabled, clear LTE results
- // 7-11 must be -1 for GSM signal strength to be used (see frameworks/base/telephony/java/android/telephony/SignalStrength.java)
- response[7] = -1; // lteSignalStrength
- response[8] = -1; // lteRsrp
- response[9] = -1; // lteRsrq
- response[10] = -1; // lteRssnr
- response[11] = -1; // lteCqi
- } else if (mSignalbarCount) {
- int num_bars = (response[7] & 0xff00) >> 8;
- response[7] &= 0xff; // remove the Samsung number of bars field
- response[10] = INVALID_SNR; // mark lteRssnr invalid so it doesn't get used
-
- // Translate number of bars into something SignalStrength.java can understand
- switch (num_bars) {
- case 0 : response[8] = 1; break; // map to 0 bars
- case 1 : response[8] = 116; break; // map to 1 bar
- case 2 : response[8] = 115; break; // map to 2 bars
- case 3 : response[8] = 105; break; // map to 3 bars
- case 4 : response[8] = 95; break; // map to 4 bars
- case 5 : response[8] = 85; break; // map to 4 bars but give an extra 10 dBm
- default : break; // no idea; just pass value through
- }
- } else {
- response[7] &= 0xff; // remove the Samsung number of bars field
- }
-
- Log.d(LOG_TAG, "responseSignalStength AFTER: mode=" + (mSignalbarCount ? "bars" : "raw") +
- " gsmDbm=" + response[0] + " gsmEcio=" + response[1] +
- " lteSignalStrength=" + response[7] + " lteRsrp=" + response[8] + " lteRsrq=" + response[9] +
- " lteRssnr=" + response[10] + " lteCqi=" + response[11]);
- return new SignalStrength(response[0], response[1], response[2], response[3], response[4], response[5], response[6], response[7],response[8], response[9], response[10], response[11], true);
- }
-
- @Override
- protected Object
- responseSMS(Parcel p) {
- // Notify that sendSMS() can send the next SMS
- synchronized (mSMSLock) {
- mIsSendingSMS = false;
- mSMSLock.notify();
- }
-
- return super.responseSMS(p);
- }
-}