diff options
author | Shareef Ali <shareefalis@cyanogenmod.org> | 2013-05-17 07:46:42 -0400 |
---|---|---|
committer | Shareef Ali <shareefalis@cyanogenmod.org> | 2013-05-30 18:15:57 -0500 |
commit | 873f5a8692bcfa5b8394c95b2783f6bad7653a28 (patch) | |
tree | d16dd79b89bb2116489622802178f38090cece11 | |
parent | 8f5a38069bac929e4aaaa94f7952aeae79208e79 (diff) | |
download | frameworks_opt_telephony-873f5a8692bcfa5b8394c95b2783f6bad7653a28.zip frameworks_opt_telephony-873f5a8692bcfa5b8394c95b2783f6bad7653a28.tar.gz frameworks_opt_telephony-873f5a8692bcfa5b8394c95b2783f6bad7653a28.tar.bz2 |
SamsungQcomRIL: New class and get rid of old and outdated codes
Consolidate the RIL and base on the CDMA RIL
Now inherit class related to the Samsung Qualcomm family
Special thanks to Dan Pasanen for coninuing the patcheset
while my macbook was in repair.
* Rebase on standard ril
* samsungDriverCall now handled in the superclass
* Supports:
* Quad-core Exynos4 with Qualcomm modem and later
* Snapdragon S3 and later
Change-Id: Ie593e32087a9bfeb5d16802a10c2739cf1061676
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); - } -} |