diff options
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); - } -} |