android_device_mt6753_common/patches/framework_opt_telephony/0001-Update-for-mtk.patch

9653 lines
419 KiB
Diff

From 8163ec618f05d7fabe9b1bfae1e2c7575ed27a0a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A7=8B=E5=8F=B6=E9=9A=8F=E9=A3=8Eivan?=
<yanziily@gmail.com>
Date: Sun, 3 Jan 2016 21:28:59 +0800
Subject: [PATCH] Update for mtk
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Change-Id: I3d9ff9bcb8c7ee46b5820d9ba1be0406236c09fb
Signed-off-by: 秋叶随风ivan <yanziily@gmail.com>
---
.../android/internal/telephony/BaseCommands.java | 209 ++
.../internal/telephony/CommandsInterface.java | 250 +++
.../android/internal/telephony/HardwareConfig.java | 2 +
.../com/android/internal/telephony/IccCard.java | 89 +
.../android/internal/telephony/MediaTekRIL.java | 2259 ++++++++++++++++++++
src/java/com/android/internal/telephony/Phone.java | 35 +
.../com/android/internal/telephony/PhoneBase.java | 62 +-
.../android/internal/telephony/PhoneFactory.java | 20 +
.../com/android/internal/telephony/PhoneProxy.java | 23 +
src/java/com/android/internal/telephony/RIL.java | 527 ++++-
.../internal/telephony/ServiceStateTracker.java | 22 +
.../telephony/SubscriptionInfoUpdater.java | 2 +-
.../cdma/CdmaSubscriptionSourceManager.java | 2 +-
.../telephony/dataconnection/ApnSetting.java | 30 +-
.../telephony/dataconnection/DcTracker.java | 10 +
.../telephony/dataconnection/DcTrackerBase.java | 6 +-
.../android/internal/telephony/gsm/GSMPhone.java | 85 +-
.../android/internal/telephony/gsm/GsmMmiCode.java | 102 +-
.../telephony/gsm/GsmServiceStateTracker.java | 43 +-
.../internal/telephony/imsphone/ImsPhone.java | 18 +
.../imsphone/ImsPhoneCommandInterface.java | 47 +
.../telephony/imsphone/ImsPhoneMmiCode.java | 21 +
.../telephony/sip/SipCommandInterface.java | 47 +
.../internal/telephony/test/SimulatedCommands.java | 33 +
.../internal/telephony/uicc/IccCardProxy.java | 209 +-
.../internal/telephony/uicc/IccConstants.java | 30 +
.../internal/telephony/uicc/IccFileHandler.java | 219 +-
.../internal/telephony/uicc/RuimRecords.java | 10 +-
.../internal/telephony/uicc/SIMRecords.java | 10 +-
.../android/internal/telephony/uicc/UiccCard.java | 107 +
.../telephony/uicc/UiccCardApplication.java | 163 ++
.../internal/telephony/uicc/UiccController.java | 421 +++-
.../internal/telephony/uicc/UsimFileHandler.java | 7 +
.../internal/telephony/EtwsNotification.java | 42 +
.../com/mediatek/internal/telephony/EtwsUtils.java | 31 +
.../mediatek/internal/telephony/FemtoCellInfo.aidl | 19 +
.../mediatek/internal/telephony/FemtoCellInfo.java | 154 ++
.../internal/telephony/ModemSwitchHandler.java | 244 +++
.../internal/telephony/NetworkInfoWithAcT.aidl | 57 +
.../internal/telephony/NetworkInfoWithAcT.java | 201 ++
.../internal/telephony/NetworkManager.java | 101 +
.../telephony/RadioCapabilitySwitchUtil.java | 310 +++
.../telephony/dataconnection/FdManager.java | 421 ++++
.../internal/telephony/uicc/IccCardProxyEx.java | 390 ++++
.../internal/telephony/worldphone/IWorldPhone.java | 86 +
.../telephony/worldphone/WorldPhoneOm.java | 912 ++++++++
.../telephony/worldphone/WorldPhoneUtil.java | 246 +++
.../telephony/worldphone/WorldPhoneWrapper.java | 86 +
48 files changed, 8359 insertions(+), 61 deletions(-)
create mode 100644 src/java/com/android/internal/telephony/MediaTekRIL.java
create mode 100644 src/java/com/mediatek/internal/telephony/EtwsNotification.java
create mode 100644 src/java/com/mediatek/internal/telephony/EtwsUtils.java
create mode 100755 src/java/com/mediatek/internal/telephony/FemtoCellInfo.aidl
create mode 100755 src/java/com/mediatek/internal/telephony/FemtoCellInfo.java
create mode 100755 src/java/com/mediatek/internal/telephony/ModemSwitchHandler.java
create mode 100755 src/java/com/mediatek/internal/telephony/NetworkInfoWithAcT.aidl
create mode 100755 src/java/com/mediatek/internal/telephony/NetworkInfoWithAcT.java
create mode 100755 src/java/com/mediatek/internal/telephony/NetworkManager.java
create mode 100755 src/java/com/mediatek/internal/telephony/RadioCapabilitySwitchUtil.java
create mode 100755 src/java/com/mediatek/internal/telephony/dataconnection/FdManager.java
create mode 100755 src/java/com/mediatek/internal/telephony/uicc/IccCardProxyEx.java
create mode 100755 src/java/com/mediatek/internal/telephony/worldphone/IWorldPhone.java
create mode 100755 src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneOm.java
create mode 100755 src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneUtil.java
create mode 100755 src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneWrapper.java
diff --git a/src/java/com/android/internal/telephony/BaseCommands.java b/src/java/com/android/internal/telephony/BaseCommands.java
index 3b5cb4e..9d4bee8 100644
--- a/src/java/com/android/internal/telephony/BaseCommands.java
+++ b/src/java/com/android/internal/telephony/BaseCommands.java
@@ -97,6 +97,25 @@ public abstract class BaseCommands implements CommandsInterface {
protected Registrant mCatCcAlphaRegistrant;
protected Registrant mSsRegistrant;
+ // MTK registrants
+ protected RegistrantList mPhoneRatFamilyChangedRegistrants = new RegistrantList();
+ protected RegistrantList mSessionChangedRegistrants = new RegistrantList();
+ protected RegistrantList mSimMissing = new RegistrantList();
+ protected RegistrantList mSimRecovery = new RegistrantList();
+ protected RegistrantList mVirtualSimOn = new RegistrantList();
+ protected RegistrantList mVirtualSimOff = new RegistrantList();
+ protected RegistrantList mSimPlugOutRegistrants = new RegistrantList();
+ protected RegistrantList mSimPlugInRegistrants = new RegistrantList();
+ protected RegistrantList mCommonSlotNoChangedRegistrants = new RegistrantList();
+ protected RegistrantList mDataAllowedRegistrants = new RegistrantList();
+ protected RegistrantList mNeighboringInfoRegistrants = new RegistrantList();
+ protected RegistrantList mNetworkInfoRegistrants = new RegistrantList();
+ protected RegistrantList mPlmnChangeNotificationRegistrant = new RegistrantList();
+ protected RegistrantList mPsNetworkStateRegistrants = new RegistrantList();
+ protected Registrant mRegistrationSuspendedRegistrant;
+ // M: fast dormancy.
+ protected Registrant mScriResultRegistrant;
+
// Preferred network type received from PhoneFactory.
// This is used when establishing a connection to the
// vendor ril so it starts up in the correct mode.
@@ -108,6 +127,12 @@ public abstract class BaseCommands implements CommandsInterface {
// RIL Version
protected int mRilVersion = -1;
+ // MTK states
+ /* M: call control part start */
+ protected boolean mbWaitingForECFURegistrants = false;
+ protected Object mCfuReturnValue = null; ///* M: SS part */
+ /* M: call control part end */
+
public BaseCommands(Context context) {
mContext = context; // May be null (if so we won't log statistics)
}
@@ -936,4 +961,188 @@ public abstract class BaseCommands implements CommandsInterface {
return TelephonyManager.getLteOnGsmModeStatic();
}
+ // MTK additions
+
+ //MTK-START Support Multi-Application
+ @Override
+ public void openIccApplication(int application, Message response) {
+ }
+
+ @Override
+ public void getIccApplicationStatus(int sessionId, Message result) {
+ }
+
+ @Override
+ public void iccIOForAppEx(int command, int fileid, String path, int p1, int p2, int p3,
+ String data, String pin2, String aid, int channel, Message response) {
+ }
+
+ @Override
+ public void registerForSessionChanged(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mSessionChangedRegistrants.add(r);
+ }
+
+ @Override
+ public void unregisterForSessionChanged(Handler h) {
+ mSessionChangedRegistrants.remove(h);
+ }
+ //MTK-END Support Multi-Application
+
+ //MTK-START Support SIM ME lock
+ @Override
+ public void queryNetworkLock(int categrory, Message response){};
+
+ @Override
+ public void setNetworkLock(int catagory, int lockop, String password,
+ String data_imsi, String gid1, String gid2, Message response){};
+ //MTK-END Support SIM ME lock
+
+ @Override
+ public void doGeneralSimAuthentication(int sessionId, int mode , int tag, String param1,
+ String param2, Message response) {
+ }
+
+ public void registerForSimMissing(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mSimMissing.add(r);
+ }
+ public void unregisterForSimMissing(Handler h) {
+ mSimMissing.remove(h);
+ }
+
+ public void registerForSimRecovery(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mSimRecovery.add(r);
+ }
+
+ public void unregisterForSimRecovery(Handler h) {
+ mSimRecovery.remove(h);
+ }
+
+ public void registerForVirtualSimOn(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mVirtualSimOn.add(r);
+ }
+
+ public void unregisterForVirtualSimOn(Handler h) {
+ mVirtualSimOn.remove(h);
+ }
+
+ public void registerForVirtualSimOff(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mVirtualSimOff.add(r);
+ }
+
+ public void unregisterForVirtualSimOff(Handler h) {
+ mVirtualSimOff.remove(h);
+ }
+
+ public void registerForSimPlugOut(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mSimPlugOutRegistrants.add(r);
+ }
+
+ public void unregisterForSimPlugOut(Handler h) {
+ mSimPlugOutRegistrants.remove(h);
+ }
+
+ public void registerForSimPlugIn(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mSimPlugInRegistrants.add(r);
+ }
+
+ public void unregisterForSimPlugIn(Handler h) {
+ mSimPlugInRegistrants.remove(h);
+ }
+
+ public void registerForCommonSlotNoChanged(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mCommonSlotNoChangedRegistrants.add(r);
+ }
+
+ public void unregisterForCommonSlotNoChanged(Handler h) {
+ mCommonSlotNoChangedRegistrants.remove(h);
+ }
+
+ public void registerForPsNetworkStateChanged(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+
+ mPsNetworkStateRegistrants.add(r);
+ }
+
+ public void unregisterForPsNetworkStateChanged(Handler h) {
+ mPsNetworkStateRegistrants.remove(h);
+ }
+
+ public void registerForNeighboringInfo(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mNeighboringInfoRegistrants.add(r);
+ }
+
+ public void unregisterForNeighboringInfo(Handler h) {
+ mNeighboringInfoRegistrants.remove(h);
+ }
+
+ public void registerForNetworkInfo(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mNetworkInfoRegistrants.add(r);
+ }
+
+ public void unregisterForNetworkInfo(Handler h) {
+ mNetworkInfoRegistrants.remove(h);
+ }
+
+ public void setTrm(int mode, Message result) {}
+
+ public void setOnPlmnChangeNotification(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mPlmnChangeNotificationRegistrant.add(r);
+ }
+
+ public void unSetOnPlmnChangeNotification(Handler h) {
+ mPlmnChangeNotificationRegistrant.remove(h);
+ }
+
+ public void setOnRegistrationSuspended(Handler h, int what, Object obj) {
+ mRegistrationSuspendedRegistrant = new Registrant(h, what, obj);
+ }
+
+ public void unSetOnRegistrationSuspended(Handler h) {
+ mRegistrationSuspendedRegistrant.clear();
+ }
+
+ @Override
+ public void setPhoneRatFamily(int ratFamily, Message response) {
+ }
+
+ @Override
+ public void getPhoneRatFamily(Message response) {
+ }
+
+ @Override
+ public void registerForPhoneRatFamilyChanged(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mPhoneRatFamilyChangedRegistrants.add(r);
+ }
+
+ @Override
+ public void unregisterForPhoneRatFamilyChanged(Handler h) {
+ mPhoneRatFamilyChangedRegistrants.remove(h);
+ }
+
+ // M: fast dormancy
+ public void setScriResult(Handler h, int what, Object obj) {
+ mScriResultRegistrant = new Registrant(h, what, obj);
+ }
+
+ public void unSetScriResult(Handler h) {
+ mScriResultRegistrant.clear();
+ }
+
+ public void setScri(boolean forceRelease, Message response){
+ }
+
+ public void setFDMode(int mode, int parameter1, int parameter2, Message response){
+ }
}
diff --git a/src/java/com/android/internal/telephony/CommandsInterface.java b/src/java/com/android/internal/telephony/CommandsInterface.java
index 89e30ae..dfa968e 100644
--- a/src/java/com/android/internal/telephony/CommandsInterface.java
+++ b/src/java/com/android/internal/telephony/CommandsInterface.java
@@ -102,6 +102,15 @@ public interface CommandsInterface {
static final int USSD_MODE_NOT_SUPPORTED = 4;
static final int USSD_MODE_NW_TIMEOUT = 5;
+ /* M: SS part */
+ //MTK-START [mtk04070][111118][ALPS00093395]MTK added
+ static final int USSD_SESSION_END = 2;
+ static final int USSD_HANDLED_BY_STK = 3;
+ static final int USSD_OPERATION_NOT_SUPPORTED = 4;
+ static final int USSD_NETWORK_TIMEOUT = 5;
+ //MTK-END [mtk04070][111118][ALPS00093395]MTK added
+ /* M: SS part end */
+
// GSM SMS fail cause for acknowledgeLastIncomingSMS. From TS 23.040, 9.2.3.22.
static final int GSM_SMS_FAIL_CAUSE_MEMORY_CAPACITY_EXCEEDED = 0xD3;
static final int GSM_SMS_FAIL_CAUSE_USIM_APP_TOOLKIT_BUSY = 0xD4;
@@ -114,6 +123,19 @@ public interface CommandsInterface {
static final int CDMA_SMS_FAIL_CAUSE_OTHER_TERMINAL_PROBLEM = 39;
static final int CDMA_SMS_FAIL_CAUSE_ENCODING_PROBLEM = 96;
+ //MTK AT CMD +ESMLCK
+ static final int CAT_NETWOEK = 0;
+ static final int CAT_NETOWRK_SUBSET = 1;
+ static final int CAT_SERVICE_PROVIDER = 2;
+ static final int CAT_CORPORATE = 3;
+ static final int CAT_SIM = 4;
+
+ static final int OP_UNLOCK = 0;
+ static final int OP_LOCK = 1;
+ static final int OP_ADD = 2;
+ static final int OP_REMOVE = 3;
+ static final int OP_PERMANENT_UNLOCK = 4;
+
//***** Methods
RadioState getRadioState();
@@ -2018,4 +2040,232 @@ public interface CommandsInterface {
*/
void setOnCatSendSmsResult(Handler h, int what, Object obj);
void unSetOnCatSendSmsResult(Handler h);
+
+ // MTK additions
+
+ //MTK-START multiple application support
+ /**
+ * M: Open application in the UICC
+ *
+ * @param application: application ID
+ * @param response The message to send.
+ */
+ public void openIccApplication(int application, Message response);
+
+ /**
+ * Query application status
+ *
+ * @param sessionId: The channel ID
+ * @param response The message to send.
+ */
+ public void getIccApplicationStatus(int sessionId, Message result);
+
+ /**
+ * parameters equivalent to 27.007 AT+CRLA command
+ * channel is used to assign which application to get EF file.
+ * response.obj will be an AsyncResult
+ * response.obj.userObj will be a IccIoResult on success
+ */
+ void iccIOForAppEx(int command, int fileid, String path, int p1, int p2, int p3,
+ String data, String pin2, String aid, int channel, Message response);
+
+ /**
+ * Register the handler for event notifications for sessionid of an application changed event.
+ *
+ * @param h Handler for notification message.
+ * @param what User-defined message code.
+ * @param obj User object.
+ */
+ void registerForSessionChanged(Handler h, int what, Object obj);
+
+ /**
+ * Unregister the handler for event notifications for sessionid of an application changed event.
+ *
+ * @param h Handler for notification message.
+ */
+ void unregisterForSessionChanged(Handler h);
+ //MTK-END multiple application support
+
+ /**
+ * Query network lock status according to indicated category.
+ *
+ * @param categrory network lock category
+ * 0 for Network personalisation category
+ * 1 for Network subset personalisation category
+ * 2 for Service provider personalisation category
+ * 3 for Corporate(GID) personalisation category
+ * 4 for SIM/USIM(IMSI) personalisation category
+ * @param response Callback message containing response structure.
+ */
+ void queryNetworkLock(int categrory, Message response);
+
+ /**
+ * Query network lock status according to indicated category.
+ *
+ * @param categrory network lock category
+ * "0" for Network personalisation category
+ * "1" for Network subset personalisation category
+ * "2" for Service provider personalisation category
+ * "3" for Corporate(GID) personalisation category
+ * "4" for SIM/USIM(IMSI) personalisation category
+ * @param lockop lock operation
+ * "0" for unlock opreation
+ * "1" for lock opreation
+ * "2" for add lock opreation
+ * "3" for remove lock opreation
+ * "4" for disable lock category opreation
+ * @param password password of indicated network lock
+ * @param data_imsi IMSI value used to setup lock
+ * @param gid1 GID1 value used to setup lock
+ * @param gid2 GID2 value used to setup lock
+ * @param response Callback message containing response structure.
+ */
+ void setNetworkLock(int catagory, int lockop, String password,
+ String data_imsi, String gid1, String gid2, Message response);
+
+
+ /**
+ * Request security context authentication for SIM/USIM/ISIM
+ */
+ public void doGeneralSimAuthentication(int sessionId, int mode , int tag, String param1,
+ String param2, Message response);
+
+ void iccGetATR(Message result);
+ void iccOpenChannelWithSw(String AID, Message result);
+
+ void registerForSimMissing(Handler h, int what, Object obj);
+ void unregisterForSimMissing(Handler h);
+
+ void registerForSimRecovery(Handler h, int what, Object obj);
+ void unregisterForSimRecovery(Handler h);
+
+ public void registerForVirtualSimOn(Handler h, int what, Object obj);
+ public void unregisterForVirtualSimOn(Handler h);
+
+ public void registerForVirtualSimOff(Handler h, int what, Object obj);
+ public void unregisterForVirtualSimOff(Handler h);
+
+ /**
+ * Sets the handler for event notifications for SIM plug-out event.
+ *
+ * @param h Handler for notification message.
+ * @param what User-defined message code.
+ * @param obj User object.
+ */
+ void registerForSimPlugOut(Handler h, int what, Object obj);
+
+ /**
+ * Unregister the handler for event notifications for SIM plug-out event.
+ *
+ * @param h Handler for notification message.
+ */
+ void unregisterForSimPlugOut(Handler h);
+
+ /**
+ * Sets the handler for event notifications for SIM plug-in event.
+ *
+ * @param h Handler for notification message.
+ * @param what User-defined message code.
+ * @param obj User object.
+ */
+ void registerForSimPlugIn(Handler h, int what, Object obj);
+
+ /**
+ * Unregister the handler for event notifications for SIM plug-in event.
+ *
+ * @param h Handler for notification message.
+ */
+ void unregisterForSimPlugIn(Handler h);
+
+ /**
+ * Sets the handler for event notifications for SIM common slot no changed.
+ *
+ */
+ void registerForCommonSlotNoChanged(Handler h, int what, Object obj);
+
+ /**
+ * Unregister the handler for event notifications for SIM common slot no changed.
+ *
+ */
+ void unregisterForCommonSlotNoChanged(Handler h);
+
+ void registerForPsNetworkStateChanged(Handler h, int what, Object obj);
+ void unregisterForPsNetworkStateChanged(Handler h);
+
+ /**
+ * unlike the register* methods, there's only one Neighboring cell info handler
+ *
+ * AsyncResult.result is an Object[]
+ * ((Object[])AsyncResult.result)[0] is a String containing the RAT
+ * ((Object[])AsyncResult.result)[1] is a String containing the neighboring cell info raw data
+ *
+ * Please note that the delivery of this message may be delayed several
+ * seconds on system startup
+ */
+ void registerForNeighboringInfo(Handler h, int what, Object obj);
+ void unregisterForNeighboringInfo(Handler h);
+
+ /**
+ * unlike the register* methods, there's only one Network info handler
+ *
+ * AsyncResult.result is an Object[]
+ * ((Object[])AsyncResult.result)[0] is a String containing the type
+ * ((Object[])AsyncResult.result)[1] is a String contain the network info raw data
+ *
+ * Please note that the delivery of this message may be delayed several
+ * seconds on system startup
+ */
+ void registerForNetworkInfo(Handler h, int what, Object obj);
+ void unregisterForNetworkInfo(Handler h);
+
+ void setTrm(int mode, Message result);
+
+ void setOnPlmnChangeNotification(Handler h, int what, Object obj);
+ void unSetOnPlmnChangeNotification(Handler h);
+ void setOnRegistrationSuspended(Handler h, int what, Object obj);
+ void unSetOnRegistrationSuspended(Handler h);
+ void setResumeRegistration(int sessionId, Message response);
+ void storeModemType(int modemType, Message response);
+ void queryModemType(Message response);
+
+ /**
+ * Set phone RAT family.
+ *
+ * @param ratFamily bit mask to identify PhoneRatFamily.PHONE_RAT_FAMILY_2G,
+ * PhoneRatFamily.PHONE_RAT_FAMILY_3G, PhoneRatFamily.PHONE_RAT_FAMILY_4G
+ * @param result Callback message.
+ */
+ public void setPhoneRatFamily(int ratFamily, Message result);
+
+ /**
+ * Get phone RAT family.
+ *
+ * @param result Callback message.
+ */
+ public void getPhoneRatFamily(Message result);
+
+ /**
+ * Registers the handler when phone RAT family is changed.
+ *
+ * @param h Handler for notification message.
+ * @param what User-defined message code.
+ * @param obj User object.
+ */
+ public void registerForPhoneRatFamilyChanged(Handler h, int what, Object obj);
+
+ /**
+ * Unregister for notifications when phone RAT family is changed.
+ *
+ * @param h Handler to be removed from the registrant list.
+ */
+ public void unregisterForPhoneRatFamilyChanged(Handler h);
+
+ public void setInitialAttachApn(String apn, String protocol, int authType, String username,
+ String password, String operatorNumeric, boolean canHandleIms, Message result);
+
+ // Fast Dormancy
+ void setScri(boolean forceRelease, Message response);
+ void setFDMode(int mode, int parameter1, int parameter2, Message response);
+ public void setScriResult(Handler h, int what, Object obj);
+ public void unSetScriResult(Handler h);
}
diff --git a/src/java/com/android/internal/telephony/HardwareConfig.java b/src/java/com/android/internal/telephony/HardwareConfig.java
index 0f855de..9a35a01 100644
--- a/src/java/com/android/internal/telephony/HardwareConfig.java
+++ b/src/java/com/android/internal/telephony/HardwareConfig.java
@@ -161,6 +161,7 @@ public class HardwareConfig {
maxActiveVoiceCall = maxV;
maxActiveDataCall = maxD;
maxStandby = maxS;
+ Rlog.d(LOG_TAG, "assignModem: result=" + this.toString());
}
}
@@ -169,6 +170,7 @@ public class HardwareConfig {
uuid = id;
modemUuid = link;
state = state;
+ Rlog.d(LOG_TAG, "assignSim: result=" + this.toString());
}
}
diff --git a/src/java/com/android/internal/telephony/IccCard.java b/src/java/com/android/internal/telephony/IccCard.java
index 7d182be..6e1d35b 100644
--- a/src/java/com/android/internal/telephony/IccCard.java
+++ b/src/java/com/android/internal/telephony/IccCard.java
@@ -21,6 +21,7 @@ import android.os.Message;
import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.telephony.uicc.IccCardApplicationStatus;
+import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
import com.android.internal.telephony.uicc.IccFileHandler;
import com.android.internal.telephony.uicc.IccRecords;
@@ -231,4 +232,92 @@ public interface IccCard {
* @return true if ICC card is PUK2 blocked
*/
public boolean getIccPuk2Blocked();
+
+ // MTK additions
+
+ // Added by M begin
+ /**
+ * Use to query the network lock type.
+ *
+ * @return the network lock type define in IccCardApplicationStatus.PersoSubState
+ *
+ * @internal
+ */
+ public PersoSubState getNetworkPersoType();
+
+ /**
+ * Use to query indicated category's ME lock status
+ *
+ * @param category 0:Network, 1:Network subset, 2:Service Provider, 3: Corporate, 4:SIM
+ * @param onComplete
+ * onComplete.obj will be an AsyncResult
+ * ((AsyncResult)onComplete.obj).exception == null on success
+ * ((AsyncResult)onComplete.obj).exception != null on fail
+ *
+ * @return the network lock type define in IccCardApplicationStatus.PersoSubState
+ *
+ * @internal
+ */
+ public void queryIccNetworkLock(int category, Message onComplete);
+
+ /**
+ * Use to set indicated category's ME lock status
+ *
+ * @param category 0:Network, 1:Network subset, 2:Service Provider, 3: Corporate, 4:SIM
+ * @param lockop 0: Unlock, 1: Lock, 2:Add, 3:Remove, 4:Permanently unlock
+ * @param password password of indicated category lock
+ * @param data_imsi IMSI
+ * @param gid1 GID1 value
+ * @param gid2 GID2 value
+ * @param onComplete
+ * onComplete.obj will be an AsyncResult
+ * ((AsyncResult)onComplete.obj).exception == null on success
+ * ((AsyncResult)onComplete.obj).exception != null on fail
+ *
+ * @return the network lock type define in IccCardApplicationStatus.PersoSubState
+ *
+ * @internal
+ */
+ public void setIccNetworkLockEnabled(int category,
+ int lockop, String password, String data_imsi, String gid1, String gid2, Message onComplete);
+
+ /**
+ * Use to repolling icc card status (Used by SIM ME lock related enhancement feature)
+ *
+ * @param needIntent indicated need an Intent to notify needed to unlock another SIM or not.
+ * if yes, will broadcast TelephonyIntents.ACTION_UNLOCK_SIM_LOCK to notify.
+ * if no, will notify by original TelephonyIntents.ACTION_SIM_STATE_CHANGED.
+ */
+ public void repollIccStateForModemSmlChangeFeatrue(boolean needIntent);
+
+ /**
+ * NFC API, use to exchange SIM IO.
+ *
+ * @internal
+ */
+ public void exchangeSimIo(int fileID, int command,
+ int p1, int p2, int p3, String pathID, String data, String pin2, Message onComplete);
+
+ /**
+ * NFC API, use to get ATR.
+ *
+ * @internal
+ */
+ public void iccGetAtr(Message onComplete);
+
+ public String getIccCardType();
+
+ /**
+ * NFC API, use to open logical channel with sw.
+ *
+ * @internal
+ */
+ public void openLogicalChannelWithSw(String AID, Message onComplete);
+ /**
+ * Notifies handler in case of FDN changed
+ */
+ public void registerForFdnChanged(Handler h, int what, Object obj);
+ public void unregisterForFdnChanged(Handler h);
+
+ // Added by M end
}
diff --git a/src/java/com/android/internal/telephony/MediaTekRIL.java b/src/java/com/android/internal/telephony/MediaTekRIL.java
new file mode 100644
index 0000000..947fc3f
--- /dev/null
+++ b/src/java/com/android/internal/telephony/MediaTekRIL.java
@@ -0,0 +1,2259 @@
+/*
+ * Copyright (C) 2014 The OmniROM Project <http://www.omnirom.org>
+ *
+ * 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.net.LocalSocket;
+import android.net.LocalSocketAddress;
+import android.os.AsyncResult;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Parcel;
+import android.os.SystemProperties;
+import android.text.TextUtils;
+import android.telephony.PhoneNumberUtils;
+import android.telephony.PhoneRatFamily;
+import android.telephony.Rlog;
+import android.telephony.SignalStrength;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Vector;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import com.android.internal.telephony.uicc.IccRecords;
+import com.android.internal.telephony.uicc.UiccController;
+
+public class MediaTekRIL extends RIL implements CommandsInterface {
+
+ // TODO: Support multiSIM
+ // Sim IDs are 0 / 1
+ int mSimId = 0;
+
+ /* ALPS00799783: for restore previous preferred network type when set type fail */
+ private int mPreviousPreferredType = -1;
+
+ /* M: call control part start */
+ /* DTMF request will be ignored when duplicated sending */
+ private class dtmfQueueHandler {
+
+ public dtmfQueueHandler() {
+ mDtmfStatus = DTMF_STATUS_STOP;
+ }
+
+ public void start() {
+ mDtmfStatus = DTMF_STATUS_START;
+ }
+
+ public void stop() {
+ mDtmfStatus = DTMF_STATUS_STOP;
+ }
+
+ public boolean isStart() {
+ return (mDtmfStatus == DTMF_STATUS_START);
+ }
+
+ public void add(RILRequest o) {
+ mDtmfQueue.addElement(o);
+ }
+
+ public void remove(RILRequest o) {
+ mDtmfQueue.remove(o);
+ }
+
+ public void remove(int idx) {
+ mDtmfQueue.removeElementAt(idx);
+ }
+
+ public RILRequest get() {
+ return (RILRequest) mDtmfQueue.get(0);
+ }
+
+ public int size() {
+ return mDtmfQueue.size();
+ }
+
+ public void setPendingRequest(RILRequest r) {
+ mPendingCHLDRequest = r;
+ }
+
+ public RILRequest getPendingRequest() {
+ return mPendingCHLDRequest;
+ }
+
+ public void setSendChldRequest() {
+ mIsSendChldRequest = true;
+ }
+
+ public void resetSendChldRequest() {
+ mIsSendChldRequest = false;
+ }
+
+ public boolean hasSendChldRequest() {
+ riljLog("mIsSendChldRequest = " + mIsSendChldRequest);
+ return mIsSendChldRequest;
+ }
+
+ public final int MAXIMUM_DTMF_REQUEST = 32;
+ private final boolean DTMF_STATUS_START = true;
+ private final boolean DTMF_STATUS_STOP = false;
+
+ private boolean mDtmfStatus = DTMF_STATUS_STOP;
+ private Vector mDtmfQueue = new Vector(MAXIMUM_DTMF_REQUEST);
+
+ private RILRequest mPendingCHLDRequest = null;
+ private boolean mIsSendChldRequest = false;
+ }
+
+ private dtmfQueueHandler mDtmfReqQueue = new dtmfQueueHandler();
+ /* M: call control part end */
+
+ public MediaTekRIL(Context context, int networkMode, int cdmaSubscription) {
+ super(context, networkMode, cdmaSubscription, null);
+ }
+
+ public MediaTekRIL(Context context, int networkMode, int cdmaSubscription, Integer instanceId) {
+ super(context, networkMode, cdmaSubscription, instanceId);
+ }
+
+ public static byte[] hexStringToBytes(String s) {
+ byte[] ret;
+
+ if (s == null) return null;
+
+ int len = s.length();
+ ret = new byte[len/2];
+
+ for (int i=0 ; i <len ; i+=2) {
+ ret[i/2] = (byte) ((hexCharToInt(s.charAt(i)) << 4)
+ | hexCharToInt(s.charAt(i+1)));
+ }
+
+ return ret;
+ }
+
+ static int hexCharToInt(char c) {
+ if (c >= '0' && c <= '9') return (c - '0');
+ if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
+ if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
+
+ throw new RuntimeException ("invalid hex char '" + c + "'");
+ }
+
+ protected Object
+ responseOperatorInfos(Parcel p) {
+ if (mInstanceId == null || mInstanceId == 0) {
+ mSimId = 0;
+ } else {
+ mSimId = mInstanceId;
+ }
+
+ String strings[] = (String [])responseStrings(p);
+ ArrayList<OperatorInfo> ret;
+
+ if (strings.length % 4 != 0) {
+ throw new RuntimeException(
+ "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS: invalid response. Got "
+ + strings.length + " strings, expected multiples of 4");
+ }
+
+ String lacStr = SystemProperties.get("gsm.cops.lac");
+ boolean lacValid = false;
+ int lacIndex=0;
+
+ Rlog.d(RILJ_LOG_TAG, "lacStr = " + lacStr+" lacStr.length="+lacStr.length()+" strings.length="+strings.length);
+ if((lacStr.length() > 0) && (lacStr.length()%4 == 0) && ((lacStr.length()/4) == (strings.length/5 ))){
+ Rlog.d(RILJ_LOG_TAG, "lacValid set to true");
+ lacValid = true;
+ }
+
+ SystemProperties.set("gsm.cops.lac","");
+
+ ret = new ArrayList<OperatorInfo>(strings.length / 4);
+
+ for (int i = 0 ; i < strings.length ; i += 4) {
+ if((strings[i+0] != null) && (strings[i+0].startsWith("uCs2") == true)) {
+ riljLog("responseOperatorInfos handling UCS2 format name");
+
+ try {
+ strings[i+0] = new String(hexStringToBytes(strings[i+0].substring(4)), "UTF-16");
+ } catch(UnsupportedEncodingException ex) {
+ riljLog("responseOperatorInfos UnsupportedEncodingException");
+ }
+ }
+
+ if ((lacValid == true) && (strings[i] != null)) {
+ UiccController uiccController = UiccController.getInstance();
+ IccRecords iccRecords = uiccController.getIccRecords(mSimId, UiccController.APP_FAM_3GPP);
+ int lacValue = -1;
+ String sEons = null;
+ String lac = lacStr.substring(lacIndex,lacIndex+4);
+ Rlog.d(RILJ_LOG_TAG, "lacIndex="+lacIndex+" lacValue="+lacValue+" lac="+lac+" plmn numeric="+strings[i+2]+" plmn name"+strings[i+0]);
+
+ if(lac != "") {
+ lacValue = Integer.parseInt(lac, 16);
+ lacIndex += 4;
+ if(lacValue != 0xfffe) {
+ /*sEons = iccRecords.getEonsIfExist(strings[i+2],lacValue,true);
+ if(sEons != null) {
+ strings[i] = sEons;
+ Rlog.d(RILJ_LOG_TAG, "plmn name update to Eons: "+strings[i]);
+ }*/
+ } else {
+ Rlog.d(RILJ_LOG_TAG, "invalid lac ignored");
+ }
+ }
+ }
+
+ if (strings[i] != null && (strings[i].equals("") || strings[i].equals(strings[i+2]))) {
+ Operators init = new Operators ();
+ String temp = init.unOptimizedOperatorReplace(strings[i+2]);
+ riljLog("lookup RIL responseOperatorInfos() " + strings[i+2] + " gave " + temp);
+ strings[i] = temp;
+ strings[i+1] = temp;
+ }
+
+ // NOTE: We don't have the 5th element in MTK, and I don't know about
+ // the cases that make this processing necessary. Disable for now.
+ /*
+ // 1, 2 = 2G
+ // > 2 = 3G
+ String property_name = "gsm.baseband.capability";
+ if(mSimId > 0) {
+ property_name = property_name + (mSimId+1);
+ }
+
+ int basebandCapability = SystemProperties.getInt(property_name, 3);
+ Rlog.d(RILJ_LOG_TAG, "property_name="+property_name+", basebandCapability=" + basebandCapability);
+ if (3 < basebandCapability) {
+ strings[i+0] = strings[i+0].concat(" " + strings[i+4]);
+ strings[i+1] = strings[i+1].concat(" " + strings[i+4]);
+ }
+ */
+
+ ret.add(
+ new OperatorInfo(
+ strings[i+0],
+ strings[i+1],
+ strings[i+2],
+ strings[i+3]));
+ }
+
+ return ret;
+ }
+
+ private Object
+ responseCrssNotification(Parcel p) {
+ /*SuppCrssNotification notification = new SuppCrssNotification();
+
+ notification.code = p.readInt();
+ notification.type = p.readInt();
+ notification.number = p.readString();
+ notification.alphaid = p.readString();
+ notification.cli_validity = p.readInt();
+
+ return notification;*/
+
+ Rlog.e(RILJ_LOG_TAG, "NOT PROCESSING CRSS NOTIFICATION");
+ return null;
+ }
+
+ private Object responseEtwsNotification(Parcel p) {
+ /*EtwsNotification response = new EtwsNotification();
+
+ response.warningType = p.readInt();
+ response.messageId = p.readInt();
+ response.serialNumber = p.readInt();
+ response.plmnId = p.readString();
+ response.securityInfo = p.readString();
+
+ return response;*/
+ Rlog.e(RILJ_LOG_TAG, "NOT PROCESSING ETWS NOTIFICATION");
+
+ return null;
+ }
+
+ private Object responseSetupDedicateDataCall(Parcel p) {
+ int number = p.readInt();
+ if (RILJ_LOGD) riljLog("responseSetupDedicateDataCall number=" + number);
+ /*
+ DedicateDataCallState[] dedicateDataCalls = new DedicateDataCallState[number];
+ for (int i=0; i<number; i++) {
+ DedicateDataCallState dedicateDataCall = new DedicateDataCallState();
+ dedicateDataCall.readFrom(p);
+ dedicateDataCalls[i] = dedicateDataCall;
+
+ riljLog("[" + dedicateDataCall.interfaceId + ", " + dedicateDataCall.defaultCid + ", " + dedicateDataCall.cid + ", " + dedicateDataCall.active +
+ ", " + dedicateDataCall.signalingFlag + ", " + dedicateDataCall.failCause + ", Qos" + dedicateDataCall.qosStatus +
+ ", Tft" + dedicateDataCall.tftStatus + ", PCSCF" + dedicateDataCall.pcscfInfo);
+ }
+
+ if (number > 1)
+ return dedicateDataCalls;
+ else if (number > 0)
+ return dedicateDataCalls[0];
+ else
+ return null;
+ */
+ Rlog.e(RILJ_LOG_TAG, "responseSetupDedicateDataCall: stub!");
+
+ return null;
+ }
+
+ private Object
+ responseSetPhoneRatChanged(Parcel p) {
+ int num = p.readInt();
+ int rat = p.readInt();
+ PhoneRatFamily response = new PhoneRatFamily(mInstanceId, rat);
+
+ return response;
+ }
+
+ private Object
+ responseNetworkInfoWithActs(Parcel p) {
+ Rlog.e(RILJ_LOG_TAG, "responseNetworkInfoWithActs: stub!");
+
+ return null;
+ }
+
+ private Object
+ responseOperatorInfosWithAct(Parcel p) {
+ Rlog.e(RILJ_LOG_TAG, "responseOperatorInfosWithAct: stub!");
+
+ return null;
+ }
+
+ private Object
+ responseFemtoCellInfos(Parcel p) {
+ Rlog.e(RILJ_LOG_TAG, "responseFemtoCellInfos: stub!");
+
+ return null;
+ }
+
+ private Object
+ responseSmsParams(Parcel p) {
+ Rlog.e(RILJ_LOG_TAG, "responseSmsParams: stub!");
+
+ return null;
+ }
+
+ private Object
+ responseSimSmsMemoryStatus(Parcel p) {
+ Rlog.e(RILJ_LOG_TAG, "responseSimSmsMemoryStatus: stub!");
+
+ return null;
+ }
+
+ private Object
+ responseCbConfig(Parcel p) {
+ Rlog.e(RILJ_LOG_TAG, "responseCbConfig: stub!");
+
+ return null;
+ }
+
+ private Object
+ responseModifyDataCall(Parcel p) {
+ Rlog.e(RILJ_LOG_TAG, "responseModifyDataCall: stub!");
+
+ return null;
+ }
+
+ private Object
+ responsePcscfDiscovery(Parcel p) {
+ Rlog.e(RILJ_LOG_TAG, "responsePcscfDiscovery: stub!");
+
+ return null;
+ }
+
+ private Object
+ responseGetNitzTime(Parcel p) {
+ Rlog.e(RILJ_LOG_TAG, "responseGetNitzTime: stub!");
+
+ return null;
+ }
+
+ @Override
+ public void setLocalCallHold(int lchStatus) {
+ byte[] payload = new byte[]{(byte)(lchStatus & 0x7F)};
+ Rlog.d(RILJ_LOG_TAG, "setLocalCallHold: lchStatus is " + lchStatus);
+
+ // sendOemRilRequestRaw(OEMHOOK_EVT_HOOK_SET_LOCAL_CALL_HOLD, 1, payload, null);
+ Rlog.e(RILJ_LOG_TAG, "setLocalCallHold: stub!");
+ }
+
+ @Override
+ public void getModemCapability(Message response) {
+ Rlog.d(RILJ_LOG_TAG, "GetModemCapability");
+ // sendOemRilRequestRaw(OEMHOOK_EVT_HOOK_GET_MODEM_CAPABILITY, 0, null, response);
+ Rlog.w(RILJ_LOG_TAG, "GetModemCapability: not really implemented!");
+ AsyncResult.forMessage(response, null, CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
+ response.sendToTarget();
+ }
+
+ @Override
+ public void updateStackBinding(int stack, int enable, Message response) {
+ byte[] payload = new byte[]{(byte)stack,(byte)enable};
+ Rlog.d(RILJ_LOG_TAG, "UpdateStackBinding: on Stack: " + stack +
+ ", enable/disable: " + enable);
+
+ // sendOemRilRequestRaw(OEMHOOK_EVT_HOOK_UPDATE_SUB_BINDING, 2, payload, response);
+ Rlog.e(RILJ_LOG_TAG, "UpdateStackBinding: stub!");
+ }
+
+ @Override
+ public void
+ startDtmf(char c, Message result) {
+ /* M: call control part start */
+ /* DTMF request will be ignored when the count of requests reaches 32 */
+ synchronized (mDtmfReqQueue) {
+ if (!mDtmfReqQueue.hasSendChldRequest() && mDtmfReqQueue.size() < mDtmfReqQueue.MAXIMUM_DTMF_REQUEST) {
+ if (!mDtmfReqQueue.isStart()) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_DTMF_START, result);
+
+ rr.mParcel.writeString(Character.toString(c));
+ mDtmfReqQueue.start();
+ mDtmfReqQueue.add(rr);
+ if (mDtmfReqQueue.size() == 1) {
+ riljLog("send start dtmf");
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+ send(rr);
+ }
+ } else {
+ riljLog("DTMF status conflict, want to start DTMF when status is " + mDtmfReqQueue.isStart());
+ }
+ }
+ }
+ /* M: call control part end */
+ }
+ @Override
+ public void
+ stopDtmf(Message result) {
+ /* M: call control part start */
+ /* DTMF request will be ignored when the count of requests reaches 32 */
+ synchronized (mDtmfReqQueue) {
+ if (!mDtmfReqQueue.hasSendChldRequest() && mDtmfReqQueue.size() < mDtmfReqQueue.MAXIMUM_DTMF_REQUEST) {
+ if (mDtmfReqQueue.isStart()) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_DTMF_STOP, result);
+
+ mDtmfReqQueue.stop();
+ mDtmfReqQueue.add(rr);
+ if (mDtmfReqQueue.size() == 1) {
+ riljLog("send stop dtmf");
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+ send(rr);
+ }
+ } else {
+ riljLog("DTMF status conflict, want to start DTMF when status is " + mDtmfReqQueue.isStart());
+ }
+ }
+ }
+ /* M: call control part end */
+ }
+
+ @Override
+ public void
+ switchWaitingOrHoldingAndActive (Message result) {
+ RILRequest rr
+ = RILRequest.obtain(
+ RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE,
+ result);
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ /* M: call control part start */
+ handleChldRelatedRequest(rr);
+ /* M: call control part end */
+ }
+
+ @Override
+ public void
+ conference (Message result) {
+
+ /* M: call control part start */
+ /*
+ if (MobileManagerUtils.isSupported()) {
+ if (!checkMoMSSubPermission(SubPermissions.MAKE_CONFERENCE_CALL)) {
+ return;
+ }
+ }
+ */
+ /* M: call control part end */
+
+ RILRequest rr
+ = RILRequest.obtain(RIL_REQUEST_CONFERENCE, result);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ /* M: call control part start */
+ handleChldRelatedRequest(rr);
+ /* M: call control part end */
+ }
+
+ @Override
+ public void
+ separateConnection (int gsmIndex, Message result) {
+ RILRequest rr
+ = RILRequest.obtain(RIL_REQUEST_SEPARATE_CONNECTION, result);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+ + " " + gsmIndex);
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(gsmIndex);
+
+ /* M: call control part start */
+ handleChldRelatedRequest(rr);
+ /* M: call control part end */
+ }
+
+ @Override
+ public void
+ explicitCallTransfer (Message result) {
+ RILRequest rr
+ = RILRequest.obtain(RIL_REQUEST_EXPLICIT_CALL_TRANSFER, result);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ /* M: call control part start */
+ handleChldRelatedRequest(rr);
+ /* M: call control part end */
+ }
+
+ // all that C&P just for responseOperator overriding?
+ @Override
+ protected RILRequest
+ processSolicited (Parcel p) {
+ int serial, error;
+ boolean found = false;
+
+ serial = p.readInt();
+ error = p.readInt();
+
+ RILRequest rr;
+
+ rr = findAndRemoveRequestFromList(serial);
+
+ if (rr == null) {
+ Rlog.w(RILJ_LOG_TAG, "Unexpected solicited response! sn: "
+ + serial + " error: " + error);
+ return null;
+ }
+
+ /* M: call control part start */
+ /* DTMF request will be ignored when the count of requests reaches 32 */
+ if ((rr.mRequest == RIL_REQUEST_DTMF_START) ||
+ (rr.mRequest == RIL_REQUEST_DTMF_STOP)) {
+ synchronized (mDtmfReqQueue) {
+ mDtmfReqQueue.remove(rr);
+ riljLog("remove first item in dtmf queue done, size = " + mDtmfReqQueue.size());
+ if (mDtmfReqQueue.size() > 0) {
+ RILRequest rr2 = mDtmfReqQueue.get();
+ if (RILJ_LOGD) riljLog(rr2.serialString() + "> " + requestToString(rr2.mRequest));
+ send(rr2);
+ } else {
+ if (mDtmfReqQueue.getPendingRequest() != null) {
+ riljLog("send pending switch request");
+ send(mDtmfReqQueue.getPendingRequest());
+ mDtmfReqQueue.setSendChldRequest();
+ mDtmfReqQueue.setPendingRequest(null);
+ }
+ }
+ }
+ }
+ /* M: call control part end */
+ Object ret = null;
+
+ if ((rr.mRequest == RIL_REQUEST_QUERY_AVAILABLE_NETWORKS) ||
+ (rr.mRequest == RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT)) {
+ // mGetAvailableNetworkDoneRegistrant.notifyRegistrants();
+ Rlog.e(RILJ_LOG_TAG, "mGetAvailableNetworkDoneRegistrant.notifyRegistrants(); -- not implemented!");
+ }
+
+ /* ALPS00799783 START */
+ if (rr.mRequest == RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE) {
+ if ((error != 0) && (mPreviousPreferredType != -1)) {
+ riljLog("restore mPreferredNetworkType from " + mPreferredNetworkType + " to " + mPreviousPreferredType);
+ mPreferredNetworkType = mPreviousPreferredType;
+ }
+ mPreviousPreferredType = -1; //reset
+ }
+ /* ALPS00799783 END */
+
+ /* M: call control part start */
+ if (rr.mRequest == RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE ||
+ rr.mRequest == RIL_REQUEST_CONFERENCE ||
+ rr.mRequest == RIL_REQUEST_SEPARATE_CONNECTION ||
+ rr.mRequest == RIL_REQUEST_EXPLICIT_CALL_TRANSFER) {
+ riljLog("clear mIsSendChldRequest");
+ mDtmfReqQueue.resetSendChldRequest();
+ }
+ /* M: call control part end */
+
+ if (error == 0 || p.dataAvail() > 0) {
+
+ /* Convert RIL_REQUEST_GET_MODEM_VERSION back */
+ if (SystemProperties.get("ro.cm.device").indexOf("e73") == 0 &&
+ rr.mRequest == 220) {
+ rr.mRequest = RIL_REQUEST_BASEBAND_VERSION;
+ }
+
+ // either command succeeds or command fails but with data payload
+ try {switch (rr.mRequest) {
+ /*
+ cat libs/telephony/ril_commands.h \
+ | egrep "^ *{RIL_" \
+ | sed -re 's/\{([^,]+),[^,]+,([^}]+).+/case \1: ret = \2(p); break;/'
+ */
+ case RIL_REQUEST_GET_SIM_STATUS: ret = responseIccCardStatus(p); break;
+ case RIL_REQUEST_ENTER_SIM_PIN: ret = responseInts(p); break;
+ case RIL_REQUEST_ENTER_SIM_PUK: ret = responseInts(p); break;
+ case RIL_REQUEST_ENTER_SIM_PIN2: ret = responseInts(p); break;
+ case RIL_REQUEST_ENTER_SIM_PUK2: ret = responseInts(p); break;
+ case RIL_REQUEST_CHANGE_SIM_PIN: ret = responseInts(p); break;
+ case RIL_REQUEST_CHANGE_SIM_PIN2: ret = responseInts(p); break;
+ case RIL_REQUEST_ENTER_DEPERSONALIZATION_CODE: ret = responseInts(p); break;
+ case RIL_REQUEST_GET_CURRENT_CALLS: ret = responseCallList(p); break;
+ case RIL_REQUEST_DIAL: ret = responseVoid(p); break;
+ case RIL_REQUEST_GET_IMSI: ret = responseString(p); break;
+ case RIL_REQUEST_HANGUP: ret = responseVoid(p); break;
+ case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: ret = responseVoid(p); break;
+ case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: ret = responseVoid(p); break;
+ case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: ret = responseVoid(p); break;
+ case RIL_REQUEST_CONFERENCE: ret = responseVoid(p); break;
+ case RIL_REQUEST_UDUB: ret = responseVoid(p); break;
+ case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: ret = responseInts(p); break;
+ case RIL_REQUEST_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break;
+ case RIL_REQUEST_VOICE_REGISTRATION_STATE: ret = responseStrings(p); break;
+ case RIL_REQUEST_DATA_REGISTRATION_STATE: ret = responseStrings(p); break;
+ case RIL_REQUEST_OPERATOR: ret = responseOperator(p); break;
+ case RIL_REQUEST_RADIO_POWER: ret = responseVoid(p); break;
+ case RIL_REQUEST_DTMF: ret = responseVoid(p); break;
+ case RIL_REQUEST_SEND_SMS: ret = responseSMS(p); break;
+ case RIL_REQUEST_SEND_SMS_EXPECT_MORE: ret = responseSMS(p); break;
+ case RIL_REQUEST_SETUP_DATA_CALL: ret = responseSetupDataCall(p); break;
+ case RIL_REQUEST_SIM_IO: ret = responseICC_IO(p); break;
+ case RIL_REQUEST_SEND_USSD: ret = responseVoid(p); break;
+ case RIL_REQUEST_CANCEL_USSD: ret = responseVoid(p); break;
+ case RIL_REQUEST_GET_CLIR: ret = responseInts(p); break;
+ case RIL_REQUEST_SET_CLIR: ret = responseVoid(p); break;
+ case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: ret = responseCallForward(p); break;
+ case RIL_REQUEST_SET_CALL_FORWARD: ret = responseVoid(p); break;
+ case RIL_REQUEST_QUERY_CALL_WAITING: ret = responseInts(p); break;
+ case RIL_REQUEST_SET_CALL_WAITING: ret = responseVoid(p); break;
+ case RIL_REQUEST_SMS_ACKNOWLEDGE: ret = responseVoid(p); break;
+ case RIL_REQUEST_GET_IMEI: ret = responseString(p); break;
+ case RIL_REQUEST_GET_IMEISV: ret = responseString(p); break;
+ case RIL_REQUEST_ANSWER: ret = responseVoid(p); break;
+ case RIL_REQUEST_DEACTIVATE_DATA_CALL: ret = responseDeactivateDataCall(p); break; //VoLTE
+ case RIL_REQUEST_QUERY_FACILITY_LOCK: ret = responseInts(p); break;
+ case RIL_REQUEST_SET_FACILITY_LOCK: ret = responseInts(p); break;
+ case RIL_REQUEST_CHANGE_BARRING_PASSWORD: ret = responseVoid(p); break;
+ case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: ret = responseInts(p); break;
+ case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: ret = responseVoid(p); break;
+ case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : ret = responseOperatorInfos(p); break;
+ case RIL_REQUEST_ABORT_QUERY_AVAILABLE_NETWORKS: ret = responseVoid(p); break;
+ case RIL_REQUEST_DTMF_START: ret = responseVoid(p); break;
+ case RIL_REQUEST_DTMF_STOP: ret = responseVoid(p); break;
+ case RIL_REQUEST_BASEBAND_VERSION: ret = responseString(p); break;
+ case RIL_REQUEST_SEPARATE_CONNECTION: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_MUTE: ret = responseVoid(p); break;
+ case RIL_REQUEST_GET_MUTE: ret = responseInts(p); break;
+ case RIL_REQUEST_QUERY_CLIP: ret = responseInts(p); break;
+ case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: ret = responseInts(p); break;
+ case RIL_REQUEST_DATA_CALL_LIST: ret = responseDataCallList(p); break;
+ case RIL_REQUEST_RESET_RADIO: ret = responseVoid(p); break;
+ case RIL_REQUEST_OEM_HOOK_RAW: ret = responseRaw(p); break;
+ case RIL_REQUEST_OEM_HOOK_STRINGS: ret = responseStrings(p); break;
+ case RIL_REQUEST_SCREEN_STATE: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: ret = responseVoid(p); break;
+ case RIL_REQUEST_WRITE_SMS_TO_SIM: ret = responseInts(p); break;
+ case RIL_REQUEST_DELETE_SMS_ON_SIM: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_BAND_MODE: ret = responseVoid(p); break;
+ case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: ret = responseInts(p); break;
+ case RIL_REQUEST_STK_GET_PROFILE: ret = responseString(p); break;
+ case RIL_REQUEST_STK_SET_PROFILE: ret = responseVoid(p); break;
+ case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: ret = responseString(p); break;
+ case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: ret = responseVoid(p); break;
+ case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: ret = responseInts(p); break;
+ case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: ret = responseVoid(p); break;
+ case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: ret = responseGetPreferredNetworkType(p); break;
+ case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: ret = responseCellList(p); break;
+ case RIL_REQUEST_SET_LOCATION_UPDATES: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: ret = responseInts(p); break;
+ case RIL_REQUEST_SET_TTY_MODE: ret = responseVoid(p); break;
+ case RIL_REQUEST_QUERY_TTY_MODE: ret = responseInts(p); break;
+ case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: ret = responseInts(p); break;
+ case RIL_REQUEST_CDMA_FLASH: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_BURST_DTMF: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_SEND_SMS: ret = responseSMS(p); break;
+ case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: ret = responseVoid(p); break;
+ case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: ret = responseGmsBroadcastConfig(p); break;
+ case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: ret = responseVoid(p); break;
+ case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: ret = responseCdmaBroadcastConfig(p); break;
+ case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_SUBSCRIPTION: ret = responseStrings(p); break;
+ case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: ret = responseInts(p); break;
+ case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: ret = responseVoid(p); break;
+ case RIL_REQUEST_DEVICE_IDENTITY: ret = responseStrings(p); break;
+ case RIL_REQUEST_GET_SMSC_ADDRESS: ret = responseString(p); break;
+ case RIL_REQUEST_SET_SMSC_ADDRESS: ret = responseVoid(p); break;
+ case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break;
+ case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: ret = responseVoid(p); break;
+ case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: ret = responseVoid(p); break;
+ case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: ret = responseInts(p); break;
+ case RIL_REQUEST_ISIM_AUTHENTICATION: ret = responseString(p); break;
+ case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: ret = responseVoid(p); break;
+ case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: ret = responseICC_IO(p); break;
+ case RIL_REQUEST_VOICE_RADIO_TECH: ret = responseInts(p); break;
+ case RIL_REQUEST_GET_CELL_INFO_LIST: ret = responseCellInfoList(p); break;
+ case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_INITIAL_ATTACH_APN: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_DATA_PROFILE: ret = responseVoid(p); break;
+ case RIL_REQUEST_IMS_REGISTRATION_STATE: ret = responseInts(p); break;
+ case RIL_REQUEST_IMS_SEND_SMS: ret = responseSMS(p); break;
+ case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: ret = responseICC_IO(p); break;
+ case RIL_REQUEST_SIM_OPEN_CHANNEL: ret = responseInts(p); break;
+ case RIL_REQUEST_SIM_CLOSE_CHANNEL: ret = responseVoid(p); break;
+ case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: ret = responseICC_IO(p); break;
+ case RIL_REQUEST_NV_READ_ITEM: ret = responseString(p); break;
+ case RIL_REQUEST_NV_WRITE_ITEM: ret = responseVoid(p); break;
+ case RIL_REQUEST_NV_WRITE_CDMA_PRL: ret = responseVoid(p); break;
+ case RIL_REQUEST_NV_RESET_CONFIG: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_UICC_SUBSCRIPTION: ret = responseVoid(p); break;
+ case RIL_REQUEST_ALLOW_DATA: ret = responseVoid(p); break;
+ case RIL_REQUEST_GET_HARDWARE_CONFIG: ret = responseHardwareConfig(p); break;
+ case RIL_REQUEST_SIM_AUTHENTICATION: ret = responseICC_IOBase64(p); break;
+ case RIL_REQUEST_SHUTDOWN: ret = responseVoid(p); break;
+ case RIL_REQUEST_GET_PHONE_RAT_FAMILY: ret = responseInts(p); break;
+ case RIL_REQUEST_SET_PHONE_RAT_FAMILY: ret = responsePhoneId(); break;
+
+ /* M: call control part start */
+ case RIL_REQUEST_HANGUP_ALL: ret = responseVoid(p); break;
+ case RIL_REQUEST_FORCE_RELEASE_CALL: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_CALL_INDICATION: ret = responseVoid(p); break;
+ case RIL_REQUEST_EMERGENCY_DIAL: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_ECC_SERVICE_CATEGORY: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_ECC_LIST: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_SPEECH_CODEC_INFO: ret = responseVoid(p); break;
+ /* M: call control part end */
+
+ /// M: IMS feature. @{
+ case RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER: responseString(p); break;
+ case RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER: responseString(p); break;
+ case RIL_REQUEST_DIAL_WITH_SIP_URI: ret = responseVoid(p); break;
+ case RIL_REQUEST_RETRIEVE_HELD_CALL: ret = responseVoid(p); break;
+ /// @}
+
+ //MTK-START SIM ME lock
+ case RIL_REQUEST_QUERY_SIM_NETWORK_LOCK: ret = responseInts(p); break;
+ case RIL_REQUEST_SET_SIM_NETWORK_LOCK: ret = responseInts(p); break;
+ //MTK-END SIM ME lock
+ //MTK-START multiple application support
+ case RIL_REQUEST_GENERAL_SIM_AUTH: ret = responseICC_IO(p); break;
+ case RIL_REQUEST_OPEN_ICC_APPLICATION: ret = responseInts(p); break;
+ case RIL_REQUEST_GET_ICC_APPLICATION_STATUS: ret = responseIccCardStatus(p); break;
+ //MTK-END multiple application support
+ case RIL_REQUEST_SIM_IO_EX: ret = responseICC_IO(p); break;
+ // PHB Start
+ case RIL_REQUEST_QUERY_PHB_STORAGE_INFO: ret = responseInts(p); break;
+ case RIL_REQUEST_WRITE_PHB_ENTRY: ret = responseVoid(p); break;
+ case RIL_REQUEST_READ_PHB_ENTRY: {
+ // ret = responsePhbEntries(p); break;
+ Rlog.e(RILJ_LOG_TAG, "RIL_REQUEST_READ_PHB_ENTRY: stub!");
+ ret = responseVoid(p); break;
+ }
+ case RIL_REQUEST_QUERY_UPB_CAPABILITY: ret = responseInts(p); break;
+ case RIL_REQUEST_READ_UPB_GRP: ret = responseInts(p); break;
+ case RIL_REQUEST_WRITE_UPB_GRP: ret = responseVoid(p); break;
+ case RIL_REQUEST_EDIT_UPB_ENTRY: ret = responseVoid(p); break;
+ case RIL_REQUEST_DELETE_UPB_ENTRY: ret = responseVoid(p); break;
+ case RIL_REQUEST_READ_UPB_GAS_LIST: ret = responseStrings(p); break;
+ case RIL_REQUEST_GET_PHB_STRING_LENGTH: ret = responseInts(p); break;
+ case RIL_REQUEST_GET_PHB_MEM_STORAGE: {
+ // ret = responseGetPhbMemStorage(p); break;
+ Rlog.e(RILJ_LOG_TAG, "RIL_REQUEST_GET_PHB_MEM_STORAGE: stub!");
+ ret = responseVoid(p); break;
+ }
+ case RIL_REQUEST_SET_PHB_MEM_STORAGE: ret = responseVoid(p); break;
+ case RIL_REQUEST_READ_PHB_ENTRY_EXT: {
+ // ret = responseReadPhbEntryExt(p); break;
+ Rlog.e(RILJ_LOG_TAG, "RIL_REQUEST_READ_PHB_ENTRY_EXT: stub!");
+ ret = responseVoid(p); break;
+ }
+ case RIL_REQUEST_WRITE_PHB_ENTRY_EXT: ret = responseVoid(p); break;
+ // PHB End
+
+
+ /* M: network part start */
+ case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_WITH_ACT: ret = responseVoid(p); break;
+ case RIL_REQUEST_GET_POL_CAPABILITY: ret = responseInts(p); break;
+ case RIL_REQUEST_GET_POL_LIST: ret = responseNetworkInfoWithActs(p); break;
+ case RIL_REQUEST_SET_POL_ENTRY: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_TRM: ret = responseInts(p); break;
+ case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT : ret = responseOperatorInfosWithAct(p); break;
+ case RIL_REQUEST_STK_EVDL_CALL_BY_AP: ret = responseVoid(p); break;
+
+ //Femtocell (CSG) feature START
+ case RIL_REQUEST_GET_FEMTOCELL_LIST: ret = responseFemtoCellInfos(p); break;
+ case RIL_REQUEST_ABORT_FEMTOCELL_LIST: ret = responseVoid(p); break;
+ case RIL_REQUEST_SELECT_FEMTOCELL: ret = responseVoid(p); break;
+ //Femtocell (CSG) feature END
+ /* M: network part end */
+
+ case RIL_REQUEST_QUERY_MODEM_TYPE: ret = responseInts(p); break;
+ case RIL_REQUEST_STORE_MODEM_TYPE: ret = responseVoid(p); break;
+
+ // IMS
+ case RIL_REQUEST_SET_IMS_ENABLE: ret = responseVoid(p); break;
+ case RIL_REQUEST_SIM_GET_ATR: ret = responseString(p); break;
+ // M: Fast Dormancy
+ case RIL_REQUEST_SET_SCRI: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_FD_MODE: ret = responseInts(p); break;
+
+ // MTK-START, SMS part
+ case RIL_REQUEST_GET_SMS_PARAMS: ret = responseSmsParams(p); break;
+ case RIL_REQUEST_SET_SMS_PARAMS: ret = responseVoid(p); break;
+ case RIL_REQUEST_GET_SMS_SIM_MEM_STATUS: ret = responseSimSmsMemoryStatus(p); break;
+ case RIL_REQUEST_SET_ETWS: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_CB_CHANNEL_CONFIG_INFO: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_CB_LANGUAGE_CONFIG_INFO: ret = responseVoid(p); break;
+ case RIL_REQUEST_GET_CB_CONFIG_INFO: ret = responseCbConfig(p); break;
+ case RIL_REQUEST_REMOVE_CB_MESSAGE: ret = responseVoid(p); break;
+ // MTK-END, SMS part
+ case RIL_REQUEST_SET_DATA_CENTRIC: ret = responseVoid(p); break;
+
+ //VoLTE
+ case RIL_REQUEST_SETUP_DEDICATE_DATA_CALL: ret = responseSetupDedicateDataCall(p); break;
+ case RIL_REQUEST_DEACTIVATE_DEDICATE_DATA_CALL: ret = responseVoid(p); break;
+ case RIL_REQUEST_MODIFY_DATA_CALL: ret = responseModifyDataCall(p); break;
+ case RIL_REQUEST_ABORT_SETUP_DATA_CALL: ret = responseVoid(p); break;
+ case RIL_REQUEST_PCSCF_DISCOVERY_PCO: ret=responsePcscfDiscovery(p); break;
+ case RIL_REQUEST_CLEAR_DATA_BEARER: ret=responseVoid(p); break;
+ // M: CC33 LTE.
+ case RIL_REQUEST_SET_DATA_ON_TO_MD: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_REMOVE_RESTRICT_EUTRAN_MODE: ret = responseVoid(p); break;
+
+ case RIL_REQUEST_BTSIM_CONNECT: ret = responseString(p); break;
+ case RIL_REQUEST_BTSIM_DISCONNECT_OR_POWEROFF: ret = responseVoid(p); break;
+ case RIL_REQUEST_BTSIM_POWERON_OR_RESETSIM: ret = responseString(p); break;
+ case RIL_REQUEST_BTSIM_TRANSFERAPDU: ret = responseString(p); break;
+
+ /* M: call control part start */
+ case RIL_REQUEST_SET_IMS_CALL_STATUS: ret = responseVoid(p); break;
+ /* M: call control part end */
+
+ /* M: C2K part start */
+ case RIL_REQUEST_GET_NITZ_TIME: ret = responseGetNitzTime(p); break;
+ case RIL_REQUEST_QUERY_UIM_INSERTED: ret = responseInts(p); break;
+ case RIL_REQUEST_SWITCH_HPF: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_AVOID_SYS: ret = responseVoid(p); break;
+ case RIL_REQUEST_QUERY_AVOID_SYS: ret = responseInts(p); break;
+ case RIL_REQUEST_QUERY_CDMA_NETWORK_INFO: ret = responseStrings(p); break;
+ case RIL_REQUEST_GET_LOCAL_INFO: ret = responseInts(p); break;
+ case RIL_REQUEST_UTK_REFRESH: ret = responseVoid(p); break;
+ case RIL_REQUEST_QUERY_SMS_AND_PHONEBOOK_STATUS: ret = responseInts(p); break;
+ case RIL_REQUEST_QUERY_NETWORK_REGISTRATION: ret = responseInts(p); break;
+ case RIL_REQUEST_AGPS_TCP_CONNIND: ret = responseVoid(p); break;
+ case RIL_REQUEST_AGPS_SET_MPC_IPPORT: ret = responseVoid(p); break;
+ case RIL_REQUEST_AGPS_GET_MPC_IPPORT: ret = responseStrings(p); break;
+ case RIL_REQUEST_SET_MEID: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_REG_RESUME: ret = responseVoid(p); break;
+ case RIL_REQUEST_ENABLE_REG_PAUSE: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_ETS_DEV: ret = responseVoid(p); break;
+ case RIL_REQUEST_WRITE_MDN: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_VIA_TRM: ret = responseVoid(p); break;
+ case RIL_REQUEST_SET_ARSI_THRESHOLD: ret = responseVoid(p); break;
+ /* M: C2K part end */
+ default:
+ throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest);
+ //break;
+ }} catch (Throwable tr) {
+ // Exceptions here usually mean invalid RIL responses
+
+ Rlog.w(RILJ_LOG_TAG, rr.serialString() + "< "
+ + requestToString(rr.mRequest)
+ + " exception, possible invalid RIL response", tr);
+
+ if (rr.mResult != null) {
+ AsyncResult.forMessage(rr.mResult, null, tr);
+ rr.mResult.sendToTarget();
+ }
+ return rr;
+ }
+ }
+
+ if (rr.mRequest == RIL_REQUEST_SHUTDOWN) {
+ // Set RADIO_STATE to RADIO_UNAVAILABLE to continue shutdown process
+ // regardless of error code to continue shutdown procedure.
+ riljLog("Response to RIL_REQUEST_SHUTDOWN received. Error is " +
+ error + " Setting Radio State to Unavailable regardless of error.");
+ setRadioState(RadioState.RADIO_UNAVAILABLE);
+ }
+
+ // Here and below fake RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, see b/7255789.
+ // This is needed otherwise we don't automatically transition to the main lock
+ // screen when the pin or puk is entered incorrectly.
+ switch (rr.mRequest) {
+ case RIL_REQUEST_ENTER_SIM_PUK:
+ case RIL_REQUEST_ENTER_SIM_PUK2:
+ if (mIccStatusChangedRegistrants != null) {
+ if (RILJ_LOGD) {
+ riljLog("ON enter sim puk fakeSimStatusChanged: reg count="
+ + mIccStatusChangedRegistrants.size());
+ }
+ mIccStatusChangedRegistrants.notifyRegistrants();
+ }
+ break;
+ }
+
+ if (error != 0) {
+ switch (rr.mRequest) {
+ case RIL_REQUEST_ENTER_SIM_PIN:
+ case RIL_REQUEST_ENTER_SIM_PIN2:
+ case RIL_REQUEST_CHANGE_SIM_PIN:
+ case RIL_REQUEST_CHANGE_SIM_PIN2:
+ case RIL_REQUEST_SET_FACILITY_LOCK:
+ if (mIccStatusChangedRegistrants != null) {
+ if (RILJ_LOGD) {
+ riljLog("ON some errors fakeSimStatusChanged: reg count="
+ + mIccStatusChangedRegistrants.size());
+ }
+ mIccStatusChangedRegistrants.notifyRegistrants();
+ }
+ break;
+
+ case RIL_REQUEST_SET_PHONE_RAT_FAMILY:
+ if (RILJ_LOGD) {
+ riljLog("Set phone RAT failed, send response with phone ID");
+ }
+ ret = responsePhoneId();
+ break;
+ }
+
+ rr.onError(error, ret);
+ return rr;
+ }
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
+ + " " + retToString(rr.mRequest, ret));
+
+ if (rr.mResult != null) {
+ AsyncResult.forMessage(rr.mResult, ret, null);
+ rr.mResult.sendToTarget();
+ }
+
+ return rr;
+ }
+
+ @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_NEIGHBORING_CELL_INFO: ret = responseStrings(p); break;
+ case RIL_UNSOL_NETWORK_INFO: ret = responseStrings(p); break;
+ case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED: ret = responseVoid(p); break;
+ case RIL_UNSOL_INVALID_SIM: ret = responseStrings(p); break;
+ case RIL_UNSOL_RESPONSE_ACMT: ret = responseInts(p); break;
+ case RIL_UNSOL_IMEI_LOCK: ret = responseVoid(p); break;
+ case RIL_UNSOL_RESPONSE_MMRR_STATUS_CHANGED: ret = responseInts(p); break;
+ case RIL_UNSOL_STK_EVDL_CALL: ret = responseInts(p); break;
+ case RIL_UNSOL_STK_CALL_CTRL: ret = responseStrings(p); break;
+
+ case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: ret = responseInts(p); break;
+ case RIL_UNSOL_SRVCC_STATE_NOTIFY: ret = responseInts(p); break;
+ case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: ret = responseHardwareConfig(p); break;
+ // fxxk this conflicts with RIL_UNSOL_RADIO_CAPABILITY...
+ case RIL_UNSOL_SET_PHONE_RAT_FAMILY_COMPLETE:
+ ret = responseSetPhoneRatChanged(p); break;
+ /* M: call control part start */
+ case RIL_UNSOL_CALL_FORWARDING: ret = responseInts(p); break;
+ case RIL_UNSOL_CRSS_NOTIFICATION: ret = responseCrssNotification(p); break;
+ case RIL_UNSOL_INCOMING_CALL_INDICATION: ret = responseStrings(p); break;
+ case RIL_UNSOL_CIPHER_INDICATION: ret = responseStrings(p); break;
+ case RIL_UNSOL_CNAP: ret = responseStrings(p); break;
+ case RIL_UNSOL_SPEECH_CODEC_INFO: ret = responseInts(p); break;
+ /* M: call control part end */
+ //MTK-START multiple application support
+ case RIL_UNSOL_APPLICATION_SESSION_ID_CHANGED: ret = responseInts(p); break;
+ //MTK-END multiple application support
+ case RIL_UNSOL_SIM_MISSING: ret = responseInts(p); break;
+ case RIL_UNSOL_SIM_RECOVERY: ret = responseInts(p); break;
+ case RIL_UNSOL_VIRTUAL_SIM_ON: ret = responseInts(p); break;
+ case RIL_UNSOL_VIRTUAL_SIM_OFF: ret = responseInts(p); break;
+ case RIL_UNSOL_SIM_PLUG_OUT: ret = responseVoid(p); break;
+ case RIL_UNSOL_SIM_PLUG_IN: ret = responseVoid(p); break;
+ case RIL_UNSOL_SIM_COMMON_SLOT_NO_CHANGED: ret = responseVoid(p); break;
+ case RIL_UNSOL_DATA_ALLOWED: ret = responseVoid(p); break;
+ case RIL_UNSOL_PHB_READY_NOTIFICATION: ret = responseInts(p); break;
+ case RIL_UNSOL_STK_SETUP_MENU_RESET: ret = responseVoid(p); break;
+ // IMS
+ case RIL_UNSOL_IMS_ENABLE_DONE: ret = responseVoid(p); break;
+ case RIL_UNSOL_IMS_DISABLE_DONE: ret = responseVoid(p); break;
+ case RIL_UNSOL_IMS_REGISTRATION_INFO: ret = responseInts(p); break;
+ //VoLTE
+ case RIL_UNSOL_DEDICATE_BEARER_ACTIVATED: ret = responseSetupDedicateDataCall(p);break;
+ case RIL_UNSOL_DEDICATE_BEARER_MODIFIED: ret = responseSetupDedicateDataCall(p);break;
+ case RIL_UNSOL_DEDICATE_BEARER_DEACTIVATED: ret = responseInts(p);break;
+ // M: Fast Dormancy
+ case RIL_UNSOL_SCRI_RESULT: ret = responseInts(p); break;
+
+ case RIL_UNSOL_RESPONSE_PLMN_CHANGED: ret = responseStrings(p); break;
+ case RIL_UNSOL_RESPONSE_REGISTRATION_SUSPENDED: ret = responseInts(p); break;
+ //Remote SIM ME lock related APIs [Start]
+ case RIL_UNSOL_MELOCK_NOTIFICATION: ret = responseInts(p); break;
+ //Remote SIM ME lock related APIs [End]
+ case RIL_UNSOL_VOLTE_EPS_NETWORK_FEATURE_SUPPORT: ret = responseInts(p); break;
+
+ /// M: IMS feature. @{
+ //For updating call ids for conference call after SRVCC is done.
+ case RIL_UNSOL_ECONF_SRVCC_INDICATION: ret = responseInts(p); break;
+ //For updating conference call merged/added result.
+ case RIL_UNSOL_ECONF_RESULT_INDICATION: ret = responseStrings(p); break;
+ //For updating call mode and pau information.
+ case RIL_UNSOL_CALL_INFO_INDICATION : ret = responseStrings(p); break;
+ /// @}
+
+ case RIL_UNSOL_VOLTE_EPS_NETWORK_FEATURE_INFO: ret = responseInts(p); break;
+ case RIL_UNSOL_SRVCC_HANDOVER_INFO_INDICATION:ret = responseInts(p); break;
+ // M: CC33 LTE.
+ case RIL_UNSOL_RAC_UPDATE: ret = responseVoid(p); break;
+ case RIL_UNSOL_REMOVE_RESTRICT_EUTRAN: ret = responseVoid(p); break;
+
+ //MTK-START for MD state change
+ case RIL_UNSOL_MD_STATE_CHANGE: ret = responseInts(p); break;
+ //MTK-END for MD state change
+
+ case RIL_UNSOL_MO_DATA_BARRING_INFO: ret = responseInts(p); break;
+ case RIL_UNSOL_SSAC_BARRING_INFO: ret = responseInts(p); break;
+//MTK_TC1_FEATURE for LGE CSMCC_MO_CALL_MODIFIED {
+ case RIL_UNSOL_RESPONSE_MO_CALL_STATE_CHANGED: ret = responseStrings(p); break;
+//}
+ /* M: C2K part start*/
+ case RIL_UNSOL_CDMA_CALL_ACCEPTED: ret = responseVoid(p); break;
+ case RIL_UNSOL_UTK_SESSION_END: ret = responseVoid(p); break;
+ case RIL_UNSOL_UTK_PROACTIVE_COMMAND: ret = responseString(p); break;
+ case RIL_UNSOL_UTK_EVENT_NOTIFY: ret = responseString(p); break;
+ case RIL_UNSOL_VIA_GPS_EVENT: ret = responseInts(p); break;
+ case RIL_UNSOL_VIA_NETWORK_TYPE_CHANGE: ret = responseInts(p); break;
+ case RIL_UNSOL_VIA_PLMN_CHANGE_REG_PAUSE: ret = responseStrings(p); break;
+ case RIL_UNSOL_VIA_INVALID_SIM_DETECTED: ret = responseVoid(p); break;
+ /* M: C2K part end*/
+ default:
+ // Rewind the Parcel
+ p.setDataPosition(dataPosition);
+
+ // Forward responses that we are not overriding to the super class
+ super.processUnsolicited(p);
+ return;
+ }
+
+ // To avoid duplicating code from RIL.java, we rewrite some response codes to fit
+ // AOSP's one (when they do the same effect)
+ boolean rewindAndReplace = false;
+ int newResponseCode = 0;
+
+ switch (response) {
+ case RIL_UNSOL_NEIGHBORING_CELL_INFO:
+ if (RILJ_LOGD) unsljLogvRet(response, ret);
+ if (mNeighboringInfoRegistrants != null) {
+ mNeighboringInfoRegistrants.notifyRegistrants(
+ new AsyncResult(null, ret, null));
+ }
+ break;
+
+ case RIL_UNSOL_NETWORK_INFO:
+ if (RILJ_LOGD) unsljLogvRet(response, ret);
+ if (mNetworkInfoRegistrants != null) {
+ mNetworkInfoRegistrants.notifyRegistrants(
+ new AsyncResult(null, ret, null));
+ }
+ break;
+
+ case RIL_UNSOL_SET_PHONE_RAT_FAMILY_COMPLETE:
+ if (RILJ_LOGD) unsljLogRet(response, ret);
+ riljLog("mPhoneRatFamilyreg size :" + mPhoneRatFamilyChangedRegistrants.size());
+ if (mPhoneRatFamilyChangedRegistrants != null) {
+ mPhoneRatFamilyChangedRegistrants.notifyRegistrants(
+ new AsyncResult(null, ret, null));
+ }
+ break;
+
+ case RIL_UNSOL_PHB_READY_NOTIFICATION:
+ if (RILJ_LOGD) unsljLogRet(response, ret);
+ Rlog.e(RILJ_LOG_TAG, "RIL_UNSOL_PHB_READY_NOTIFICATION: stub!");
+ /*
+ if (mPhbReadyRegistrants != null) {
+ mPhbReadyRegistrants.notifyRegistrants(
+ new AsyncResult(null, ret, null));
+ }
+ */
+ break;
+
+ case RIL_UNSOL_STK_EVDL_CALL:
+ Rlog.e(RILJ_LOG_TAG, "RIL_UNSOL_STK_EVDL_CALL: stub!");
+ /*
+ if (false == SystemProperties.get("ro.mtk_bsp_package").equals("1")) {
+ if (RILJ_LOGD) unsljLogvRet(response, ret);
+ if (mStkEvdlCallRegistrant != null) {
+ mStkEvdlCallRegistrant.notifyRegistrant(new AsyncResult(null, ret, null));
+ }
+ }
+ */
+ break;
+
+ case RIL_UNSOL_STK_CALL_CTRL:
+ if (RILJ_LOGD) {
+ unsljLogvRet(response, ret);
+ }
+ Rlog.e(RILJ_LOG_TAG, "RIL_UNSOL_STK_CALL_CTRL: stub!");
+ /*
+ if (mStkCallCtrlRegistrant != null) {
+ mStkCallCtrlRegistrant.notifyRegistrant(new AsyncResult(null, ret, null));
+ }
+ */
+ break;
+
+ case RIL_UNSOL_STK_SETUP_MENU_RESET:
+ if (RILJ_LOGD) unsljLogRet(response, ret);
+ Rlog.e(RILJ_LOG_TAG, "RIL_UNSOL_STK_SETUP_MENU_RESET: stub!");
+ /*
+ if (mStkSetupMenuResetRegistrant != null) {
+ mStkSetupMenuResetRegistrant.notifyRegistrant(new AsyncResult(null, ret, null));
+ }
+ */
+ break;
+
+ //MTK-START multiple application support
+ case RIL_UNSOL_APPLICATION_SESSION_ID_CHANGED: {
+ if (RILJ_LOGD) unsljLog(response);
+ if (mSessionChangedRegistrants != null) {
+ mSessionChangedRegistrants.notifyRegistrants(new AsyncResult(null, ret, null));
+ }
+ break;
+ }
+ //MTK-END multiple application support
+
+ case RIL_UNSOL_SIM_MISSING:
+ if (RILJ_LOGD) unsljLogRet(response, ret);
+ if (mSimMissing != null) {
+ mSimMissing.notifyRegistrants(
+ new AsyncResult(null, ret, null));
+ }
+ break;
+
+ case RIL_UNSOL_SIM_RECOVERY:
+ if (RILJ_LOGD) unsljLogRet(response, ret);
+ if (mSimRecovery != null) {
+ mSimRecovery.notifyRegistrants(
+ new AsyncResult(null, ret, null));
+ }
+ break;
+
+ case RIL_UNSOL_VIRTUAL_SIM_ON:
+ if (RILJ_LOGD) unsljLogRet(response, ret);
+ if (mVirtualSimOn != null) {
+ mVirtualSimOn.notifyRegistrants(
+ new AsyncResult(null, ret, null));
+ }
+ break;
+
+ case RIL_UNSOL_VIRTUAL_SIM_OFF:
+ if (RILJ_LOGD) unsljLogRet(response, ret);
+ if (mVirtualSimOff != null) {
+ mVirtualSimOff.notifyRegistrants(
+ new AsyncResult(null, ret, null));
+ }
+ break;
+
+ case RIL_UNSOL_SIM_PLUG_OUT:
+ if (RILJ_LOGD) unsljLogRet(response, ret);
+ if (mSimPlugOutRegistrants != null) {
+ mSimPlugOutRegistrants.notifyRegistrants(
+ new AsyncResult(null, ret, null));
+ }
+ mCfuReturnValue = null;
+ break;
+
+ case RIL_UNSOL_SIM_PLUG_IN:
+ if (RILJ_LOGD) unsljLogRet(response, ret);
+ if (mSimPlugInRegistrants != null) {
+ mSimPlugInRegistrants.notifyRegistrants(
+ new AsyncResult(null, ret, null));
+ }
+ break;
+
+ case RIL_UNSOL_SIM_COMMON_SLOT_NO_CHANGED:
+ if (RILJ_LOGD) unsljLog(response);
+ if (mCommonSlotNoChangedRegistrants != null) {
+ mCommonSlotNoChangedRegistrants.notifyRegistrants(new AsyncResult(null, null, null));
+ }
+ break;
+
+ case RIL_UNSOL_RESPONSE_PLMN_CHANGED:
+ if (RILJ_LOGD) unsljLogvRet(response, ret);
+ if (mPlmnChangeNotificationRegistrant != null) {
+ mPlmnChangeNotificationRegistrant.notifyRegistrants(new AsyncResult(null, ret, null));
+ }
+ break;
+
+ case RIL_UNSOL_RESPONSE_REGISTRATION_SUSPENDED:
+ if (RILJ_LOGD) unsljLogvRet(response, ret);
+ if (mRegistrationSuspendedRegistrant != null) {
+ mRegistrationSuspendedRegistrant.notifyRegistrant(new AsyncResult(null, ret, null));
+ }
+ break;
+
+ // M: Fast Dormancy
+ case RIL_UNSOL_SCRI_RESULT:
+ Integer scriResult = (((int[]) ret)[0]);
+ riljLog("s:" + scriResult + ":" + (((int[]) ret)[0]));
+ if (RILJ_LOGD) unsljLogRet(response, ret);
+
+ if (mScriResultRegistrant != null) {
+ mScriResultRegistrant.notifyRegistrant(new AsyncResult(null, scriResult, null));
+ }
+ break;
+
+ /*
+ case RIL_UNSOL_CALL_PROGRESS_INFO:
+ rewindAndReplace = true;
+ newResponseCode = RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED;
+ break;
+ */
+
+ case RIL_UNSOL_INCOMING_CALL_INDICATION:
+ setCallIndication((String[])ret);
+ rewindAndReplace = true;
+ newResponseCode = RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED;
+ break;
+
+ case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
+ if (RILJ_LOGD) unsljLog(response);
+
+ mPsNetworkStateRegistrants
+ .notifyRegistrants(new AsyncResult(null, null, null));
+ break;
+
+ case RIL_UNSOL_SMS_READY_NOTIFICATION:
+ Rlog.e(RILJ_LOG_TAG, "RIL_UNSOL_SMS_READY_NOTIFICATION: stub!");
+ /*if (mGsmSmsRegistrant != null) {
+ mGsmSmsRegistrant
+ .notifyRegistrant();
+ }*/
+ break;
+
+ default:
+ Rlog.i(RILJ_LOG_TAG, "Unprocessed unsolicited known MTK response: " + response);
+ }
+
+ if (rewindAndReplace) {
+ Rlog.w(RILJ_LOG_TAG, "Rewriting MTK unsolicited response " + response + " to " + newResponseCode);
+
+ // Rewrite
+ p.setDataPosition(dataPosition);
+ p.writeInt(newResponseCode);
+
+ // And rewind again in front
+ p.setDataPosition(dataPosition);
+
+ super.processUnsolicited(p);
+ }
+ }
+
+ static String
+ requestToString(int request) {
+/*
+ cat libs/telephony/ril_commands.h \
+ | egrep "^ *{RIL_" \
+ | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
+*/
+ switch(request) {
+ case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
+ case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
+ case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
+ case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
+ case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
+ case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
+ case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
+ case RIL_REQUEST_ENTER_DEPERSONALIZATION_CODE: return "ENTER_DEPERSONALIZATION_CODE";
+ case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
+ case RIL_REQUEST_DIAL: return "DIAL";
+ case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
+ case RIL_REQUEST_HANGUP: return "HANGUP";
+ case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
+ case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
+ case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
+ case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
+ case RIL_REQUEST_UDUB: return "UDUB";
+ case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
+ case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
+ case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
+ case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
+ case RIL_REQUEST_OPERATOR: return "OPERATOR";
+ case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
+ case RIL_REQUEST_DTMF: return "DTMF";
+ case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
+ case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
+ case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
+ case RIL_REQUEST_SIM_IO: return "SIM_IO";
+ case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
+ /* M: SS part */
+ ///M: For query CNAP
+ case RIL_REQUEST_SEND_CNAP: return "SEND_CNAP";
+ /* M: SS part end */
+ case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
+ case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
+ case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
+ case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
+ case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
+ case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
+ case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
+ case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
+ case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
+ case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
+ case RIL_REQUEST_ANSWER: return "ANSWER";
+ case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
+ case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
+ case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
+ case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
+ case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
+ case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
+ case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
+ case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
+ case RIL_REQUEST_ABORT_QUERY_AVAILABLE_NETWORKS : return "ABORT_QUERY_AVAILABLE_NETWORKS";
+ case RIL_REQUEST_DTMF_START: return "DTMF_START";
+ case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
+ case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
+ case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
+ case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
+ case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
+ case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
+ case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
+ case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
+ case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
+ case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
+ case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
+ case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
+ case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: return "SET_SUPP_SVC_NOTIFICATION";
+ case RIL_REQUEST_WRITE_SMS_TO_SIM: return "WRITE_SMS_TO_SIM";
+ case RIL_REQUEST_DELETE_SMS_ON_SIM: return "DELETE_SMS_ON_SIM";
+ case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
+ case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
+ case RIL_REQUEST_STK_GET_PROFILE: return "REQUEST_STK_GET_PROFILE";
+ case RIL_REQUEST_STK_SET_PROFILE: return "REQUEST_STK_SET_PROFILE";
+ case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "REQUEST_STK_SEND_ENVELOPE_COMMAND";
+ case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "REQUEST_STK_SEND_TERMINAL_RESPONSE";
+ case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
+ case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "REQUEST_EXPLICIT_CALL_TRANSFER";
+ case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "REQUEST_SET_PREFERRED_NETWORK_TYPE";
+ case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "REQUEST_GET_PREFERRED_NETWORK_TYPE";
+ case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "REQUEST_GET_NEIGHBORING_CELL_IDS";
+ case RIL_REQUEST_SET_LOCATION_UPDATES: return "REQUEST_SET_LOCATION_UPDATES";
+ case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: return "RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE";
+ case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: return "RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE";
+ case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: return "RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE";
+ case RIL_REQUEST_SET_TTY_MODE: return "RIL_REQUEST_SET_TTY_MODE";
+ case RIL_REQUEST_QUERY_TTY_MODE: return "RIL_REQUEST_QUERY_TTY_MODE";
+ case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: return "RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
+ case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: return "RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
+ case RIL_REQUEST_CDMA_FLASH: return "RIL_REQUEST_CDMA_FLASH";
+ case RIL_REQUEST_CDMA_BURST_DTMF: return "RIL_REQUEST_CDMA_BURST_DTMF";
+ case RIL_REQUEST_CDMA_SEND_SMS: return "RIL_REQUEST_CDMA_SEND_SMS";
+ case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: return "RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE";
+ case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: return "RIL_REQUEST_GSM_GET_BROADCAST_CONFIG";
+ case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: return "RIL_REQUEST_GSM_SET_BROADCAST_CONFIG";
+ case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: return "RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG";
+ case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: return "RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG";
+ case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: return "RIL_REQUEST_GSM_BROADCAST_ACTIVATION";
+ case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return "RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY";
+ case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: return "RIL_REQUEST_CDMA_BROADCAST_ACTIVATION";
+ case RIL_REQUEST_CDMA_SUBSCRIPTION: return "RIL_REQUEST_CDMA_SUBSCRIPTION";
+ case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM";
+ case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM";
+ case RIL_REQUEST_DEVICE_IDENTITY: return "RIL_REQUEST_DEVICE_IDENTITY";
+ case RIL_REQUEST_GET_SMSC_ADDRESS: return "RIL_REQUEST_GET_SMSC_ADDRESS";
+ case RIL_REQUEST_SET_SMSC_ADDRESS: return "RIL_REQUEST_SET_SMSC_ADDRESS";
+ case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "REQUEST_EXIT_EMERGENCY_CALLBACK_MODE";
+ case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "RIL_REQUEST_REPORT_SMS_MEMORY_STATUS";
+ case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING";
+ case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE";
+ case RIL_REQUEST_ISIM_AUTHENTICATION: return "RIL_REQUEST_ISIM_AUTHENTICATION";
+ case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
+ case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
+ case RIL_REQUEST_VOICE_RADIO_TECH: return "RIL_REQUEST_VOICE_RADIO_TECH";
+ case RIL_REQUEST_GET_CELL_INFO_LIST: return "RIL_REQUEST_GET_CELL_INFO_LIST";
+ case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return "RIL_REQUEST_SET_CELL_INFO_LIST_RATE";
+ case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
+ case RIL_REQUEST_SET_DATA_PROFILE: return "RIL_REQUEST_SET_DATA_PROFILE";
+ case RIL_REQUEST_IMS_REGISTRATION_STATE: return "RIL_REQUEST_IMS_REGISTRATION_STATE";
+ case RIL_REQUEST_IMS_SEND_SMS: return "RIL_REQUEST_IMS_SEND_SMS";
+ case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC";
+ case RIL_REQUEST_SIM_OPEN_CHANNEL: return "RIL_REQUEST_SIM_OPEN_CHANNEL";
+ case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "RIL_REQUEST_SIM_CLOSE_CHANNEL";
+ case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL";
+ case RIL_REQUEST_NV_READ_ITEM: return "RIL_REQUEST_NV_READ_ITEM";
+ case RIL_REQUEST_NV_WRITE_ITEM: return "RIL_REQUEST_NV_WRITE_ITEM";
+ case RIL_REQUEST_NV_WRITE_CDMA_PRL: return "RIL_REQUEST_NV_WRITE_CDMA_PRL";
+ case RIL_REQUEST_NV_RESET_CONFIG: return "RIL_REQUEST_NV_RESET_CONFIG";
+ case RIL_REQUEST_SET_UICC_SUBSCRIPTION: return "RIL_REQUEST_SET_UICC_SUBSCRIPTION";
+ case RIL_REQUEST_ALLOW_DATA: return "RIL_REQUEST_ALLOW_DATA";
+ case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG";
+ case RIL_REQUEST_SIM_AUTHENTICATION: return "RIL_REQUEST_SIM_AUTHENTICATION";
+ case RIL_REQUEST_SHUTDOWN: return "RIL_REQUEST_SHUTDOWN";
+ case RIL_REQUEST_SET_PHONE_RAT_FAMILY: return "RIL_REQUEST_SET_PHONE_RAT_FAMILY";
+ case RIL_REQUEST_GET_PHONE_RAT_FAMILY: return "RIL_REQUEST_GET_PHONE_RAT_FAMILY";
+
+ /* M: call control part start */
+ case RIL_REQUEST_HANGUP_ALL: return "HANGUP_ALL";
+ case RIL_REQUEST_FORCE_RELEASE_CALL: return "FORCE_RELEASE_CALL";
+ case RIL_REQUEST_SET_CALL_INDICATION: return "SET_CALL_INDICATION";
+ case RIL_REQUEST_EMERGENCY_DIAL: return "EMERGENCY_DIAL";
+ case RIL_REQUEST_SET_ECC_SERVICE_CATEGORY: return "SET_ECC_SERVICE_CATEGORY";
+ case RIL_REQUEST_SET_ECC_LIST: return "SET_ECC_LIST";
+ case RIL_REQUEST_SET_SPEECH_CODEC_INFO: return "SET_SPEECH_CODEC_INFO";
+ /* M: call control part end */
+
+ /// M: IMS feature. @{
+ case RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER: return "RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER";
+ case RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER: return "RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER";
+ case RIL_REQUEST_DIAL_WITH_SIP_URI: return "RIL_REQUEST_DIAL_WITH_SIP_URI";
+ case RIL_REQUEST_RETRIEVE_HELD_CALL: return "RIL_REQUEST_RETRIEVE_HELD_CALL";
+ /// @}
+
+ //MTK-START SIM ME lock
+ case RIL_REQUEST_QUERY_SIM_NETWORK_LOCK: return "QUERY_SIM_NETWORK_LOCK";
+ case RIL_REQUEST_SET_SIM_NETWORK_LOCK: return "SET_SIM_NETWORK_LOCK";
+ //MTK-END SIM ME lock
+ //ISIM
+ case RIL_REQUEST_GENERAL_SIM_AUTH: return "RIL_REQUEST_GENERAL_SIM_AUTH";
+ case RIL_REQUEST_OPEN_ICC_APPLICATION: return "RIL_REQUEST_OPEN_ICC_APPLICATION";
+ case RIL_REQUEST_GET_ICC_APPLICATION_STATUS: return "RIL_REQUEST_GET_ICC_APPLICATION_STATUS";
+ case RIL_REQUEST_SIM_IO_EX: return "SIM_IO_EX";
+
+ // PHB Start
+ case RIL_REQUEST_QUERY_PHB_STORAGE_INFO: return "RIL_REQUEST_QUERY_PHB_STORAGE_INFO";
+ case RIL_REQUEST_WRITE_PHB_ENTRY: return "RIL_REQUEST_WRITE_PHB_ENTRY";
+ case RIL_REQUEST_READ_PHB_ENTRY: return "RIL_REQUEST_READ_PHB_ENTRY";
+ case RIL_REQUEST_QUERY_UPB_CAPABILITY: return "RIL_REQUEST_QUERY_UPB_CAPABILITY";
+ case RIL_REQUEST_EDIT_UPB_ENTRY: return "RIL_REQUEST_EDIT_UPB_ENTRY";
+ case RIL_REQUEST_DELETE_UPB_ENTRY: return "RIL_REQUEST_DELETE_UPB_ENTRY";
+ case RIL_REQUEST_READ_UPB_GAS_LIST: return "RIL_REQUEST_READ_UPB_GAS_LIST";
+ case RIL_REQUEST_READ_UPB_GRP: return "RIL_REQUEST_READ_UPB_GRP";
+ case RIL_REQUEST_WRITE_UPB_GRP: return "RIL_REQUEST_WRITE_UPB_GRP";
+ case RIL_REQUEST_GET_PHB_STRING_LENGTH: return "RIL_REQUEST_GET_PHB_STRING_LENGTH";
+ case RIL_REQUEST_GET_PHB_MEM_STORAGE: return "RIL_REQUEST_GET_PHB_MEM_STORAGE";
+ case RIL_REQUEST_SET_PHB_MEM_STORAGE: return "RIL_REQUEST_SET_PHB_MEM_STORAGE";
+ case RIL_REQUEST_READ_PHB_ENTRY_EXT: return "RIL_REQUEST_READ_PHB_ENTRY_EXT";
+ case RIL_REQUEST_WRITE_PHB_ENTRY_EXT: return "RIL_REQUEST_WRITE_PHB_ENTRY_EXT";
+ // PHB End
+
+ /* M: network part start */
+ case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_WITH_ACT: return "SET_NETWORK_SELECTION_MANUAL_WITH_ACT";
+ case RIL_REQUEST_GET_POL_CAPABILITY: return "RIL_REQUEST_GET_POL_CAPABILITY";
+ case RIL_REQUEST_GET_POL_LIST: return "RIL_REQUEST_GET_POL_LIST";
+ case RIL_REQUEST_SET_POL_ENTRY: return "RIL_REQUEST_SET_POL_ENTRY";
+ case RIL_REQUEST_SET_TRM: return "RIL_REQUEST_SET_TRM";
+ case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT : return "QUERY_AVAILABLE_NETWORKS_WITH_ACT";
+ //Femtocell (CSG) feature START
+ case RIL_REQUEST_GET_FEMTOCELL_LIST: return "RIL_REQUEST_GET_FEMTOCELL_LIST";
+ case RIL_REQUEST_ABORT_FEMTOCELL_LIST: return "RIL_REQUEST_ABORT_FEMTOCELL_LIST";
+ case RIL_REQUEST_SELECT_FEMTOCELL: return "RIL_REQUEST_SELECT_FEMTOCELL";
+ //Femtocell (CSG) feature END
+ /* M: network part end */
+ case RIL_REQUEST_STK_EVDL_CALL_BY_AP: return "RIL_REQUEST_STK_EVDL_CALL_BY_AP";
+ case RIL_REQUEST_QUERY_MODEM_TYPE: return "RIL_REQUEST_QUERY_MODEM_TYPE";
+ case RIL_REQUEST_STORE_MODEM_TYPE: return "RIL_REQUEST_STORE_MODEM_TYPE";
+ case RIL_REQUEST_SIM_GET_ATR: return "SIM_GET_ATR";
+ case RIL_REQUEST_SIM_OPEN_CHANNEL_WITH_SW: return "SIM_OPEN_CHANNEL_WITH_SW";
+ //VoLTE
+ case RIL_REQUEST_SETUP_DEDICATE_DATA_CALL: return "RIL_REQUEST_SETUP_DEDICATE_DATA_CALL";
+ case RIL_REQUEST_DEACTIVATE_DEDICATE_DATA_CALL: return "RIL_REQUEST_DEACTIVATE_DEDICATE_DATA_CALL";
+ case RIL_REQUEST_MODIFY_DATA_CALL: return "RIL_REQUEST_MODIFY_DATA_CALL";
+ case RIL_REQUEST_ABORT_SETUP_DATA_CALL: return "RIL_REQUEST_ABORT_SETUP_DATA_CALL";
+ case RIL_REQUEST_PCSCF_DISCOVERY_PCO: return "RIL_REQUEST_PCSCF_DISCOVERY_PCO";
+ case RIL_REQUEST_CLEAR_DATA_BEARER: return "RIL_REQUEST_CLEAR_DATA_BEARER";
+
+ // IMS
+ case RIL_REQUEST_SET_IMS_ENABLE: return "RIL_REQUEST_SET_IMS_ENABLE";
+
+ // M: Fast Dormancy
+ case RIL_REQUEST_SET_SCRI: return "RIL_REQUEST_SET_SCRI";
+ case RIL_REQUEST_SET_FD_MODE: return "RIL_REQUEST_SET_FD_MODE";
+ // MTK-START, SMS part
+ case RIL_REQUEST_GET_SMS_PARAMS: return "RIL_REQUEST_GET_SMS_PARAMS";
+ case RIL_REQUEST_SET_SMS_PARAMS: return "RIL_REQUEST_SET_SMS_PARAMS";
+ case RIL_REQUEST_GET_SMS_SIM_MEM_STATUS: return "RIL_REQUEST_GET_SMS_SIM_MEM_STATUS";
+ case RIL_REQUEST_SET_ETWS: return "RIL_REQUEST_SET_ETWS";
+ case RIL_REQUEST_SET_CB_CHANNEL_CONFIG_INFO:
+ return "RIL_REQUEST_SET_CB_CHANNEL_CONFIG_INFO";
+ case RIL_REQUEST_SET_CB_LANGUAGE_CONFIG_INFO:
+ return "RIL_REQUEST_SET_CB_LANGUAGE_CONFIG_INFO";
+ case RIL_REQUEST_GET_CB_CONFIG_INFO: return "RIL_REQUEST_GET_CB_CONFIG_INFO";
+ case RIL_REQUEST_REMOVE_CB_MESSAGE: return "RIL_REQUEST_REMOVE_CB_MESSAGE";
+ // MTK-END, SMS part
+ case RIL_REQUEST_SET_DATA_CENTRIC: return "RIL_REQUEST_SET_DATA_CENTRIC";
+
+ case RIL_REQUEST_MODEM_POWEROFF: return "MODEM_POWEROFF";
+ case RIL_REQUEST_MODEM_POWERON: return "MODEM_POWERON";
+ // M: CC33 LTE.
+ case RIL_REQUEST_SET_DATA_ON_TO_MD: return "RIL_REQUEST_SET_DATA_ON_TO_MD";
+ case RIL_REQUEST_SET_REMOVE_RESTRICT_EUTRAN_MODE: return "RIL_REQUEST_SET_REMOVE_RESTRICT_EUTRAN_MODE";
+ case RIL_REQUEST_BTSIM_CONNECT: return "RIL_REQUEST_BTSIM_CONNECT";
+ case RIL_REQUEST_BTSIM_DISCONNECT_OR_POWEROFF: return "RIL_REQUEST_BTSIM_DISCONNECT_OR_POWEROFF";
+ case RIL_REQUEST_BTSIM_POWERON_OR_RESETSIM: return "RIL_REQUEST_BTSIM_POWERON_OR_RESETSIM";
+ case RIL_REQUEST_BTSIM_TRANSFERAPDU: return "RIL_REQUEST_SEND_BTSIM_TRANSFERAPDU";
+
+ /* M: call control part start */
+ case RIL_REQUEST_SET_IMS_CALL_STATUS: return "RIL_REQUEST_SET_IMS_CALL_STATUS";
+ /* M: call control part end */
+
+ /* M: C2K part start */
+ case RIL_REQUEST_GET_NITZ_TIME: return "RIL_REQUEST_GET_NITZ_TIME";
+ case RIL_REQUEST_QUERY_UIM_INSERTED: return "RIL_REQUEST_QUERY_UIM_INSERTED";
+ case RIL_REQUEST_SWITCH_HPF: return "RIL_REQUEST_SWITCH_HPF";
+ case RIL_REQUEST_SET_AVOID_SYS: return "RIL_REQUEST_SET_AVOID_SYS";
+ case RIL_REQUEST_QUERY_AVOID_SYS: return "RIL_REQUEST_QUERY_AVOID_SYS";
+ case RIL_REQUEST_QUERY_CDMA_NETWORK_INFO: return "RIL_REQUEST_QUERY_CDMA_NETWORK_INFO";
+ case RIL_REQUEST_GET_LOCAL_INFO: return "RIL_REQUEST_GET_LOCAL_INFO";
+ case RIL_REQUEST_UTK_REFRESH: return "RIL_REQUEST_UTK_REFRESH";
+ case RIL_REQUEST_QUERY_SMS_AND_PHONEBOOK_STATUS:
+ return "RIL_REQUEST_QUERY_SMS_AND_PHONEBOOK_STATUS";
+ case RIL_REQUEST_QUERY_NETWORK_REGISTRATION:
+ return "RIL_REQUEST_QUERY_NETWORK_REGISTRATION";
+ case RIL_REQUEST_AGPS_TCP_CONNIND: return "RIL_REQUEST_AGPS_TCP_CONNIND";
+ case RIL_REQUEST_AGPS_SET_MPC_IPPORT: return "RIL_REQUEST_AGPS_SET_MPC_IPPORT";
+ case RIL_REQUEST_AGPS_GET_MPC_IPPORT: return "RIL_REQUEST_AGPS_GET_MPC_IPPORT";
+ case RIL_REQUEST_SET_MEID: return "RIL_REQUEST_SET_MEID";
+ case RIL_REQUEST_SET_REG_RESUME: return "RIL_REQUEST_SET_REG_RESUME";
+ case RIL_REQUEST_ENABLE_REG_PAUSE: return "RIL_REQUEST_ENABLE_REG_PAUSE";
+ case RIL_REQUEST_SET_ETS_DEV: return "RIL_REQUEST_SET_ETS_DEV";
+ case RIL_REQUEST_WRITE_MDN: return "RIL_REQUEST_WRITE_MDN";
+ case RIL_REQUEST_SET_VIA_TRM: return "RIL_REQUEST_SET_VIA_TRM";
+ case RIL_REQUEST_SET_ARSI_THRESHOLD: return "RIL_REQUEST_SET_ARSI_THRESHOLD";
+ /* M: C2K part end */
+ default: return "<unknown request> (" + request + ")";
+ }
+ }
+
+ // VoLTE
+ private Object
+ responseDeactivateDataCall(Parcel p) {
+ int [] cidArray = null;
+ if (p.dataSize() > 0 ) { //checking Parcel data value
+ cidArray = (int []) responseInts(p);
+ }
+
+ return cidArray;
+ }
+
+ private Object
+ responseOperator(Parcel p) {
+ int num;
+ String response[] = null;
+
+ response = p.readStringArray();
+
+ if (false) {
+ num = p.readInt();
+
+ response = new String[num];
+ for (int i = 0; i < num; i++) {
+ response[i] = p.readString();
+ }
+ }
+
+ for (int i = 0; i < response.length; i++) {
+ if((response[i] != null) && (response[i].startsWith("uCs2") == true))
+ {
+ riljLog("responseOperator handling UCS2 format name: response[" + i + "]");
+ try{
+ response[i] = new String(hexStringToBytes(response[i].substring(4)),"UTF-16");
+ }catch(UnsupportedEncodingException ex){
+ riljLog("responseOperatorInfos UnsupportedEncodingException");
+ }
+ }
+ }
+
+ // NOTE: the original code seemingly has some nontrivial SpnOverride
+ // modifications, so I'm not going to port that.
+ if (response.length > 2 && response[2] != null) {
+ if (response[0] != null && (response[0].equals("") || response[0].equals(response[2]))) {
+ Operators init = new Operators ();
+ String temp = init.unOptimizedOperatorReplace(response[2]);
+ riljLog("lookup RIL responseOperator() " + response[2] + " gave " + temp + " was " + response[0] + "/" + response[1] + " before.");
+ response[0] = temp;
+ response[1] = temp;
+ }
+ }
+
+ return response;
+ }
+
+ private Object
+ responsePhoneId() {
+ return mInstanceId;
+ }
+
+ static String
+ responseToString(int request)
+ {
+/*
+ cat libs/telephony/ril_unsol_commands.h \
+ | egrep "^ *{RIL_" \
+ | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
+*/
+ switch(request) {
+ case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
+ case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
+ case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
+ case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
+ case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
+ case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
+ case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
+ case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST";
+ case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
+ case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
+ case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
+ case RIL_UNSOL_SUPP_SVC_NOTIFICATION: return "UNSOL_SUPP_SVC_NOTIFICATION";
+ case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
+ case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
+ case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
+ case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
+ case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FULL";
+ case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
+ case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
+ case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
+ case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_RESPONSE_CDMA_NEW_SMS";
+ case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_RESPONSE_NEW_BROADCAST_SMS";
+ case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
+ case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
+ case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
+ case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
+ case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
+ case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
+ case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
+ case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
+ case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
+ case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "CDMA_SUBSCRIPTION_SOURCE_CHANGED";
+ case RIL_UNSOl_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
+ case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
+ case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
+ case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
+ case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST";
+ case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
+ return "UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED";
+ case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED:
+ return "RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
+ case RIL_UNSOL_SRVCC_STATE_NOTIFY:
+ return "UNSOL_SRVCC_STATE_NOTIFY";
+ case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: return "RIL_UNSOL_HARDWARE_CONFIG_CHANGED";
+ case RIL_UNSOL_ON_SS: return "UNSOL_ON_SS";
+ case RIL_UNSOL_STK_CC_ALPHA_NOTIFY: return "UNSOL_STK_CC_ALPHA_NOTIFY";
+ case RIL_UNSOL_STK_SEND_SMS_RESULT: return "RIL_UNSOL_STK_SEND_SMS_RESULT";
+ case RIL_UNSOL_SET_PHONE_RAT_FAMILY_COMPLETE:
+ return "RIL_UNSOL_SET_PHONE_RAT_FAMILY_COMPLETE";
+ /* M: call control part start */
+ case RIL_UNSOL_CALL_FORWARDING: return "UNSOL_CALL_FORWARDING";
+ case RIL_UNSOL_CRSS_NOTIFICATION: return "UNSOL_CRSS_NOTIFICATION";
+ case RIL_UNSOL_INCOMING_CALL_INDICATION: return "UNSOL_INCOMING_CALL_INDICATION";
+ case RIL_UNSOL_CIPHER_INDICATION: return "UNSOL_CIPHER_INDICATION";
+ case RIL_UNSOL_CNAP: return "UNSOL_CNAP";
+ case RIL_UNSOL_SPEECH_CODEC_INFO: return "UNSOL_SPEECH_CODEC_INFO";
+ /* M: call control part end */
+ //MTK-START multiple application support
+ case RIL_UNSOL_APPLICATION_SESSION_ID_CHANGED: return "RIL_UNSOL_APPLICATION_SESSION_ID_CHANGED";
+ //MTK-END multiple application support
+ case RIL_UNSOL_SIM_MISSING: return "UNSOL_SIM_MISSING";
+ case RIL_UNSOL_VIRTUAL_SIM_ON: return "UNSOL_VIRTUAL_SIM_ON";
+ case RIL_UNSOL_VIRTUAL_SIM_OFF: return "UNSOL_VIRTUAL_SIM_ON_OFF";
+ case RIL_UNSOL_SIM_RECOVERY: return "UNSOL_SIM_RECOVERY";
+ case RIL_UNSOL_SIM_PLUG_OUT: return "UNSOL_SIM_PLUG_OUT";
+ case RIL_UNSOL_SIM_PLUG_IN: return "UNSOL_SIM_PLUG_IN";
+ case RIL_UNSOL_SIM_COMMON_SLOT_NO_CHANGED: return "RIL_UNSOL_SIM_COMMON_SLOT_NO_CHANGED";
+ case RIL_UNSOL_DATA_ALLOWED: return "RIL_UNSOL_DATA_ALLOWED";
+ case RIL_UNSOL_PHB_READY_NOTIFICATION: return "UNSOL_PHB_READY_NOTIFICATION";
+ case RIL_UNSOL_IMEI_LOCK: return "UNSOL_IMEI_LOCK";
+ case RIL_UNSOL_RESPONSE_ACMT: return "UNSOL_ACMT_INFO";
+ case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED";
+ case RIL_UNSOL_RESPONSE_MMRR_STATUS_CHANGED: return "UNSOL_RESPONSE_MMRR_STATUS_CHANGED";
+ case RIL_UNSOL_NEIGHBORING_CELL_INFO: return "UNSOL_NEIGHBORING_CELL_INFO";
+ case RIL_UNSOL_NETWORK_INFO: return "UNSOL_NETWORK_INFO";
+ case RIL_UNSOL_INVALID_SIM: return "RIL_UNSOL_INVALID_SIM";
+ case RIL_UNSOL_IMS_ENABLE_DONE: return "RIL_UNSOL_IMS_ENABLE_DONE";
+ case RIL_UNSOL_IMS_DISABLE_DONE: return "RIL_UNSOL_IMS_DISABLE_DONE";
+ case RIL_UNSOL_IMS_REGISTRATION_INFO: return "RIL_UNSOL_IMS_REGISTRATION_INFO";
+ case RIL_UNSOL_STK_SETUP_MENU_RESET: return "RIL_UNSOL_STK_SETUP_MENU_RESET";
+ case RIL_UNSOL_RESPONSE_PLMN_CHANGED: return "RIL_UNSOL_RESPONSE_PLMN_CHANGED";
+ case RIL_UNSOL_RESPONSE_REGISTRATION_SUSPENDED: return "RIL_UNSOL_RESPONSE_REGISTRATION_SUSPENDED";
+ //VoLTE
+ case RIL_UNSOL_DEDICATE_BEARER_ACTIVATED: return "RIL_UNSOL_DEDICATE_BEARER_ACTIVATED";
+ case RIL_UNSOL_DEDICATE_BEARER_MODIFIED: return "RIL_UNSOL_DEDICATE_BEARER_MODIFIED";
+ //Remote SIM ME lock related APIs [Start]
+ case RIL_UNSOL_MELOCK_NOTIFICATION: return "RIL_UNSOL_MELOCK_NOTIFICATION";
+ //Remote SIM ME lock related APIs [End]
+ // M: Fast Dormancy
+ case RIL_UNSOL_SCRI_RESULT: return "RIL_UNSOL_SCRI_RESULT";
+ case RIL_UNSOL_STK_EVDL_CALL: return "RIL_UNSOL_STK_EVDL_CALL";
+ case RIL_UNSOL_STK_CALL_CTRL: return "RIL_UNSOL_STK_CALL_CTRL";
+
+ /// M: IMS feature. @{
+ case RIL_UNSOL_ECONF_SRVCC_INDICATION: return "RIL_UNSOL_ECONF_SRVCC_INDICATION";
+ //For updating conference call merged/added result.
+ case RIL_UNSOL_ECONF_RESULT_INDICATION: return "RIL_UNSOL_ECONF_RESULT_INDICATION";
+ //For updating call mode and pau information.
+ case RIL_UNSOL_CALL_INFO_INDICATION : return "RIL_UNSOL_CALL_INFO_INDICATION";
+ /// @}
+
+ case RIL_UNSOL_VOLTE_EPS_NETWORK_FEATURE_INFO: return "RIL_UNSOL_VOLTE_EPS_NETWORK_FEATURE_INFO";
+ case RIL_UNSOL_SRVCC_HANDOVER_INFO_INDICATION: return "RIL_UNSOL_SRVCC_HANDOVER_INFO_INDICATION";
+ // M: CC33 LTE.
+ case RIL_UNSOL_RAC_UPDATE: return "RIL_UNSOL_RAC_UPDATE";
+ case RIL_UNSOL_REMOVE_RESTRICT_EUTRAN: return "RIL_UNSOL_REMOVE_RESTRICT_EUTRAN";
+
+ //MTK-START for MD state change
+ case RIL_UNSOL_MD_STATE_CHANGE: return "RIL_UNSOL_MD_STATE_CHANGE";
+ //MTK-END for MD state change
+
+ case RIL_UNSOL_MO_DATA_BARRING_INFO: return "RIL_UNSOL_MO_DATA_BARRING_INFO";
+ case RIL_UNSOL_SSAC_BARRING_INFO: return "RIL_UNSOL_SSAC_BARRING_INFO";
+//MTK_TC1_FEATURE for LGE CSMCC_MO_CALL_MODIFIED {
+ case RIL_UNSOL_RESPONSE_MO_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_MO_CALL_STATE_CHANGED";
+//}
+ /* M: C2K part start */
+ case RIL_UNSOL_CDMA_CALL_ACCEPTED: return "RIL_UNSOL_CDMA_CALL_ACCEPTED";
+ case RIL_UNSOL_UTK_SESSION_END: return "RIL_UNSOL_UTK_SESSION_END";
+ case RIL_UNSOL_UTK_PROACTIVE_COMMAND: return "RIL_UNSOL_UTK_PROACTIVE_COMMAND";
+ case RIL_UNSOL_UTK_EVENT_NOTIFY: return "RIL_UNSOL_UTK_EVENT_NOTIFY";
+ case RIL_UNSOL_VIA_GPS_EVENT: return "RIL_UNSOL_VIA_GPS_EVENT";
+ case RIL_UNSOL_VIA_NETWORK_TYPE_CHANGE: return "RIL_UNSOL_VIA_NETWORK_TYPE_CHANGE";
+ case RIL_UNSOL_VIA_PLMN_CHANGE_REG_PAUSE: return "RIL_UNSOL_VIA_PLMN_CHANGE_REG_PAUSE";
+ case RIL_UNSOL_VIA_INVALID_SIM_DETECTED: return "RIL_UNSOL_VIA_INVALID_SIM_DETECTED";
+ /* M: C2K part end */
+ default: return "<unknown response> (" + request + ")";
+ }
+ }
+
+ /*
+ * to protect modem status we need to avoid two case :
+ * 1. DTMF start -> CHLD request -> DTMF stop
+ * 2. CHLD request -> DTMF request
+ */
+ private void handleChldRelatedRequest(RILRequest rr) {
+ synchronized (mDtmfReqQueue) {
+ int queueSize = mDtmfReqQueue.size();
+ int i, j;
+ if (queueSize > 0) {
+ RILRequest rr2 = mDtmfReqQueue.get();
+ if (rr2.mRequest == RIL_REQUEST_DTMF_START) {
+ // need to send the STOP command
+ if (RILJ_LOGD) riljLog("DTMF queue isn't 0, first request is START, send stop dtmf and pending switch");
+ if (queueSize > 1) {
+ j = 2;
+ } else {
+ // need to create a new STOP command
+ j = 1;
+ }
+ if (RILJ_LOGD) riljLog("queue size " + mDtmfReqQueue.size());
+
+ for (i = queueSize - 1; i >= j; i--) {
+ mDtmfReqQueue.remove(i);
+ }
+ if (RILJ_LOGD) riljLog("queue size after " + mDtmfReqQueue.size());
+ if (mDtmfReqQueue.size() == 1) { // only start command, we need to add stop command
+ RILRequest rr3 = RILRequest.obtain(RIL_REQUEST_DTMF_STOP, null);
+ if (RILJ_LOGD) riljLog("add dummy stop dtmf request");
+ mDtmfReqQueue.stop();
+ mDtmfReqQueue.add(rr3);
+ }
+ }
+ else {
+ // first request is STOP, just remove it and send switch
+ if (RILJ_LOGD) riljLog("DTMF queue isn't 0, first request is STOP, penging switch");
+ j = 1;
+ for (i = queueSize - 1; i >= j; i--) {
+ mDtmfReqQueue.remove(i);
+ }
+ }
+ mDtmfReqQueue.setPendingRequest(rr);
+ } else {
+ if (RILJ_LOGD) riljLog("DTMF queue is 0, send switch Immediately");
+ mDtmfReqQueue.setSendChldRequest();
+ send(rr);
+ }
+ }
+ }
+
+ private
+ void setCallIndication(String[] incomingCallInfo) {
+ RILRequest rr
+ = RILRequest.obtain(RIL_REQUEST_SET_CALL_INDICATION, null);
+
+ int callId = Integer.parseInt(incomingCallInfo[0]);
+ int callMode = Integer.parseInt(incomingCallInfo[3]);
+ int seqNumber = Integer.parseInt(incomingCallInfo[4]);
+
+ // some guess work is needed here, for now, just 0
+ callMode = 0;
+
+ rr.mParcel.writeInt(3);
+
+ rr.mParcel.writeInt(callMode);
+ rr.mParcel.writeInt(callId);
+ rr.mParcel.writeInt(seqNumber);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> "
+ + requestToString(rr.mRequest) + " " + callMode + " " + callId + " " + seqNumber);
+
+ send(rr);
+ }
+
+ // Override setupDataCall as the MTK RIL needs 8th param CID (hardwired to 1?)
+ @Override
+ public void
+ setupDataCall(String radioTechnology, String profile, String apn,
+ String user, String password, String authType, String protocol,
+ Message result) {
+ RILRequest rr
+ = RILRequest.obtain(RIL_REQUEST_SETUP_DATA_CALL, result);
+
+ rr.mParcel.writeInt(8);
+
+ rr.mParcel.writeString(radioTechnology);
+ rr.mParcel.writeString(profile);
+ rr.mParcel.writeString(apn);
+ rr.mParcel.writeString(user);
+ rr.mParcel.writeString(password);
+ rr.mParcel.writeString(authType);
+ rr.mParcel.writeString(protocol);
+ rr.mParcel.writeString("1");
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> "
+ + requestToString(rr.mRequest) + " " + radioTechnology + " "
+ + profile + " " + apn + " " + user + " "
+ + password + " " + authType + " " + protocol + "1");
+
+ send(rr);
+ }
+
+ protected Object
+ responseSignalStrength(Parcel p) {
+ SignalStrength s = SignalStrength.makeSignalStrengthFromRilParcel(p);
+ return new SignalStrength(s.getGsmSignalStrength(),
+ s.getGsmBitErrorRate(),
+ s.getCdmaDbm(),
+ s.getCdmaEcio(),
+ s.getEvdoDbm(),
+ s.getEvdoEcio(),
+ s.getEvdoSnr(),
+ true);
+ }
+
+ private void setRadioStateFromRILInt (int stateCode) {
+ switch (stateCode) {
+ case 0: case 1: break; // radio off
+ default:
+ {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_GPRS_TRANSFER_TYPE, null);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(1);
+
+ send(rr);
+ }
+ {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_GPRS_CONNECT_TYPE, null);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(1);
+
+ send(rr);
+ }
+ }
+ }
+
+ /* Oh well... this broke non-dual-SIM phones including MX4 :-/
+ @Override
+ public void
+ setRadioPower(boolean on, Message result) {
+ if ((mInstanceId != null && mInstanceId == 1)) {
+ riljLog("SetRadioPower: on/off ignored on SIM2");
+ return;
+ }
+
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_DUAL_SIM_MODE_SWITCH, result);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(on ? 3 : -1); // SIM1 | SIM2 ?
+ send(rr);
+ }
+ */
+
+ @Override
+ public void setUiccSubscription(int slotId, int appIndex, int subId,
+ int subStatus, Message result) {
+ if (RILJ_LOGD) riljLog("setUiccSubscription" + slotId + " " + appIndex + " " + subId + " " + subStatus);
+
+ // Fake response (note: should be sent before mSubscriptionStatusRegistrants or
+ // SubscriptionManager might not set the readiness correctly)
+ AsyncResult.forMessage(result, 0, null);
+ result.sendToTarget();
+
+ // TODO: Actually turn off/on the radio (and don't fight with the ServiceStateTracker)
+ if (subStatus == 1 /* ACTIVATE */) {
+ // Subscription changed: enabled
+ if (mSubscriptionStatusRegistrants != null) {
+ mSubscriptionStatusRegistrants.notifyRegistrants(
+ new AsyncResult (null, new int[] {1}, null));
+ }
+ } else if (subStatus == 0 /* DEACTIVATE */) {
+ // Subscription changed: disabled
+ if (mSubscriptionStatusRegistrants != null) {
+ mSubscriptionStatusRegistrants.notifyRegistrants(
+ new AsyncResult (null, new int[] {0}, null));
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setPreferredNetworkType(int networkType , Message response) {
+ RILRequest rr = RILRequest.obtain(
+ RILConstants.RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, response);
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(networkType);
+
+ mPreviousPreferredType = mPreferredNetworkType; //ALPS00799783
+ mPreferredNetworkType = networkType;
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+ + " : " + networkType);
+
+ send(rr);
+ }
+
+ /** M: add extra parameter */
+ @Override
+ public void setInitialAttachApn(String apn, String protocol, int authType, String username,
+ String password, Message result) {
+ Rlog.e(RILJ_LOG_TAG, "setInitialAttachApn: operatorNumeric is required on MTK!");
+ setInitialAttachApn(apn, protocol, authType, username, password, "", false, result);
+ }
+
+ @Override
+ public void setInitialAttachApn(String apn, String protocol, int authType, String username,
+ String password, String operatorNumeric, boolean canHandleIms, Message result) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_INITIAL_ATTACH_APN, null);
+
+ if (RILJ_LOGD) riljLog("Set RIL_REQUEST_SET_INITIAL_ATTACH_APN");
+
+ rr.mParcel.writeString(apn);
+ rr.mParcel.writeString(protocol);
+ rr.mParcel.writeInt(authType);
+ rr.mParcel.writeString(username);
+ rr.mParcel.writeString(password);
+
+ /** M: start */
+ rr.mParcel.writeString(operatorNumeric);
+ rr.mParcel.writeInt(canHandleIms ? 1 : 0);
+ /* M: end */
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+ + ", apn:" + apn + ", protocol:" + protocol + ", authType:" + authType
+ + ", username:" + username + ", password:" + password
+ + ", operatorNumeric:" + operatorNumeric + ", canHandleIms:" + canHandleIms);
+
+ send(rr);
+ }
+
+ private static int readRilMessage(InputStream is, byte[] buffer)
+ throws IOException {
+ int countRead;
+ int offset;
+ int remaining;
+ int messageLength;
+
+ // First, read in the length of the message
+ offset = 0;
+ remaining = 4;
+ do {
+ countRead = is.read(buffer, offset, remaining);
+
+ if (countRead < 0 ) {
+ Rlog.e(RILJ_LOG_TAG, "Hit EOS reading message length");
+ return -1;
+ }
+
+ offset += countRead;
+ remaining -= countRead;
+ } while (remaining > 0);
+
+ messageLength = ((buffer[0] & 0xff) << 24)
+ | ((buffer[1] & 0xff) << 16)
+ | ((buffer[2] & 0xff) << 8)
+ | (buffer[3] & 0xff);
+
+ // Then, re-use the buffer and read in the message itself
+ offset = 0;
+ remaining = messageLength;
+ do {
+ countRead = is.read(buffer, offset, remaining);
+
+ if (countRead < 0 ) {
+ Rlog.e(RILJ_LOG_TAG, "Hit EOS reading message. messageLength=" + messageLength
+ + " remaining=" + remaining);
+ return -1;
+ }
+
+ offset += countRead;
+ remaining -= countRead;
+ } while (remaining > 0);
+
+ return messageLength;
+ }
+
+ protected RILReceiver createRILReceiver() {
+ return new MTKRILReceiver();
+ }
+
+ protected class MTKRILReceiver extends RILReceiver {
+ byte[] buffer;
+
+ protected MTKRILReceiver() {
+ buffer = new byte[RIL_MAX_COMMAND_BYTES];
+ }
+
+ @Override
+ public void
+ run() {
+ int retryCount = 0;
+ String rilSocket = "rild";
+
+ try {for (;;) {
+ LocalSocket s = null;
+ LocalSocketAddress l;
+
+ if (mInstanceId == null || mInstanceId == 0 ) {
+ rilSocket = SOCKET_NAME_RIL[0];
+ } else {
+ rilSocket = SOCKET_NAME_RIL[mInstanceId];
+ }
+
+ int currentSim;
+ if (mInstanceId == null || mInstanceId ==0) {
+ currentSim = 0;
+ } else {
+ currentSim = mInstanceId;
+ }
+
+ int m3GsimId = 0;
+ m3GsimId = SystemProperties.getInt("gsm.3gswitch", 0);
+ if((m3GsimId > 0) && (m3GsimId <= 2)) {
+ --m3GsimId;
+ } else {
+ m3GsimId = 0;
+ }
+
+ if (m3GsimId >= 1) {
+ if (currentSim == 0) {
+ rilSocket = SOCKET_NAME_RIL[m3GsimId];
+ }
+ else if(currentSim == m3GsimId) {
+ rilSocket = SOCKET_NAME_RIL[0];
+ }
+ if (RILJ_LOGD) riljLog("Capability switched, swap sockets [" + currentSim + ", " + rilSocket + "]");
+ }
+
+ try {
+ s = new LocalSocket();
+ l = new LocalSocketAddress(rilSocket,
+ LocalSocketAddress.Namespace.RESERVED);
+ s.connect(l);
+ } catch (IOException ex){
+ try {
+ if (s != null) {
+ s.close();
+ }
+ } catch (IOException ex2) {
+ //ignore failure to close after failure to connect
+ }
+
+ // don't print an error message after the the first time
+ // or after the 8th time
+
+ if (retryCount == 8) {
+ Rlog.e (RILJ_LOG_TAG,
+ "Couldn't find '" + rilSocket
+ + "' socket after " + retryCount
+ + " times, continuing to retry silently");
+ } else if (retryCount >= 0 && retryCount < 8) {
+ Rlog.i (RILJ_LOG_TAG,
+ "Couldn't find '" + rilSocket
+ + "' socket; retrying after timeout");
+ }
+
+ try {
+ Thread.sleep(SOCKET_OPEN_RETRY_MILLIS);
+ } catch (InterruptedException er) {
+ }
+
+ retryCount++;
+ continue;
+ }
+
+ retryCount = 0;
+
+ mSocket = s;
+ Rlog.i(RILJ_LOG_TAG, "(" + mInstanceId + ") Connected to '"
+ + rilSocket + "' socket");
+
+ /* Compatibility with qcom's DSDS (Dual SIM) stack */
+ if (needsOldRilFeature("qcomdsds")) {
+ String str = "SUB1";
+ byte[] data = str.getBytes();
+ try {
+ mSocket.getOutputStream().write(data);
+ Rlog.i(RILJ_LOG_TAG, "Data sent!!");
+ } catch (IOException ex) {
+ Rlog.e(RILJ_LOG_TAG, "IOException", ex);
+ } catch (RuntimeException exc) {
+ Rlog.e(RILJ_LOG_TAG, "Uncaught exception ", exc);
+ }
+ }
+
+ int length = 0;
+ try {
+ InputStream is = mSocket.getInputStream();
+
+ for (;;) {
+ Parcel p;
+
+ length = readRilMessage(is, buffer);
+
+ if (length < 0) {
+ // End-of-stream reached
+ break;
+ }
+
+ p = Parcel.obtain();
+ p.unmarshall(buffer, 0, length);
+ p.setDataPosition(0);
+
+ //Rlog.v(RILJ_LOG_TAG, "Read packet: " + length + " bytes");
+
+ processResponse(p);
+ p.recycle();
+ }
+ } catch (java.io.IOException ex) {
+ Rlog.i(RILJ_LOG_TAG, "'" + rilSocket + "' socket closed",
+ ex);
+ } catch (Throwable tr) {
+ Rlog.e(RILJ_LOG_TAG, "Uncaught exception read length=" + length +
+ "Exception:" + tr.toString());
+ }
+
+ Rlog.i(RILJ_LOG_TAG, "(" + mInstanceId + ") Disconnected from '" + rilSocket
+ + "' socket");
+
+ setRadioState (RadioState.RADIO_UNAVAILABLE);
+
+ try {
+ mSocket.close();
+ } catch (IOException ex) {
+ }
+
+ mSocket = null;
+ RILRequest.resetSerial();
+
+ // Clear request list on close
+ clearRequestList(RADIO_NOT_AVAILABLE, false);
+ }} catch (Throwable tr) {
+ Rlog.e(RILJ_LOG_TAG,"Uncaught exception", tr);
+ }
+
+ /* We're disconnected so we don't know the ril version */
+ notifyRegistrantsRilConnectionChanged(-1);
+ }
+ }
+
+ /* broken by new version of MTK RIL, disable for now */
+ /*
+ public void handle3GSwitch() {
+ int simId = mInstanceId == null ? 0 : mInstanceId;
+ int newsim = SystemProperties.getInt("gsm.3gswitch", 0);
+ newsim = newsim - 1;
+ if(!(simId==newsim)) {
+ int prop = SystemProperties.getInt("gsm.3gswitch", 0);
+ if (RILJ_LOGD) riljLog("Setting data subscription on SIM" + (simId + 1) + " mInstanceid=" + mInstanceId + " gsm.3gswitch=" + prop);
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_3G_CAPABILITY, null);
+ rr.mParcel.writeInt(1);
+ int realsim = simId + 1;
+ rr.mParcel.writeInt(realsim);
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+ send(rr);
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException er) {
+ }
+ resetRadio(null);
+ try {
+ Thread.sleep(4*1000);
+ } catch (InterruptedException er) {
+ }
+ }
+ else {
+ if (RILJ_LOGD) riljLog("Not setting data subscription on same SIM");
+ }
+ }
+
+ public void setDataAllowed(boolean allowed, Message result) {
+ handle3GSwitch();
+
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_ALLOW_DATA, result);
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+ + " " + allowed);
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(allowed ? 1 : 0);
+ send(rr);
+ }
+ */
+}
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index b412f2b..6b8ba87 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -2064,4 +2064,39 @@ public interface Phone {
* @return true if IMS is Registered
*/
public boolean isImsRegistered();
+
+ // MTK addditions
+
+ /**
+ * Set phone RAT family.
+ *
+ * @param ratFamily bit mask to identify PhoneRatFamily.PHONE_RAT_FAMILY_2G,
+ * PhoneRatFamily.PHONE_RAT_FAMILY_3G, PhoneRatFamily.PHONE_RAT_FAMILY_4G
+ * @param response Callback message.
+ */
+ public void setPhoneRatFamily(int ratFamily, Message response);
+
+ /**
+ * Get phone RAT family.
+ *
+ * @return a bit mask to identify PhoneRatFamily.PHONE_RAT_FAMILY_2G,
+ * PhoneRatFamily.PHONE_RAT_FAMILY_3G, PhoneRatFamily.PHONE_RAT_FAMILY_4G
+ */
+ public int getPhoneRatFamily();
+
+ /**
+ * Registers the handler when phone RAT family is changed.
+ *
+ * @param h Handler for notification message.
+ * @param what User-defined message code.
+ * @param obj User object.
+ */
+ public void registerForPhoneRatFamilyChanged(Handler h, int what, Object obj);
+
+ /**
+ * Unregister for notifications when phone RAT family is changed.
+ *
+ * @param h Handler to be removed from the registrant list.
+ */
+ public void unregisterForPhoneRatFamilyChanged(Handler h);
}
diff --git a/src/java/com/android/internal/telephony/PhoneBase.java b/src/java/com/android/internal/telephony/PhoneBase.java
index 5ef81eb..dfbe0c2 100644
--- a/src/java/com/android/internal/telephony/PhoneBase.java
+++ b/src/java/com/android/internal/telephony/PhoneBase.java
@@ -42,6 +42,7 @@ import android.telephony.CellIdentityCdma;
import android.telephony.CellInfo;
import android.telephony.CellInfoCdma;
import android.telephony.DataConnectionRealTimeInfo;
+import android.telephony.PhoneRatFamily;
import android.telephony.VoLteServiceState;
import android.telephony.Rlog;
import android.telephony.ServiceState;
@@ -179,7 +180,21 @@ public abstract class PhoneBase extends Handler implements Phone {
protected static final int EVENT_SET_CALL_FORWARD_TIMER_DONE = 37;
protected static final int EVENT_GET_CALL_FORWARD_TIMER_DONE = 38;
protected static final int EVENT_GET_CALLFORWARDING_STATUS = 39;
- protected static final int EVENT_LAST = EVENT_GET_CALLFORWARDING_STATUS;
+ // MTK
+ protected static final int EVENT_GET_PHONE_RAT_FAMILY = 41;
+ protected static final int EVENT_PHONE_RAT_FAMILY_CHANGED_NOTIFY = 42;
+ protected static final int EVENT_LAST = EVENT_PHONE_RAT_FAMILY_CHANGED_NOTIFY;
+
+ // MTK again - wtf
+ /// M: c2k modify, event constants. @{
+ protected static final int EVENT_SET_MEID_DONE = 101;
+ protected static final int EVENT_RUIM_READY = 102;
+ /// @}
+
+ /** M: for suspend data during plmn list */
+ protected static final int EVENT_GET_AVAILABLE_NETWORK_DONE = 500520;
+ protected static final int EVENT_DC_SWITCH_STATE_CHANGE = 500521;
+ protected static final int EVENT_GET_AVAILABLE_NETWORK = 500522;
// For shared prefs.
private static final String GSM_ROAMING_LIST_OVERRIDE_PREFIX = "gsm_roaming_list_";
@@ -252,6 +267,9 @@ public abstract class PhoneBase extends Handler implements Phone {
private boolean mImsServiceReady = false;
protected static ImsPhone mImsPhone = null;
+ // give the empty phone RAT family at initial, we will update it when radio available
+ protected int mPhoneRatFamily = PhoneRatFamily.PHONE_RAT_FAMILY_NONE;
+
@Override
public String getPhoneName() {
return mName;
@@ -349,6 +367,9 @@ public abstract class PhoneBase extends Handler implements Phone {
protected final RegistrantList mVideoCapabilityChangedRegistrants
= new RegistrantList();
+ // MTK
+ protected final RegistrantList mPhoneRatFamilyChangedRegistrants
+ = new RegistrantList();
protected Looper mLooper; /* to insure registrants are in correct thread*/
@@ -608,6 +629,19 @@ public abstract class PhoneBase extends Handler implements Phone {
}
break;
+ case EVENT_PHONE_RAT_FAMILY_CHANGED_NOTIFY:
+ ar = (AsyncResult) msg.obj;
+ Rlog.d(LOG_TAG, "Event EVENT_PHONE_RAT_FAMILY_CHANGED_NOTIFY "
+ + mPhoneRatFamilyChangedRegistrants.size());
+ if (ar.exception == null) {
+ PhoneRatFamily rat = (PhoneRatFamily)(ar.result);
+ Rlog.d(LOG_TAG, "update mPhoneRatFamily, "
+ + mPhoneRatFamilyChangedRegistrants.size() + ", " + rat);
+ mPhoneRatFamily = rat.getRatFamily();
+ }
+ mPhoneRatFamilyChangedRegistrants.notifyRegistrants((AsyncResult) msg.obj);
+ break;
+
default:
throw new RuntimeException("unexpected event not handled");
}
@@ -2338,6 +2372,32 @@ public abstract class PhoneBase extends Handler implements Phone {
+ this);
}
+ // MTK additions
+
+ @Override
+ public void setPhoneRatFamily(int ratFamily, Message response) {
+ mCi.setPhoneRatFamily(ratFamily, response);
+ }
+
+ @Override
+ public int getPhoneRatFamily() {
+ Rlog.d(LOG_TAG, "getPhoneRatFamily:ID:" + mPhoneId + ", RAT:" + mPhoneRatFamily);
+ return mPhoneRatFamily;
+ }
+
+ @Override
+ public void registerForPhoneRatFamilyChanged(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mPhoneRatFamilyChangedRegistrants.add(r);
+ mCi.registerForPhoneRatFamilyChanged(this, EVENT_PHONE_RAT_FAMILY_CHANGED_NOTIFY, null);
+ }
+
+ @Override
+ public void unregisterForPhoneRatFamilyChanged(Handler h) {
+ mPhoneRatFamilyChangedRegistrants.remove(h);
+ mCi.unregisterForPhoneRatFamilyChanged(this);
+ }
+
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("PhoneBase: subId=" + getSubId());
pw.println(" mPhoneId=" + mPhoneId);
diff --git a/src/java/com/android/internal/telephony/PhoneFactory.java b/src/java/com/android/internal/telephony/PhoneFactory.java
index 08ea27c..9440e36 100644
--- a/src/java/com/android/internal/telephony/PhoneFactory.java
+++ b/src/java/com/android/internal/telephony/PhoneFactory.java
@@ -42,6 +42,10 @@ import com.android.internal.telephony.sip.SipPhoneFactory;
import com.android.internal.telephony.uicc.IccCardProxy;
import com.android.internal.telephony.uicc.UiccController;
+import com.mediatek.internal.telephony.worldphone.IWorldPhone;
+import com.mediatek.internal.telephony.worldphone.WorldPhoneUtil;
+import com.mediatek.internal.telephony.worldphone.WorldPhoneWrapper;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.reflect.Constructor;
@@ -75,6 +79,9 @@ public class PhoneFactory {
static private PhoneNotifier sPhoneNotifier;
static private Context sContext;
+ // MTK
+ static private IWorldPhone sWorldPhone = null;
+
//***** Class Methods
public static void makeDefaultPhones(Context context) {
@@ -236,6 +243,11 @@ public class PhoneFactory {
sSubInfoRecordUpdater = new SubscriptionInfoUpdater(context,
sProxyPhones, sCommandsInterfaces);
SubscriptionController.getInstance().updatePhonesAvailability(sProxyPhones);
+
+ // MTK
+ if (WorldPhoneUtil.isWorldPhoneSupport()) {
+ sWorldPhone = WorldPhoneWrapper.getWorldPhoneInstance();
+ }
}
}
}
@@ -257,6 +269,14 @@ public class PhoneFactory {
}
}
+ public static IWorldPhone getWorldPhone() {
+ if (sWorldPhone == null) {
+ Rlog.d(LOG_TAG, "sWorldPhone is null");
+ }
+
+ return sWorldPhone;
+ }
+
private static <T> T instantiateCustomRIL(
String sRILClassname, Context context, int networkMode, int cdmaSubscription, Integer instanceId)
throws Exception {
diff --git a/src/java/com/android/internal/telephony/PhoneProxy.java b/src/java/com/android/internal/telephony/PhoneProxy.java
index 8246d23..18b6e15 100644
--- a/src/java/com/android/internal/telephony/PhoneProxy.java
+++ b/src/java/com/android/internal/telephony/PhoneProxy.java
@@ -1589,4 +1589,27 @@ public class PhoneProxy extends Handler implements Phone {
pw.flush();
pw.println("++++++++++++++++++++++++++++++++");
}
+
+ // MTK additions
+
+ @Override
+ public void setPhoneRatFamily(int ratFamily, Message response) {
+ mActivePhone.setPhoneRatFamily(ratFamily, response);
+ }
+
+ @Override
+ public int getPhoneRatFamily() {
+ return mActivePhone.getPhoneRatFamily();
+ }
+
+ @Override
+ public void registerForPhoneRatFamilyChanged(Handler h, int what, Object obj) {
+ mActivePhone.registerForPhoneRatFamilyChanged(h, what, obj);
+ }
+
+ @Override
+ public void unregisterForPhoneRatFamilyChanged(Handler h) {
+ mActivePhone.unregisterForPhoneRatFamilyChanged(h);
+ }
+
}
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index 330679e..be26c8f 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -55,6 +55,7 @@ import android.telephony.SignalStrength;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.SparseArray;
import android.view.Display;
@@ -289,6 +290,10 @@ public class RIL extends BaseCommands implements CommandsInterface {
// divide the response array without prior knowledge of the number of elements.
protected int mQANElements = 4;
+ // MTK
+ // save the status of screen
+ private boolean isScreenOn = true;
+
//***** Events
static final int EVENT_SEND = 1;
@@ -2483,6 +2488,9 @@ public class RIL extends BaseCommands implements CommandsInterface {
}
protected void sendScreenState(boolean on) {
+ // MTK
+ isScreenOn = on;
+
RILRequest rr = RILRequest.obtain(RIL_REQUEST_SCREEN_STATE, null);
rr.mParcel.writeInt(1);
rr.mParcel.writeInt(on ? 1 : 0);
@@ -3387,12 +3395,19 @@ public class RIL extends BaseCommands implements CommandsInterface {
case RIL_UNSOL_RIL_CONNECTED: {
if (RILJ_LOGD) unsljLogRet(response, ret);
+ // Set ecc list before MO call
+ if (TelephonyManager.getDefault().getMultiSimConfiguration() == TelephonyManager.MultiSimVariants.DSDA
+ || mInstanceId == 0) {
+ setEccList();
+ }
+
// Initial conditions
- setRadioPower(false, null);
+ // setRadioPower(false, null);
setPreferredNetworkType(mPreferredNetworkType, null);
setCdmaSubscriptionSource(mCdmaSubscription, null);
setCellInfoListRate(Integer.MAX_VALUE, null);
notifyRegistrantsRilConnectionChanged(((int[])ret)[0]);
+ sendScreenState(isScreenOn);
break;
}
case RIL_UNSOL_CELL_INFO_LIST: {
@@ -4378,6 +4393,10 @@ public class RIL extends BaseCommands implements CommandsInterface {
case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
case RIL_REQUEST_SIM_IO: return "SIM_IO";
case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
+ /* M: SS part */
+ ///M: For query CNAP
+ case RIL_REQUEST_SEND_CNAP: return "SEND_CNAP";
+ /* M: SS part end */
case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
@@ -4397,6 +4416,7 @@ public class RIL extends BaseCommands implements CommandsInterface {
case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
+ case RIL_REQUEST_ABORT_QUERY_AVAILABLE_NETWORKS : return "ABORT_QUERY_AVAILABLE_NETWORKS";
case RIL_REQUEST_DTMF_START: return "DTMF_START";
case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
@@ -4477,6 +4497,135 @@ public class RIL extends BaseCommands implements CommandsInterface {
case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG";
case RIL_REQUEST_SIM_AUTHENTICATION: return "RIL_REQUEST_SIM_AUTHENTICATION";
case RIL_REQUEST_SHUTDOWN: return "RIL_REQUEST_SHUTDOWN";
+ case RIL_REQUEST_SET_PHONE_RAT_FAMILY: return "RIL_REQUEST_SET_PHONE_RAT_FAMILY";
+ case RIL_REQUEST_GET_PHONE_RAT_FAMILY: return "RIL_REQUEST_GET_PHONE_RAT_FAMILY";
+
+ /* M: call control part start */
+ case RIL_REQUEST_HANGUP_ALL: return "HANGUP_ALL";
+ case RIL_REQUEST_FORCE_RELEASE_CALL: return "FORCE_RELEASE_CALL";
+ case RIL_REQUEST_SET_CALL_INDICATION: return "SET_CALL_INDICATION";
+ case RIL_REQUEST_EMERGENCY_DIAL: return "EMERGENCY_DIAL";
+ case RIL_REQUEST_SET_ECC_SERVICE_CATEGORY: return "SET_ECC_SERVICE_CATEGORY";
+ case RIL_REQUEST_SET_ECC_LIST: return "SET_ECC_LIST";
+ case RIL_REQUEST_SET_SPEECH_CODEC_INFO: return "SET_SPEECH_CODEC_INFO";
+ /* M: call control part end */
+
+ /// M: IMS feature. @{
+ case RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER: return "RIL_REQUEST_ADD_IMS_CONFERENCE_CALL_MEMBER";
+ case RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER: return "RIL_REQUEST_REMOVE_IMS_CONFERENCE_CALL_MEMBER";
+ case RIL_REQUEST_DIAL_WITH_SIP_URI: return "RIL_REQUEST_DIAL_WITH_SIP_URI";
+ case RIL_REQUEST_RETRIEVE_HELD_CALL: return "RIL_REQUEST_RETRIEVE_HELD_CALL";
+ /// @}
+
+ //MTK-START SIM ME lock
+ case RIL_REQUEST_QUERY_SIM_NETWORK_LOCK: return "QUERY_SIM_NETWORK_LOCK";
+ case RIL_REQUEST_SET_SIM_NETWORK_LOCK: return "SET_SIM_NETWORK_LOCK";
+ //MTK-END SIM ME lock
+ //ISIM
+ case RIL_REQUEST_GENERAL_SIM_AUTH: return "RIL_REQUEST_GENERAL_SIM_AUTH";
+ case RIL_REQUEST_OPEN_ICC_APPLICATION: return "RIL_REQUEST_OPEN_ICC_APPLICATION";
+ case RIL_REQUEST_GET_ICC_APPLICATION_STATUS: return "RIL_REQUEST_GET_ICC_APPLICATION_STATUS";
+ case RIL_REQUEST_SIM_IO_EX: return "SIM_IO_EX";
+
+ // PHB Start
+ case RIL_REQUEST_QUERY_PHB_STORAGE_INFO: return "RIL_REQUEST_QUERY_PHB_STORAGE_INFO";
+ case RIL_REQUEST_WRITE_PHB_ENTRY: return "RIL_REQUEST_WRITE_PHB_ENTRY";
+ case RIL_REQUEST_READ_PHB_ENTRY: return "RIL_REQUEST_READ_PHB_ENTRY";
+ case RIL_REQUEST_QUERY_UPB_CAPABILITY: return "RIL_REQUEST_QUERY_UPB_CAPABILITY";
+ case RIL_REQUEST_EDIT_UPB_ENTRY: return "RIL_REQUEST_EDIT_UPB_ENTRY";
+ case RIL_REQUEST_DELETE_UPB_ENTRY: return "RIL_REQUEST_DELETE_UPB_ENTRY";
+ case RIL_REQUEST_READ_UPB_GAS_LIST: return "RIL_REQUEST_READ_UPB_GAS_LIST";
+ case RIL_REQUEST_READ_UPB_GRP: return "RIL_REQUEST_READ_UPB_GRP";
+ case RIL_REQUEST_WRITE_UPB_GRP: return "RIL_REQUEST_WRITE_UPB_GRP";
+ case RIL_REQUEST_GET_PHB_STRING_LENGTH: return "RIL_REQUEST_GET_PHB_STRING_LENGTH";
+ case RIL_REQUEST_GET_PHB_MEM_STORAGE: return "RIL_REQUEST_GET_PHB_MEM_STORAGE";
+ case RIL_REQUEST_SET_PHB_MEM_STORAGE: return "RIL_REQUEST_SET_PHB_MEM_STORAGE";
+ case RIL_REQUEST_READ_PHB_ENTRY_EXT: return "RIL_REQUEST_READ_PHB_ENTRY_EXT";
+ case RIL_REQUEST_WRITE_PHB_ENTRY_EXT: return "RIL_REQUEST_WRITE_PHB_ENTRY_EXT";
+ // PHB End
+
+ /* M: network part start */
+ case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL_WITH_ACT: return "SET_NETWORK_SELECTION_MANUAL_WITH_ACT";
+ case RIL_REQUEST_GET_POL_CAPABILITY: return "RIL_REQUEST_GET_POL_CAPABILITY";
+ case RIL_REQUEST_GET_POL_LIST: return "RIL_REQUEST_GET_POL_LIST";
+ case RIL_REQUEST_SET_POL_ENTRY: return "RIL_REQUEST_SET_POL_ENTRY";
+ case RIL_REQUEST_SET_TRM: return "RIL_REQUEST_SET_TRM";
+ case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS_WITH_ACT : return "QUERY_AVAILABLE_NETWORKS_WITH_ACT";
+ //Femtocell (CSG) feature START
+ case RIL_REQUEST_GET_FEMTOCELL_LIST: return "RIL_REQUEST_GET_FEMTOCELL_LIST";
+ case RIL_REQUEST_ABORT_FEMTOCELL_LIST: return "RIL_REQUEST_ABORT_FEMTOCELL_LIST";
+ case RIL_REQUEST_SELECT_FEMTOCELL: return "RIL_REQUEST_SELECT_FEMTOCELL";
+ //Femtocell (CSG) feature END
+ /* M: network part end */
+ case RIL_REQUEST_STK_EVDL_CALL_BY_AP: return "RIL_REQUEST_STK_EVDL_CALL_BY_AP";
+ case RIL_REQUEST_QUERY_MODEM_TYPE: return "RIL_REQUEST_QUERY_MODEM_TYPE";
+ case RIL_REQUEST_STORE_MODEM_TYPE: return "RIL_REQUEST_STORE_MODEM_TYPE";
+ case RIL_REQUEST_SIM_GET_ATR: return "SIM_GET_ATR";
+ case RIL_REQUEST_SIM_OPEN_CHANNEL_WITH_SW: return "SIM_OPEN_CHANNEL_WITH_SW";
+ //VoLTE
+ case RIL_REQUEST_SETUP_DEDICATE_DATA_CALL: return "RIL_REQUEST_SETUP_DEDICATE_DATA_CALL";
+ case RIL_REQUEST_DEACTIVATE_DEDICATE_DATA_CALL: return "RIL_REQUEST_DEACTIVATE_DEDICATE_DATA_CALL";
+ case RIL_REQUEST_MODIFY_DATA_CALL: return "RIL_REQUEST_MODIFY_DATA_CALL";
+ case RIL_REQUEST_ABORT_SETUP_DATA_CALL: return "RIL_REQUEST_ABORT_SETUP_DATA_CALL";
+ case RIL_REQUEST_PCSCF_DISCOVERY_PCO: return "RIL_REQUEST_PCSCF_DISCOVERY_PCO";
+ case RIL_REQUEST_CLEAR_DATA_BEARER: return "RIL_REQUEST_CLEAR_DATA_BEARER";
+
+ // IMS
+ case RIL_REQUEST_SET_IMS_ENABLE: return "RIL_REQUEST_SET_IMS_ENABLE";
+
+ // M: Fast Dormancy
+ case RIL_REQUEST_SET_SCRI: return "RIL_REQUEST_SET_SCRI";
+ case RIL_REQUEST_SET_FD_MODE: return "RIL_REQUEST_SET_FD_MODE";
+ // MTK-START, SMS part
+ case RIL_REQUEST_GET_SMS_PARAMS: return "RIL_REQUEST_GET_SMS_PARAMS";
+ case RIL_REQUEST_SET_SMS_PARAMS: return "RIL_REQUEST_SET_SMS_PARAMS";
+ case RIL_REQUEST_GET_SMS_SIM_MEM_STATUS: return "RIL_REQUEST_GET_SMS_SIM_MEM_STATUS";
+ case RIL_REQUEST_SET_ETWS: return "RIL_REQUEST_SET_ETWS";
+ case RIL_REQUEST_SET_CB_CHANNEL_CONFIG_INFO:
+ return "RIL_REQUEST_SET_CB_CHANNEL_CONFIG_INFO";
+ case RIL_REQUEST_SET_CB_LANGUAGE_CONFIG_INFO:
+ return "RIL_REQUEST_SET_CB_LANGUAGE_CONFIG_INFO";
+ case RIL_REQUEST_GET_CB_CONFIG_INFO: return "RIL_REQUEST_GET_CB_CONFIG_INFO";
+ case RIL_REQUEST_REMOVE_CB_MESSAGE: return "RIL_REQUEST_REMOVE_CB_MESSAGE";
+ // MTK-END, SMS part
+ case RIL_REQUEST_SET_DATA_CENTRIC: return "RIL_REQUEST_SET_DATA_CENTRIC";
+
+ case RIL_REQUEST_MODEM_POWEROFF: return "MODEM_POWEROFF";
+ case RIL_REQUEST_MODEM_POWERON: return "MODEM_POWERON";
+ // M: CC33 LTE.
+ case RIL_REQUEST_SET_DATA_ON_TO_MD: return "RIL_REQUEST_SET_DATA_ON_TO_MD";
+ case RIL_REQUEST_SET_REMOVE_RESTRICT_EUTRAN_MODE: return "RIL_REQUEST_SET_REMOVE_RESTRICT_EUTRAN_MODE";
+ case RIL_REQUEST_BTSIM_CONNECT: return "RIL_REQUEST_BTSIM_CONNECT";
+ case RIL_REQUEST_BTSIM_DISCONNECT_OR_POWEROFF: return "RIL_REQUEST_BTSIM_DISCONNECT_OR_POWEROFF";
+ case RIL_REQUEST_BTSIM_POWERON_OR_RESETSIM: return "RIL_REQUEST_BTSIM_POWERON_OR_RESETSIM";
+ case RIL_REQUEST_BTSIM_TRANSFERAPDU: return "RIL_REQUEST_SEND_BTSIM_TRANSFERAPDU";
+
+ /* M: call control part start */
+ case RIL_REQUEST_SET_IMS_CALL_STATUS: return "RIL_REQUEST_SET_IMS_CALL_STATUS";
+ /* M: call control part end */
+
+ /* M: C2K part start */
+ case RIL_REQUEST_GET_NITZ_TIME: return "RIL_REQUEST_GET_NITZ_TIME";
+ case RIL_REQUEST_QUERY_UIM_INSERTED: return "RIL_REQUEST_QUERY_UIM_INSERTED";
+ case RIL_REQUEST_SWITCH_HPF: return "RIL_REQUEST_SWITCH_HPF";
+ case RIL_REQUEST_SET_AVOID_SYS: return "RIL_REQUEST_SET_AVOID_SYS";
+ case RIL_REQUEST_QUERY_AVOID_SYS: return "RIL_REQUEST_QUERY_AVOID_SYS";
+ case RIL_REQUEST_QUERY_CDMA_NETWORK_INFO: return "RIL_REQUEST_QUERY_CDMA_NETWORK_INFO";
+ case RIL_REQUEST_GET_LOCAL_INFO: return "RIL_REQUEST_GET_LOCAL_INFO";
+ case RIL_REQUEST_UTK_REFRESH: return "RIL_REQUEST_UTK_REFRESH";
+ case RIL_REQUEST_QUERY_SMS_AND_PHONEBOOK_STATUS: return "RIL_REQUEST_QUERY_SMS_AND_PHONEBOOK_STATUS";
+ case RIL_REQUEST_QUERY_NETWORK_REGISTRATION: return "RIL_REQUEST_QUERY_NETWORK_REGISTRATION";
+ case RIL_REQUEST_AGPS_TCP_CONNIND: return "RIL_REQUEST_AGPS_TCP_CONNIND";
+ case RIL_REQUEST_AGPS_SET_MPC_IPPORT: return "RIL_REQUEST_AGPS_SET_MPC_IPPORT";
+ case RIL_REQUEST_AGPS_GET_MPC_IPPORT: return "RIL_REQUEST_AGPS_GET_MPC_IPPORT";
+ case RIL_REQUEST_SET_MEID: return "RIL_REQUEST_SET_MEID";
+ case RIL_REQUEST_SET_REG_RESUME: return "RIL_REQUEST_SET_REG_RESUME";
+ case RIL_REQUEST_ENABLE_REG_PAUSE: return "RIL_REQUEST_ENABLE_REG_PAUSE";
+ case RIL_REQUEST_SET_ETS_DEV: return "RIL_REQUEST_SET_ETS_DEV";
+ case RIL_REQUEST_WRITE_MDN: return "RIL_REQUEST_WRITE_MDN";
+ case RIL_REQUEST_SET_VIA_TRM: return "RIL_REQUEST_SET_VIA_TRM";
+ case RIL_REQUEST_SET_ARSI_THRESHOLD: return "RIL_REQUEST_SET_ARSI_THRESHOLD";
+ /* M: C2K part end */
default: return "<unknown request>";
}
}
@@ -4534,9 +4683,85 @@ public class RIL extends BaseCommands implements CommandsInterface {
case RIL_UNSOL_SRVCC_STATE_NOTIFY:
return "UNSOL_SRVCC_STATE_NOTIFY";
case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: return "RIL_UNSOL_HARDWARE_CONFIG_CHANGED";
- case RIL_UNSOL_ON_SS: return "UNSOL_ON_SS";
- case RIL_UNSOL_STK_CC_ALPHA_NOTIFY: return "UNSOL_STK_CC_ALPHA_NOTIFY";
- case RIL_UNSOL_STK_SEND_SMS_RESULT: return "RIL_UNSOL_STK_SEND_SMS_RESULT";
+ case RIL_UNSOL_SET_PHONE_RAT_FAMILY_COMPLETE: return "RIL_UNSOL_SET_PHONE_RAT_FAMILY_COMPLETE";
+ /* M: call control part start */
+ case RIL_UNSOL_CALL_FORWARDING: return "UNSOL_CALL_FORWARDING";
+ case RIL_UNSOL_CRSS_NOTIFICATION: return "UNSOL_CRSS_NOTIFICATION";
+ case RIL_UNSOL_INCOMING_CALL_INDICATION: return "UNSOL_INCOMING_CALL_INDICATION";
+ case RIL_UNSOL_CIPHER_INDICATION: return "UNSOL_CIPHER_INDICATION";
+ case RIL_UNSOL_CNAP: return "UNSOL_CNAP";
+ case RIL_UNSOL_SPEECH_CODEC_INFO: return "UNSOL_SPEECH_CODEC_INFO";
+ /* M: call control part end */
+ //MTK-START multiple application support
+ case RIL_UNSOL_APPLICATION_SESSION_ID_CHANGED: return "RIL_UNSOL_APPLICATION_SESSION_ID_CHANGED";
+ //MTK-END multiple application support
+ case RIL_UNSOL_SIM_MISSING: return "UNSOL_SIM_MISSING";
+ case RIL_UNSOL_VIRTUAL_SIM_ON: return "UNSOL_VIRTUAL_SIM_ON";
+ case RIL_UNSOL_VIRTUAL_SIM_OFF: return "UNSOL_VIRTUAL_SIM_ON_OFF";
+ case RIL_UNSOL_SIM_RECOVERY: return "UNSOL_SIM_RECOVERY";
+ case RIL_UNSOL_SIM_PLUG_OUT: return "UNSOL_SIM_PLUG_OUT";
+ case RIL_UNSOL_SIM_PLUG_IN: return "UNSOL_SIM_PLUG_IN";
+ case RIL_UNSOL_SIM_COMMON_SLOT_NO_CHANGED: return "RIL_UNSOL_SIM_COMMON_SLOT_NO_CHANGED";
+ case RIL_UNSOL_DATA_ALLOWED: return "RIL_UNSOL_DATA_ALLOWED";
+ case RIL_UNSOL_PHB_READY_NOTIFICATION: return "UNSOL_PHB_READY_NOTIFICATION";
+ case RIL_UNSOL_IMEI_LOCK: return "UNSOL_IMEI_LOCK";
+ case RIL_UNSOL_RESPONSE_ACMT: return "UNSOL_ACMT_INFO";
+ case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED";
+ case RIL_UNSOL_RESPONSE_MMRR_STATUS_CHANGED: return "UNSOL_RESPONSE_MMRR_STATUS_CHANGED";
+ case RIL_UNSOL_NEIGHBORING_CELL_INFO: return "UNSOL_NEIGHBORING_CELL_INFO";
+ case RIL_UNSOL_NETWORK_INFO: return "UNSOL_NETWORK_INFO";
+ case RIL_UNSOL_INVALID_SIM: return "RIL_UNSOL_INVALID_SIM";
+ case RIL_UNSOL_IMS_ENABLE_DONE: return "RIL_UNSOL_IMS_ENABLE_DONE";
+ case RIL_UNSOL_IMS_DISABLE_DONE: return "RIL_UNSOL_IMS_DISABLE_DONE";
+ case RIL_UNSOL_IMS_REGISTRATION_INFO: return "RIL_UNSOL_IMS_REGISTRATION_INFO";
+ case RIL_UNSOL_STK_SETUP_MENU_RESET: return "RIL_UNSOL_STK_SETUP_MENU_RESET";
+ case RIL_UNSOL_RESPONSE_PLMN_CHANGED: return "RIL_UNSOL_RESPONSE_PLMN_CHANGED";
+ case RIL_UNSOL_RESPONSE_REGISTRATION_SUSPENDED: return "RIL_UNSOL_RESPONSE_REGISTRATION_SUSPENDED";
+ //VoLTE
+ case RIL_UNSOL_DEDICATE_BEARER_ACTIVATED: return "RIL_UNSOL_DEDICATE_BEARER_ACTIVATED";
+ case RIL_UNSOL_DEDICATE_BEARER_MODIFIED: return "RIL_UNSOL_DEDICATE_BEARER_MODIFIED";
+ //Remote SIM ME lock related APIs [Start]
+ case RIL_UNSOL_MELOCK_NOTIFICATION: return "RIL_UNSOL_MELOCK_NOTIFICATION";
+ //Remote SIM ME lock related APIs [End]
+ // M: Fast Dormancy
+ case RIL_UNSOL_SCRI_RESULT: return "RIL_UNSOL_SCRI_RESULT";
+ case RIL_UNSOL_STK_EVDL_CALL: return "RIL_UNSOL_STK_EVDL_CALL";
+ case RIL_UNSOL_STK_CALL_CTRL: return "RIL_UNSOL_STK_CALL_CTRL";
+
+ /// M: IMS feature. @{
+ case RIL_UNSOL_ECONF_SRVCC_INDICATION: return "RIL_UNSOL_ECONF_SRVCC_INDICATION";
+ //For updating conference call merged/added result.
+ case RIL_UNSOL_ECONF_RESULT_INDICATION: return "RIL_UNSOL_ECONF_RESULT_INDICATION";
+ //For updating call mode and pau information.
+ case RIL_UNSOL_CALL_INFO_INDICATION : return "RIL_UNSOL_CALL_INFO_INDICATION";
+ /// @}
+
+ case RIL_UNSOL_VOLTE_EPS_NETWORK_FEATURE_INFO: return "RIL_UNSOL_VOLTE_EPS_NETWORK_FEATURE_INFO";
+ case RIL_UNSOL_SRVCC_HANDOVER_INFO_INDICATION: return "RIL_UNSOL_SRVCC_HANDOVER_INFO_INDICATION";
+ // M: CC33 LTE.
+ case RIL_UNSOL_RAC_UPDATE: return "RIL_UNSOL_RAC_UPDATE";
+ case RIL_UNSOL_REMOVE_RESTRICT_EUTRAN: return "RIL_UNSOL_REMOVE_RESTRICT_EUTRAN";
+
+ //MTK-START for MD state change
+ case RIL_UNSOL_MD_STATE_CHANGE: return "RIL_UNSOL_MD_STATE_CHANGE";
+ //MTK-END for MD state change
+
+ case RIL_UNSOL_MO_DATA_BARRING_INFO: return "RIL_UNSOL_MO_DATA_BARRING_INFO";
+ case RIL_UNSOL_SSAC_BARRING_INFO: return "RIL_UNSOL_SSAC_BARRING_INFO";
+ //MTK_TC1_FEATURE for LGE CSMCC_MO_CALL_MODIFIED {
+ case RIL_UNSOL_RESPONSE_MO_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_MO_CALL_STATE_CHANGED";
+ //}
+
+ /* M: C2K part start */
+ case RIL_UNSOL_CDMA_CALL_ACCEPTED: return "RIL_UNSOL_CDMA_CALL_ACCEPTED";
+ case RIL_UNSOL_UTK_SESSION_END: return "RIL_UNSOL_UTK_SESSION_END";
+ case RIL_UNSOL_UTK_PROACTIVE_COMMAND: return "RIL_UNSOL_UTK_PROACTIVE_COMMAND";
+ case RIL_UNSOL_UTK_EVENT_NOTIFY: return "RIL_UNSOL_UTK_EVENT_NOTIFY";
+ case RIL_UNSOL_VIA_GPS_EVENT: return "RIL_UNSOL_VIA_GPS_EVENT";
+ case RIL_UNSOL_VIA_NETWORK_TYPE_CHANGE: return "RIL_UNSOL_VIA_NETWORK_TYPE_CHANGE";
+ case RIL_UNSOL_VIA_PLMN_CHANGE_REG_PAUSE: return "RIL_UNSOL_VIA_PLMN_CHANGE_REG_PAUSE";
+ case RIL_UNSOL_VIA_INVALID_SIM_DETECTED: return "RIL_UNSOL_VIA_INVALID_SIM_DETECTED";
+ /* M: C2K part end */
default: return "<unknown response>";
}
}
@@ -4878,6 +5103,13 @@ public class RIL extends BaseCommands implements CommandsInterface {
send(rr);
}
+ @Override
+ public void setInitialAttachApn(String apn, String protocol, int authType, String username,
+ String password, String operatorNumeric, boolean canHandleIms, Message result) {
+ // On generic RIL implementation we just ignore the MTK-specific parameters
+ setInitialAttachApn(apn, protocol, authType, username, password, result);
+ }
+
public void setDataProfile(DataProfile[] dps, Message result) {
if (RILJ_LOGD) riljLog("Set RIL_REQUEST_SET_DATA_PROFILE");
@@ -5098,4 +5330,291 @@ public class RIL extends BaseCommands implements CommandsInterface {
send(rr);
}
+
+ // MTK additions
+ //MTK-START Support Multi-Application
+ @Override
+ public void openIccApplication(int application, Message response) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_OPEN_ICC_APPLICATION, response);
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(application);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+ + ", application = " + application);
+ send(rr);
+ }
+
+ @Override
+ public void getIccApplicationStatus(int sessionId, Message result) {
+ //Note: This RIL request has not been renamed to ICC,
+ // but this request is also valid for SIM and RUIM
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_ICC_APPLICATION_STATUS, result);
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(sessionId);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+ + ", session = " + sessionId);
+ send(rr);
+ }
+
+ @Override
+ public void iccIOForAppEx(int command, int fileid, String path, int p1, int p2, int p3,
+ String data, String pin2, String aid, int channel , Message result) {
+ //Note: This RIL request has not been renamed to ICC,
+ // but this request is also valid for SIM and RUIM
+ RILRequest rr
+ = RILRequest.obtain(RIL_REQUEST_SIM_IO_EX, result);
+
+ rr.mParcel.writeInt(command);
+ rr.mParcel.writeInt(fileid);
+ rr.mParcel.writeString(path);
+ rr.mParcel.writeInt(p1);
+ rr.mParcel.writeInt(p2);
+ rr.mParcel.writeInt(p3);
+ rr.mParcel.writeString(data);
+ rr.mParcel.writeString(pin2);
+ rr.mParcel.writeString(aid);
+ rr.mParcel.writeInt(channel);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> iccIO: "
+ + requestToString(rr.mRequest)
+ + " 0x" + Integer.toHexString(command)
+ + " 0x" + Integer.toHexString(fileid) + " "
+ + " path: " + path + ","
+ + p1 + "," + p2 + "," + p3 + ",channel:" + channel
+ + " aid: " + aid);
+
+ send(rr);
+ }
+ //MTK-END Support Multi-Application
+
+ @Override
+ public void queryNetworkLock(int category, Message response) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_QUERY_SIM_NETWORK_LOCK, response);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ riljLog("queryNetworkLock:" + category);
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(category);
+
+ send(rr);
+ }
+
+ @Override
+ public void setNetworkLock(int catagory, int lockop, String password,
+ String data_imsi, String gid1, String gid2, Message response) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_SIM_NETWORK_LOCK, response);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ riljLog("setNetworkLock:" + catagory + ", " + lockop + ", " + password + ", " + data_imsi
+ + ", " + gid1 + ", " + gid2);
+
+ rr.mParcel.writeInt(6);
+ rr.mParcel.writeString(Integer.toString(catagory));
+ rr.mParcel.writeString(Integer.toString(lockop));
+ if (null != password) {
+ rr.mParcel.writeString(password);
+ } else {
+ rr.mParcel.writeString("");
+ }
+ rr.mParcel.writeString(data_imsi);
+ rr.mParcel.writeString(gid1);
+ rr.mParcel.writeString(gid2);
+
+ send(rr);
+ }
+
+ @Override
+ public void doGeneralSimAuthentication(int sessionId, int mode , int tag, String param1,
+ String param2, Message response) {
+
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_GENERAL_SIM_AUTH, response);
+
+ rr.mParcel.writeInt(sessionId);
+ rr.mParcel.writeInt(mode);
+
+ // Calcuate param1 length in byte length
+ if (param1 != null && param1.length() > 0) {
+ String length = Integer.toHexString(param1.length() / 2);
+ length = (((length.length() % 2 == 1) ? "0" : "") + length);
+ // Session id is equal to 0, for backward compability, we use old AT command
+ // old AT command no need to include param's length
+ rr.mParcel.writeString(((sessionId == 0) ? param1 : (length + param1)));
+ } else {
+ rr.mParcel.writeString(param1);
+ }
+
+ // Calcuate param2 length in byte length
+ if (param2 != null && param2.length() > 0) {
+ String length = Integer.toHexString(param2.length() / 2);
+ length = (((length.length() % 2 == 1) ? "0" : "") + length);
+ // Session id is equal to 0, for backward compability, we use old AT command
+ // old AT command no need to include param's length
+ rr.mParcel.writeString(((sessionId == 0) ? param2 : (length + param2)));
+ } else {
+ rr.mParcel.writeString(param2);
+ }
+
+ if (mode == 1) {
+ rr.mParcel.writeInt(tag);
+ }
+
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + ": " +
+ "session = " + sessionId + ",mode = " + mode + ",tag = " + tag + ", " + param1 + ", " + param2);
+
+ send(rr);
+ }
+
+ @Override
+ public void iccGetATR(Message result) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SIM_GET_ATR, result);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ send(rr);
+ }
+
+ @Override
+ public void iccOpenChannelWithSw(String AID, Message result) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SIM_OPEN_CHANNEL_WITH_SW, result);
+
+ rr.mParcel.writeString(AID);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> iccOpenChannelWithSw: " + requestToString(rr.mRequest)
+ + " " + AID);
+
+ send(rr);
+ }
+
+ public void setTrm(int mode, Message result) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_TRM, null);
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(mode);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+ send(rr);
+ }
+
+ public void setResumeRegistration(int sessionId, Message response) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_RESUME_REGISTRATION, response);
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(sessionId);
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+ send(rr);
+ }
+
+ public void queryModemType(Message response) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_QUERY_MODEM_TYPE, response);
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+ send(rr);
+ }
+
+ public void storeModemType(int modemType, Message response) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_STORE_MODEM_TYPE, response);
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(modemType);
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+ send(rr);
+ }
+
+ /*
+ public void
+ emergencyDial(String address, int clirMode, UUSInfo uusInfo, Message result) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_EMERGENCY_DIAL, result);
+
+ rr.mParcel.writeString(address);
+ rr.mParcel.writeInt(clirMode);
+ rr.mParcel.writeInt(0); // UUS information is absent
+
+ if (uusInfo == null) {
+ rr.mParcel.writeInt(0); // UUS information is absent
+ } else {
+ rr.mParcel.writeInt(1); // UUS information is present
+ rr.mParcel.writeInt(uusInfo.getType());
+ rr.mParcel.writeInt(uusInfo.getDcs());
+ rr.mParcel.writeByteArray(uusInfo.getUserData());
+ }
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ send(rr);
+ }
+ */
+
+ public void setEccServiceCategory(int serviceCategory) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_ECC_SERVICE_CATEGORY, null);
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(serviceCategory);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+ + " " + serviceCategory);
+
+ send(rr);
+ }
+
+ private void setEccList() {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_ECC_LIST, null);
+ ArrayList<PhoneNumberUtils.EccEntry> eccList = PhoneNumberUtils.getEccList();
+
+ rr.mParcel.writeInt(eccList.size() * 3);
+ for (PhoneNumberUtils.EccEntry entry : eccList) {
+ rr.mParcel.writeString(entry.getEcc());
+ rr.mParcel.writeString(entry.getCategory());
+ String strCondition = entry.getCondition();
+ if (strCondition.equals(PhoneNumberUtils.EccEntry.ECC_FOR_MMI))
+ strCondition = PhoneNumberUtils.EccEntry.ECC_NO_SIM;
+ rr.mParcel.writeString(strCondition);
+ }
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ send(rr);
+ }
+
+ // M: Fast Dormancy
+ public void setScri(boolean forceRelease, Message response) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_SCRI, response);
+
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(forceRelease ? 1 : 0);
+
+ send(rr);
+ }
+
+ //[New R8 modem FD]
+ public void setFDMode(int mode, int parameter1, int parameter2, Message response) {
+ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_FD_MODE, response);
+
+ //AT+EFD=<mode>[,<param1>[,<param2>]]
+ //mode=0:disable modem Fast Dormancy; mode=1:enable modem Fast Dormancy
+ //mode=3:inform modem the screen status; parameter1: screen on or off
+ //mode=2:Fast Dormancy inactivity timer; parameter1:timer_id; parameter2:timer_value
+ if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+
+ if (mode == 0 || mode == 1) {
+ rr.mParcel.writeInt(1);
+ rr.mParcel.writeInt(mode);
+ } else if (mode == 3) {
+ rr.mParcel.writeInt(2);
+ rr.mParcel.writeInt(mode);
+ rr.mParcel.writeInt(parameter1);
+ } else if (mode == 2) {
+ rr.mParcel.writeInt(3);
+ rr.mParcel.writeInt(mode);
+ rr.mParcel.writeInt(parameter1);
+ rr.mParcel.writeInt(parameter2);
+ }
+
+ send(rr);
+ }
}
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index 179d4a1..7630879 100644
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -189,6 +189,28 @@ public abstract class ServiceStateTracker extends Handler {
protected static final int EVENT_IMS_STATE_CHANGED = 46;
protected static final int EVENT_IMS_STATE_DONE = 47;
+ // MTK events
+ protected static final int EVENT_DATA_CONNECTION_DETACHED = 100;
+ protected static final int EVENT_INVALID_SIM_INFO = 101; //ALPS00248788
+ protected static final int EVENT_PS_NETWORK_STATE_CHANGED = 102;
+ protected static final int EVENT_IMEI_LOCK = 103; /* ALPS00296298 */
+ protected static final int EVENT_DISABLE_EMMRRS_STATUS = 104;
+ protected static final int EVENT_ENABLE_EMMRRS_STATUS = 105;
+ protected static final int EVENT_ICC_REFRESH = 106;
+ protected static final int EVENT_FEMTO_CELL_INFO = 107;
+ protected static final int EVENT_GET_CELL_INFO_LIST_BY_RATE = 108;
+ protected static final int EVENT_SET_IMS_ENABLED_DONE = 109;
+ protected static final int EVENT_SET_IMS_DISABLE_DONE = 110;
+ protected static final int EVENT_IMS_DISABLED_URC = 111;
+ protected static final int EVENT_IMS_REGISTRATION_INFO = 112;
+
+ // MTK CDMA events
+ protected static final int EVENT_QUERY_NITZ_TIME = 200;
+ protected static final int EVENT_GET_NITZ_TIME = 201;
+ protected static final int EVENT_NETWORK_TYPE_CHANGED = 202;
+ protected static final int EVENT_ETS_DEV_CHANGED = 203;
+ protected static final int EVENT_SET_MDN_DONE = 204;
+
protected static final String TIMEZONE_PROPERTY = "persist.sys.timezone";
/**
diff --git a/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java b/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java
index 95f805e..a806374 100644
--- a/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java
+++ b/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java
@@ -225,7 +225,7 @@ public class SubscriptionInfoUpdater extends Handler {
mIccId[slotId] = ICCID_STRING_FOR_NO_SIM;
}
} else {
- mIccId[slotId] = ICCID_STRING_FOR_NO_SIM;
+ mIccId[slotId] = mFh[slotId].needsFakeIccid() ? IccConstants.FAKE_ICCID : ICCID_STRING_FOR_NO_SIM;
logd("Query IccId fail: " + ar.exception);
}
logd("mIccId[" + slotId + "] = " + mIccId[slotId]);
diff --git a/src/java/com/android/internal/telephony/cdma/CdmaSubscriptionSourceManager.java b/src/java/com/android/internal/telephony/cdma/CdmaSubscriptionSourceManager.java
index f7b8936..059d24d 100644
--- a/src/java/com/android/internal/telephony/cdma/CdmaSubscriptionSourceManager.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaSubscriptionSourceManager.java
@@ -44,7 +44,7 @@ public class CdmaSubscriptionSourceManager extends Handler {
public static final int SUBSCRIPTION_SOURCE_UNKNOWN = -1;
public static final int SUBSCRIPTION_FROM_RUIM = 0; /* CDMA subscription from RUIM */
public static final int SUBSCRIPTION_FROM_NV = 1; /* CDMA subscription from NV */
- public static final int PREFERRED_CDMA_SUBSCRIPTION = SUBSCRIPTION_FROM_NV;
+ public static final int PREFERRED_CDMA_SUBSCRIPTION = SUBSCRIPTION_FROM_RUIM;
private static CdmaSubscriptionSourceManager sInstance;
private static final Object sReferenceCountMonitor = new Object();
diff --git a/src/java/com/android/internal/telephony/dataconnection/ApnSetting.java b/src/java/com/android/internal/telephony/dataconnection/ApnSetting.java
index cf2c57c..c9963c7 100755
--- a/src/java/com/android/internal/telephony/dataconnection/ApnSetting.java
+++ b/src/java/com/android/internal/telephony/dataconnection/ApnSetting.java
@@ -111,23 +111,23 @@ public class ApnSetting {
int profileId, boolean modemCognitive, int maxConns, int waitTime, int maxConnsTime,
int mtu, String mvnoType, String mvnoMatchData) {
this.id = id;
- this.numeric = numeric;
- this.carrier = carrier;
- this.apn = apn;
- this.proxy = proxy;
- this.port = port;
- this.mmsc = mmsc;
- this.mmsProxy = mmsProxy;
- this.mmsPort = mmsPort;
- this.user = user;
- this.password = password;
+ this.numeric = numeric == null ? "" : numeric;
+ this.carrier = carrier == null ? "" : carrier;
+ this.apn = apn == null ? "" : apn;
+ this.proxy = proxy == null ? "" : proxy;
+ this.port = port == null ? "" : port;
+ this.mmsc = mmsc == null ? "" : mmsc;
+ this.mmsProxy = mmsProxy == null ? "" : mmsProxy;
+ this.mmsPort = mmsPort == null ? "" : mmsPort;
+ this.user = user == null ? "" : user;
+ this.password = password == null ? "" : password;
this.authType = authType;
this.types = new String[types.length];
for (int i = 0; i < types.length; i++) {
- this.types[i] = types[i].toLowerCase(Locale.ROOT);
+ this.types[i] = types[i] == null ? "" : types[i].toLowerCase(Locale.ROOT);
}
- this.protocol = protocol;
- this.roamingProtocol = roamingProtocol;
+ this.protocol = protocol == null ? "" : protocol;
+ this.roamingProtocol = roamingProtocol == null ? "" : roamingProtocol;
this.carrierEnabled = carrierEnabled;
this.bearer = bearer;
this.profileId = profileId;
@@ -136,8 +136,8 @@ public class ApnSetting {
this.waitTime = waitTime;
this.maxConnsTime = maxConnsTime;
this.mtu = mtu;
- this.mvnoType = mvnoType;
- this.mvnoMatchData = mvnoMatchData;
+ this.mvnoType = mvnoType == null ? "" : mvnoType;
+ this.mvnoMatchData = mvnoMatchData == null ? "" : mvnoMatchData;
}
diff --git a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
index 91ac2c0..9e271f6 100755
--- a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
@@ -88,6 +88,9 @@ import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.ArrayUtils;
+// MTK
+import com.mediatek.internal.telephony.dataconnection.FdManager;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.nio.ByteBuffer;
@@ -185,6 +188,9 @@ public final class DcTracker extends DcTrackerBase {
private boolean mDeregistrationAlarmState = false;
private PendingIntent mImsDeregistrationDelayIntent = null;
+ // MTK
+ protected FdManager mFdMgr;
+
/* IWLAN and WWAN co-exist flag */
private boolean mWwanIwlanCoexistFlag = false;
@@ -254,6 +260,9 @@ public final class DcTracker extends DcTrackerBase {
mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
}
+ // MTK Fast Dormancy
+ mFdMgr = FdManager.getInstance(p);
+
// Add Emergency APN to APN setting list by default to support EPDN in sim absent cases
initEmergencyApnSetting();
addEmergencyApnSetting();
@@ -869,6 +878,7 @@ public final class DcTracker extends DcTrackerBase {
IccRecords r = mIccRecords.get();
boolean recordsLoaded = false;
if (r != null) {
+ log("isDataAllowed mIccRecords=IccRecords {" + r.toString() + "}");
recordsLoaded = r.getRecordsLoaded();
if (DBG) log("isDataAllowed getRecordsLoaded=" + recordsLoaded);
}
diff --git a/src/java/com/android/internal/telephony/dataconnection/DcTrackerBase.java b/src/java/com/android/internal/telephony/dataconnection/DcTrackerBase.java
index c17a9ce..806c719 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DcTrackerBase.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DcTrackerBase.java
@@ -1806,7 +1806,7 @@ public abstract class DcTrackerBase extends Handler {
ApnSetting firstApnSetting = null;
String operator = (r != null) ? r.getOperatorNumeric(): "";
- log("setInitialApn: E mPreferredApn=" + mPreferredApn);
+ log("setInitialApn: E operator=" + operator + " mPreferredApn=" + mPreferredApn);
if (apnList != null && !apnList.isEmpty()) {
firstApnSetting = apnList.get(0);
@@ -1858,7 +1858,9 @@ public abstract class DcTrackerBase extends Handler {
mPhone.mCi.setInitialAttachApn(initialAttachApnSetting.apn,
initialAttachApnSetting.protocol, initialAttachApnSetting.authType,
- initialAttachApnSetting.user, initialAttachApnSetting.password, null);
+ initialAttachApnSetting.user, initialAttachApnSetting.password,
+ operator, initialAttachApnSetting.canHandleType(PhoneConstants.APN_TYPE_IMS),
+ null);
}
}
diff --git a/src/java/com/android/internal/telephony/gsm/GSMPhone.java b/src/java/com/android/internal/telephony/gsm/GSMPhone.java
index 1b8ef2d..723c223 100644
--- a/src/java/com/android/internal/telephony/gsm/GSMPhone.java
+++ b/src/java/com/android/internal/telephony/gsm/GSMPhone.java
@@ -147,6 +147,8 @@ public class GSMPhone extends PhoneBase {
}
}
+ public boolean mIsNetworkInitiatedUssd = false;
+
// Constructors
public
@@ -977,6 +979,9 @@ public class GSMPhone extends PhoneBase {
@Override
public void sendUssdResponse(String ussdMessge) {
GsmMmiCode mmi = GsmMmiCode.newFromUssdUserInput(ussdMessge, this, mUiccApplication.get());
+ /* M: SS part */
+ Rlog.d(LOG_TAG, "[sendUssdResponse]mPendingMMIs.add(mmi) + " + mmi);
+ /* M: SS part end */
mPendingMMIs.add(mmi);
mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
mmi.sendUssd(ussdMessge);
@@ -1470,6 +1475,10 @@ public class GSMPhone extends PhoneBase {
* The exception is cancellation of an incoming USSD-REQUEST, which is
* not on the list.
*/
+
+ /* M: SS part */
+ Rlog.d(LOG_TAG, "mPendingMMIs.remove(mmi) - " + mmi);
+ /* M: SS part end */
if (mPendingMMIs.remove(mmi) || mmi.isUssdRequest() || mmi.isSsInfo()) {
mMmiCompleteRegistrants.notifyRegistrants(
new AsyncResult(null, mmi, null));
@@ -1477,6 +1486,27 @@ public class GSMPhone extends PhoneBase {
}
/**
+ * Removes the given MMI from the pending list and notifies
+ * registrants that it is complete.
+ * @param mmi MMI that is done
+ * @param obj User object to deliver to application
+ */
+ public void onMMIDone(GsmMmiCode mmi, Object obj) {
+ /* Only notify complete if it's on the pending list.
+ * Otherwise, it's already been handled (eg, previously canceled).
+ * The exception is cancellation of an incoming USSD-REQUEST, which is
+ * not on the list.
+ */
+ /* M: SS part */
+ Rlog.d(LOG_TAG, "mPendingMMIs.remove(mmi) - " + mmi);
+ /* M: SS part end */
+ if (mPendingMMIs.remove(mmi) || mmi.isUssdRequest() || mmi.isSsInfo()) {
+ mMmiCompleteRegistrants.notifyRegistrants(
+ new AsyncResult(obj, mmi, null));
+ }
+ }
+
+ /**
* Used to check if Call Forwarding status is present on sim card. If not, a message is
* sent so we can check if the CF status is stored as a Shared Preference.
*/
@@ -1506,34 +1536,55 @@ public class GSMPhone extends PhoneBase {
boolean isUssdError;
boolean isUssdRequest;
boolean isUssdRelease;
+ boolean isUssdhandleByStk;
+
+ Rlog.d(LOG_TAG, "onIncomingUSSD(): mIsNetworkInitiatedUssd = " + mIsNetworkInitiatedUssd);
isUssdRequest
= (ussdMode == CommandsInterface.USSD_MODE_REQUEST);
-
+ /* M: SS part */
+ //MTK-START [mtk04070][111118][ALPS00093395]MTK modified
isUssdError
- = (ussdMode != CommandsInterface.USSD_MODE_NOTIFY
- && ussdMode != CommandsInterface.USSD_MODE_REQUEST);
+ = ((ussdMode == CommandsInterface.USSD_OPERATION_NOT_SUPPORTED)
+ || (ussdMode == CommandsInterface.USSD_NETWORK_TIMEOUT));
+ //MTK-END [mtk04070][111118][ALPS00093395]MTK modified
+
+ isUssdhandleByStk
+ = (ussdMode == CommandsInterface.USSD_HANDLED_BY_STK);
+ /* M: SS part end */
isUssdRelease = (ussdMode == CommandsInterface.USSD_MODE_NW_RELEASE);
+ Rlog.d(LOG_TAG, "ussdMode= " + ussdMode);
+ Rlog.d(LOG_TAG, "isUssdRequest=" + isUssdRequest + " isUssdError= " + isUssdError);
// See comments in GsmMmiCode.java
// USSD requests aren't finished until one
// of these two events happen
GsmMmiCode found = null;
+ Rlog.d(LOG_TAG, "USSD:mPendingMMIs= " + mPendingMMIs + " size=" + mPendingMMIs.size());
for (int i = 0, s = mPendingMMIs.size() ; i < s; i++) {
+ Rlog.d(LOG_TAG, "i= " + i + " isPending=" + mPendingMMIs.get(i).isPendingUSSD());
if(mPendingMMIs.get(i).isPendingUSSD()) {
found = mPendingMMIs.get(i);
+ Rlog.d(LOG_TAG, "found = " + found);
break;
}
}
if (found != null) {
// Complete pending USSD
-
- if (isUssdRelease) {
+ /* M: SS part */
+ //For ALPS01471897
+ Rlog.d(LOG_TAG, "setUserInitiatedMMI TRUE");
+ found.setUserInitiatedMMI(true);
+ /* M: SS part end */
+ if (isUssdRelease && mIsNetworkInitiatedUssd) {
+ Rlog.d(LOG_TAG, "onIncomingUSSD(): USSD_MODE_NW_RELEASE.");
found.onUssdRelease();
} else if (isUssdError) {
found.onUssdFinishedError();
+ } else if (isUssdhandleByStk) {
+ found.onUssdStkHandling(ussdMessage, isUssdRequest);
} else {
found.onUssdFinished(ussdMessage, isUssdRequest);
}
@@ -1542,6 +1593,13 @@ public class GSMPhone extends PhoneBase {
// ignore everything that isnt a Notify or a Request
// also, discard if there is no message to present
+
+ /* M: SS part */
+ //For ALPS01471897
+ Rlog.d(LOG_TAG, "The default value of UserInitiatedMMI is FALSE");
+ mIsNetworkInitiatedUssd = true;
+ Rlog.d(LOG_TAG, "onIncomingUSSD(): Network Initialized USSD");
+
if (!isUssdError && ussdMessage != null) {
GsmMmiCode mmi;
mmi = GsmMmiCode.newNetworkInitiatedUssd(ussdMessage,
@@ -1549,8 +1607,25 @@ public class GSMPhone extends PhoneBase {
GSMPhone.this,
mUiccApplication.get());
onNetworkInitiatedUssd(mmi);
+
+ //MTK-START [mtk04070][111118][ALPS00093395]MTK added
+ } else if (isUssdError) {
+ GsmMmiCode mmi;
+ mmi = GsmMmiCode.newNetworkInitiatedUssdError(ussdMessage,
+ isUssdRequest,
+ GSMPhone.this,
+ mUiccApplication.get());
+ onNetworkInitiatedUssd(mmi);
+ //MTK-END [mtk04070][111118][ALPS00093395]MTK added
}
+ /* M: SS part end */
+ }
+
+ /* M: SS part */
+ if (isUssdRelease || isUssdError) {
+ mIsNetworkInitiatedUssd = false;
}
+ /* M: SS part end */
}
/**
diff --git a/src/java/com/android/internal/telephony/gsm/GsmMmiCode.java b/src/java/com/android/internal/telephony/gsm/GsmMmiCode.java
index c79c9f0..2db5c34 100644
--- a/src/java/com/android/internal/telephony/gsm/GsmMmiCode.java
+++ b/src/java/com/android/internal/telephony/gsm/GsmMmiCode.java
@@ -116,6 +116,12 @@ public final class GsmMmiCode extends Handler implements MmiCode {
static final int EVENT_SET_CFF_COMPLETE = 6;
static final int EVENT_USSD_CANCEL_COMPLETE = 7;
+ /* M: SS part */
+ /// M: [mtk04070][111125][ALPS00093395]MTK added. @{
+ static final String USSD_HANDLED_BY_STK = "stk";
+ /// @}
+ /* M: SS part end */
+
//***** Instance Variables
GSMPhone mPhone;
@@ -140,6 +146,9 @@ public final class GsmMmiCode extends Handler implements MmiCode {
CharSequence mMessage;
private boolean mIsSsInfo = false;
+ //For ALPS01471897
+ private boolean mUserInitiatedMMI = false;
+ //end
//***** Class Variables
@@ -573,10 +582,21 @@ public final class GsmMmiCode extends Handler implements MmiCode {
return ((Phone) mPhone);
}
+ //For ALPS01471897
+ public void setUserInitiatedMMI(boolean userinit)
+ {
+ mUserInitiatedMMI = userinit;
+ }
+
+ public boolean getUserInitiatedMMI() {
+ return mUserInitiatedMMI;
+ }
+
// inherited javadoc suffices
@Override
public void
cancel() {
+ mPhone.mIsNetworkInitiatedUssd = false;
// Complete or failed cannot be cancelled
if (mState == State.COMPLETE || mState == State.FAILED) {
return;
@@ -779,6 +799,36 @@ public final class GsmMmiCode extends Handler implements MmiCode {
return mIsSsInfo;
}
+ public static boolean isUssdNumber(String dialString, GSMPhone dialPhone, UiccCardApplication iccApp) {
+ String newDialString = PhoneNumberUtils.stripSeparators(dialString);
+ String networkPortion = PhoneNumberUtils.extractNetworkPortionAlt(newDialString);
+
+ GsmMmiCode mmi = GsmMmiCode.newFromDialString(networkPortion, dialPhone, iccApp);
+ if (mmi == null || mmi.isTemporaryModeCLIR()) {
+ return false;
+ }
+ else {
+ if (mmi.isShortCode()) {
+ return true;
+ } else if (mmi.mDialingNumber != null) {
+ return true;
+ } else if (mmi.mSc != null
+ && (mmi.mSc.equals(SC_CLIP)
+ || mmi.mSc.equals(SC_CLIR)
+ || isServiceCodeCallForwarding(mmi.mSc)
+ || isServiceCodeCallBarring(mmi.mSc)
+ || mmi.mSc.equals(SC_PWD)
+ || mmi.mSc.equals(SC_WAIT)
+ || mmi.isPinPukCommand()
+ )) {
+ return false;
+ } else if (mmi.mPoundString != null) {
+ return true;
+ }
+ return false;
+ }
+ }
+
/** Process a MMI code or short code...anything that isn't a dialing number */
void
processCode () {
@@ -789,7 +839,13 @@ public final class GsmMmiCode extends Handler implements MmiCode {
sendUssd(mDialingNumber);
} else if (mDialingNumber != null) {
// We should have no dialing numbers here
- throw new RuntimeException ("Invalid or Unsupported MMI Code");
+
+ /* M: SS part */
+ /// M: [mtk04070][111125][ALPS00093395]MTK modified. @{
+ Rlog.w(LOG_TAG, "Special USSD Support:" + mPoundString + mDialingNumber);
+ sendUssd(mPoundString + mDialingNumber);
+ //throw new RuntimeException ("Invalid or Unsupported MMI Code");
+ /// @}
} else if (mSc != null && mSc.equals(SC_CLIP)) {
Rlog.d(LOG_TAG, "is CLIP");
if (isInterrogate()) {
@@ -1007,7 +1063,10 @@ public final class GsmMmiCode extends Handler implements MmiCode {
void
onUssdFinished(String ussdMessage, boolean isUssdRequest) {
if (mState == State.PENDING) {
- if (ussdMessage == null) {
+ /* M: SS part */
+ /// M: [mtk04070][111125][ALPS00093395]Check the length of ussdMessage.
+ if (ussdMessage == null || ussdMessage.length() == 0) {
+ /* M: SS part end */
mMessage = mContext.getText(com.android.internal.R.string.mmiComplete);
} else {
mMessage = ussdMessage;
@@ -1017,11 +1076,28 @@ public final class GsmMmiCode extends Handler implements MmiCode {
if (!isUssdRequest) {
mState = State.COMPLETE;
}
-
mPhone.onMMIDone(this);
}
}
+ void
+ onUssdStkHandling(String ussdMessage, boolean isUssdRequest) {
+ if (mState == State.PENDING) {
+ if (ussdMessage == null || ussdMessage.length() == 0) {
+ mMessage = mContext.getText(com.android.internal.R.string.mmiComplete);
+ } else {
+ mMessage = ussdMessage;
+ }
+ mIsUssdRequest = isUssdRequest;
+ // If it's a request, leave it PENDING so that it's cancelable.
+ if (!isUssdRequest) {
+ mState = State.COMPLETE;
+ }
+ String userObjStringStk = USSD_HANDLED_BY_STK;
+ mPhone.onMMIDone(this, (Object) userObjStringStk);
+ }
+ }
+
/**
* Called from GSMPhone
*
@@ -1033,11 +1109,11 @@ public final class GsmMmiCode extends Handler implements MmiCode {
if (mState == State.PENDING) {
mState = State.FAILED;
mMessage = mContext.getText(com.android.internal.R.string.mmiError);
-
mPhone.onMMIDone(this);
}
}
+
/**
* Called from GSMPhone
*
@@ -1057,6 +1133,7 @@ public final class GsmMmiCode extends Handler implements MmiCode {
}
}
+
void sendUssd(String ussdMessage) {
// Treat this as a USSD string
mIsPendingUSSD = true;
@@ -1616,4 +1693,21 @@ public final class GsmMmiCode extends Handler implements MmiCode {
sb.append("}");
return sb.toString();
}
+
+ /* M: SS part */
+ /// M: [mtk04070][111125][ALPS00093395]MTK proprietary methods. @{
+ static GsmMmiCode
+ newNetworkInitiatedUssdError(String ussdMessage,
+ boolean isUssdRequest, GSMPhone phone, UiccCardApplication app) {
+ GsmMmiCode ret;
+
+ ret = new GsmMmiCode(phone, app);
+
+ ret.mMessage = ret.mContext.getText(com.android.internal.R.string.mmiError);
+ ret.mIsUssdRequest = isUssdRequest;
+
+ ret.mState = State.FAILED;
+
+ return ret;
+ }
}
diff --git a/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index 117d054..f2e3d18 100644
--- a/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -224,6 +224,20 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
mCi.setOnNITZTime(this, EVENT_NITZ_TIME, null);
mCi.setOnRestrictedStateChanged(this, EVENT_RESTRICTED_STATE_CHANGED, null);
+ // MTK
+ mCi.registerForPsNetworkStateChanged(this, EVENT_PS_NETWORK_STATE_CHANGED, null);
+ // mCi.setInvalidSimInfo(this, EVENT_INVALID_SIM_INFO, null); //ALPS00248788
+
+ // mCi.registerForIccRefresh(this, EVENT_ICC_REFRESH, null);
+ /*
+ if (SystemProperties.get("ro.mtk_ims_support").equals("1")) {
+ mCi.registerForImsDisable(this, EVENT_IMS_DISABLED_URC, null);
+ mCi.registerForImsRegistrationInfo(this, EVENT_IMS_REGISTRATION_INFO, null);
+ }
+ if (SystemProperties.get("ro.mtk_femto_cell_support").equals("1"))
+ mCi.registerForFemtoCellInfo(this, EVENT_FEMTO_CELL_INFO, null);
+ */
+
// system setting property AIRPLANE_MODE_ON is set in Settings.
int airplaneMode = Settings.Global.getInt(
phone.getContext().getContentResolver(),
@@ -267,6 +281,11 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
mCr.unregisterContentObserver(mAutoTimeObserver);
mCr.unregisterContentObserver(mAutoTimeZoneObserver);
mPhone.getContext().unregisterReceiver(mIntentReceiver);
+
+ // MTK
+ // mCi.unregisterForIccRefresh(this);
+ mCi.unregisterForPsNetworkStateChanged(this);
+
super.dispose();
}
@@ -327,6 +346,10 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
pollState();
break;
+ case EVENT_PS_NETWORK_STATE_CHANGED:
+ pollState();
+ break;
+
case EVENT_GET_SIGNAL_STRENGTH:
// This callback is called when signal strength is polled
// all by itself
@@ -720,6 +743,12 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
psc = Integer.parseInt(states[14], 16);
}
}
+
+ log("EVENT_POLL_STATE_REGISTRATION mSS getRilVoiceRadioTechnology:" + mSS.getRilVoiceRadioTechnology() +
+ ", regState:" + regState +
+ ", NewSS RilVoiceRadioTechnology:" + mNewSS.getRilVoiceRadioTechnology() +
+ ", lac:" + lac +
+ ", cid:" + cid);
} catch (NumberFormatException ex) {
loge("error parsing RegistrationState: " + ex);
}
@@ -783,12 +812,18 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
if (states.length >= 4 && states[3] != null) {
type = Integer.parseInt(states[3]);
}
- if ((states.length >= 5 ) &&
+ if (states.length >= 5 && states[4] != null) {
+ log("<cell_data_speed_support> " + states[4]);
+ }
+ if (states.length >= 6 && states[5] != null) {
+ log("<max_data_bearer_capability> " + states[5]);
+ }
+ if ((states.length >= 7) &&
(regState == ServiceState.RIL_REG_STATE_DENIED)) {
- mNewReasonDataDenied = Integer.parseInt(states[4]);
+ mNewReasonDataDenied = Integer.parseInt(states[6]);
}
- if (states.length >= 6) {
- mNewMaxDataCalls = Integer.parseInt(states[5]);
+ if (states.length >= 8) {
+ mNewMaxDataCalls = Integer.parseInt(states[7]);
}
} catch (NumberFormatException ex) {
loge("error parsing GprsRegistrationState: " + ex);
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
index b4c70d9..ac63ebf 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
@@ -104,6 +104,14 @@ public class ImsPhone extends ImsPhoneBase {
public static final String CS_FALLBACK = "cs_fallback";
+ /// M: @{
+ /**
+ * Used as the message in CallStateException.
+ * We don't support dialing a USSD number while there is an existing IMS call.
+ */
+ public static final String USSD_DURING_IMS_INCALL = "ussd_during_ims_incall";
+ /// @}
+
static final int RESTART_ECM_TIMER = 0; // restart Ecm timer
static final int CANCEL_ECM_TIMER = 1; // cancel Ecm timer
@@ -532,6 +540,16 @@ public class ImsPhone extends ImsPhoneBase {
return result;
}
+ /// M: for USSD over IMS workaround. @{
+ private boolean isUssdDuringInCall(ImsPhoneMmiCode mmi) {
+ if (mmi == null || !mmi.isUssdNumber()) {
+ return false;
+ }
+
+ return isInCall();
+ }
+ /// @}
+
boolean isInCall() {
ImsPhoneCall.State foregroundCallState = getForegroundCall().getState();
ImsPhoneCall.State backgroundCallState = getBackgroundCall().getState();
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
index 755e87c..9226a8b 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
@@ -586,5 +586,52 @@ class ImsPhoneCommandInterface extends BaseCommands implements CommandsInterface
public void requestShutdown(Message result) {
}
+ // MTK
+
+ @Override
+ public void iccGetATR(Message response) {
+ }
+
+ @Override
+ public void iccOpenChannelWithSw(String AID, Message result){
+ }
+
+ @Override
+ public void setTrm(int mode, Message result) {
+ }
+
+ @Override
+ public void setOnPlmnChangeNotification(Handler h, int what, Object obj) {
+ }
+
+ @Override
+ public void unSetOnPlmnChangeNotification(Handler h) {
+ }
+
+ @Override
+ public void setOnRegistrationSuspended(Handler h, int what, Object obj) {
+ }
+
+ @Override
+ public void unSetOnRegistrationSuspended(Handler h) {
+ }
+
+ @Override
+ public void setResumeRegistration(int sessionId, Message response) {
+ }
+
+ @Override
+ public void queryModemType(Message response) {
+ }
+
+ @Override
+ public void storeModemType(int modemType, Message response) {
+ }
+
+ @Override
+ public void setInitialAttachApn(String apn, String protocol, int authType, String username,
+ String password, String operatorNumeric, boolean canHandleIms, Message result) {
+ }
+
public boolean needsOldRilFeature(String feature) { return false; }
}
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneMmiCode.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneMmiCode.java
index 18d94ad..2a9191c 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneMmiCode.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneMmiCode.java
@@ -1797,4 +1797,25 @@ public final class ImsPhoneMmiCode extends Handler implements MmiCode {
sb.append("}");
return sb.toString();
}
+
+ /// M: for SS part. @{
+ /**
+ Utility function to check if it is USSD number.
+ @return boolean true if this an USSD number.
+ */
+ public boolean isUssdNumber() {
+ if (isTemporaryModeCLIR()) {
+ return false;
+ } else {
+ if (isShortCode()) {
+ return true;
+ } else if (mDialingNumber != null) {
+ return true;
+ } else if (mPoundString != null) {
+ return true;
+ }
+ return false;
+ }
+ }
+ /// @}
}
diff --git a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
index 65c37ba..f14bf69 100644
--- a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
+++ b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
@@ -589,5 +589,52 @@ class SipCommandInterface extends BaseCommands implements CommandsInterface {
public void requestShutdown(Message result) {
}
+ // MTK
+
+ @Override
+ public void iccGetATR(Message response) {
+ }
+
+ @Override
+ public void iccOpenChannelWithSw(String AID, Message result){
+ }
+
+ @Override
+ public void setTrm(int mode, Message result) {
+ }
+
+ @Override
+ public void setOnPlmnChangeNotification(Handler h, int what, Object obj) {
+ }
+
+ @Override
+ public void unSetOnPlmnChangeNotification(Handler h) {
+ }
+
+ @Override
+ public void setOnRegistrationSuspended(Handler h, int what, Object obj) {
+ }
+
+ @Override
+ public void unSetOnRegistrationSuspended(Handler h) {
+ }
+
+ @Override
+ public void setResumeRegistration(int sessionId, Message response) {
+ }
+
+ @Override
+ public void queryModemType(Message response) {
+ }
+
+ @Override
+ public void storeModemType(int modemType, Message response) {
+ }
+
+ @Override
+ public void setInitialAttachApn(String apn, String protocol, int authType, String username,
+ String password, String operatorNumeric, boolean canHandleIms, Message result) {
+ }
+
public boolean needsOldRilFeature(String feature) { return false; }
}
diff --git a/src/java/com/android/internal/telephony/test/SimulatedCommands.java b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
index 0181430..afddcdc 100644
--- a/src/java/com/android/internal/telephony/test/SimulatedCommands.java
+++ b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
@@ -1776,5 +1776,38 @@ public final class SimulatedCommands extends BaseCommands
setRadioState(RadioState.RADIO_UNAVAILABLE);
}
+ // MTK additions
+
+ @Override
+ public void iccGetATR(Message response) {
+ unimplemented(response);
+ }
+
+ @Override
+ public void iccOpenChannelWithSw(String AID, Message response) {
+ unimplemented(response);
+ }
+
+ @Override
+ public void setTrm(int mode, Message result) {
+ }
+
+ @Override
+ public void setResumeRegistration(int sessionId, Message response) {
+ }
+
+ @Override
+ public void queryModemType(Message response) {
+ }
+
+ @Override
+ public void storeModemType(int modemType, Message response) {
+ }
+
+ @Override
+ public void setInitialAttachApn(String apn, String protocol, int authType, String username,
+ String password, String operatorNumeric, boolean canHandleIms, Message result) {
+ }
+
public boolean needsOldRilFeature(String feature) { return false; }
}
diff --git a/src/java/com/android/internal/telephony/uicc/IccCardProxy.java b/src/java/com/android/internal/telephony/uicc/IccCardProxy.java
index c4c55c6..ed7bab6 100755
--- a/src/java/com/android/internal/telephony/uicc/IccCardProxy.java
+++ b/src/java/com/android/internal/telephony/uicc/IccCardProxy.java
@@ -54,6 +54,8 @@ import com.android.internal.telephony.uicc.IccCardStatus.PinState;
import com.android.internal.telephony.uicc.UiccController;
import com.android.internal.telephony.uicc.RuimRecords;
+import com.mediatek.internal.telephony.uicc.IccCardProxyEx;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -103,6 +105,21 @@ public class IccCardProxy extends Handler implements IccCard {
private static final int EVENT_SUBSCRIPTION_DEACTIVATED = 502;
private static final int EVENT_CARRIER_PRIVILIGES_LOADED = 503;
+ // MTK
+ private static final int EVENT_ICC_RECOVERY = 100;
+ private static final int EVENT_ICC_FDN_CHANGED = 101;
+ private static final int EVENT_NOT_AVAILABLE = 102;
+
+ private static final String ICCID_STRING_FOR_NO_SIM = "N/A";
+ private String[] PROPERTY_ICCID_SIM = {
+ "ril.iccid.sim1",
+ "ril.iccid.sim2",
+ "ril.iccid.sim3",
+ "ril.iccid.sim4",
+ };
+
+ private static final String COMMON_SLOT_PROPERTY = "";
+
private Integer mPhoneId = null;
private final Object mLock = new Object();
@@ -113,6 +130,10 @@ public class IccCardProxy extends Handler implements IccCard {
private RegistrantList mPinLockedRegistrants = new RegistrantList();
private RegistrantList mPersoLockedRegistrants = new RegistrantList();
+ // MTK
+ private RegistrantList mRecoveryRegistrants = new RegistrantList();
+ private RegistrantList mFdnChangedRegistrants = new RegistrantList();
+
private int mCurrentAppType = UiccController.APP_FAM_3GPP; //default to 3gpp?
private UiccController mUiccController = null;
private UiccCard mUiccCard = null;
@@ -127,6 +148,9 @@ public class IccCardProxy extends Handler implements IccCard {
private boolean mIsCardStatusAvailable = false;
private PersoSubState mPersoSubState = PersoSubState.PERSOSUBSTATE_UNKNOWN;
+ // MTK
+ private IccCardProxyEx mIccCardProxyEx;
+
// Sim State events may be broadcasted before the siminfo table update has been
// completed. Due to this such events may be broadcasted with dummy subId for a
// particular slotId. Therefore, setExternalState once the siminfo table has been updated.
@@ -145,6 +169,7 @@ public class IccCardProxy extends Handler implements IccCard {
mContext = context;
mCi = ci;
mPhoneId = phoneId;
+ mIccCardProxyEx = new IccCardProxyEx(context, ci);
mCdmaSSM = CdmaSubscriptionSourceManager.getInstance(context,
ci, this, EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null);
mUiccController = UiccController.getInstance();
@@ -168,6 +193,7 @@ public class IccCardProxy extends Handler implements IccCard {
mCi.unregisterForOn(this);
mCi.unregisterForOffOrNotAvailable(this);
mCdmaSSM.dispose(this);
+ mIccCardProxyEx.dispose();
}
}
@@ -288,6 +314,10 @@ public class IccCardProxy extends Handler implements IccCard {
setExternalState(State.NOT_READY);
}
break;
+ case EVENT_NOT_AVAILABLE:
+ log("handleMessage (EVENT_NOT_AVAILABLE)");
+ setExternalState(State.NOT_READY);
+ break;
case EVENT_RADIO_ON:
mRadioOn = true;
if (!mInitialized) {
@@ -302,9 +332,29 @@ public class IccCardProxy extends Handler implements IccCard {
case EVENT_ICC_CHANGED:
mIsCardStatusAvailable = true;
if (mInitialized) {
+ AsyncResult ar = (AsyncResult) msg.obj;
+ int index = mPhoneId;
+
+ if (ar != null && ar.result instanceof Integer) {
+ index = ((Integer) ar.result).intValue();
+ log("handleMessage (EVENT_ICC_CHANGED), index=" + index + " mPhoneId=" + mPhoneId);
+ } else {
+ log("handleMessage (EVENT_ICC_CHANGED), come from myself, mPhoneId=" + mPhoneId);
+ }
+
updateIccAvailability();
}
break;
+ case EVENT_ICC_RECOVERY: {
+ AsyncResult ar = (AsyncResult) msg.obj;
+ Integer index = (Integer) ar.result;
+ log("handleMessage (EVENT_ICC_RECOVERY) , index = " + index);
+ // if (index == mSlotId) {
+ if (DBG) log("mRecoveryRegistrants notify");
+ mRecoveryRegistrants.notifyRegistrants();
+ // }
+ break;
+ }
case EVENT_ICC_ABSENT:
mAbsentRegistrants.notifyRegistrants();
setExternalState(State.ABSENT);
@@ -386,6 +436,10 @@ public class IccCardProxy extends Handler implements IccCard {
}
break;
+ case EVENT_ICC_FDN_CHANGED:
+ mFdnChangedRegistrants.notifyRegistrants();
+ break;
+
case EVENT_CARRIER_PRIVILIGES_LOADED:
log("EVENT_CARRIER_PRIVILEGES_LOADED");
if (mUiccCard != null) {
@@ -490,12 +544,19 @@ public class IccCardProxy extends Handler implements IccCard {
setExternalState(State.PUK_REQUIRED);
break;
case APPSTATE_SUBSCRIPTION_PERSO:
+ /* [mtk02772][ALPS00437082]
+ mediatek platform will set network locked for all of subState (5 type of network locked)
+ */
+ setExternalState(State.PERSO_LOCKED);
+
+ /*
if (mUiccApplication.isPersoLocked()) {
mPersoSubState = mUiccApplication.getPersoSubState();
setExternalState(State.PERSO_LOCKED);
} else {
setExternalState(State.UNKNOWN);
}
+ */
break;
case APPSTATE_READY:
setExternalState(State.READY);
@@ -655,7 +716,15 @@ public class IccCardProxy extends Handler implements IccCard {
switch (state) {
case PIN_REQUIRED: return IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN;
case PUK_REQUIRED: return IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK;
- case PERSO_LOCKED: return IccCardConstants.INTENT_VALUE_LOCKED_PERSO;
+ case PERSO_LOCKED: // return IccCardConstants.INTENT_VALUE_LOCKED_PERSO;
+ switch (mUiccApplication.getPersoSubState()) {
+ case PERSOSUBSTATE_SIM_NETWORK: return IccCardConstants.INTENT_VALUE_LOCKED_NETWORK;
+ case PERSOSUBSTATE_SIM_NETWORK_SUBSET: return IccCardConstants.INTENT_VALUE_LOCKED_NETWORK_SUBSET;
+ case PERSOSUBSTATE_SIM_CORPORATE: return IccCardConstants.INTENT_VALUE_LOCKED_CORPORATE;
+ case PERSOSUBSTATE_SIM_SERVICE_PROVIDER: return IccCardConstants.INTENT_VALUE_LOCKED_SERVICE_PROVIDER;
+ case PERSOSUBSTATE_SIM_SIM: return IccCardConstants.INTENT_VALUE_LOCKED_SIM;
+ default: return null;
+ }
case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ABSENT_ON_PERM_DISABLED;
case CARD_IO_ERROR: return IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR;
default: return null;
@@ -990,4 +1059,142 @@ public class IccCardProxy extends Handler implements IccCard {
pw.flush();
}
+
+ // MTK additions
+
+ // Added by M begin
+ /**
+ * Query the SIM ME Lock type required to unlock.
+ *
+ * @return SIM ME Lock type
+ */
+ public PersoSubState getNetworkPersoType() {
+ if (mUiccApplication != null) {
+ return mUiccApplication.getPersoSubState();
+ }
+ return PersoSubState.PERSOSUBSTATE_UNKNOWN;
+ }
+
+ /**
+ * Check whether ICC network lock is enabled
+ * This is an async call which returns lock state to applications directly
+ */
+ @Override
+ public void queryIccNetworkLock(int category, Message onComplete) {
+ if (DBG) log("queryIccNetworkLock(): category = " + category);
+ synchronized (mLock) {
+ if (mUiccApplication != null) {
+ mUiccApplication.queryIccNetworkLock(category, onComplete);
+ } else if (onComplete != null) {
+ Exception e = new RuntimeException("ICC card is absent.");
+ AsyncResult.forMessage(onComplete).exception = e;
+ onComplete.sendToTarget();
+ return;
+ }
+ }
+ }
+
+ /**
+ * Set the ICC network lock enabled or disabled
+ * When the operation is complete, onComplete will be sent to its handler
+ */
+ @Override
+ public void setIccNetworkLockEnabled(int category,
+ int lockop, String password, String data_imsi, String gid1, String gid2, Message onComplete) {
+ if (DBG) log("SetIccNetworkEnabled(): category = " + category
+ + " lockop = " + lockop + " password = " + password
+ + " data_imsi = " + data_imsi + " gid1 = " + gid1 + " gid2 = " + gid2);
+ synchronized (mLock) {
+ if (mUiccApplication != null) {
+ mUiccApplication.setIccNetworkLockEnabled(category, lockop, password, data_imsi, gid1, gid2, onComplete);
+ } else if (onComplete != null) {
+ Exception e = new RuntimeException("ICC card is absent.");
+ AsyncResult.forMessage(onComplete).exception = e;
+ onComplete.sendToTarget();
+ return;
+ }
+ }
+ }
+
+ /**
+ * Used by SIM ME lock related enhancement feature(Modem SML change feature).
+ */
+ public void repollIccStateForModemSmlChangeFeatrue(boolean needIntent) {
+ if (DBG) log("repollIccStateForModemSmlChangeFeatrue, needIntent = " + needIntent);
+ synchronized (mLock) {
+ mUiccController.repollIccStateForModemSmlChangeFeatrue(mPhoneId, needIntent);
+ }
+ }
+
+ public void exchangeSimIo(int fileID, int command,
+ int p1, int p2, int p3, String pathID, String data, String pin2, Message onComplete) {
+ if (mUiccCard != null && mUiccCard.getCardState() != CardState.CARDSTATE_ABSENT) {
+ mUiccCard.exchangeSimIo(fileID, command, p1, p2, p3, pathID, data, pin2, onComplete);
+ }
+ }
+
+ public void iccGetAtr(Message onComplete) {
+ if (mUiccCard != null && mUiccCard.getCardState() != CardState.CARDSTATE_ABSENT) {
+ mUiccCard.iccGetAtr(onComplete);
+ }
+ }
+
+ public void openLogicalChannelWithSw(String AID, Message onComplete) {
+ if (mUiccCard != null && mUiccCard.getCardState() != CardState.CARDSTATE_ABSENT) {
+ mUiccCard.iccOpenChannelWithSw(AID, onComplete);
+ }
+ }
+
+ // retrun usim property or use uicccardapplication app type
+ public String getIccCardType() {
+ if (mUiccCard != null && mUiccCard.getCardState() != CardState.CARDSTATE_ABSENT) {
+ return mUiccCard.getIccCardType();
+ }
+ return "";
+ }
+
+ public void registerForRecovery(Handler h, int what, Object obj) {
+ synchronized (mLock) {
+ Registrant r = new Registrant(h, what, obj);
+
+ mRecoveryRegistrants.add(r);
+
+ if (getState() == State.READY) {
+ r.notifyRegistrant();
+ }
+ }
+ }
+
+ public void unregisterForRecovery(Handler h) {
+ synchronized (mLock) {
+ mRecoveryRegistrants.remove(h);
+ }
+ }
+
+ /**
+ * Notifies handler in case of FDN changed
+ */
+ @Override
+ public void registerForFdnChanged(Handler h, int what, Object obj) {
+ synchronized (mLock) {
+ synchronized (mLock) {
+ Registrant r = new Registrant(h, what, obj);
+
+ mFdnChangedRegistrants.add(r);
+
+ if (getIccFdnEnabled()) {
+ r.notifyRegistrant();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void unregisterForFdnChanged(Handler h) {
+ synchronized (mLock) {
+ mFdnChangedRegistrants.remove(h);
+ }
+ }
+
+ // Added by M end
}
diff --git a/src/java/com/android/internal/telephony/uicc/IccConstants.java b/src/java/com/android/internal/telephony/uicc/IccConstants.java
index facc918..4b5b48f 100644
--- a/src/java/com/android/internal/telephony/uicc/IccConstants.java
+++ b/src/java/com/android/internal/telephony/uicc/IccConstants.java
@@ -112,4 +112,34 @@ public interface IccConstants {
//UICC access
static final String DF_ADF = "7FFF";
+
+ //CM-Specific : Fake ICCID
+ static final String FAKE_ICCID = "00000000000001";
+
+ // MTK
+ static final int EF_ECC = 0x6FB7;
+
+ // USIM SIM file ids from TS 31.102
+ static final int EF_PSISMSC = 0x6FE5;
+ static final int EF_GBABP = 0x6fD6;
+ // [ALPS01206315] Support EF_SMSP (EF ids from 11.11/31.102)
+ static final int EF_SMSP = 0x6F42;
+ static final int EF_ELP = 0x2F05;
+ // ALPS00302702 RAT balancing
+ static public final int EF_RAT = 0x4F36; // ADF(USIM)/7F66/5F30/4F36
+ static final String DF_USIM = "7FFF";
+ static final int EF_GID2 = 0x6F3F;
+
+ // MTK-START [ALPS00092673] Orange feature merge back added by mtk80589 in 2011.11.15
+ /*
+ Detail description:
+ This feature provides a interface to get menu title string from EF_SUME
+ */
+ // SET UP MENU ELEMENTS
+ static final int EF_SUME = 0x6F54;
+ // MTK-END [ALPS00092673] Orange feature merge back added by mtk80589 in 2011.11.15
+
+ //ISIM access file ids from TS 31.103
+ static final int EF_ISIM_GBABP = 0x6fd5;
+ static final int EF_ISIM_GBANL = 0x6fd7;
}
diff --git a/src/java/com/android/internal/telephony/uicc/IccFileHandler.java b/src/java/com/android/internal/telephony/uicc/IccFileHandler.java
index 24d948c..e1f524b 100644
--- a/src/java/com/android/internal/telephony/uicc/IccFileHandler.java
+++ b/src/java/com/android/internal/telephony/uicc/IccFileHandler.java
@@ -18,6 +18,7 @@ package com.android.internal.telephony.uicc;
import android.os.*;
import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.PhoneConstants;
import java.util.ArrayList;
@@ -92,6 +93,9 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
/** Finished retrieving size of record for EFimg now. */
static protected final int EVENT_GET_RECORD_SIZE_IMG_DONE = 11;
+ // MTK
+ static protected final int EVENT_SELECT_EF_FILE = 100;
+
// member variables
protected final CommandsInterface mCi;
protected final UiccCardApplication mParentApp;
@@ -104,6 +108,10 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
boolean mLoadAll;
String mPath;
+ // MTK
+ int mChannel;
+ int mMode;
+
// Variables used to load part records
boolean mLoadPart;
ArrayList<Integer> mRecordNums;
@@ -120,6 +128,8 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
mLoadAll = false;
mLoadPart = false;
mPath = null;
+ mChannel = 0;
+ mMode = -1;
}
LoadLinearFixedContext(int efid, int recordNum, String path, Message onLoaded) {
@@ -129,6 +139,8 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
mLoadAll = false;
mLoadPart = false;
mPath = path;
+ mChannel = 0;
+ mMode = -1;
}
LoadLinearFixedContext(int efid, String path, Message onLoaded) {
@@ -138,6 +150,8 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
mLoadPart = false;
mOnLoaded = onLoaded;
mPath = path;
+ mChannel = 0;
+ mMode = -1;
}
LoadLinearFixedContext(int efid, Message onLoaded) {
@@ -147,6 +161,8 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
mLoadPart = false;
mOnLoaded = onLoaded;
mPath = null;
+ mChannel = 0;
+ mMode = -1;
}
LoadLinearFixedContext(int efid, ArrayList<Integer> recordNums, String path,
@@ -161,6 +177,31 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
mCountLoadrecords = recordNums.size();
mOnLoaded = onLoaded;
mPath = path;
+ mChannel = 0;
+ mMode = -1;
+ }
+
+ // MTK
+ LoadLinearFixedContext(int efid, int recordNum, Message onLoaded, int channel) {
+ mEfid = efid;
+ mRecordNum = recordNum;
+ mOnLoaded = onLoaded;
+ mLoadAll = false;
+ mLoadPart = false;
+ mPath = null;
+ mChannel = channel;
+ mMode = -1;
+ }
+
+ LoadLinearFixedContext(int efid, Message onLoaded, int channel) {
+ mEfid = efid;
+ mRecordNum = 1;
+ mOnLoaded = onLoaded;
+ mLoadAll = true;
+ mLoadPart = false;
+ mPath = null;
+ mChannel = channel;
+ mMode = -1;
}
private void initLCResults(int size) {
@@ -496,6 +537,7 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
int fileid;
int recordSize[];
String path = null;
+ int channel = 0;
try {
switch (msg.what) {
@@ -591,12 +633,22 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
if (path == null) {
path = getEFPath(lc.mEfid);
}
- mCi.iccIOForApp(COMMAND_READ_RECORD, lc.mEfid, path,
- lc.mRecordNum,
- READ_RECORD_MODE_ABSOLUTE,
- lc.mRecordSize, null, null, mAid,
- obtainMessage(EVENT_READ_RECORD_DONE, lc));
- break;
+
+
+ if (lc.mMode != -1) {
+ mCi.iccIOForAppEx(COMMAND_READ_RECORD, lc.mEfid, getSmsEFPath(lc.mMode),
+ lc.mRecordNum,
+ READ_RECORD_MODE_ABSOLUTE,
+ lc.mRecordSize, null, null, mAid, lc.mChannel,
+ obtainMessage(EVENT_READ_RECORD_DONE, lc));
+ } else {
+ mCi.iccIOForAppEx(COMMAND_READ_RECORD, lc.mEfid, path,
+ lc.mRecordNum,
+ READ_RECORD_MODE_ABSOLUTE,
+ lc.mRecordSize, null, null, mAid, lc.mChannel,
+ obtainMessage(EVENT_READ_RECORD_DONE, lc));
+ }
+ break;
case EVENT_GET_BINARY_SIZE_DONE:
ar = (AsyncResult)msg.obj;
response = (Message) ar.userObj;
@@ -609,6 +661,7 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
data = result.payload;
fileid = msg.arg1;
+ channel = msg.arg2;
if (UiccTlvData.isUiccTlvData(data)) {
@@ -634,8 +687,8 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
throw new IccFileTypeMismatch();
}
- mCi.iccIOForApp(COMMAND_READ_BINARY, fileid, getEFPath(fileid),
- 0, 0, size, null, null, mAid,
+ mCi.iccIOForAppEx(COMMAND_READ_BINARY, fileid, getEFPath(fileid),
+ 0, 0, size, null, null, mAid, channel,
obtainMessage(EVENT_READ_BINARY_DONE,
fileid, 0, response));
break;
@@ -665,11 +718,20 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
path = getEFPath(lc.mEfid);
}
- mCi.iccIOForApp(COMMAND_READ_RECORD, lc.mEfid, path,
- lc.mRecordNum,
- READ_RECORD_MODE_ABSOLUTE,
- lc.mRecordSize, null, null, mAid,
- obtainMessage(EVENT_READ_RECORD_DONE, lc));
+ if (lc.mMode != -1) {
+ mCi.iccIOForAppEx(COMMAND_READ_RECORD, lc.mEfid,
+ getSmsEFPath(lc.mMode),
+ lc.mRecordNum,
+ READ_RECORD_MODE_ABSOLUTE,
+ lc.mRecordSize, null, null, mAid, lc.mChannel,
+ obtainMessage(EVENT_READ_RECORD_DONE, lc));
+ } else {
+ mCi.iccIOForAppEx(COMMAND_READ_RECORD, lc.mEfid, path,
+ lc.mRecordNum,
+ READ_RECORD_MODE_ABSOLUTE,
+ lc.mRecordSize, null, null, mAid, lc.mChannel,
+ obtainMessage(EVENT_READ_RECORD_DONE, lc));
+ }
}
} else if (lc.mLoadPart) {
lc.results.set(lc.mRecordNum - 1, result.payload);
@@ -680,9 +742,20 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
if (path == null) {
path = getEFPath(lc.mEfid);
}
- mCi.iccIOForApp(COMMAND_READ_RECORD, lc.mEfid, path, lc.mRecordNum,
- READ_RECORD_MODE_ABSOLUTE, lc.mRecordSize, null, null, mAid,
- obtainMessage(EVENT_READ_RECORD_DONE, lc));
+ if (lc.mMode != -1) {
+ mCi.iccIOForAppEx(COMMAND_READ_RECORD, lc.mEfid,
+ getSmsEFPath(lc.mMode),
+ lc.mRecordNum,
+ READ_RECORD_MODE_ABSOLUTE,
+ lc.mRecordSize, null, null, mAid, lc.mChannel,
+ obtainMessage(EVENT_READ_RECORD_DONE, lc));
+ } else {
+ mCi.iccIOForAppEx(COMMAND_READ_RECORD, lc.mEfid, path,
+ lc.mRecordNum,
+ READ_RECORD_MODE_ABSOLUTE,
+ lc.mRecordSize, null, null, mAid, lc.mChannel,
+ obtainMessage(EVENT_READ_RECORD_DONE, lc));
+ }
} else {
sendResult(response, lc.results, null);
}
@@ -752,9 +825,123 @@ public abstract class IccFileHandler extends Handler implements IccConstants {
return null;
}
+ public boolean needsFakeIccid() {
+ return mCi.needsOldRilFeature("fakeiccid");
+ }
+
protected abstract String getEFPath(int efid);
protected abstract void logd(String s);
protected abstract void loge(String s);
+ // MTK
+ public void loadEFLinearFixedAll(int fileid, Message onLoaded, boolean is7FFF) {
+ Message response = obtainMessage(EVENT_GET_RECORD_SIZE_DONE,
+ new LoadLinearFixedContext(fileid, onLoaded));
+
+ mCi.iccIOForApp(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid, is7FFF),
+ 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, response);
+ }
+
+ public void loadEFLinearFixedAll(int fileid, int mode , Message onLoaded) {
+ LoadLinearFixedContext lc = new LoadLinearFixedContext(fileid, onLoaded);
+ lc.mMode = mode;
+ Message response = obtainMessage(EVENT_GET_RECORD_SIZE_DONE, lc);
+
+ mCi.iccIOForApp(COMMAND_GET_RESPONSE, fileid, getSmsEFPath(mode),
+ 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, response);
+ }
+
+ protected String getSmsEFPath(int mode)
+ {
+ String efpath = "";
+
+ if (mode == PhoneConstants.PHONE_TYPE_GSM)
+ efpath = IccConstants.MF_SIM + IccConstants.DF_TELECOM;
+ else if (mode == PhoneConstants.PHONE_TYPE_CDMA)
+ efpath = IccConstants.MF_SIM + IccConstants.DF_CDMA;
+
+ return efpath;
+ }
+
+
+ /**
+ * Load a SIM Transparent EF with path specified
+ *
+ * @param fileid EF id
+ * @param efPath EF path
+ * @param onLoaded
+ *
+ * ((AsyncResult)(onLoaded.obj)).result is the byte[]
+ *
+ */
+
+ public void loadEFTransparent(int fileid, String efPath, Message onLoaded) {
+ Message response = obtainMessage(EVENT_GET_BINARY_SIZE_DONE,
+ fileid, 0, onLoaded);
+
+ mCi.iccIOForApp(COMMAND_GET_RESPONSE, fileid, efPath,
+ 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, response);
+ }
+
+
+ /**
+ * select an EF file and get response
+ *
+ * @param fileid EF id
+ * @param onLoaded (EFResponseData)efData
+ *
+ */
+ public void selectEFFile(int fileid, Message onLoaded) {
+ Message response
+ = obtainMessage(EVENT_SELECT_EF_FILE, fileid, 0, onLoaded);
+
+ mCi.iccIOForApp(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
+ 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, response);
+ }
+ //MTK-START Support Multi-Application
+ /**
+ * Load a SIM Transparent EF
+ *
+ * @param fileid EF id
+ * @param channel application channel
+ * @param onLoaded
+ *
+ * ((AsyncResult)(onLoaded.obj)).result is the byte[]
+ *
+ */
+
+ public void loadEFTransparentEx(int fileid, int channel , Message onLoaded) {
+ Message response = obtainMessage(EVENT_GET_BINARY_SIZE_DONE,
+ fileid, channel, onLoaded);
+
+ mCi.iccIOForAppEx(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
+ 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, channel, response);
+ }
+
+ public void loadEFLinearFixedEx(int fileid, int recordNum, int channel, Message onLoaded) {
+ Message response
+ = obtainMessage(EVENT_GET_RECORD_SIZE_DONE,
+ new LoadLinearFixedContext(fileid, recordNum, onLoaded, channel));
+
+ mCi.iccIOForAppEx(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),
+ 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, channel, response);
+ }
+ public void loadEFLinearFixedAllEx(int fileid, int channel, Message onLoaded) {
+ Message response = obtainMessage(EVENT_GET_RECORD_SIZE_DONE,
+ new LoadLinearFixedContext(fileid, onLoaded, channel));
+
+ mCi.iccIOForAppEx(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid, false),
+ 0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, mAid, channel, response);
+ }
+
+ public void updateEFTransparentEx(int fileid, int channel, byte[ ] data, Message onComplete) {
+ mCi.iccIOForAppEx(COMMAND_UPDATE_BINARY, fileid, getEFPath(fileid),
+ 0, 0, data.length,
+ IccUtils.bytesToHexString(data), null, mAid, channel, onComplete);
+ }
+
+ //MTK-END Support Multi-Application
+
+ protected String getEFPath(int efid, boolean is7FFF) { return null; };
}
diff --git a/src/java/com/android/internal/telephony/uicc/RuimRecords.java b/src/java/com/android/internal/telephony/uicc/RuimRecords.java
index 4d16293..883642b 100644
--- a/src/java/com/android/internal/telephony/uicc/RuimRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/RuimRecords.java
@@ -723,11 +723,15 @@ public final class RuimRecords extends IccRecords {
data = (byte[])ar.result;
if (ar.exception != null) {
- break;
+ if(mFh.needsFakeIccid()) {
+ mIccId = FAKE_ICCID;
+ } else {
+ break;
+ }
+ } else {
+ mIccId = IccUtils.bcdToString(data, 0, data.length);
}
- mIccId = IccUtils.bcdToString(data, 0, data.length);
-
log("iccid: " + mIccId);
break;
diff --git a/src/java/com/android/internal/telephony/uicc/SIMRecords.java b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
index cd65830..df24072 100644
--- a/src/java/com/android/internal/telephony/uicc/SIMRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
@@ -876,11 +876,15 @@ public class SIMRecords extends IccRecords {
data = (byte[])ar.result;
if (ar.exception != null) {
- break;
+ if(mFh.needsFakeIccid()) {
+ mIccId = FAKE_ICCID;
+ } else {
+ break;
+ }
+ } else {
+ mIccId = IccUtils.bcdToString(data, 0, data.length);
}
- mIccId = IccUtils.bcdToString(data, 0, data.length);
-
log("iccid: " + mIccId);
break;
diff --git a/src/java/com/android/internal/telephony/uicc/UiccCard.java b/src/java/com/android/internal/telephony/uicc/UiccCard.java
index 1c27e44..2c6a474 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccCard.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccCard.java
@@ -98,8 +98,20 @@ public class UiccCard {
private static final int EVENT_CARRIER_PRIVILIGES_LOADED = 20;
private static final int EVENT_SIM_GET_ATR_DONE = 21;
+ // MTK
+ private static final int EVENT_GET_ATR_DONE = 100;
+ private static final int EVENT_OPEN_CHANNEL_WITH_SW_DONE = 101;
+
private int mPhoneId;
+ // MTK
+ static final String[] UICCCARD_PROPERTY_RIL_UICC_TYPE = {
+ "gsm.ril.uicctype",
+ "gsm.ril.uicctype.2",
+ "gsm.ril.uicctype.3",
+ "gsm.ril.uicctype.4",
+ };
+
public UiccCard(Context c, CommandsInterface ci, IccCardStatus ics, int phoneId) {
mCardState = ics.mCardState;
mPhoneId = phoneId;
@@ -371,6 +383,9 @@ public class UiccCard {
case EVENT_TRANSMIT_APDU_BASIC_CHANNEL_DONE:
case EVENT_SIM_IO_DONE:
case EVENT_SIM_GET_ATR_DONE:
+ // MTK
+ case EVENT_GET_ATR_DONE:
+ case EVENT_OPEN_CHANNEL_WITH_SW_DONE:
AsyncResult ar = (AsyncResult)msg.obj;
if (ar.exception != null) {
if (DBG)
@@ -706,4 +721,96 @@ public class UiccCard {
}
pw.flush();
}
+
+ // MTK additions
+
+ public int getSlotId() {
+ return mPhoneId;
+ }
+
+ public UiccCard(Context c, CommandsInterface ci, IccCardStatus ics, int slotId, boolean isUpdateSiminfo) {
+ if (DBG) log("Creating simId " + slotId + ",isUpdateSiminfo" + isUpdateSiminfo);
+ mCardState = ics.mCardState;
+ mPhoneId = slotId;
+ update(c, ci, ics, isUpdateSiminfo);
+ }
+
+ public void exchangeSimIo(int fileID, int command,
+ int p1, int p2, int p3, String pathID, String data, String pin2, Message onComplete) {
+ mCi.iccIO(command, fileID, pathID, p1, p2, p3, data, pin2,
+ mHandler.obtainMessage(EVENT_SIM_IO_DONE, onComplete));
+ }
+
+ public void iccGetAtr(Message onComplete) {
+ mCi.iccGetATR(mHandler.obtainMessage(EVENT_GET_ATR_DONE, onComplete));
+ }
+
+ public String getIccCardType() {
+ final String mIccType = SystemProperties.get(UICCCARD_PROPERTY_RIL_UICC_TYPE[mPhoneId]);
+ if (DBG) log("getIccCardType(): iccType = " + mIccType);
+ return mIccType;
+ }
+
+ public void iccOpenChannelWithSw(String AID, Message onComplete) {
+ mCi.iccOpenChannelWithSw(AID,
+ mHandler.obtainMessage(EVENT_OPEN_CHANNEL_WITH_SW_DONE, onComplete));
+ }
+
+ public void update(Context c, CommandsInterface ci, IccCardStatus ics, boolean isUpdateSimInfo) {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ loge("Updated after destroyed! Fix me!");
+ return;
+ }
+ CardState oldState = mCardState;
+ mCardState = ics.mCardState;
+ mUniversalPinState = ics.mUniversalPinState;
+ mGsmUmtsSubscriptionAppIndex = ics.mGsmUmtsSubscriptionAppIndex;
+ mCdmaSubscriptionAppIndex = ics.mCdmaSubscriptionAppIndex;
+ mImsSubscriptionAppIndex = ics.mImsSubscriptionAppIndex;
+ mContext = c;
+ mCi = ci;
+ //update applications
+ if (DBG) log(ics.mApplications.length + " applications");
+ for (int i = 0; i < mUiccApplications.length; i++) {
+ if (mUiccApplications[i] == null) {
+ //Create newly added Applications
+ if (i < ics.mApplications.length) {
+ mUiccApplications[i] = new UiccCardApplication(this,
+ ics.mApplications[i], mContext, mCi);
+ }
+ } else if (i >= ics.mApplications.length) {
+ //Delete removed applications
+ mUiccApplications[i].dispose();
+ mUiccApplications[i] = null;
+ } else {
+ //Update the rest
+ mUiccApplications[i].update(ics.mApplications[i], mContext, mCi);
+ }
+ }
+
+ createAndUpdateCatService();
+ sanitizeApplicationIndexes();
+
+ RadioState radioState = mCi.getRadioState();
+ if (DBG) log("update: radioState=" + radioState + " mLastRadioState="
+ + mLastRadioState + "isUpdateSimInfo= " + isUpdateSimInfo);
+ // No notifications while radio is off or we just powering up
+ if (isUpdateSimInfo) {
+ if (radioState == RadioState.RADIO_ON && mLastRadioState == RadioState.RADIO_ON) {
+ if (oldState != CardState.CARDSTATE_ABSENT &&
+ mCardState == CardState.CARDSTATE_ABSENT) {
+ if (DBG) log("update: notify card removed");
+ mAbsentRegistrants.notifyRegistrants();
+ mHandler.sendMessage(mHandler.obtainMessage(EVENT_CARD_REMOVED, null));
+ } else if (oldState == CardState.CARDSTATE_ABSENT &&
+ mCardState != CardState.CARDSTATE_ABSENT) {
+ if (DBG) log("update: notify card added");
+ mHandler.sendMessage(mHandler.obtainMessage(EVENT_CARD_ADDED, null));
+ }
+ }
+ }
+ mLastRadioState = radioState;
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java b/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java
index cce75f1..c455256 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java
@@ -22,6 +22,7 @@ import android.os.Handler;
import android.os.Message;
import android.os.Registrant;
import android.os.RegistrantList;
+import android.os.SystemProperties;
import android.telephony.Rlog;
import com.android.internal.telephony.CommandsInterface;
@@ -88,6 +89,37 @@ public class UiccCardApplication {
private RegistrantList mPinLockedRegistrants = new RegistrantList();
private RegistrantList mPersoLockedRegistrants = new RegistrantList();
+ // MTK
+ private int mSlotId;
+
+ private static final int EVENT_QUERY_NETWORK_LOCK_DONE = 101;
+ private static final int EVENT_CHANGE_NETWORK_LOCK_DONE = 102;
+ private static final int EVENT_RADIO_NOTAVAILABLE = 103;
+
+ // [02772] start
+ static final String[] UICCCARDAPPLICATION_PROPERTY_RIL_UICC_TYPE = {
+ "gsm.ril.uicctype",
+ "gsm.ril.uicctype.2",
+ "gsm.ril.uicctype.3",
+ "gsm.ril.uicctype.4",
+ };
+ protected String mIccType = null; /* Add for USIM detect */
+ // [02772] end
+
+ private static final String PROPERTY_PIN1_RETRY[] = {
+ "gsm.sim.retry.pin1",
+ "gsm.sim.retry.pin1.2",
+ "gsm.sim.retry.pin1.3",
+ "gsm.sim.retry.pin1.4",
+ };
+
+ private static final String PROPERTY_PIN2_RETRY[] = {
+ "gsm.sim.retry.pin2",
+ "gsm.sim.retry.pin2.2",
+ "gsm.sim.retry.pin2.3",
+ "gsm.sim.retry.pin2.4",
+ };
+
UiccCardApplication(UiccCard uiccCard,
IccCardApplicationStatus as,
Context c,
@@ -107,6 +139,8 @@ public class UiccCardApplication {
mContext = c;
mCi = ci;
+ mSlotId = mUiccCard.getSlotId();
+
mIccFh = createIccFileHandler(as.app_type);
mIccRecords = createIccRecords(as.app_type, mContext, mCi);
if (mAppState == AppState.APPSTATE_READY) {
@@ -146,6 +180,8 @@ public class UiccCardApplication {
mIccRecords = createIccRecords(as.app_type, c, ci);
}
+ // MTK log
+ if (DBG) log("mPersoSubState: " + mPersoSubState + " oldPersoSubState: " + oldPersoSubState);
if (mPersoSubState != oldPersoSubState &&
isPersoLocked()) {
notifyPersoLockedRegistrantsIfNeeded(null);
@@ -409,6 +445,28 @@ public class UiccCardApplication {
ar = (AsyncResult)msg.obj;
onChangeFacilityLock(ar);
break;
+ case EVENT_QUERY_NETWORK_LOCK_DONE:
+ if (DBG) log("handleMessage (EVENT_QUERY_NETWORK_LOCK)");
+ ar = (AsyncResult) msg.obj;
+
+ if (ar.exception != null) {
+ Rlog.e(LOG_TAG, "Error query network lock with exception "
+ + ar.exception);
+ }
+ AsyncResult.forMessage((Message) ar.userObj, ar.result, ar.exception);
+ ((Message) ar.userObj).sendToTarget();
+ break;
+ case EVENT_CHANGE_NETWORK_LOCK_DONE:
+ if (DBG) log("handleMessage (EVENT_CHANGE_NETWORK_LOCK)");
+ ar = (AsyncResult) msg.obj;
+ if (ar.exception != null) {
+ Rlog.e(LOG_TAG, "Error change network lock with exception "
+ + ar.exception);
+ }
+ AsyncResult.forMessage(((Message) ar.userObj)).exception
+ = ar.exception;
+ ((Message) ar.userObj).sendToTarget();
+ break;
case EVENT_RADIO_UNAVAILABLE:
if (DBG) log("handleMessage (EVENT_RADIO_UNAVAILABLE)");
mAppState = AppState.APPSTATE_UNKNOWN;
@@ -779,12 +837,34 @@ public class UiccCardApplication {
}
}
+ // MTK implementation of getIccFdnAvailable
+ public boolean getIccFdnAvailableMTK() {
+ if (mIccRecords == null) {
+ if (DBG) log("isFdnExist mIccRecords == null");
+ return false;
+ }
+
+ UsimServiceTable ust = mIccRecords.getUsimServiceTable();
+ if (ust != null && ust.isAvailable(UsimServiceTable.UsimService.FDN)) {
+ if (DBG) log("isFdnExist return true");
+ return true;
+ } else {
+ if (DBG) log("isFdnExist return false");
+ return false;
+ }
+ }
+
/**
* Check whether fdn (fixed dialing number) service is available.
* @return true if ICC fdn service available
* false if ICC fdn service not available
*/
public boolean getIccFdnAvailable() {
+ final boolean mtkResult = getIccFdnAvailableMTK();
+ if (mtkResult != mIccFdnAvailable) {
+ if (DBG) log("getIccFdnAvailable: WARNING: mIccFdnAvailable="
+ + mIccFdnAvailable + " disagrees with mtkResult!");
+ }
return mIccFdnAvailable;
}
@@ -958,4 +1038,87 @@ public class UiccCardApplication {
}
pw.flush();
}
+
+ // MTK
+ private RegistrantList mFdnChangedRegistrants = new RegistrantList();
+
+ public void registerForFdnChanged(Handler h, int what, Object obj) {
+ synchronized (mLock) {
+ Registrant r = new Registrant(h, what, obj);
+ mFdnChangedRegistrants.add(r);
+ }
+ }
+
+ public void unregisterForFdnChanged(Handler h) {
+ synchronized (mLock) {
+ mFdnChangedRegistrants.remove(h);
+ }
+ }
+
+ public int getSlotId() {
+ return mSlotId;
+ }
+
+ private void notifyFdnChangedRegistrants() {
+ if (mDestroyed) {
+ return;
+ }
+
+ mFdnChangedRegistrants.notifyRegistrants();
+ }
+
+ public String getIccCardType() {
+ if (mIccType == null || mIccType.equals("")) {
+ mIccType = SystemProperties.get(UICCCARDAPPLICATION_PROPERTY_RIL_UICC_TYPE[mSlotId]);
+ }
+
+ log("getIccCardType(): mIccType = " + mIccType);
+ return mIccType;
+ }
+
+ //MTK-START [mtk80601][111215][ALPS00093395]
+ /**
+ * Check whether ICC network lock is enabled
+ * This is an async call which returns lock state to applications directly
+ */
+ public void queryIccNetworkLock(int category, Message onComplete) {
+ if (DBG) log("queryIccNetworkLock(): category = " + category);
+
+ switch(category) {
+ case CommandsInterface.CAT_NETWOEK:
+ case CommandsInterface.CAT_NETOWRK_SUBSET:
+ case CommandsInterface.CAT_CORPORATE:
+ case CommandsInterface.CAT_SERVICE_PROVIDER:
+ case CommandsInterface.CAT_SIM:
+ mCi.queryNetworkLock(category, mHandler.obtainMessage(EVENT_QUERY_NETWORK_LOCK_DONE, onComplete));
+ break;
+ default:
+ Rlog.e(LOG_TAG, "queryIccNetworkLock unknown category = " + category);
+ break;
+ }
+ }
+
+ /**
+ * Set the ICC network lock enabled or disabled
+ * When the operation is complete, onComplete will be sent to its handler
+ */
+ public void setIccNetworkLockEnabled(int category,
+ int lockop, String password, String data_imsi, String gid1, String gid2, Message onComplete) {
+ if (DBG) log("SetIccNetworkEnabled(): category = " + category
+ + " lockop = " + lockop + " password = " + password
+ + " data_imsi = " + data_imsi + " gid1 = " + gid1 + " gid2 = " + gid2);
+
+ switch(lockop) {
+ case CommandsInterface.OP_REMOVE:
+ case CommandsInterface.OP_ADD:
+ case CommandsInterface.OP_LOCK:
+ case CommandsInterface.OP_PERMANENT_UNLOCK:
+ case CommandsInterface.OP_UNLOCK:
+ mCi.setNetworkLock(category, lockop, password, data_imsi, gid1, gid2, mHandler.obtainMessage(EVENT_CHANGE_NETWORK_LOCK_DONE, onComplete));
+ break;
+ default:
+ Rlog.e(LOG_TAG, "SetIccNetworkEnabled unknown operation" + lockop);
+ break;
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/uicc/UiccController.java b/src/java/com/android/internal/telephony/uicc/UiccController.java
index 3e5d679..e3cc67c 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccController.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccController.java
@@ -18,14 +18,19 @@ package com.android.internal.telephony.uicc;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.BroadcastReceiver;
+import android.content.IntentFilter;
import android.os.AsyncResult;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Registrant;
import android.os.RegistrantList;
import android.os.SystemProperties;
import android.telephony.TelephonyManager;
+import android.telephony.SubscriptionManager;
import android.telephony.Rlog;
import android.text.format.Time;
@@ -34,7 +39,10 @@ import android.telephony.ServiceState;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.SubscriptionController;
+import com.android.internal.telephony.IccCardConstants;
+import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
+import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -97,6 +105,36 @@ public class UiccController extends Handler {
private static final int EVENT_REFRESH = 4;
private static final int EVENT_REFRESH_OEM = 5;
+ // MTK
+ protected static final int EVENT_RADIO_AVAILABLE = 100;
+ protected static final int EVENT_VIRTUAL_SIM_ON = 101;
+ protected static final int EVENT_VIRTUAL_SIM_OFF = 102;
+ protected static final int EVENT_SIM_MISSING = 103;
+ protected static final int EVENT_QUERY_SIM_MISSING_STATUS = 104;
+ protected static final int EVENT_SIM_RECOVERY = 105;
+ protected static final int EVENT_GET_ICC_STATUS_DONE_FOR_SIM_MISSING = 106;
+ protected static final int EVENT_GET_ICC_STATUS_DONE_FOR_SIM_RECOVERY = 107;
+ protected static final int EVENT_QUERY_ICCID_DONE_FOR_HOT_SWAP = 108;
+ protected static final int EVENT_SIM_PLUG_OUT = 109;
+ protected static final int EVENT_SIM_PLUG_IN = 110;
+ protected static final int EVENT_HOTSWAP_GET_ICC_STATUS_DONE = 111;
+ protected static final int EVENT_QUERY_SIM_STATUS_FOR_PLUG_IN = 112;
+ protected static final int EVENT_QUERY_SIM_MISSING = 113;
+ protected static final int EVENT_INVALID_SIM_DETECTED = 114;
+ protected static final int EVENT_REPOLL_SML_STATE = 115;
+ protected static final int EVENT_COMMON_SLOT_NO_CHANGED = 116;
+
+ //Multi-application
+ protected static final int EVENT_TURN_ON_ISIM_APPLICATION_DONE = 200;
+ protected static final int EVENT_GET_ICC_APPLICATION_STATUS = 201;
+ protected static final int EVENT_APPLICATION_SESSION_CHANGED = 202;
+
+ private static final int SML_FEATURE_NO_NEED_BROADCAST_INTENT = 0;
+ private static final int SML_FEATURE_NEED_BROADCAST_INTENT = 1;
+ private static final String ACTION_RESET_MODEM = "android.intent.action.sim.ACTION_RESET_MODEM";
+ private static final String PROPERTY_3G_SWITCH = "gsm.3gswitch";
+ private static final String COMMON_SLOT_PROPERTY = "ro.mtk_sim_hot_swap_common_slot";
+
private CommandsInterface[] mCis;
private UiccCard[] mUiccCards = new UiccCard[TelephonyManager.getDefault().getPhoneCount()];
@@ -109,6 +147,15 @@ public class UiccController extends Handler {
private boolean mOEMHookSimRefresh = false;
+ // MTK
+ private boolean mIsHotSwap = false;
+ private boolean mClearMsisdn = false;
+
+ private RegistrantList mRecoveryRegistrants = new RegistrantList();
+ //Multi-application
+ private int[] mImsSessionId = new int[TelephonyManager.getDefault().getPhoneCount()];
+ private RegistrantList mApplicationChangedRegistrants = new RegistrantList();
+
// Logging for dumpsys. Useful in cases when the cards run into errors.
private static final int MAX_PROACTIVE_COMMANDS_TO_LOG = 20;
private LinkedList<String> mCardLogs = new LinkedList<String>();
@@ -131,9 +178,11 @@ public class UiccController extends Handler {
com.android.internal.R.bool.config_sim_refresh_for_dual_mode_card);
for (int i = 0; i < mCis.length; i++) {
Integer index = new Integer(i);
- if (SystemProperties.getBoolean("persist.radio.apm_sim_not_pwdn", false)) {
+ if (SystemProperties.getBoolean("persist.radio.apm_sim_not_pwdn", false) ||
+ SystemProperties.get("gsm.version.ril-impl").startsWith("mtk")) {
// Reading ICC status in airplane mode is only supported in QCOM
// RILs when this property is set to true
+ // and MTK RILs
mCis[i].registerForAvailable(this, EVENT_ICC_STATUS_CHANGED, index);
} else {
mCis[i].registerForOn(this, EVENT_ICC_STATUS_CHANGED, index);
@@ -142,12 +191,30 @@ public class UiccController extends Handler {
mCis[i].registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, index);
// TODO remove this once modem correctly notifies the unsols
mCis[i].registerForNotAvailable(this, EVENT_RADIO_UNAVAILABLE, index);
+
+ mCis[i].registerForVirtualSimOn(this, EVENT_VIRTUAL_SIM_ON, index);
+ mCis[i].registerForVirtualSimOff(this, EVENT_VIRTUAL_SIM_OFF, index);
+ mCis[i].registerForSimMissing(this, EVENT_SIM_MISSING, index);
+ mCis[i].registerForSimRecovery(this, EVENT_SIM_RECOVERY, index);
+ mCis[i].registerForSimPlugOut(this, EVENT_SIM_PLUG_OUT, index);
+ mCis[i].registerForSimPlugIn(this, EVENT_SIM_PLUG_IN, index);
+ mCis[i].registerForCommonSlotNoChanged(this, EVENT_COMMON_SLOT_NO_CHANGED, index);
+ mCis[i].registerForSessionChanged(this, EVENT_APPLICATION_SESSION_CHANGED, index);
+
if (mOEMHookSimRefresh) {
mCis[i].registerForSimRefreshEvent(this, EVENT_REFRESH_OEM, index);
} else {
mCis[i].registerForIccRefresh(this, EVENT_REFRESH, index);
}
}
+
+ IntentFilter filter = new IntentFilter();
+ /* TODO: Wait for SIM Info migration done
+ filter.addAction(TelephonyIntents.ACTION_SIM_INFO_UPDATE);
+ */
+ filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
+ filter.addAction(ACTION_RESET_MODEM);
+ mContext.registerReceiver(mIntentReceiver, filter);
}
public static UiccController getInstance() {
@@ -239,6 +306,23 @@ public class UiccController extends Handler {
}
}
+ //Notifies when card status changes
+ public void registerForIccRecovery(Handler h, int what, Object obj) {
+ synchronized (mLock) {
+ Registrant r = new Registrant(h, what, obj);
+ mRecoveryRegistrants.add(r);
+ //Notify registrant right after registering, so that it will get the latest ICC status,
+ //otherwise which may not happen until there is an actual change in ICC status.
+ r.notifyRegistrant();
+ }
+ }
+
+ public void unregisterForIccRecovery(Handler h) {
+ synchronized (mLock) {
+ mRecoveryRegistrants.remove(h);
+ }
+ }
+
@Override
public void handleMessage (Message msg) {
synchronized (mLock) {
@@ -259,6 +343,38 @@ public class UiccController extends Handler {
AsyncResult ar = (AsyncResult)msg.obj;
onGetIccCardStatusDone(ar, index);
break;
+ case EVENT_REPOLL_SML_STATE:
+ if (DBG) log("Received EVENT_REPOLL_SML_STATE");
+ ar = (AsyncResult) msg.obj;
+ boolean needIntent = msg.arg1 == SML_FEATURE_NEED_BROADCAST_INTENT ? true : false;
+
+ //Update Uicc Card status.
+ onGetIccCardStatusDone(ar, index, false);
+
+ // If we still in Network lock, broadcast intent if caller need this intent.
+ if (mUiccCards[index] != null && needIntent == true) {
+ UiccCardApplication app = mUiccCards[index].getApplication(APP_FAM_3GPP);
+ if (app == null) {
+ if (DBG) log("UiccCardApplication = null");
+ break;
+ }
+ if (app.getState() == AppState.APPSTATE_SUBSCRIPTION_PERSO) {
+ Intent lockIntent = new Intent();
+ if (null == lockIntent) {
+ if (DBG) log("New intent failed");
+ return;
+ }
+ if (DBG) log("Broadcast ACTION_UNLOCK_SIM_LOCK");
+ lockIntent.setAction(TelephonyIntents.ACTION_UNLOCK_SIM_LOCK);
+ lockIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE,
+ IccCardConstants.INTENT_VALUE_ICC_LOCKED);
+ lockIntent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON,
+ parsePersoType(app.getPersoSubState()));
+ SubscriptionManager.putPhoneIdAndSubIdExtra(lockIntent, index);
+ mContext.sendBroadcast(lockIntent);
+ }
+ }
+ break;
case EVENT_RADIO_UNAVAILABLE:
if (DBG) log("EVENT_RADIO_UNAVAILABLE, dispose card");
if (mUiccCards[index] != null) {
@@ -267,6 +383,90 @@ public class UiccController extends Handler {
mUiccCards[index] = null;
mIccChangedRegistrants.notifyRegistrants(new AsyncResult(null, index, null));
break;
+ case EVENT_TURN_ON_ISIM_APPLICATION_DONE:
+ if (DBG) log("Received EVENT_TURN_ON_ISIM_APPLICATION_DONE");
+ ar = (AsyncResult) msg.obj;
+ if (ar.exception != null) {
+ Rlog.e(LOG_TAG, "[SIM " + index + "] Error turn on ISIM. ", ar.exception);
+ return;
+ }
+
+ //Response format: <Application ID>, <Session ID>
+ int[] ints = (int[]) ar.result;
+ if (DBG) log("Application ID = " + ints[0] + "Session ID = " + ints[1]);
+
+ mImsSessionId[index] = ints[1];
+ mCis[index].getIccApplicationStatus(mImsSessionId[index],
+ obtainMessage(EVENT_GET_ICC_APPLICATION_STATUS, index));
+ break;
+
+ case EVENT_GET_ICC_APPLICATION_STATUS:
+ if (DBG) log("Received EVENT_GET_ICC_APPLICATION_STATUS");
+ ar = (AsyncResult) msg.obj;
+ onGetIccApplicationStatusDone(ar, index);
+ break;
+
+ case EVENT_APPLICATION_SESSION_CHANGED:
+ if (DBG) log("Received EVENT_APPLICATION_SESSION_CHANGED");
+ ar = (AsyncResult) msg.obj;
+
+ //Response format: <Application ID>, <Session ID>
+ int[] result = (int[]) ar.result;
+ // FIXME: application id and array index? only support one application now.
+ if (DBG) log("Application = " + result[0] + ", Session = " + result[1]);
+ mImsSessionId[index] = result[1];
+ break;
+ case EVENT_VIRTUAL_SIM_ON:
+ mCis[index].getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE, index));
+ // setNotificationVirtual(index, EVENT_VIRTUAL_SIM_ON);
+ SharedPreferences shOn = mContext.getSharedPreferences("AutoAnswer", 1);
+ SharedPreferences.Editor editorOn = shOn.edit();
+ editorOn.putBoolean("flag", true);
+ editorOn.commit();
+ break;
+ case EVENT_VIRTUAL_SIM_OFF:
+ if (DBG) log("handleMessage (EVENT_VIRTUAL_SIM_OFF)");
+ mCis[index].getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE, index));
+ // removeNotificationVirtual(index, EVENT_VIRTUAL_SIM_ON);
+ //setNotification(index, EVENT_SIM_MISSING);
+ SharedPreferences shOff = mContext.getSharedPreferences("AutoAnswer", 1);
+ SharedPreferences.Editor editorOff = shOff.edit();
+ editorOff.putBoolean("flag", false);
+ editorOff.commit();
+ break;
+ case EVENT_SIM_RECOVERY:
+ if (DBG) log("handleMessage (EVENT_SIM_RECOVERY)");
+ mCis[index].getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE_FOR_SIM_RECOVERY, index));
+ mRecoveryRegistrants.notifyRegistrants(new AsyncResult(null, index, null));
+ //disableSimMissingNotification(index);
+
+ //ALPS01209124
+ Intent intent = new Intent();
+ intent.setAction(TelephonyIntents.ACTION_SIM_RECOVERY_DONE);
+ mContext.sendBroadcast(intent);
+ break;
+ case EVENT_SIM_MISSING:
+ if (DBG) log("handleMessage (EVENT_SIM_MISSING)");
+ //setNotification(index, EVENT_SIM_MISSING);
+ mCis[index].getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE_FOR_SIM_MISSING, index));
+ break;
+ case EVENT_GET_ICC_STATUS_DONE_FOR_SIM_MISSING:
+ if (DBG) log("Received EVENT_GET_ICC_STATUS_DONE_FOR_SIM_MISSING");
+ ar = (AsyncResult) msg.obj;
+ onGetIccCardStatusDone(ar, index, false);
+ case EVENT_GET_ICC_STATUS_DONE_FOR_SIM_RECOVERY:
+ if (DBG) log("Received EVENT_GET_ICC_STATUS_DONE_FOR_SIM_RECOVERY");
+ ar = (AsyncResult) msg.obj;
+ onGetIccCardStatusDone(ar, index, false);
+ break;
+ case EVENT_COMMON_SLOT_NO_CHANGED:
+ if (DBG) log("handleMessage (EVENT_COMMON_SLOT_NO_CHANGED)");
+ Intent intentNoChanged = new Intent(TelephonyIntents.ACTION_COMMON_SLOT_NO_CHANGED);
+ int slotId = index.intValue();
+ SubscriptionManager.putPhoneIdAndSubIdExtra(intentNoChanged, slotId);
+ log("Broadcasting intent ACTION_COMMON_SLOT_NO_CHANGED for mSlotId : " + slotId);
+ mContext.sendBroadcast(intentNoChanged);
+ break;
case EVENT_REFRESH:
ar = (AsyncResult)msg.obj;
if (DBG) log("Sim REFRESH received");
@@ -437,4 +637,223 @@ public class UiccController extends Handler {
pw.println(" " + mCardLogs.get(i));
}
}
+
+ // MTK
+ private synchronized void onGetIccCardStatusDone(AsyncResult ar, Integer index, boolean isUpdate) {
+ if (ar.exception != null) {
+ Rlog.e(LOG_TAG, "Error getting ICC status. "
+ + "RIL_REQUEST_GET_ICC_STATUS should "
+ + "never return an error", ar.exception);
+ return;
+ }
+ if (!isValidCardIndex(index)) {
+ Rlog.e(LOG_TAG, "onGetIccCardStatusDone: invalid index : " + index);
+ return;
+ }
+ if (DBG) log("onGetIccCardStatusDone, index " + index + "isUpdateSiminfo " + isUpdate);
+
+ IccCardStatus status = (IccCardStatus) ar.result;
+
+ //if (status.mCardState == IccCardStatus.CardState.CARDSTATE_PRESENT) {
+ // if (DBG) log("onGetIccCardStatusDone, disableSimMissingNotification because card is present");
+ // disableSimMissingNotification(index);
+ //}
+
+ if (mUiccCards[index] == null) {
+ //Create new card
+ mUiccCards[index] = new UiccCard(mContext, mCis[index], status, index, isUpdate);
+
+/*
+ // Update the UiccCard in base class, so that if someone calls
+ // UiccManager.getUiccCard(), it will return the default card.
+ if (index == PhoneConstants.DEFAULT_CARD_INDEX) {
+ mUiccCard = mUiccCards[index];
+ }
+*/
+ } else {
+ //Update already existing card
+ mUiccCards[index].update(mContext, mCis[index] , status, isUpdate);
+ }
+
+ if (DBG) log("Notifying IccChangedRegistrants");
+ // TODO: Think if it is possible to pass isUpdate
+ if (!SystemProperties.get(COMMON_SLOT_PROPERTY).equals("1")) {
+ mIccChangedRegistrants.notifyRegistrants(new AsyncResult(null, index, null));
+ } else {
+ Bundle result = new Bundle();
+ result.putInt("Index", index.intValue());
+ result.putBoolean("ForceUpdate", isUpdate);
+
+ mIccChangedRegistrants.notifyRegistrants(new AsyncResult(null, result, null));
+ }
+ }
+
+ private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ public void onReceive(Context context, Intent intent) {
+ if (intent == null) return;
+ String action = intent.getAction();
+ log("mIntentReceiver Receive action " + action);
+
+ if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())) {
+ log(intent.toString() + intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE));
+ String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
+ int slot = intent.getIntExtra(PhoneConstants.SLOT_KEY, PhoneConstants.SIM_ID_1);
+ log("mIntentReceiver ACTION_SIM_STATE_CHANGED slot " + slot + " ,state " + stateExtra);
+
+ if (slot >= TelephonyManager.getDefault().getPhoneCount()) {
+ Rlog.e(LOG_TAG, "BroadcastReceiver SIM State changed slot is invalid");
+ return;
+ }
+
+ String iccType = ((getUiccCard(slot) != null) ? getUiccCard(slot).getIccCardType() : "");
+
+ if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(stateExtra)
+ && "USIM".equals(iccType)) {
+ mCis[slot].openIccApplication(0, obtainMessage(EVENT_TURN_ON_ISIM_APPLICATION_DONE, slot));
+ }
+ } else if (action.equals(ACTION_RESET_MODEM)) {
+ int simIdFor3G = SystemProperties.getInt(PROPERTY_3G_SWITCH, 1) - 1;
+ int slotId = intent.getIntExtra("SLOT_ID", 0);
+ if (slotId < 0 || slotId >= mCis.length) {
+ log("Receive ACTION_RESET_MODEM: invalid slot id." + slotId);
+ return;
+ }
+ log("mIntentReceiver Receive ACTION_RESET_MODEM: " + slotId);
+ if (simIdFor3G == slotId) {
+ log("phone " + simIdFor3G + " will reset modem");
+ mCis[slotId].resetRadio(null);
+ }
+ } /* else if (TelephonyIntents.ACTION_SIM_INFO_UPDATE.equals(action)) {
+ //ALPS00776430: Since EF_MSISDN can not be read/wrtie without verify PIN.
+ //We need to clear it or update it to avoid user to get the cached data before.
+ new Thread() {
+ @Override
+ public void run() {
+ SIMInfo simInfo = SIMInfo.getSIMInfoBySlot(mContext, mSimId);
+ if (simInfo!= null && mClearMsisdn == false) {
+ mClearMsisdn = true;
+ log("Initial sim info.");
+ IccRecords iccRecord = getIccRecords(APP_FAM_3GPP);
+ if(iccRecord != null) {
+ SIMInfo.setNumber(mContext, iccRecord.getMsisdnNumber(), simInfo.mSimId);
+ } else {
+ SIMInfo.setNumber(mContext, "", simInfo.mSimId);
+ }
+ Intent intent = new Intent(TelephonyIntents.ACTION_SIM_INFO_UPDATE);
+ ActivityManagerNative.broadcastStickyIntent(intent, READ_PHONE_STATE, UserHandle.USER_ALL);
+ }
+ }
+ }.start();
+ } */
+ }
+ };
+
+ private synchronized void onGetIccApplicationStatusDone(AsyncResult ar, Integer index) {
+ if (ar.exception != null) {
+ Rlog.e(LOG_TAG, "Error getting ICC status. "
+ + "RIL_REQUEST_GET_ICC_APPLICATION_STATUS should "
+ + "never return an error", ar.exception);
+ return;
+ }
+ if (!isValidCardIndex(index)) {
+ Rlog.e(LOG_TAG, "onGetIccApplicationStatusDone: invalid index : " + index);
+ return;
+ }
+ if (DBG) log("onGetIccApplicationStatusDone, index " + index);
+
+ IccCardStatus status = (IccCardStatus) ar.result;
+
+ if (mUiccCards[index] == null) {
+ //Create new card
+ mUiccCards[index] = new UiccCard(mContext, mCis[index], status, index);
+
+/*
+ // Update the UiccCard in base class, so that if someone calls
+ // UiccManager.getUiccCard(), it will return the default card.
+ if (index == PhoneConstants.DEFAULT_CARD_INDEX) {
+ mUiccCard = mUiccCards[index];
+ }
+*/
+ } else {
+ //Update already existing card
+ mUiccCards[index].update(mContext, mCis[index] , status);
+ }
+
+ if (DBG) log("Notifying mApplicationChangedRegistrants");
+ mApplicationChangedRegistrants.notifyRegistrants();
+ }
+
+ private int mBtSlotId = -1;
+
+ /**
+ * Get BT connected sim id.
+ *
+ * @internal
+ */
+ public int getBtConnectedSimId() {
+ if (DBG) log("getBtConnectedSimId, slot " + mBtSlotId);
+ return mBtSlotId;
+ }
+
+ /**
+ * Set BT connected sim id.
+ *
+ * @internal
+ */
+ public void setBtConnectedSimId(int simId) {
+ mBtSlotId = simId;
+ if (DBG) log("setBtConnectedSimId, slot " + mBtSlotId);
+ }
+
+ /**
+ * Parse network lock reason string.
+ *
+ * @param state network lock type
+ * @return network lock string
+ *
+ */
+ private String parsePersoType(PersoSubState state) {
+ if (DBG) log("parsePersoType, state = " + state);
+ switch (state) {
+ case PERSOSUBSTATE_SIM_NETWORK:
+ return IccCardConstants.INTENT_VALUE_LOCKED_NETWORK;
+ case PERSOSUBSTATE_SIM_NETWORK_SUBSET:
+ return IccCardConstants.INTENT_VALUE_LOCKED_NETWORK_SUBSET;
+ case PERSOSUBSTATE_SIM_CORPORATE:
+ return IccCardConstants.INTENT_VALUE_LOCKED_CORPORATE;
+ case PERSOSUBSTATE_SIM_SERVICE_PROVIDER:
+ return IccCardConstants.INTENT_VALUE_LOCKED_SERVICE_PROVIDER;
+ case PERSOSUBSTATE_SIM_SIM:
+ return IccCardConstants.INTENT_VALUE_LOCKED_SIM;
+ default:
+ break;
+ }
+ return IccCardConstants.INTENT_VALUE_ICC_UNKNOWN;
+ }
+
+ //Modem SML change feature.
+ public void repollIccStateForModemSmlChangeFeatrue(int slotId, boolean needIntent) {
+ if (DBG) log("repollIccStateForModemSmlChangeFeatrue, needIntent = " + needIntent);
+ int arg1 = needIntent == true ? SML_FEATURE_NEED_BROADCAST_INTENT : SML_FEATURE_NO_NEED_BROADCAST_INTENT;
+ //Use arg1 to determine the intent is needed or not
+ //Use object to indicated slotId
+ mCis[slotId].getIccCardStatus(obtainMessage(EVENT_REPOLL_SML_STATE, arg1, 0, slotId));
+ }
+
+ //Notifies when application status changes
+ public void registerForApplicationChanged(Handler h, int what, Object obj) {
+ synchronized (mLock) {
+ Registrant r = new Registrant(h, what, obj);
+ mApplicationChangedRegistrants.add(r);
+ //Notify registrant right after registering, so that it will get the latest application status,
+ //otherwise which may not happen until there is an actual change in application status.
+ r.notifyRegistrant();
+ }
+ }
+
+ public void unregisterForApplicationChanged(Handler h) {
+ synchronized (mLock) {
+ mApplicationChangedRegistrants.remove(h);
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java b/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java
index 612d55e..426814d 100644
--- a/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java
+++ b/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java
@@ -35,7 +35,10 @@ public final class UsimFileHandler extends IccFileHandler implements IccConstant
@Override
protected String getEFPath(int efid) {
switch(efid) {
+ case EF_ICCID:
+ return null;
case EF_SMS:
+ case EF_SMSP: // [ALPS01206315] Support EF_SMSP
case EF_EXT6:
case EF_EXT5:
case EF_MWIS:
@@ -60,9 +63,13 @@ public final class UsimFileHandler extends IccFileHandler implements IccConstant
case EF_CSP_CPHS:
case EF_GID1:
case EF_LI:
+ case EF_ECC:
case EF_PLMNWACT:
return MF_SIM + DF_ADF;
+ case EF_PSISMSC:
+ return /*MF_SIM +*/ DF_TELECOM;
+
case EF_PBR:
// we only support global phonebook.
return MF_SIM + DF_TELECOM + DF_PHONEBOOK;
diff --git a/src/java/com/mediatek/internal/telephony/EtwsNotification.java b/src/java/com/mediatek/internal/telephony/EtwsNotification.java
new file mode 100644
index 0000000..064f7eb
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/EtwsNotification.java
@@ -0,0 +1,42 @@
+package com.mediatek.internal.telephony;
+
+import com.android.internal.telephony.IccUtils;
+
+public class EtwsNotification {
+ public int warningType;
+ public int messageId;
+ public int serialNumber;
+ public String plmnId;
+ public String securityInfo;
+
+ public String toString() {
+ return "EtwsNotification: " + warningType + ", " + messageId + ", " + serialNumber
+ + ", " + plmnId + ", " + securityInfo;
+ }
+
+ public boolean isDuplicatedEtws(EtwsNotification other) {
+ if (this.warningType == other.warningType
+ && this.messageId == other.messageId
+ && this.serialNumber == other.serialNumber
+ && this.plmnId.equals(other.plmnId)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public byte[] getEtwsPdu() {
+ byte[] etwsPdu = new byte[56];
+ byte[] serialNumberBytes = EtwsUtils.intToBytes(serialNumber);
+ System.arraycopy(serialNumberBytes, 2, etwsPdu, 0, 2);
+ byte[] messageIdBytes = EtwsUtils.intToBytes(messageId);
+ System.arraycopy(messageIdBytes, 2, etwsPdu, 2, 2);
+ byte[] warningTypeBytes = EtwsUtils.intToBytes(warningType);
+ System.arraycopy(warningTypeBytes, 2, etwsPdu, 4, 2);
+ if (securityInfo != null) {
+ System.arraycopy(IccUtils.hexStringToBytes(securityInfo), 0, etwsPdu, 6, 50);
+ }
+
+ return etwsPdu;
+ }
+}
\ No newline at end of file
diff --git a/src/java/com/mediatek/internal/telephony/EtwsUtils.java b/src/java/com/mediatek/internal/telephony/EtwsUtils.java
new file mode 100644
index 0000000..bed25a0
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/EtwsUtils.java
@@ -0,0 +1,31 @@
+package com.mediatek.internal.telephony;
+
+public class EtwsUtils {
+ public static final int ETWS_PDU_LENGTH = 56;
+
+ public static byte[] intToBytes(int value) {
+ byte[] ret = new byte[4];
+ for (int i = 0; i < 4; ++i) {
+ ret[3 - i] = (byte) (value & 0xff);
+ value >>= 8;
+ }
+
+ return ret;
+ }
+
+ public static int bytesToInt(byte[] values) {
+ if (values == null || values.length == 0 || values.length > 4) {
+ throw new RuntimeException("valid byte array");
+ }
+
+ int ret = 0;
+ int len = values.length - 1;
+ for (int i = 0; i < len; ++i) {
+ ret |= (values[i] & 0xff);
+ ret <<= 8;
+ }
+ ret |= (values[len] & 0xff);
+
+ return ret;
+ }
+}
\ No newline at end of file
diff --git a/src/java/com/mediatek/internal/telephony/FemtoCellInfo.aidl b/src/java/com/mediatek/internal/telephony/FemtoCellInfo.aidl
new file mode 100755
index 0000000..2ee8f03
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/FemtoCellInfo.aidl
@@ -0,0 +1,19 @@
+/*
+** Copyright 2007, The Android Open Source 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.mediatek.internal.telephony;
+
+parcelable FemtoCellInfo;
diff --git a/src/java/com/mediatek/internal/telephony/FemtoCellInfo.java b/src/java/com/mediatek/internal/telephony/FemtoCellInfo.java
new file mode 100755
index 0000000..173f1f2
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/FemtoCellInfo.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2006 The Android Open Source 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.mediatek.internal.telephony;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * {@hide}
+ */
+public class FemtoCellInfo implements Parcelable {
+ /* This CSG is Not in EFACSGL nor in EFOCSGL */
+ public static final int CSG_ICON_TYPE_NOT_ALLOWED = 0;
+
+ /* This CSG is in Allowed CSG List (EFACSGL) */
+ public static final int CSG_ICON_TYPE_ALLOWED = 1;
+
+ /* This CSG is in Operator CSG List (EFOCSGL) */
+ public static final int CSG_ICON_TYPE_OPERATOR = 2;
+
+ /* This CSG is in Operator CSGs. However, it is unauthorized, meaning that UE's registration has been rejected by cause #25.*/
+ public static final int CSG_ICON_TYPE_OPERATOR_UNAUTHORIZED = 3;
+
+ private int csgId;
+ private int csgIconType; /* FemtoCellInfo.CSG_ICON_TYPE_xxx */
+ private String homeNodeBName;
+ private String operatorNumeric; /* ex: "46000" */
+ private String operatorAlphaLong; /* ex: "China Mobile" */
+ private int rat = 0; /* ServiceState.RIL_RADIO_TECHNOLOGY_xxx */
+
+/**
+ * Get registered CSG Id
+ * @internal
+ */
+ public int getCsgId() {
+ return csgId;
+ }
+
+/**
+ * Get registered CSG Icon Type
+ * @internal
+ */
+ public int getCsgIconType() {
+ return csgIconType;
+ }
+
+/**
+ * Get Home NodeB Name(if exist)
+ * @internal
+ */
+ public String getHomeNodeBName() {
+ return homeNodeBName;
+ }
+
+/**
+ * Get registered CSG Rat information
+ */
+ public int getCsgRat() {
+ return rat;
+ }
+
+/**
+ * Get registered operator numeric code
+ */
+ public String getOperatorNumeric() {
+ return operatorNumeric;
+ }
+
+/**
+ * Get registered operator alphanumeric long name
+ * @internal
+ */
+ public String getOperatorAlphaLong() {
+ return operatorAlphaLong;
+ }
+
+ public FemtoCellInfo(int csgId, int csgIconType, String homeNodeBName, String operatorNumeric, String operatorAlphaLong, int rat) {
+ this.csgId = csgId;
+ this.csgIconType = csgIconType;
+ this.homeNodeBName = homeNodeBName;
+ this.operatorNumeric = operatorNumeric;
+ this.operatorAlphaLong = operatorAlphaLong;
+ this.rat = rat;
+ }
+
+ public String toString() {
+ return "FemtoCellInfo " + csgId
+ + "/" + csgIconType
+ + "/" + homeNodeBName
+ + "/" + operatorNumeric
+ + "/" + operatorAlphaLong
+ + "/" + rat;
+ }
+
+ /**
+ * Parcelable interface implemented below.
+ * This is a simple effort to make FemtoCellInfo parcelable rather than
+ * trying to make the conventional containing object (AsyncResult),
+ * implement parcelable.
+ */
+
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * Implement the Parcelable interface.
+ * Method to serialize a FemtoCellInfo object.
+ */
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(csgId);
+ dest.writeInt(csgIconType);
+ dest.writeString(homeNodeBName);
+ dest.writeString(operatorNumeric);
+ dest.writeString(operatorAlphaLong);
+ dest.writeInt(rat);
+ }
+
+ /**
+ * Implement the Parcelable interface
+ * Method to deserialize a FemtoCellInfo object, or an array thereof.
+ */
+ public static final Creator<FemtoCellInfo> CREATOR =
+ new Creator<FemtoCellInfo>() {
+ public FemtoCellInfo createFromParcel(Parcel in) {
+ FemtoCellInfo femtoCellInfo = new FemtoCellInfo(
+ in.readInt(), /*csgId*/
+ in.readInt(), /*csgIconType*/
+ in.readString(), /*homeNodeBName*/
+ in.readString(), /*operatorNumeric*/
+ in.readString(), /*operatorAlphaLong*/
+ in.readInt()); /*rat*/
+ return femtoCellInfo;
+ }
+
+ public FemtoCellInfo[] newArray(int size) {
+ return new FemtoCellInfo[size];
+ }
+ };
+}
+
diff --git a/src/java/com/mediatek/internal/telephony/ModemSwitchHandler.java b/src/java/com/mediatek/internal/telephony/ModemSwitchHandler.java
new file mode 100755
index 0000000..0f0638d
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/ModemSwitchHandler.java
@@ -0,0 +1,244 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.internal.telephony;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.SystemProperties;
+import android.telephony.Rlog;
+
+import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneBase;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.PhoneProxy;
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.TelephonyProperties;
+
+import com.mediatek.internal.telephony.worldphone.WorldPhoneUtil;
+
+public class ModemSwitchHandler {
+ private static final String LOG_TAG = "PHONE";
+
+ /** @internal */
+ public static final int MD_TYPE_UNKNOWN = 0;
+ /** @internal */
+ public static final int MD_TYPE_WG = 3;
+ /** @internal */
+ public static final int MD_TYPE_TG = 4;
+ /** @internal */
+ public static final int MD_TYPE_LWG = 5;
+ /** @internal */
+ public static final int MD_TYPE_LTG = 6;
+ /** @internal */
+ public static final int MD_TYPE_FDD = 100;
+ /** @internal */
+ public static final int MD_TYPE_TDD = 101;
+ private static final int PROJECT_SIM_NUM = WorldPhoneUtil.getProjectSimNum();
+
+ private static int sCurrentModemType = getActiveModemType();
+ private static Phone[] sProxyPhones = null;
+ private static Phone[] sActivePhones = new Phone[PROJECT_SIM_NUM];
+ private static Context sContext = null;
+ private static CommandsInterface[] sCi = new CommandsInterface[PROJECT_SIM_NUM];
+
+ public ModemSwitchHandler() {
+ logd("Constructor invoked");
+ logd("Init modem type: " + sCurrentModemType);
+ sProxyPhones = PhoneFactory.getPhones();
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ sActivePhones[i] = ((PhoneProxy) sProxyPhones[i]).getActivePhone();
+ sCi[i] = ((PhoneBase) sActivePhones[i]).mCi;
+ }
+ if (PhoneFactory.getDefaultPhone() != null) {
+ sContext = PhoneFactory.getDefaultPhone().getContext();
+ } else {
+ logd("DefaultPhone = null");
+ }
+ }
+
+ /**
+ * Trigger TRM to switch modem type
+ * @param modemType 3 : switch to WG(MD_TYPE_WG)
+ * 4 : switch to TG(MD_TYPE_TG)
+ * 5 : switch to FDD CSFB(MD_TYPE_LWG)
+ * 6 : switch to TDD CSFB(MD_TYPE_LTG)
+ */
+ public static void switchModem(int modemType) {
+ int protocolSim = WorldPhoneUtil.getMajorSim();
+ logd("protocolSim: " + protocolSim);
+ if (protocolSim >= PhoneConstants.SIM_ID_1 && protocolSim <= PhoneConstants.SIM_ID_4) {
+ switchModem(sCi[protocolSim], modemType);
+ } else {
+ switchModem(sCi[PhoneConstants.SIM_ID_1], modemType);
+ }
+ }
+
+ /**
+ * Trigger TRM to switch modem type with desinated RIL instance
+ * @param modemType 3 : switch to WG(MD_TYPE_WG)
+ * 4 : switch to TG(MD_TYPE_TG)
+ * 5 : switch to FDD CSFB(MD_TYPE_LWG)
+ * 6 : switch to TDD CSFB(MD_TYPE_LTG)
+ */
+ public static void switchModem(CommandsInterface ci, int modemType) {
+ logd("[switchModem]");
+ if (modemType == sCurrentModemType) {
+ if (modemType == MD_TYPE_WG) {
+ logd("Already in WG modem");
+ } else if (modemType == MD_TYPE_TG) {
+ logd("Already in TG modem");
+ } else if (modemType == MD_TYPE_LWG) {
+ logd("Already in FDD CSFB modem");
+ } else if (modemType == MD_TYPE_LTG) {
+ logd("Already in TDD CSFB modem");
+ }
+ return;
+ }
+ if (ci.getRadioState() == CommandsInterface.RadioState.RADIO_UNAVAILABLE) {
+ logd("Radio unavailable, can not switch modem");
+ return;
+ }
+ if (modemType == MD_TYPE_WG) {
+ ci.setTrm(9, null);
+ } else if (modemType == MD_TYPE_TG) {
+ ci.setTrm(10, null);
+ } else if (modemType == MD_TYPE_LWG) {
+ ci.setTrm(11, null);
+ } else if (modemType == MD_TYPE_LTG) {
+ ci.setTrm(12, null);
+ } else {
+ logd("Invalid modem type:" + modemType);
+ return;
+ }
+ // Update sCurrentModemType variable & set ril.active.md system property
+ setActiveModemType(modemType);
+
+ // Broadcast modem switch notification
+ logd("Broadcast intent ACTION_MD_TYPE_CHANGE");
+ Intent intent = new Intent(TelephonyIntents.ACTION_MD_TYPE_CHANGE);
+ intent.putExtra(TelephonyIntents.EXTRA_MD_TYPE, modemType);
+ sContext.sendBroadcast(intent);
+ }
+
+ /**
+ * Trigger CCCI to reload modem bin
+ * @param modemType 3 : reload WG(MD_TYPE_WG)
+ * 4 : reload TG(MD_TYPE_TG)
+ * 5 : reload FDD CSFB(MD_TYPE_LWG)
+ * 6 : reload TDD CSFB(MD_TYPE_LTG)
+ */
+ public static void reloadModem(int modemType) {
+ int majorSim = WorldPhoneUtil.getMajorSim();
+ if (majorSim >= PhoneConstants.SIM_ID_1 && majorSim <= PhoneConstants.SIM_ID_4) {
+ reloadModem(sCi[majorSim], modemType);
+ } else {
+ reloadModem(sCi[PhoneConstants.SIM_ID_1], modemType);
+ }
+ }
+
+ /**
+ * Trigger CCCI to reload modem bin with desinated RIL instance
+ * @param modemType 3 : reload WG(MD_TYPE_WG)
+ * 4 : reload TG(MD_TYPE_TG)
+ * 5 : reload FDD CSFB(MD_TYPE_LWG)
+ * 6 : reload TDD CSFB(MD_TYPE_LTG)
+ */
+ public static void reloadModem(CommandsInterface ci, int modemType) {
+ logd("[reloadModem]");
+ if (ci.getRadioState() == CommandsInterface.RadioState.RADIO_UNAVAILABLE) {
+ logd("Radio unavailable, can not reload modem");
+ return;
+ }
+ if (modemType == MD_TYPE_WG) {
+ ci.setTrm(14, null);
+ } else if (modemType == MD_TYPE_TG) {
+ ci.setTrm(15, null);
+ } else if (modemType == MD_TYPE_LWG) {
+ ci.setTrm(16, null);
+ } else if (modemType == MD_TYPE_LTG) {
+ ci.setTrm(17, null);
+ } else {
+ logd("Invalid modem type:" + modemType);
+ }
+ }
+
+ /**
+ * Returns current modem type
+ * @internal
+ * @return 0 : modem type is unknown
+ * 3 : switch to WG(MD_TYPE_WG)
+ * 4 : switch to TG(MD_TYPE_TG)
+ * 5 : switch to FDD CSFB(MD_TYPE_LWG)
+ * 6 : switch to TDD CSFB(MD_TYPE_LTG)
+ */
+ public static int getActiveModemType() {
+ sCurrentModemType = Integer.valueOf(
+ SystemProperties.get(TelephonyProperties.PROPERTY_ACTIVE_MD, Integer.toString(MD_TYPE_UNKNOWN)));
+
+ return sCurrentModemType;
+ }
+
+ public static void setActiveModemType(int modemType) {
+ SystemProperties.set(TelephonyProperties.PROPERTY_ACTIVE_MD, Integer.toString(modemType));
+ sCurrentModemType = modemType;
+ logd("[setActiveModemType] " + modemToString(sCurrentModemType));
+ }
+
+ public static String modemToString(int modemType) {
+ String modemString;
+ if (modemType == MD_TYPE_WG) {
+ modemString = "WG";
+ } else if (modemType == MD_TYPE_TG) {
+ modemString = "TG";
+ } else if (modemType == MD_TYPE_LWG) {
+ modemString = "FDD CSFB";
+ } else if (modemType == MD_TYPE_LTG) {
+ modemString = "TDD CSFB";
+ } else if (modemType == MD_TYPE_UNKNOWN) {
+ modemString = "UNKNOWN";
+ } else {
+ modemString = "Invalid modem type";
+ }
+
+ return modemString;
+ }
+
+ private static void logd(String msg) {
+ Rlog.d(LOG_TAG, "[MSH]" + msg);
+ }
+}
diff --git a/src/java/com/mediatek/internal/telephony/NetworkInfoWithAcT.aidl b/src/java/com/mediatek/internal/telephony/NetworkInfoWithAcT.aidl
new file mode 100755
index 0000000..b604df8
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/NetworkInfoWithAcT.aidl
@@ -0,0 +1,57 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+/*
+ * Copyright (C) 2008 The Android Open Source 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.mediatek.internal.telephony;
+
+/**
+ * Used to indicate that the NetworkInfo object is parcelable to aidl.
+ * This is a simple effort to make NetworkInfo parcelable rather than
+ * trying to make the conventional containing object (AsyncResult),
+ * implement parcelable. This functionality is needed for the
+ * NetworkQueryService to fix 1128695
+ */
+parcelable NetworkInfoWithAcT;
diff --git a/src/java/com/mediatek/internal/telephony/NetworkInfoWithAcT.java b/src/java/com/mediatek/internal/telephony/NetworkInfoWithAcT.java
new file mode 100755
index 0000000..12d848e
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/NetworkInfoWithAcT.java
@@ -0,0 +1,201 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+/*
+ * Copyright (C) 2006 The Android Open Source 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.mediatek.internal.telephony;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Entry of preferred network list in UICC card. ex: EF_PLMNSEL
+ * {@hide}
+ * @internal
+ */
+public class NetworkInfoWithAcT implements Parcelable {
+
+ String operatorAlphaName;
+ String operatorNumeric;
+
+ int nAct;
+ int nPriority; // priority is the index of the plmn in the list.
+
+
+/**
+ * Get Operator alpha name ex: Vodafone
+ * @internal
+ */
+ public String
+ getOperatorAlphaName() {
+ return operatorAlphaName;
+ }
+
+/**
+ * Get member Operator PLMN ID ex: 53001
+ * @internal
+ */
+ public String
+ getOperatorNumeric() {
+ return operatorNumeric;
+ }
+
+/**
+ * Get access techonolgy of the PLMN. It's a bitmap value. <bit3, bit2,bit1,bit0> => < E-UTRAN_Act ,UTRAN_Act,GSM_Compact_Act ,Gsm_Act >
+ * @internal
+ */
+ public int
+ getAccessTechnology() {
+ return nAct;
+ }
+
+/**
+ * Get priority, index of the PLMN in the list
+ * @internal
+ */
+ public int
+ getPriority() {
+ return nPriority;
+ }
+
+/**
+ * Set Operator alpha name ex: Vodafone
+ *
+ * @internal
+ */
+ public void
+ setOperatorAlphaName(String operatorAlphaName) {
+ this.operatorAlphaName = operatorAlphaName;
+ }
+
+/**
+ * Set member Operator PLMN ID ex: 53001
+ * @internal
+ */
+ public void
+ setOperatorNumeric(String operatorNumeric) {
+ this.operatorNumeric = operatorNumeric;
+ }
+
+/**
+ * Set access techonolgy of the PLMN. It's a bitmap value. <bit3, bit2,bit1,bit0> => < E-UTRAN_Act ,UTRAN_Act,GSM_Compact_Act ,Gsm_Act >
+ *
+ * @internal
+ */
+ public void
+ setAccessTechnology(int nAct) {
+ this.nAct = nAct;
+ }
+
+/**
+ * Set priority, index of the PLMN in the list
+ * @internal
+ */
+ public void
+ setPriority(int nIndex) {
+ this.nPriority = nIndex;
+ }
+
+ public NetworkInfoWithAcT(String operatorAlphaLong,
+ String operatorNumeric,
+ int nAct,
+ int nPriority) {
+
+ this.operatorAlphaName = operatorAlphaLong;
+ this.operatorNumeric = operatorNumeric;
+ this.nAct = nAct;
+ this.nPriority = nPriority;
+ }
+
+ public String toString() {
+ return "NetworkInfoWithAcT " + operatorAlphaName
+ + "/" + operatorNumeric
+ + "/" + nAct
+ + "/" + nPriority;
+ }
+
+ /**
+ * Parcelable interface implemented below.
+ * This is a simple effort to make NetworkInfo parcelable rather than
+ * trying to make the conventional containing object (AsyncResult),
+ * implement parcelable. This functionality is needed for the
+ * NetworkQueryService to fix 1128695.
+ */
+
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * Implement the Parcelable interface.
+ * Method to serialize a NetworkInfo object.
+ */
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(operatorAlphaName);
+ dest.writeString(operatorNumeric);
+ dest.writeInt(nAct);
+ dest.writeInt(nPriority);
+ }
+
+ /**
+ * Implement the Parcelable interface
+ * Method to deserialize a NetworkInfo object, or an array thereof.
+ */
+ public static final Creator<NetworkInfoWithAcT> CREATOR =
+ new Creator<NetworkInfoWithAcT>() {
+ public NetworkInfoWithAcT createFromParcel(Parcel in) {
+ NetworkInfoWithAcT netInfoWithAct = new NetworkInfoWithAcT(
+ in.readString(), /*operatorAlphaLong*/
+ in.readString(), /*operatorNumeric*/
+ in.readInt(), /*operatorNumeric*/
+ in.readInt()); /*state*/
+ return netInfoWithAct;
+ }
+
+ public NetworkInfoWithAcT[] newArray(int size) {
+ return new NetworkInfoWithAcT[size];
+ }
+ };
+}
diff --git a/src/java/com/mediatek/internal/telephony/NetworkManager.java b/src/java/com/mediatek/internal/telephony/NetworkManager.java
new file mode 100755
index 0000000..3b7c313
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/NetworkManager.java
@@ -0,0 +1,101 @@
+
+package com.mediatek.internal.telephony;
+
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.content.Context;
+
+import com.android.internal.telephony.CommandsInterface;
+
+public class NetworkManager extends Handler {
+ static final String LOG_TAG = "GSM";
+ private static NetworkManager sNetworkManager;
+ private Context mContext;
+ private CommandsInterface[] mCi;
+ private int mPhoneCount;
+
+ protected static final int EVENT_GET_AVAILABLE_NW = 1;
+
+ public static NetworkManager init(Context context, int phoneCount, CommandsInterface[] ci) {
+ synchronized (NetworkManager.class) {
+ if (sNetworkManager == null) {
+ sNetworkManager = new NetworkManager(context, phoneCount, ci);
+ }
+ return sNetworkManager;
+ }
+ }
+
+ public static NetworkManager getInstance() {
+ return sNetworkManager;
+ }
+
+ private NetworkManager(Context context , int phoneCount, CommandsInterface[] ci) {
+
+ log("Initialize NetworkManager under airplane mode phoneCount= " + phoneCount);
+
+ mContext = context;
+ mCi = ci;
+ mPhoneCount = phoneCount;
+ }
+
+ /**
+ * To scan all available networks. i.e. PLMN list
+ * @param Message for on complete
+ * @param simId Indicate which sim(slot) to query
+ * @internal
+ */
+ public void getAvailableNetworks(int subId, Message response) {
+ /*
+ int activeSim = -1;
+ for (int i=0; i<PhoneConstants.GEMINI_SIM_NUM;++i) {
+ if (!mGeminiDataMgr.isGprsDetached(i)) {
+ activeSim = i;
+ break;
+ }
+ }
+
+ Rlog.d(LOG_TAG, "getAvailableNetworksGemini activeSIM="+activeSim);
+
+ if (activeSim == -1 || activeSim == simId ||
+ PhoneFactory.isDualTalkMode()) {
+ getPhonebyId(simId).getAvailableNetworks(response);
+ } else {
+ PhoneBase phoneBase = getPhoneBase(activeSim);
+ if (phoneBase instanceof GSMPhone) {
+ Rlog.d(LOG_TAG, "activeSim: " + activeSim + ", simId: " + simId);
+ mActiveApnTypes = getActiveApnTypesGemini(activeSim);
+ mGeminiDataMgr.cleanupAllConnection(activeSim);
+ }
+ mGettingAvailableNetwork = true;
+ Message msg = obtainMessage(EVENT_GET_AVAILABLE_NW);
+ msg.arg1 = activeSim;
+ msg.arg2 = simId;
+ msg.obj = response;
+ mGeminiDataMgr.registerForDetached(activeSim, this, EVENT_GPRS_DETACHED, msg);
+ }
+ */
+ return;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_GET_AVAILABLE_NW:
+ synchronized (this) {
+
+ }
+ break;
+
+ default:
+ log("Unhandled message with number: " + msg.what);
+ break;
+ }
+ }
+
+ private static void log(String s) {
+ // Log.d(LOG_TAG, "[NetworkManager] " + s);
+ }
+}
+
+
diff --git a/src/java/com/mediatek/internal/telephony/RadioCapabilitySwitchUtil.java b/src/java/com/mediatek/internal/telephony/RadioCapabilitySwitchUtil.java
new file mode 100755
index 0000000..28c9bd0
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/RadioCapabilitySwitchUtil.java
@@ -0,0 +1,310 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.internal.telephony;
+
+import android.os.SystemProperties;
+
+import android.telephony.PhoneRatFamily;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConstants;
+
+import java.util.Arrays;
+
+/**
+ * Utility for capability switch.
+ *
+ */
+public class RadioCapabilitySwitchUtil {
+ private static final String LOG_TAG = "GSM";
+
+ public static final int SIM_OP_INFO_OVERSEA = 0;
+ public static final int SIM_OP_INFO_OP01 = 1;
+ public static final int SIM_OP_INFO_OP02 = 2;
+
+ public static final int SIM_TYPE_SIM = 0;
+ public static final int SIM_TYPE_USIM = 1;
+ public static final int SIM_TYPE_OTHER = 2;
+
+ public static final String MAIN_SIM_PROP = "persist.radio.simswitch.iccid";
+ private static final String PROPERTY_ICCID = "ril.iccid.sim";
+ // OP01 SIMs
+ private static final String[] PLMN_TABLE_TYPE1 = {
+ "46000", "46002", "46007", "46008", "46011",
+ // Lab test IMSI
+ "00101", "00211", "00321", "00431", "00541", "00651",
+ "00761", "00871", "00902", "01012", "01122", "01232",
+ "46004", "46602", "50270", "46003"
+ };
+
+ // non-OP01 SIMs
+ private static final String[] PLMN_TABLE_TYPE3 = {
+ "46001", "46006", "46009", "45407",
+ "46005", "45502"
+ };
+
+ /**
+ * Update current main protocol ICCID.
+ *
+ * @param mProxyPhones Phone array for all phones
+ */
+ public static void updateIccid(Phone[] mProxyPhones) {
+ for (int i = 0; i < mProxyPhones.length; i++) {
+ if ((mProxyPhones[i].getPhoneRatFamily() & PhoneRatFamily.PHONE_RAT_FAMILY_3G)
+ == PhoneRatFamily.PHONE_RAT_FAMILY_3G) {
+ String currIccId = SystemProperties.get(PROPERTY_ICCID + (i + 1));
+ SystemProperties.set(MAIN_SIM_PROP, currIccId);
+ logd("updateIccid " + currIccId);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Get all SIMs operator and type.
+ *
+ * @param simOpInfo SIM operator info
+ * @param simType SIM type
+ */
+ public static void getSimInfo(int[] simOpInfo, int[] simType) {
+ String[] strMnc = new String[simOpInfo.length];
+ String[] strSimType = new String[simOpInfo.length];
+ String propStr;
+
+ for (int i = 0; i < simOpInfo.length; i++) {
+ if (i == 0) {
+ propStr = "gsm.ril.uicctype";
+ } else {
+ propStr = "gsm.ril.uicctype." + (i + 1);
+ }
+ strSimType[i] = SystemProperties.get(propStr, "");
+ if (strSimType[i].equals("SIM")) {
+ simType[i] = RadioCapabilitySwitchUtil.SIM_TYPE_SIM;
+ } else if (strSimType[i].equals("USIM")) {
+ simType[i] = RadioCapabilitySwitchUtil.SIM_TYPE_USIM;
+ } else {
+ simType[i] = RadioCapabilitySwitchUtil.SIM_TYPE_OTHER;
+ }
+ logd("SimType[" + i + "]= " + strSimType[i] + ", simType[" + i + "]=" + simType[i]);
+ final int tmpMnc = TelephonyManager.getTelephonyProperty("gsm.sim.operator.numeric",
+ SubscriptionManager.getSubId(i)[0], -1); // getSubIdUsingPhoneId not implemented
+ strMnc[i] = tmpMnc < 0 ? "" : Integer.toString(tmpMnc);
+ logd("strMnc[" + i + "] from operator.numeric:" + strMnc[i]);
+ if (strMnc[i].equals("")) {
+ if (i == 0) {
+ propStr = "gsm.sim.ril.mcc.mnc";
+ } else {
+ propStr = "gsm.sim.ril.mcc.mnc." + (i + 1);
+ }
+ strMnc[i] = SystemProperties.get(propStr, "");
+ logd("strMnc[" + i + "] from ril.mcc.mnc:" + strMnc[i]);
+ }
+ for (String mccmnc : PLMN_TABLE_TYPE1) {
+ if (strMnc[i].equals(mccmnc)) {
+ simOpInfo[i] = SIM_OP_INFO_OP01;
+ // MTK, just why didn't you break
+ break;
+ }
+ }
+ for (String mccmnc : PLMN_TABLE_TYPE3) {
+ if (strMnc[i].equals(mccmnc)) {
+ simOpInfo[i] = SIM_OP_INFO_OP02;
+ break;
+ }
+ }
+ logd("strMnc[" + i + "]= " + strMnc[i] + ", simOpInfo[" + i + "]=" + simOpInfo[i]);
+ }
+ logd("getSimInfo(simOpInfo): " + Arrays.toString(simOpInfo));
+ logd("getSimInfo(simType): " + Arrays.toString(simType));
+ }
+
+ /**
+ * Check if need to switch capability.
+ *
+ * @param mProxyPhones Phone array for all phones
+ * @param rats new capability for phones
+ * @return ture or false
+ */
+ public static boolean isNeedSwitchInOpPackage(Phone[] mProxyPhones, PhoneRatFamily[] rats) {
+ String operatorSpec = SystemProperties.get("ro.operator.optr", "");
+ int[] simOpInfo = new int[mProxyPhones.length];
+ int[] simType = new int[mProxyPhones.length];
+
+ logd("Operator Spec:" + operatorSpec);
+ // TODO: fix OP01 and OP02
+ return true;
+
+ /*
+ if (operatorSpec.equals("OP02")) {
+ // disable capability switch in op02 package
+ return false;
+ } else if (operatorSpec.equals("OP01")) {
+ // handle later
+ } else {
+ // OM package, default enable
+ return true;
+ }
+ getSimInfo(simOpInfo, simType);
+ // find target phone ID
+ int targetPhoneId;
+ for (targetPhoneId = 0; targetPhoneId < rats.length; targetPhoneId++) {
+ if ((rats[targetPhoneId].getRatFamily() & PhoneRatFamily.PHONE_RAT_FAMILY_3G)
+ == PhoneRatFamily.PHONE_RAT_FAMILY_3G) {
+ break;
+ }
+ }
+ if (operatorSpec.equals("OP01")) {
+ return checkOp01(targetPhoneId, simOpInfo, simType);
+ } else {
+ return true;
+ }
+ */
+ }
+
+ /**
+ * Check if any higher priority SIM exists.
+ *
+ * @param curId current phone ID uses main capability
+ * @param op01Usim array to indicate if op01 USIM
+ * @param op01Sim array to indicate if op01 SIM
+ * @param overseaUsim array to indicate if oversea USIM
+ * @param overseaSim array to indicate if oversea SIM
+ * @return higher priority SIM ID
+ */
+ /*
+ public static int getHigherPrioritySimForOp01(int curId, boolean[] op01Usim, boolean[] op01Sim
+ , boolean[] overseaUsim, boolean[] overseaSim) {
+ int targetSim = -1;
+ int phoneNum = op01Usim.length;
+
+ if (op01Usim[curId] == true) {
+ return curId;
+ }
+ for (int i = 0; i < phoneNum; i++) {
+ if (op01Usim[i] == true) {
+ targetSim = i;
+ }
+ }
+ if (targetSim != -1 || op01Sim[curId] == true) {
+ return targetSim;
+ }
+ for (int i = 0; i < phoneNum; i++) {
+ if (op01Sim[i] == true) {
+ targetSim = i;
+ }
+ }
+ if (targetSim != -1 || overseaUsim[curId] == true) {
+ return targetSim;
+ }
+ for (int i = 0; i < phoneNum; i++) {
+ if (overseaUsim[i] == true) {
+ targetSim = i;
+ }
+ }
+ if (targetSim != -1 || overseaSim[curId] == true) {
+ return targetSim;
+ }
+ for (int i = 0; i < phoneNum; i++) {
+ if (overseaSim[i] == true) {
+ targetSim = i;
+ }
+ }
+ return targetSim;
+ }
+
+ private static boolean checkOp01(int targetPhoneId, int[] simOpInfo, int[] simType) {
+ int curPhoneId = Integer.valueOf(
+ SystemProperties.get(PhoneConstants.CAPABILITY_SWITCH_PROP, "1")) - 1;
+
+ logd("checkOp01 : curPhoneId: " + curPhoneId);
+ if (simOpInfo[targetPhoneId] == SIM_OP_INFO_OP01) {
+ if (simType[targetPhoneId] == SIM_TYPE_SIM) {
+ if ((simOpInfo[curPhoneId] == SIM_OP_INFO_OP01)
+ && simType[curPhoneId] != SIM_TYPE_SIM) {
+ logd("checkOp01 : case 1,2; stay in current phone");
+ return false;
+ } else {
+ // case 3: op01-SIM + op01-SIM
+ // case 4: op01-SIM + others
+ logd("checkOp01 : case 3,4");
+ return true;
+ }
+ } else { // USIM, ISIM...
+ // case 1: op01-USIM + op01-USIM
+ // case 2: op01-USIM + others
+ logd("checkOp01 : case 1,2");
+ return true;
+ }
+ } else if (simOpInfo[targetPhoneId] == SIM_OP_INFO_OVERSEA) {
+ if (simOpInfo[curPhoneId] == SIM_OP_INFO_OP01) {
+ logd("checkOp01 : case 1,2,3,4; stay in current phone");
+ return false;
+ } else if (simType[targetPhoneId] == SIM_TYPE_SIM) {
+ if ((simOpInfo[curPhoneId] == SIM_OP_INFO_OVERSEA)
+ && simType[curPhoneId] != SIM_TYPE_SIM) {
+ logd("checkOp01 : case 5,6; stay in current phone");
+ return false;
+ } else {
+ // case 7: non-China SIM + non-China SIM
+ // case 8: non-China SIM + others
+ logd("checkOp01 : case 7,8");
+ return true;
+ }
+ } else { // USIM, ISIM...
+ // case 5: non-China USIM + non-China USIM
+ // case 6: non-China USIM + others
+ logd("checkOp01 : case 5,6");
+ return true;
+ }
+ } else {
+ // case 9: non-op01 USIM/SIM + non-op01 USIM/SIM
+ logd("checkOp01 : case 9");
+ return false;
+ }
+ }
+ */
+
+ private static void logd(String s) {
+ //Log.d(LOG_TAG, "[RadioCapSwitchUtil] " + s);
+ }
+}
+
+
diff --git a/src/java/com/mediatek/internal/telephony/dataconnection/FdManager.java b/src/java/com/mediatek/internal/telephony/dataconnection/FdManager.java
new file mode 100755
index 0000000..4063293
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/dataconnection/FdManager.java
@@ -0,0 +1,421 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+
+package com.mediatek.internal.telephony.dataconnection;
+
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.os.AsyncResult;
+import android.os.BatteryManager;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.SystemProperties;
+import android.telephony.Rlog;
+import android.telephony.SubscriptionManager;
+import android.util.Log;
+import android.util.SparseArray;
+
+import com.android.internal.telephony.PhoneBase;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.gsm.GSMPhone;
+
+//import com.mediatek.settings.FeatureOption;
+//import com.mediatek.common.featureoption.FeatureOption;
+
+import java.util.ArrayList;
+
+public class FdManager extends Handler {
+ // M:Fast Dormancy Manager
+ protected static final boolean DBG = true;
+ protected static final String LOG_TAG = "FdManager";
+ protected static final String PROPERTY_3G_SWITCH = "gsm.3gswitch";
+ protected static final String PROPERTY_MTK_FD_SUPPORT = "ro.mtk_fd_support";
+ protected static final String PROPERTY_RIL_FD_MODE = "ril.fd.mode";
+ protected static final String PROPERTY_FD_ON_CHARGE = "fd.on.charge";
+ protected static final String PROPERTY_FD_SCREEN_OFF_ONLY = "fd.screen.off.only";
+ private static final String STR_PROPERTY_FD_SCREEN_ON_TIMER = "persist.radio.fd.counter";
+ private static final String STR_PROPERTY_FD_SCREEN_ON_R8_TIMER = "persist.radio.fd.r8.counter";
+ private static final String STR_PROPERTY_FD_SCREEN_OFF_TIMER = "persist.radio.fd.off.counter";
+ private static final String
+ STR_PROPERTY_FD_SCREEN_OFF_R8_TIMER = "persist.radio.fd.off.r8.counter";
+
+ private static final int BASE = 0;
+ private static final int EVENT_FD_MODE_SET = BASE + 0;
+
+ public enum FdModeType {
+ DISABLE_MD_FD,
+ ENABLE_MD_FD,
+ SET_FD_INACTIVITY_TIMER,
+ INFO_MD_SCREEN_STATUS
+ }
+
+ public enum FdTimerType {
+ ScreenOffLegacyFd,
+ ScreenOnLegacyFd,
+ ScreenOffR8Fd,
+ ScreenOnR8Fd,
+ SupportedTimerTypes
+ }
+
+ private static final SparseArray<FdManager> sFdManagers = new SparseArray<FdManager>();
+
+ private PhoneBase mPhone;
+ private boolean mChargingMode = false;
+ private boolean mIsTetheredMode = false;
+ private int mEnableFdOnCharging = 0;
+ private boolean mIsScreenOn = true;
+ private static int numberOfSupportedTypes;
+ private static String timerValue[] = {"50", "150", "50", "150"};
+ //Time Unit:0.1 sec => {5sec, 15sec, 5sec, 15sec}
+
+ protected BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (DBG) logd("onReceive: action=" + action);
+ int fdMdEnableMode = Integer.parseInt(SystemProperties.get(PROPERTY_RIL_FD_MODE, "0"));
+ int fdSimId = SystemProperties.getInt(PROPERTY_3G_SWITCH, 1) - 1;
+ if (action.equals(Intent.ACTION_SCREEN_ON)) {
+ mIsScreenOn = true;
+ if (isFdSupport()) {
+ if (DBG) logd("fdMdEnableMode=" + fdMdEnableMode + ", 3gSimID="
+ + fdSimId + ", when switching to SCREEN ON");
+ mIsScreenOn = true;
+ if (fdMdEnableMode == 1) {
+ //fdMdEnableMode == 1: It means that the Fast Dormancy polling
+ // & decision mechanism is implemented by modem side
+ if (mPhone.getPhoneId() == fdSimId) {
+ mPhone.mCi.setFDMode(FdModeType.INFO_MD_SCREEN_STATUS.ordinal(), 1, -1,
+ obtainMessage(EVENT_FD_MODE_SET));
+
+ if (isFdScreenOffOnly()) {
+ if (DBG) {
+ logd("Because FD_SCREEN_OFF_ONLY, disable fd when screen on.");
+ }
+ updateFdMdEnableStatus(false);
+ }
+ }
+ } else {
+ logd("Not Support AP-trigger FD now");
+ }
+ }
+ } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
+ mIsScreenOn = false;
+ if (isFdSupport()) {
+ if (fdMdEnableMode == 1) {
+ if (DBG) logd("fdMdEnableMode=" + fdMdEnableMode + ", 3gSimID="
+ + fdSimId + ", when switching to SCREEN OFF");
+ if (mPhone.getPhoneId() == fdSimId) {
+ mPhone.mCi.setFDMode(FdModeType.INFO_MD_SCREEN_STATUS.ordinal(), 0, -1,
+ obtainMessage(EVENT_FD_MODE_SET));
+
+ if (isFdScreenOffOnly() && checkNeedTurnOn()) {
+ if (DBG) {
+ logd("Because FD_SCREEN_OFF_ONLY, turn on fd when screen off.");
+ }
+ updateFdMdEnableStatus(true);
+ }
+ }
+ } else {
+ logd("Not Support AP-trigger FD now");
+ }
+ }
+ } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
+ if (isFdSupport()){
+ int status = intent.getIntExtra("status", 0);
+ int plugged = intent.getIntExtra("plugged", 0);
+ boolean previousChargingMode = mChargingMode;
+
+ String sChargingModeStr = "", sPluggedStr = "";
+ mChargingMode = status == BatteryManager.BATTERY_STATUS_CHARGING;
+ sChargingModeStr = mChargingMode ? "Charging" : "Non-Charging";
+
+ if (plugged == BatteryManager.BATTERY_PLUGGED_AC) {
+ sPluggedStr="Plugged in AC";
+ } else if (plugged == BatteryManager.BATTERY_PLUGGED_USB) {
+ sPluggedStr="Plugged in USB";
+ }
+
+ if ((plugged == BatteryManager.BATTERY_PLUGGED_AC)
+ || (plugged == BatteryManager.BATTERY_PLUGGED_USB)) {
+ mChargingMode = true;
+ }
+
+ int previousEnableFDOnCharging = mEnableFdOnCharging;
+ mEnableFdOnCharging =
+ Integer.parseInt(SystemProperties.get(PROPERTY_FD_ON_CHARGE, "0"));
+
+ if ((previousChargingMode != mChargingMode)
+ || (previousEnableFDOnCharging != mEnableFdOnCharging)) {
+ if (DBG) logd("fdMdEnableMode=" + fdMdEnableMode + ", 3gSimID="
+ + fdSimId + ", when charging state is changed");
+ if (DBG) logd("previousEnableFdOnCharging=" + previousEnableFDOnCharging
+ + ", mEnableFdOnCharging=" + mEnableFdOnCharging
+ + ", when charging state is changed");
+ if (DBG) logd("previousChargingMode=" + previousChargingMode
+ + ", mChargingMode=" + mChargingMode + ", status=" + status
+ + "(" + sPluggedStr + ")");
+ }
+
+
+ if (fdMdEnableMode == 1) {
+ if (mPhone.getPhoneId() == fdSimId) {
+ if ((previousChargingMode != mChargingMode)
+ || (previousEnableFDOnCharging != mEnableFdOnCharging)) {
+ updateFdMdEnableStatus(checkNeedTurnOn());
+ }
+ }
+ }
+ }
+ } else if (action.equals(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)) {
+ if (isFdSupport()){
+ logd("Received ConnectivityManager.ACTION_TETHER_STATE_CHANGED");
+ ArrayList<String> active =
+ intent.getStringArrayListExtra(ConnectivityManager.EXTRA_ACTIVE_TETHER);
+ mIsTetheredMode = ((active != null) && (active.size() > 0));
+ logd("[TETHER_STATE_CHANGED]mIsTetheredMode = " + mIsTetheredMode
+ + "mChargingMode=" + mChargingMode);
+ updateFdMdEnableStatus(checkNeedTurnOn());
+ }
+ }
+ }
+ };
+
+
+ public static FdManager getInstance(PhoneBase phone) {
+ if (isFdSupport()) {
+ if (phone.getPhoneId() < 0) {
+ Rlog.e(LOG_TAG, "phoneId " + phone.getPhoneId() + " is invalid!");
+ return null;
+ }
+ FdManager fdMgr = sFdManagers.get(phone.getPhoneId());
+ if (fdMgr == null) {
+ //PhoneBase phone = (PhoneBase) PhoneFactory.getPhone(phone.getPhoneId());
+ if (phone != null) {
+ Rlog.d(LOG_TAG, "FDManager for phoneId:" + phone.getPhoneId()
+ + " doesn't exist, create it");
+ fdMgr = new FdManager(phone);
+ sFdManagers.put(phone.getPhoneId(), fdMgr);
+ } else {
+ Rlog.e(LOG_TAG, "FDManager for phoneId:" + phone.getPhoneId()
+ + " can't get phone to init!");
+ }
+ }
+ return fdMgr;
+ }
+ return null;
+ }
+
+ private FdManager(PhoneBase p) {
+ mPhone = p;
+ logd("FastDormancyManager init");
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_SCREEN_ON);
+ filter.addAction(Intent.ACTION_SCREEN_OFF);
+ filter.addAction(Intent.ACTION_BATTERY_CHANGED);
+ filter.addAction(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
+ mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
+
+ initFdTimer();
+
+ }
+
+ public void dispose() {
+ if (DBG) logd("FD.dispose");
+ if (isFdSupport()) {
+ mPhone.getContext().unregisterReceiver(this.mIntentReceiver);
+ sFdManagers.remove(mPhone.getPhoneId());
+ }
+ }
+
+ private void initFdTimer() {
+ String timerStr[] = new String[4];
+ timerStr[0] = SystemProperties.get(STR_PROPERTY_FD_SCREEN_OFF_TIMER, "5");
+ timerValue[FdTimerType.ScreenOffLegacyFd.ordinal()] =
+ Integer.toString((int)(Double.parseDouble(timerStr[0])*10));
+ timerStr[1] = SystemProperties.get(STR_PROPERTY_FD_SCREEN_ON_TIMER, "15");
+ timerValue[FdTimerType.ScreenOnLegacyFd.ordinal()] =
+ Integer.toString((int)(Double.parseDouble(timerStr[1])*10));
+ timerStr[2] = SystemProperties.get(STR_PROPERTY_FD_SCREEN_OFF_R8_TIMER, "5");
+ timerValue[FdTimerType.ScreenOffR8Fd.ordinal()] =
+ Integer.toString((int)(Double.parseDouble(timerStr[2])*10));
+ timerStr[3] = SystemProperties.get(STR_PROPERTY_FD_SCREEN_ON_R8_TIMER, "15");
+ timerValue[FdTimerType.ScreenOnR8Fd.ordinal()] =
+ Integer.toString((int)(Double.parseDouble(timerStr[3])*10));
+ logd("Default FD timers=" + timerValue[0] + "," + timerValue[1] + ","
+ + timerValue[2] + "," + timerValue[3]);
+
+ }
+
+ public int getNumberOfSupportedTypes() {
+ return FdTimerType.SupportedTimerTypes.ordinal();
+ }
+
+ /**
+ * setFdTimerValue
+ * @param String array for new Timer Value
+ * @param Message for on complete
+ */
+ public int setFdTimerValue(String newTimerValue[], Message onComplete) {
+ int fdMdEnableMode = Integer.parseInt(SystemProperties.get(PROPERTY_RIL_FD_MODE, "0"));
+ int fdSimId = SystemProperties.getInt(PROPERTY_3G_SWITCH, 1) - 1;
+ if (isFdSupport() && fdMdEnableMode == 1 && mPhone.getPhoneId() == fdSimId) {
+ // TODO: remove FeatureOption
+ for (int i=0; i < newTimerValue.length; i++) {
+ timerValue[i] = newTimerValue[i];
+ }
+ mPhone.mCi.setFDMode(FdModeType.SET_FD_INACTIVITY_TIMER.ordinal(),
+ FdTimerType.ScreenOffLegacyFd.ordinal(),
+ Integer.parseInt(timerValue[FdTimerType.ScreenOffLegacyFd.ordinal()]), null);
+ mPhone.mCi.setFDMode(FdModeType.SET_FD_INACTIVITY_TIMER.ordinal(),
+ FdTimerType.ScreenOnLegacyFd.ordinal(),
+ Integer.parseInt(timerValue[FdTimerType.ScreenOnLegacyFd.ordinal()]), null);
+ mPhone.mCi.setFDMode(FdModeType.SET_FD_INACTIVITY_TIMER.ordinal(),
+ FdTimerType.ScreenOffR8Fd.ordinal(),
+ Integer.parseInt(timerValue[FdTimerType.ScreenOffR8Fd.ordinal()]), null);
+ mPhone.mCi.setFDMode(FdModeType.SET_FD_INACTIVITY_TIMER.ordinal(),
+ FdTimerType.ScreenOnR8Fd.ordinal(),
+ Integer.parseInt(timerValue[FdTimerType.ScreenOnR8Fd.ordinal()]), onComplete);
+ logd("Set Default FD timers=" + timerValue[0] + "," + timerValue[1] + ","
+ + timerValue[2] + "," + timerValue[3]);
+ }
+ return 0;
+ }
+
+ /**
+ * setFdTimerValue
+ * @param String array for new Timer Value
+ * @param Message for on complete
+ * @param PhoneBase for input context
+ */
+ public int setFdTimerValue(String newTimerValue[], Message onComplete, PhoneBase phone) {
+ FdManager fdMgr = getInstance(phone);
+ if (fdMgr != null) {
+ fdMgr.setFdTimerValue(newTimerValue, onComplete);
+ } else {
+ logd("setFDTimerValue fail!");
+ }
+ return 0;
+ }
+
+ /**
+ * getFdTimerValue
+ * @return FD Timer String array
+ */
+ public static String[] getFdTimerValue() {
+ return timerValue;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ AsyncResult ar;
+ switch (msg.what) {
+ case EVENT_FD_MODE_SET:
+ ar = (AsyncResult) msg.obj;
+ if (ar.exception != null) {
+ if (DBG) logd("SET_FD_MODE ERROR");
+ }
+ break;
+ default:
+ Rlog.e("FdManager", "Unidentified event msg=" + msg);
+ break;
+ }
+ }
+
+ private void updateFdMdEnableStatus(boolean enabled) {
+ int fdMdEnableMode = Integer.parseInt(SystemProperties.get(PROPERTY_RIL_FD_MODE, "0"));
+ int fdSimId = SystemProperties.getInt(PROPERTY_3G_SWITCH, 1) - 1;
+ if (DBG) logd("updateFdMdEnableStatus(): enabled=" + enabled + ",fdMdEnableMode="
+ + fdMdEnableMode + ", 3gSimID=" + fdSimId);
+ if (fdMdEnableMode == 1 && mPhone.getPhoneId() == fdSimId) {
+ if (enabled) {
+ mPhone.mCi.setFDMode(FdModeType.ENABLE_MD_FD.ordinal(), -1, -1,
+ obtainMessage(EVENT_FD_MODE_SET));
+ } else {
+ mPhone.mCi.setFDMode(FdModeType.DISABLE_MD_FD.ordinal(), -1, -1,
+ obtainMessage(EVENT_FD_MODE_SET));
+ }
+ }
+ }
+
+ // TODO: check onRecordsLoaded
+ public void disableFdWhenTethering() {
+ if (isFdSupport()) {
+ ConnectivityManager connMgr = (ConnectivityManager) mPhone.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+ if ((connMgr != null) && (connMgr.getTetheredIfaces() != null)) {
+ mIsTetheredMode = (connMgr.getTetheredIfaces().length > 0);
+ }
+
+ logd("mIsTetheredMode = " + mIsTetheredMode + "mChargingMode=" + mChargingMode);
+ updateFdMdEnableStatus(checkNeedTurnOn());
+ }
+ }
+
+ /**
+ * checkNeedTurnOn.
+ * when Fd Screen Off only mode, check screen state to make sure the turn on or not
+ * @return boolean need or not
+ */
+ private boolean checkNeedTurnOn() {
+ return (!(isFdScreenOffOnly() && mIsScreenOn) &&
+ !(mChargingMode && (mEnableFdOnCharging == 0)) &&
+ !mIsTetheredMode);
+ }
+
+ public static boolean isFdScreenOffOnly() {
+ return SystemProperties.getInt(PROPERTY_FD_SCREEN_OFF_ONLY, 0) == 1;
+ }
+
+ public static boolean isFdSupport() {
+ return SystemProperties.getInt(PROPERTY_MTK_FD_SUPPORT, 1) == 1;
+ }
+
+ protected void logd(String s) {
+ Rlog.d(LOG_TAG, "[GDCT][phoneId" + mPhone.getPhoneId() + "]"+ s);
+ }
+}
+
diff --git a/src/java/com/mediatek/internal/telephony/uicc/IccCardProxyEx.java b/src/java/com/mediatek/internal/telephony/uicc/IccCardProxyEx.java
new file mode 100755
index 0000000..4ba67ac
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/uicc/IccCardProxyEx.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2012 The Android Open Source 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.mediatek.internal.telephony.uicc;
+
+
+import static android.Manifest.permission.READ_PHONE_STATE;
+import android.app.ActivityManagerNative;
+import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncResult;
+import android.os.Handler;
+import android.os.Message;
+import android.os.UserHandle;
+
+import android.telephony.TelephonyManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.Rlog;
+
+import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.IccCardConstants;
+import com.android.internal.telephony.IccCardConstants.State;
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.uicc.UiccController;
+import com.android.internal.telephony.uicc.UiccCard;
+import com.android.internal.telephony.uicc.UiccCardApplication;
+import com.android.internal.telephony.uicc.IccRecords;
+import com.android.internal.telephony.uicc.IccFileHandler;
+import com.android.internal.telephony.uicc.IccCardStatus;
+import com.android.internal.telephony.uicc.IccCardStatus.CardState;
+import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
+import com.android.internal.telephony.PhoneConstants;
+
+/**
+ * @Deprecated use {@link UiccController}.getUiccCard instead.
+ *
+ * The Phone App assumes that there is only one icc card, and one icc application
+ * available at a time. Moreover, it assumes such object (represented with IccCard)
+ * is available all the time (whether {@link RILConstants.RIL_REQUEST_GET_SIM_STATUS} returned
+ * or not, whether card has desired application or not, whether there really is a card in the
+ * slot or not).
+ *
+ * UiccController, however, can handle multiple instances of icc objects (multiple
+ * {@link UiccCardApplication}, multiple {@link IccFileHandler}, multiple {@link IccRecords})
+ * created and destroyed dynamically during phone operation.
+ *
+ * This class implements the IccCard interface that is always available (right after default
+ * phone object is constructed) to expose the current (based on voice radio technology)
+ * application on the uicc card, so that external apps won't break.
+ */
+
+public class IccCardProxyEx extends Handler {
+ private static final boolean DBG = true;
+ private static final String LOG_TAG = "IccCardProxyEx";
+
+ private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 1;
+ private static final int EVENT_ICC_CHANGED = 2;
+ private static final int EVENT_APP_READY = 3;
+ private static final int EVENT_RECORDS_LOADED = 4;
+
+ private final Object mLock = new Object();
+ private Context mContext;
+ private CommandsInterface mCi;
+
+ private static final int APPLICATION_ID_ISIM = 0;
+ private static final int APPLICATION_ID_MAX = 1;
+
+ private int mCurrentAppType = UiccController.APP_FAM_IMS;
+ private UiccController mUiccController = null;
+
+ private UiccCard mUiccCard = null;
+ private UiccCardApplication[] mUiccApplication =
+ new UiccCardApplication[IccCardStatus.CARD_MAX_APPS];
+ private IccRecords[] mIccRecords =
+ new IccRecords[IccCardStatus.CARD_MAX_APPS];
+
+ private State[] mExternalState = new State[]{State.UNKNOWN};
+ private int mSlotId;
+
+ public IccCardProxyEx(Context context, CommandsInterface ci) {
+ this(context, ci, PhoneConstants.SIM_ID_1);
+ }
+
+ public IccCardProxyEx(Context context, CommandsInterface ci, int slotId) {
+ this.mContext = context;
+ this.mCi = ci;
+ // FIXME: slotId or phoneId?
+ mSlotId = slotId;
+
+ Integer index = new Integer(mSlotId);
+ mUiccController = UiccController.getInstance();
+ ci.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_UNAVAILABLE, index);
+ mUiccController.registerForApplicationChanged(this, EVENT_ICC_CHANGED, index);
+
+ setExternalState(State.NOT_READY, 0);
+ log("Creating");
+ }
+
+ public void dispose() {
+ synchronized (mLock) {
+ log("Disposing");
+ //Cleanup icc references
+ mCi.unregisterForOffOrNotAvailable(this);
+ mUiccController.unregisterForApplicationChanged(this);
+ mUiccController = null;
+ }
+ }
+
+ public void handleMessage(Message msg) {
+ AsyncResult ar;
+ int appId;
+ log("receive message " + msg.what);
+
+ Integer index = getIndex(msg);
+
+ if (index < 0 || index >= TelephonyManager.getDefault().getPhoneCount() || index != mSlotId) {
+ loge("Invalid index : " + index + " received with event " + msg.what);
+ return;
+ }
+
+ switch (msg.what) {
+ case EVENT_RADIO_OFF_OR_UNAVAILABLE:
+ for (int i = 0; i < APPLICATION_ID_MAX; i++) {
+ setExternalState(State.NOT_READY, i);
+ }
+ break;
+
+ case EVENT_ICC_CHANGED:
+ updateIccAvailability(0);
+ break;
+
+ case EVENT_APP_READY:
+ ar = (AsyncResult) (msg.obj);
+ appId = ((Integer) ar.userObj).intValue();
+ setExternalState(State.READY, appId);
+ break;
+
+ case EVENT_RECORDS_LOADED:
+ ar = (AsyncResult) (msg.obj);
+ appId = ((Integer) ar.userObj).intValue();
+ broadcastIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null, appId);
+
+ break;
+ default:
+ loge("Unhandled message with number: " + msg.what);
+ break;
+ }
+ }
+
+ private void updateIccAvailability(int appId) {
+ synchronized (mLock) {
+ UiccCard newCard = mUiccController.getUiccCard();
+ CardState state = CardState.CARDSTATE_ABSENT;
+ UiccCardApplication newApp = null;
+ IccRecords newRecords = null;
+ int appType = 0;
+
+ switch(appId) {
+ case 0:
+ appType = UiccController.APP_FAM_IMS;
+ break;
+ default:
+ break;
+ }
+
+ if (newCard != null) {
+ state = newCard.getCardState();
+ newApp = newCard.getApplication(appType);
+ if (newApp != null) {
+ newRecords = newApp.getIccRecords();
+ }
+ }
+
+ if (mIccRecords[appId] != newRecords || mUiccApplication[appId] != newApp || mUiccCard != newCard) {
+ if (DBG) log("Icc changed. Reregestering.");
+ unregisterUiccCardEvents(appId);
+ mUiccCard = newCard;
+ mUiccApplication[appId] = newApp;
+ mIccRecords[appId] = newRecords;
+ registerUiccCardEvents(appId);
+ }
+
+ updateExternalState(appId);
+ }
+ }
+
+ private void updateExternalState(int appId) {
+
+ if (mUiccCard == null) {
+ setExternalState(State.NOT_READY, appId);
+ return;
+ } else if (mUiccCard.getCardState() == CardState.CARDSTATE_ABSENT) {
+ setExternalState(State.ABSENT, appId);
+ return;
+ }
+
+ if (DBG) log("CardState = " + mUiccCard.getCardState());
+
+ if (mUiccCard.getCardState() == CardState.CARDSTATE_ERROR ||
+ mUiccApplication[appId] == null) {
+ setExternalState(State.UNKNOWN, appId);
+ return;
+ }
+
+ if (DBG) log("application state = " + mUiccApplication[appId].getState());
+ if (DBG) log("mUiccApplication[appId] = " + mUiccApplication[appId]);
+
+ switch (mUiccApplication[appId].getState()) {
+ case APPSTATE_UNKNOWN:
+ case APPSTATE_DETECTED:
+ setExternalState(State.UNKNOWN, appId);
+ break;
+ case APPSTATE_READY:
+ setExternalState(State.READY, appId);
+ break;
+ }
+ }
+
+ private void registerUiccCardEvents(int appId) {
+ Integer aid = new Integer(appId);
+ if (mUiccApplication[appId] != null) {
+ mUiccApplication[appId].registerForReady(this, EVENT_APP_READY, (Object) aid);
+ }
+ if (mIccRecords[appId] != null) {
+ mIccRecords[appId].registerForRecordsLoaded(this, EVENT_RECORDS_LOADED, (Object) aid);
+ }
+ }
+
+ private void unregisterUiccCardEvents(int appId) {
+ if (mUiccApplication[appId] != null) mUiccApplication[appId].unregisterForReady(this);
+ if (mIccRecords[appId] != null) mIccRecords[appId].unregisterForRecordsLoaded(this);
+ }
+
+ private void broadcastIccStateChangedIntent(String value, String reason, int appId) {
+ synchronized (mLock) {
+
+ Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED_MULTI_APPLICATION);
+ intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone");
+ intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value);
+ intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason);
+ // FIXME: putPhoneIdAndSubIdExtra is phone based API, slot id might not equal to phone id.
+ SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mSlotId);
+ intent.putExtra("appId", appId);
+ if (DBG) log("Broadcasting intent ACTION_SIM_STATE_CHANGED_MULTI_APPLICATION " + value
+ + " reason " + reason + " slotd id " + mSlotId + " app id " + appId);
+ ActivityManagerNative.broadcastStickyIntent(intent, READ_PHONE_STATE,
+ UserHandle.USER_ALL);
+ }
+ }
+
+ private void setExternalState(State newState, boolean override, int appId) {
+ synchronized (mLock) {
+ if (DBG) log("setExternalState(): mExternalState = " + mExternalState[appId] +
+ " newState = " + newState + " override = " + override);
+
+ if (!override && newState == mExternalState[appId]) {
+ return;
+ }
+
+ mExternalState[appId] = newState;
+
+ broadcastIccStateChangedIntent(getIccStateIntentString(mExternalState[appId]),
+ getIccStateReason(mExternalState[appId], appId), appId);
+ }
+ }
+
+ private void setExternalState(State newState, int appId) {
+ if (DBG) log("setExternalState(): newState = " + newState + "appId = " + appId);
+ setExternalState(newState, false, appId);
+ }
+
+ private String getIccStateIntentString(State state) {
+ switch (state) {
+ case ABSENT: return IccCardConstants.INTENT_VALUE_ICC_ABSENT;
+ case PIN_REQUIRED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED;
+ case PUK_REQUIRED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED;
+ case PERSO_LOCKED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED;
+ case READY: return IccCardConstants.INTENT_VALUE_ICC_READY;
+ case NOT_READY: return IccCardConstants.INTENT_VALUE_ICC_NOT_READY;
+ case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED;
+ default: return IccCardConstants.INTENT_VALUE_ICC_UNKNOWN;
+ }
+ }
+
+ /**
+ * Locked state have a reason (PIN, PUK, NETWORK, PERM_DISABLED)
+ * @return reason
+ */
+ private String getIccStateReason(State state, int appId) {
+ switch (state) {
+ case PIN_REQUIRED: return IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN;
+ case PUK_REQUIRED: return IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK;
+ case PERSO_LOCKED:
+ switch (mUiccApplication[appId].getPersoSubState()) {
+ case PERSOSUBSTATE_SIM_NETWORK: return IccCardConstants.INTENT_VALUE_LOCKED_NETWORK;
+ case PERSOSUBSTATE_SIM_NETWORK_SUBSET: return IccCardConstants.INTENT_VALUE_LOCKED_NETWORK_SUBSET;
+ case PERSOSUBSTATE_SIM_CORPORATE: return IccCardConstants.INTENT_VALUE_LOCKED_CORPORATE;
+ case PERSOSUBSTATE_SIM_SERVICE_PROVIDER: return IccCardConstants.INTENT_VALUE_LOCKED_SERVICE_PROVIDER;
+ case PERSOSUBSTATE_SIM_SIM: return IccCardConstants.INTENT_VALUE_LOCKED_SIM;
+ default: return null;
+ }
+ case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ABSENT_ON_PERM_DISABLED;
+ default: return null;
+ }
+ }
+
+ /* IccCard interface implementation */
+ // TODO: MTK use ICS solution, there is only three state, radio.on, radio.off, radio.not.available
+
+ public State getState(int appId) {
+ synchronized (mLock) {
+ return mExternalState[appId];
+ }
+ }
+
+
+ public IccRecords getIccRecords(int family) {
+ int appId = -1;
+ synchronized (mLock) {
+ switch (family) {
+ case UiccController.APP_FAM_IMS:
+ appId = 0;
+ break;
+ default:
+ if (DBG) log("Not Support");
+ break;
+ }
+
+ if (appId != -1) {
+ return mIccRecords[appId];
+ } else {
+ return null;
+ }
+ }
+ }
+
+ public IccFileHandler getIccFileHandler(int appId) {
+ synchronized (mLock) {
+ if (mUiccApplication[appId] != null) {
+ return mUiccApplication[appId].getIccFileHandler();
+ }
+ return null;
+ }
+ }
+
+ private Integer getIndex(Message msg) {
+ AsyncResult ar;
+ // FIXME: PhoneConstants.DEFAULT_CARD_INDEX will be changed?
+ Integer index = new Integer(PhoneConstants.DEFAULT_CARD_INDEX);
+
+ /*
+ * The events can be come in two ways. By explicitly sending it using
+ * sendMessage, in this case the user object passed is msg.obj and from
+ * the CommandsInterface, in this case the user object is msg.obj.userObj
+ */
+ if (msg != null) {
+ if (msg.obj != null && msg.obj instanceof Integer) {
+ index = (Integer) msg.obj;
+ } else if (msg.obj != null && msg.obj instanceof AsyncResult) {
+ ar = (AsyncResult) msg.obj;
+ if (ar.userObj != null && ar.userObj instanceof Integer) {
+ index = (Integer) ar.userObj;
+ }
+ }
+ }
+ return index;
+ }
+
+
+ private void log(String msg) {
+ Rlog.d(LOG_TAG, "[SIM" + (mSlotId == 0 ? "1" : "2") + "] " + msg);
+ }
+
+ private void loge(String msg) {
+ Rlog.e(LOG_TAG, "[SIM" + (mSlotId == 0 ? "1" : "2") + "] " + msg);
+ }
+}
diff --git a/src/java/com/mediatek/internal/telephony/worldphone/IWorldPhone.java b/src/java/com/mediatek/internal/telephony/worldphone/IWorldPhone.java
new file mode 100755
index 0000000..94b065e
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/worldphone/IWorldPhone.java
@@ -0,0 +1,86 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+package com.mediatek.internal.telephony.worldphone;
+
+public interface IWorldPhone {
+ public static final String LOG_TAG = "PHONE";
+
+ public static final int POLICY_OM = 0;
+ public static final int POLICY_OP01 = 1;
+
+ static final int SELECTION_MODE_MANUAL = 0;
+ static final int SELECTION_MODE_AUTO = 1;
+
+ static final int UNKNOWN_USER = 0;
+ static final int TYPE1_USER = 1;
+ static final int TYPE2_USER = 2;
+ static final int TYPE3_USER = 3;
+
+ static final int REGION_UNKNOWN = 0;
+ static final int REGION_DOMESTIC = 1;
+ static final int REGION_FOREIGN = 2;
+
+ static final int EVENT_RADIO_ON_1 = 0;
+ static final int EVENT_RADIO_ON_2 = 1;
+ static final int EVENT_REG_PLMN_CHANGED_1 = 10;
+ static final int EVENT_REG_PLMN_CHANGED_2 = 11;
+ static final int EVENT_REG_SUSPENDED_1 = 30;
+ static final int EVENT_REG_SUSPENDED_2 = 31;
+ static final int EVENT_STORE_MODEM_TYPE = 40;
+ static final int EVENT_QUERY_MODEM_TYPE = 50;
+ static final int EVENT_INVALID_SIM_NOTIFY_1 = 60;
+ static final int EVENT_INVALID_SIM_NOTIFY_2 = 61;
+
+ static final int DEFAULT_MAJOR_SIM = 0;
+ static final int MAJOR_CAPABILITY_OFF = -1;
+ static final int AUTO_SWITCH_OFF = -98;
+ static final int MAJOR_SIM_UNKNOWN = -99;
+
+ static final int CAMP_ON_NOT_DENIED = 0;
+ static final int CAMP_ON_DENY_REASON_UNKNOWN = 1;
+ static final int CAMP_ON_DENY_REASON_NEED_SWITCH_TO_FDD = 2;
+ static final int CAMP_ON_DENY_REASON_NEED_SWITCH_TO_TDD = 3;
+ static final int CAMP_ON_DENY_REASON_DOMESTIC_FDD_MD = 4;
+
+ static final int ICC_CARD_TYPE_UNKNOWN = 0;
+ static final int ICC_CARD_TYPE_SIM = 1;
+ static final int ICC_CARD_TYPE_USIM = 2;
+
+ static final String NO_OP = "OM";
+ static final String ACTION_SHUTDOWN_IPO = "android.intent.action.ACTION_SHUTDOWN_IPO";
+ static final String ACTION_ADB_SWITCH_MODEM = "android.intent.action.ACTION_ADB_SWITCH_MODEM";
+
+ public void setModemSelectionMode(int mode, int modemType);
+}
diff --git a/src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneOm.java b/src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneOm.java
new file mode 100755
index 0000000..c517ad8
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneOm.java
@@ -0,0 +1,912 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+package com.mediatek.internal.telephony.worldphone;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.AsyncResult;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.telephony.ServiceState;
+import android.telephony.Rlog;
+
+import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.IccCardConstants;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneBase;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.PhoneProxy;
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.uicc.IccRecords;
+import com.android.internal.telephony.uicc.UiccController;
+
+import com.mediatek.internal.telephony.ModemSwitchHandler;
+
+/**
+ *@hide
+ */
+public class WorldPhoneOm extends Handler implements IWorldPhone {
+ private static Object sLock = new Object();
+ private static final int PROJECT_SIM_NUM = WorldPhoneUtil.getProjectSimNum();
+ private static final int[] FDD_STANDBY_TIMER = {
+ 60
+ };
+ private static final int[] TDD_STANDBY_TIMER = {
+ 40
+ };
+ private static final String[] PLMN_TABLE_TYPE1 = {
+ "46000", "46002", "46007", "46008", "46011"
+ };
+ private static final String[] PLMN_TABLE_TYPE3 = {
+ "46001", "46006", "46009", "45407",
+ "46003", "46005", "45502"
+ };
+ private static final String[] MCC_TABLE_DOMESTIC = {
+ "460"
+ };
+
+ private static Context sContext = null;
+ private static Phone sDefultPhone = null;
+ private static Phone[] sProxyPhones = null;
+ private static Phone[] sActivePhones = new Phone[PROJECT_SIM_NUM];
+ private static CommandsInterface[] sCi = new CommandsInterface[PROJECT_SIM_NUM];
+ private static String sOperatorSpec;
+ private static String sPlmnSs;
+ private static String sLastPlmn;
+ private static String[] sImsi = new String[PROJECT_SIM_NUM];
+ private static String[] sNwPlmnStrings;
+ private static int sVoiceRegState;
+ private static int sDataRegState;
+ // private static int sRilVoiceRegState;
+ // private static int sRilDataRegState;
+ private static int sRilVoiceRadioTechnology;
+ private static int sRilDataRadioTechnology;
+ private static int sUserType;
+ private static int sRegion;
+ private static int sDenyReason;
+ private static int sSuspendId;
+ private static int sMajorSim;
+ private static int sDefaultBootUpModem = ModemSwitchHandler.MD_TYPE_UNKNOWN;
+ private static int[] sIccCardType = new int[PROJECT_SIM_NUM];
+ private static boolean sVoiceCapable;
+ private static boolean[] sIsInvalidSim = new boolean[PROJECT_SIM_NUM];
+ private static boolean[] sSuspendWaitImsi = new boolean[PROJECT_SIM_NUM];
+ private static boolean[] sFirstSelect = new boolean[PROJECT_SIM_NUM];
+ private static UiccController sUiccController = null;
+ private static IccRecords[] sIccRecordsInstance = new IccRecords[PROJECT_SIM_NUM];
+ private static ServiceState sServiceState;
+ private static ModemSwitchHandler sModemSwitchHandler = null;
+ private static int sTddStandByCounter;
+ private static int sFddStandByCounter;
+ private static boolean sWaitInTdd;
+ private static boolean sWaitInFdd;
+
+ public WorldPhoneOm() {
+ logd("Constructor invoked");
+ sOperatorSpec = SystemProperties.get("ro.operator.optr", NO_OP);
+ logd("Operator Spec:" + sOperatorSpec);
+ sDefultPhone = PhoneFactory.getDefaultPhone();
+ sProxyPhones = PhoneFactory.getPhones();
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ sActivePhones[i] = ((PhoneProxy) sProxyPhones[i]).getActivePhone();
+ sCi[i] = ((PhoneBase) sActivePhones[i]).mCi;
+ }
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ sCi[i].setOnPlmnChangeNotification(this, EVENT_REG_PLMN_CHANGED_1 + i, null);
+ sCi[i].setOnRegistrationSuspended(this, EVENT_REG_SUSPENDED_1 + i, null);
+ sCi[i].registerForOn(this, EVENT_RADIO_ON_1 + i, null);
+ // sCi[i].setInvalidSimInfo(this, EVENT_INVALID_SIM_NOTIFY_1 + i, null);
+ }
+
+ sModemSwitchHandler = new ModemSwitchHandler();
+ logd(ModemSwitchHandler.modemToString(ModemSwitchHandler.getActiveModemType()));
+
+ IntentFilter intentFilter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
+ intentFilter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
+ intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ intentFilter.addAction(ACTION_SHUTDOWN_IPO);
+ intentFilter.addAction(ACTION_ADB_SWITCH_MODEM);
+ intentFilter.addAction(TelephonyIntents.ACTION_SET_PHONE_RAT_FAMILY_DONE);
+ if (sDefultPhone != null) {
+ sContext = sDefultPhone.getContext();
+ } else {
+ logd("DefaultPhone = null");
+ }
+ sVoiceCapable = sContext.getResources().getBoolean(com.android.internal.R.bool.config_voice_capable);
+ sContext.registerReceiver(mWorldPhoneReceiver, intentFilter);
+
+ sTddStandByCounter = 0;
+ sFddStandByCounter = 0;
+ sWaitInTdd = false;
+ sWaitInFdd = false;
+ sRegion = REGION_UNKNOWN;
+ sLastPlmn = null;
+ resetAllProperties();
+ if (WorldPhoneUtil.getModemSelectionMode() == SELECTION_MODE_MANUAL) {
+ logd("Auto select disable");
+ sMajorSim = AUTO_SWITCH_OFF;
+ // Settings.Global.putInt(sContext.getContentResolver(),
+ // Settings.Global.WORLD_PHONE_AUTO_SELECT_MODE, SELECTION_MODE_MANUAL);
+ } else {
+ logd("Auto select enable");
+ // Settings.Global.putInt(sContext.getContentResolver(),
+ // Settings.Global.WORLD_PHONE_AUTO_SELECT_MODE, SELECTION_MODE_AUTO);
+ }
+ // FDD_STANDBY_TIMER[sFddStandByCounter] = Settings.Global.getInt(
+ // sContext.getContentResolver(), Settings.Global.WORLD_PHONE_FDD_MODEM_TIMER, FDD_STANDBY_TIMER[sFddStandByCounter]);
+ // Settings.Global.putInt(sContext.getContentResolver(),
+ // Settings.Global.WORLD_PHONE_FDD_MODEM_TIMER, FDD_STANDBY_TIMER[sFddStandByCounter]);
+ logd("FDD_STANDBY_TIMER = " + FDD_STANDBY_TIMER[sFddStandByCounter] + "s");
+ logd("sDefaultBootUpModem = " + sDefaultBootUpModem);
+ }
+
+ private final BroadcastReceiver mWorldPhoneReceiver = new BroadcastReceiver() {
+ public void onReceive(Context context, Intent intent) {
+ logd("[Receiver]+");
+ String action = intent.getAction();
+ logd("Action: " + action);
+ int slotId;
+ if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
+ String simStatus = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
+ slotId = intent.getIntExtra(PhoneConstants.SLOT_KEY, PhoneConstants.SIM_ID_1);
+ logd("slotId: " + slotId + " simStatus: " + simStatus);
+ if (simStatus.equals(IccCardConstants.INTENT_VALUE_ICC_IMSI)) {
+ if (sMajorSim == MAJOR_SIM_UNKNOWN) {
+ sMajorSim = WorldPhoneUtil.getMajorSim();
+ }
+ sUiccController = UiccController.getInstance();
+ if (sUiccController != null) {
+ sIccRecordsInstance[slotId] = sUiccController.getIccRecords(slotId, UiccController.APP_FAM_3GPP);
+ } else {
+ logd("Null sUiccController");
+ return;
+ }
+ if (sIccRecordsInstance[slotId] != null) {
+ sImsi[slotId] = sIccRecordsInstance[slotId].getIMSI();
+ } else {
+ logd("Null sIccRecordsInstance");
+ return;
+ }
+ sIccCardType[slotId] = getIccCardType(slotId);
+ logd("sImsi[" + slotId + "]:" + sImsi[slotId]);
+ if (slotId == sMajorSim) {
+ logd("Major SIM");
+ sUserType = getUserType(sImsi[slotId]);
+ if (sFirstSelect[slotId]) {
+ sFirstSelect[slotId] = false;
+ if (sUserType == TYPE1_USER) {
+ if (sRegion == REGION_DOMESTIC) {
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_TDD);
+ } else if (sRegion == REGION_FOREIGN) {
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_FDD);
+ } else {
+ logd("Region unknown");
+ }
+ } else if (sUserType == TYPE2_USER || sUserType == TYPE3_USER) {
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_FDD);
+ }
+ }
+ if (sSuspendWaitImsi[slotId]) {
+ sSuspendWaitImsi[slotId] = false;
+ logd("IMSI fot slot" + slotId + " now ready, resuming PLMN:"
+ + sNwPlmnStrings[0] + " with ID:" + sSuspendId);
+ resumeCampingProcedure(slotId);
+ }
+ } else {
+ logd("Not major SIM");
+ getUserType(sImsi[slotId]);
+ }
+ } else if (simStatus.equals(IccCardConstants.INTENT_VALUE_ICC_ABSENT)) {
+ sLastPlmn = null;
+ sImsi[slotId] = "";
+ sFirstSelect[slotId] = true;
+ sIsInvalidSim[slotId] = false;
+ sSuspendWaitImsi[slotId] = false;
+ sIccCardType[slotId] = ICC_CARD_TYPE_UNKNOWN;
+ if (slotId == sMajorSim) {
+ logd("Major SIM removed, no world phone service");
+ removeModemStandByTimer();
+ sUserType = UNKNOWN_USER;
+ sDenyReason = CAMP_ON_DENY_REASON_UNKNOWN;
+ sMajorSim = MAJOR_SIM_UNKNOWN;
+ } else {
+ logd("SIM" + slotId + " is not major SIM");
+ }
+ }
+ } else if (action.equals(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED)) {
+ sServiceState = ServiceState.newFromBundle(intent.getExtras());
+ if (sServiceState != null) {
+ slotId = intent.getIntExtra(PhoneConstants.SLOT_KEY, PhoneConstants.SIM_ID_1);
+ sPlmnSs = sServiceState.getOperatorNumeric();
+ sVoiceRegState = sServiceState.getVoiceRegState();
+ // sRilVoiceRegState = sServiceState.getRilVoiceRegState();
+ sRilVoiceRadioTechnology = sServiceState.getRilVoiceRadioTechnology();
+ sDataRegState = sServiceState.getDataRegState();
+ // sRilDataRegState = sServiceState.getRilDataRegState();
+ sRilDataRadioTechnology = sServiceState.getRilDataRadioTechnology();
+ logd("slotId: " + slotId + ", " + WorldPhoneUtil.iccCardTypeToString(sIccCardType[slotId]));
+ logd("sMajorSim: " + sMajorSim);
+ logd(ModemSwitchHandler.modemToString(ModemSwitchHandler.getActiveModemType()));
+ logd("sPlmnSs: " + sPlmnSs);
+ logd("sVoiceRegState: " + WorldPhoneUtil.stateToString(sVoiceRegState));
+ // logd("sRilVoiceRegState: " + WorldPhoneUtil.regStateToString(sRilVoiceRegState));
+ logd("sRilVoiceRadioTech: " + sServiceState.rilRadioTechnologyToString(sRilVoiceRadioTechnology));
+ logd("sDataRegState: " + WorldPhoneUtil.stateToString(sDataRegState));
+ // logd("sRilDataRegState: " + WorldPhoneUtil.regStateToString(sRilDataRegState));
+ logd("sRilDataRadioTech: " + sServiceState.rilRadioTechnologyToString(sRilDataRadioTechnology));
+ if (slotId == sMajorSim) {
+ if (isNoService()) {
+ handleNoService();
+ } else if (isInService()) {
+ sLastPlmn = sPlmnSs;
+ removeModemStandByTimer();
+ }
+ }
+ } else {
+ logd("Null sServiceState");
+ }
+ } else if (action.equals(ACTION_SHUTDOWN_IPO)) {
+ if (sDefaultBootUpModem == ModemSwitchHandler.MD_TYPE_FDD) {
+ if (WorldPhoneUtil.isLteSupport()) {
+ ModemSwitchHandler.reloadModem(sCi[PhoneConstants.SIM_ID_1], ModemSwitchHandler.MD_TYPE_LWG);
+ logd("Reload to FDD CSFB modem");
+ } else {
+ ModemSwitchHandler.reloadModem(sCi[PhoneConstants.SIM_ID_1], ModemSwitchHandler.MD_TYPE_WG);
+ logd("Reload to WG modem");
+ }
+ } else if (sDefaultBootUpModem == ModemSwitchHandler.MD_TYPE_TDD) {
+ if (WorldPhoneUtil.isLteSupport()) {
+ ModemSwitchHandler.reloadModem(sCi[PhoneConstants.SIM_ID_1], ModemSwitchHandler.MD_TYPE_LTG);
+ logd("Reload to TDD CSFB modem");
+ } else {
+ ModemSwitchHandler.reloadModem(sCi[PhoneConstants.SIM_ID_1], ModemSwitchHandler.MD_TYPE_TG);
+ logd("Reload to TG modem");
+ }
+ }
+ } else if (action.equals(ACTION_ADB_SWITCH_MODEM)) {
+ int toModem = intent.getIntExtra(TelephonyIntents.EXTRA_MD_TYPE, ModemSwitchHandler.MD_TYPE_UNKNOWN);
+ logd("toModem: " + toModem);
+ if (toModem == ModemSwitchHandler.MD_TYPE_WG
+ || toModem == ModemSwitchHandler.MD_TYPE_TG
+ || toModem == ModemSwitchHandler.MD_TYPE_LWG
+ || toModem == ModemSwitchHandler.MD_TYPE_LTG) {
+ setModemSelectionMode(IWorldPhone.SELECTION_MODE_MANUAL, toModem);
+ } else {
+ setModemSelectionMode(IWorldPhone.SELECTION_MODE_AUTO, toModem);
+ }
+ } else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
+ if (intent.getBooleanExtra("state", false) == false) {
+ logd("Leave flight mode");
+ sLastPlmn = null;
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ sIsInvalidSim[i] = false;
+ }
+ } else {
+ logd("Enter flight mode");
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ sFirstSelect[i] = true;
+ }
+ }
+ } else if (action.equals(TelephonyIntents.ACTION_SET_PHONE_RAT_FAMILY_DONE)) {
+ if (sMajorSim != AUTO_SWITCH_OFF) {
+ sMajorSim = WorldPhoneUtil.getMajorSim();
+ }
+ handleSimSwitched();
+ }
+ logd("[Receiver]-");
+ }
+ };
+
+ public void handleMessage(Message msg) {
+ AsyncResult ar = (AsyncResult) msg.obj;
+ switch (msg.what) {
+ case EVENT_RADIO_ON_1:
+ logd("handleMessage : <EVENT_RADIO_ON>");
+ handleRadioOn(PhoneConstants.SIM_ID_1);
+ break;
+ case EVENT_REG_PLMN_CHANGED_1:
+ logd("handleMessage : <EVENT_REG_PLMN_CHANGED>");
+ handlePlmnChange(ar, PhoneConstants.SIM_ID_1);
+ break;
+ case EVENT_REG_SUSPENDED_1:
+ logd("handleMessage : <EVENT_REG_SUSPENDED>");
+ handleRegistrationSuspend(ar, PhoneConstants.SIM_ID_1);
+ break;
+ case EVENT_RADIO_ON_2:
+ logd("handleMessage : <EVENT_RADIO_ON>");
+ handleRadioOn(PhoneConstants.SIM_ID_2);
+ break;
+ case EVENT_REG_PLMN_CHANGED_2:
+ logd("handleMessage : <EVENT_REG_PLMN_CHANGED>");
+ handlePlmnChange(ar, PhoneConstants.SIM_ID_2);
+ break;
+ case EVENT_REG_SUSPENDED_2:
+ logd("handleMessage : <EVENT_REG_SUSPENDED>");
+ handleRegistrationSuspend(ar, PhoneConstants.SIM_ID_2);
+ break;
+ case EVENT_INVALID_SIM_NOTIFY_1:
+ logd("handleMessage : <EVENT_INVALID_SIM_NOTIFY>");
+ handleInvalidSimNotify(PhoneConstants.SIM_ID_1, ar);
+ break;
+ case EVENT_INVALID_SIM_NOTIFY_2:
+ logd("handleMessage : <EVENT_INVALID_SIM_NOTIFY>");
+ handleInvalidSimNotify(PhoneConstants.SIM_ID_2, ar);
+ break;
+ default:
+ logd("Unknown msg:" + msg.what);
+ }
+ }
+
+ private void handleRadioOn(int slotId) {
+ logd("Slot" + slotId);
+ if (sMajorSim == MAJOR_SIM_UNKNOWN) {
+ sMajorSim = WorldPhoneUtil.getMajorSim();
+ }
+ }
+
+ private void handlePlmnChange(AsyncResult ar, int slotId) {
+ logd("Slot" + slotId);
+ if (sMajorSim == MAJOR_SIM_UNKNOWN) {
+ sMajorSim = WorldPhoneUtil.getMajorSim();
+ }
+ if (ar.exception == null && ar.result != null) {
+ String[] plmnString = (String[]) ar.result;
+ if (slotId == sMajorSim) {
+ sNwPlmnStrings = plmnString;
+ }
+ for (int i = 0; i < plmnString.length; i++) {
+ logd("plmnString[" + i + "]=" + plmnString[i]);
+ }
+ if (sMajorSim == slotId && sUserType == TYPE1_USER
+ && sDenyReason != CAMP_ON_DENY_REASON_NEED_SWITCH_TO_FDD) {
+ searchForDesignateService(plmnString[0]);
+ }
+ // To speed up performance in foreign countries, once get PLMN(no matter which slot)
+ // determine region right away and switch modem type if needed
+ sRegion = getRegion(plmnString[0]);
+ if (sUserType != TYPE3_USER && sRegion == REGION_FOREIGN
+ && sMajorSim != AUTO_SWITCH_OFF && sMajorSim != MAJOR_CAPABILITY_OFF) {
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_FDD);
+ }
+ } else {
+ logd("AsyncResult is wrong " + ar.exception);
+ }
+ }
+
+ private void handleRegistrationSuspend(AsyncResult ar, int slotId) {
+ logd("Slot" + slotId);
+ if (ar.exception == null && ar.result != null) {
+ sSuspendId = ((int[]) ar.result)[0];
+ logd("Suspending with Id=" + sSuspendId);
+ if (sMajorSim == slotId) {
+ if (sUserType != UNKNOWN_USER) {
+ resumeCampingProcedure(slotId);
+ } else {
+ sSuspendWaitImsi[slotId] = true;
+ logd("User type unknown, wait for IMSI");
+ }
+ } else {
+ logd("Not major slot, camp on OK");
+ sCi[slotId].setResumeRegistration(sSuspendId, null);
+ }
+ } else {
+ logd("AsyncResult is wrong " + ar.exception);
+ }
+ }
+
+ private void handleInvalidSimNotify(int slotId, AsyncResult ar) {
+ logd("Slot" + slotId);
+ if (ar.exception == null && ar.result != null) {
+ String[] invalidSimInfo = (String[]) ar.result;
+ String plmn = invalidSimInfo[0];
+ int cs_invalid = Integer.parseInt(invalidSimInfo[1]);
+ int ps_invalid = Integer.parseInt(invalidSimInfo[2]);
+ int cause = Integer.parseInt(invalidSimInfo[3]);
+ int testMode = -1;
+ testMode = SystemProperties.getInt("gsm.gcf.testmode", 0);
+ if (testMode != 0) {
+ logd("Invalid SIM notified during test mode: " + testMode);
+ return;
+ }
+ logd("testMode:" + testMode + ", cause: " + cause + ", cs_invalid: " + cs_invalid + ", ps_invalid: " + ps_invalid + ", plmn: " + plmn);
+ if (sVoiceCapable && cs_invalid == 1) {
+ if (sLastPlmn == null) {
+ logd("CS reject, invalid SIM");
+ sIsInvalidSim[slotId] = true;
+ return;
+ }
+ }
+ if (ps_invalid == 1) {
+ if (sLastPlmn == null) {
+ logd("PS reject, invalid SIM");
+ sIsInvalidSim[slotId] = true;
+ return;
+ }
+ }
+ } else {
+ logd("AsyncResult is wrong " + ar.exception);
+ }
+ }
+
+ private void handleSwitchModem(int toModem) {
+ if (sIsInvalidSim[WorldPhoneUtil.getMajorSim()]
+ && WorldPhoneUtil.getModemSelectionMode() == SELECTION_MODE_AUTO) {
+ logd("Invalid SIM, switch not executed!");
+ return;
+ }
+ if (toModem == ModemSwitchHandler.MD_TYPE_TDD) {
+ if (WorldPhoneUtil.isLteSupport()) {
+ toModem = ModemSwitchHandler.MD_TYPE_LTG;
+ } else {
+ toModem = ModemSwitchHandler.MD_TYPE_TG;
+ }
+ } else if (toModem == ModemSwitchHandler.MD_TYPE_FDD) {
+ if (WorldPhoneUtil.isLteSupport()) {
+ toModem = ModemSwitchHandler.MD_TYPE_LWG;
+ } else {
+ toModem = ModemSwitchHandler.MD_TYPE_WG;
+ }
+ }
+ if (sMajorSim == AUTO_SWITCH_OFF) {
+ logd("Storing modem type: " + toModem);
+ sCi[PhoneConstants.SIM_ID_1].storeModemType(toModem, null);
+ } else {
+ if (sDefaultBootUpModem == ModemSwitchHandler.MD_TYPE_UNKNOWN) {
+ logd("Storing modem type: " + toModem);
+ sCi[PhoneConstants.SIM_ID_1].storeModemType(toModem, null);
+ } else if (sDefaultBootUpModem == ModemSwitchHandler.MD_TYPE_FDD) {
+ if (WorldPhoneUtil.isLteSupport()) {
+ logd("Storing modem type: " + ModemSwitchHandler.MD_TYPE_WG);
+ sCi[PhoneConstants.SIM_ID_1].storeModemType(ModemSwitchHandler.MD_TYPE_LWG, null);
+ } else {
+ logd("Storing modem type: " + ModemSwitchHandler.MD_TYPE_LWG);
+ sCi[PhoneConstants.SIM_ID_1].storeModemType(ModemSwitchHandler.MD_TYPE_WG, null);
+ }
+ } else if (sDefaultBootUpModem == ModemSwitchHandler.MD_TYPE_TDD) {
+ if (WorldPhoneUtil.isLteSupport()) {
+ logd("Storing modem type: " + ModemSwitchHandler.MD_TYPE_WG);
+ sCi[PhoneConstants.SIM_ID_1].storeModemType(ModemSwitchHandler.MD_TYPE_LTG, null);
+ } else {
+ logd("Storing modem type: " + ModemSwitchHandler.MD_TYPE_LWG);
+ sCi[PhoneConstants.SIM_ID_1].storeModemType(ModemSwitchHandler.MD_TYPE_TG, null);
+ }
+ }
+ }
+ if (toModem == ModemSwitchHandler.getActiveModemType()) {
+ if (toModem == ModemSwitchHandler.MD_TYPE_WG) {
+ logd("Already in WG modem");
+ } else if (toModem == ModemSwitchHandler.MD_TYPE_TG) {
+ logd("Already in TG modem");
+ } else if (toModem == ModemSwitchHandler.MD_TYPE_LWG) {
+ logd("Already in FDD CSFB modem");
+ } else if (toModem == ModemSwitchHandler.MD_TYPE_LTG) {
+ logd("Already in TDD CSFB modem");
+ }
+ return;
+ } else {
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ if (sActivePhones[i].getState() != PhoneConstants.State.IDLE) {
+ logd("Phone" + i + " is not idle, modem switch not allowed");
+ return;
+ }
+ }
+ removeModemStandByTimer();
+ if (toModem == ModemSwitchHandler.MD_TYPE_WG) {
+ logd("Switching to WG modem");
+ } else if (toModem == ModemSwitchHandler.MD_TYPE_TG) {
+ logd("Switching to TG modem");
+ } else if (toModem == ModemSwitchHandler.MD_TYPE_LWG) {
+ logd("Switching to FDD CSFB modem");
+ } else if (toModem == ModemSwitchHandler.MD_TYPE_LTG) {
+ logd("Switching to TDD CSFB modem");
+ }
+ ModemSwitchHandler.switchModem(toModem);
+ resetNetworkProperties();
+ }
+ }
+
+ private void handleSimSwitched() {
+ if (sMajorSim == MAJOR_CAPABILITY_OFF) {
+ logd("Major capability turned off");
+ removeModemStandByTimer();
+ sUserType = UNKNOWN_USER;
+ } else if (sMajorSim == AUTO_SWITCH_OFF) {
+ logd("Auto modem selection disabled");
+ removeModemStandByTimer();
+ } else if (sMajorSim == MAJOR_SIM_UNKNOWN) {
+ logd("Major SIM unknown");
+ } else {
+ logd("Auto modem selection enabled");
+ logd("Major capability in slot" + sMajorSim);
+ if (sImsi[sMajorSim] == null || sImsi[sMajorSim].equals("")) {
+ // may caused by receive 3g switched intent when boot up
+ logd("Major slot IMSI not ready");
+ sUserType = UNKNOWN_USER;
+ return;
+ }
+ sUserType = getUserType(sImsi[sMajorSim]);
+ if (sUserType == TYPE1_USER) {
+ if (sNwPlmnStrings != null) {
+ sRegion = getRegion(sNwPlmnStrings[0]);
+ }
+ if (sRegion == REGION_DOMESTIC) {
+ sFirstSelect[sMajorSim] = false;
+ sIccCardType[sMajorSim] = getIccCardType(sMajorSim);
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_TDD);
+ } else if (sRegion == REGION_FOREIGN) {
+ sFirstSelect[sMajorSim] = false;
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_FDD);
+ } else {
+ logd("Unknown region");
+ }
+ } else if (sUserType == TYPE2_USER || sUserType == TYPE3_USER) {
+ sFirstSelect[sMajorSim] = false;
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_FDD);
+ } else {
+ logd("Unknown user type");
+ }
+ }
+ }
+
+ private void handleNoService() {
+ logd("[handleNoService]+ Can not find service");
+ logd("Type" + sUserType + " user");
+ logd(WorldPhoneUtil.regionToString(sRegion));
+ int mdType = ModemSwitchHandler.getActiveModemType();
+ logd(ModemSwitchHandler.modemToString(mdType));
+ IccCardConstants.State iccState = ((PhoneProxy) sProxyPhones[sMajorSim]).getIccCard().getState();
+ if (iccState == IccCardConstants.State.READY) {
+ if (sUserType == TYPE1_USER) {
+ if (mdType == ModemSwitchHandler.MD_TYPE_LTG
+ || mdType == ModemSwitchHandler.MD_TYPE_TG) {
+ if (TDD_STANDBY_TIMER[sTddStandByCounter] >= 0) {
+ if (!sWaitInTdd) {
+ sWaitInTdd = true;
+ logd("Wait " + TDD_STANDBY_TIMER[sTddStandByCounter] + "s. Timer index = " + sTddStandByCounter);
+ postDelayed(mTddStandByTimerRunnable, TDD_STANDBY_TIMER[sTddStandByCounter] * 1000);
+ } else {
+ logd("Timer already set:" + TDD_STANDBY_TIMER[sTddStandByCounter] + "s");
+ }
+ } else {
+ logd("Standby in TDD modem");
+ }
+ } else if (mdType == ModemSwitchHandler.MD_TYPE_LWG
+ || mdType == ModemSwitchHandler.MD_TYPE_WG) {
+ if (FDD_STANDBY_TIMER[sFddStandByCounter] >= 0) {
+ if (!sWaitInFdd) {
+ sWaitInFdd = true;
+ logd("Wait " + FDD_STANDBY_TIMER[sFddStandByCounter] + "s. Timer index = " + sFddStandByCounter);
+ postDelayed(mFddStandByTimerRunnable, FDD_STANDBY_TIMER[sFddStandByCounter] * 1000);
+ } else {
+ logd("Timer already set:" + FDD_STANDBY_TIMER[sFddStandByCounter] + "s");
+ }
+ } else {
+ logd("Standby in FDD modem");
+ }
+ }
+ } else if (sUserType == TYPE2_USER || sUserType == TYPE3_USER) {
+ if (mdType == ModemSwitchHandler.MD_TYPE_LWG
+ || mdType == ModemSwitchHandler.MD_TYPE_WG) {
+ logd("Standby in FDD modem");
+ } else {
+ logd("Should not enter this state");
+ }
+ } else {
+ logd("Unknow user type");
+ }
+ } else {
+ logd("IccState not ready");
+ }
+ logd("[handleNoService]-");
+
+ return;
+ }
+
+ private boolean isAllowCampOn(String plmnString, int slotId) {
+ logd("[isAllowCampOn]+ " + plmnString);
+ logd("User type: " + sUserType);
+ logd(WorldPhoneUtil.iccCardTypeToString(sIccCardType[slotId]));
+ sRegion = getRegion(plmnString);
+ int mdType = ModemSwitchHandler.getActiveModemType();
+ logd(ModemSwitchHandler.modemToString(mdType));
+ if (sUserType == TYPE1_USER) {
+ if (sRegion == REGION_DOMESTIC) {
+ if (mdType == ModemSwitchHandler.MD_TYPE_LTG
+ || mdType == ModemSwitchHandler.MD_TYPE_TG) {
+ sDenyReason = CAMP_ON_NOT_DENIED;
+ logd("Camp on OK");
+ logd("[isAllowCampOn]-");
+ return true;
+ } else if (mdType == ModemSwitchHandler.MD_TYPE_LWG
+ || mdType == ModemSwitchHandler.MD_TYPE_WG) {
+ sDenyReason = CAMP_ON_DENY_REASON_NEED_SWITCH_TO_TDD;
+ logd("Camp on REJECT");
+ logd("[isAllowCampOn]-");
+ return false;
+ }
+ } else if (sRegion == REGION_FOREIGN) {
+ if (mdType == ModemSwitchHandler.MD_TYPE_LTG
+ || mdType == ModemSwitchHandler.MD_TYPE_TG) {
+ sDenyReason = CAMP_ON_DENY_REASON_NEED_SWITCH_TO_FDD;
+ logd("Camp on REJECT");
+ logd("[isAllowCampOn]-");
+ return false;
+ } else if (mdType == ModemSwitchHandler.MD_TYPE_LWG
+ || mdType == ModemSwitchHandler.MD_TYPE_WG) {
+ sDenyReason = CAMP_ON_NOT_DENIED;
+ logd("Camp on OK");
+ logd("[isAllowCampOn]-");
+ return true;
+ }
+ } else {
+ logd("Unknow region");
+ }
+ } else if (sUserType == TYPE2_USER || sUserType == TYPE3_USER) {
+ if (mdType == ModemSwitchHandler.MD_TYPE_LTG
+ || mdType == ModemSwitchHandler.MD_TYPE_TG) {
+ sDenyReason = CAMP_ON_DENY_REASON_NEED_SWITCH_TO_FDD;
+ logd("Camp on REJECT");
+ logd("[isAllowCampOn]-");
+ return false;
+ } else if (mdType == ModemSwitchHandler.MD_TYPE_LWG
+ || mdType == ModemSwitchHandler.MD_TYPE_WG) {
+ sDenyReason = CAMP_ON_NOT_DENIED;
+ logd("Camp on OK");
+ logd("[isAllowCampOn]-");
+ return true;
+ }
+ } else {
+ logd("Unknown user type");
+ }
+ sDenyReason = CAMP_ON_DENY_REASON_UNKNOWN;
+ logd("Camp on REJECT");
+ logd("[isAllowCampOn]-");
+
+ return false;
+ }
+
+ private boolean isInService() {
+ boolean inService = false;
+
+ if (sVoiceRegState == ServiceState.STATE_IN_SERVICE
+ || sDataRegState == ServiceState.STATE_IN_SERVICE) {
+ inService = true;
+ }
+ logd("inService: " + inService);
+
+ return inService;
+ }
+
+ private boolean isNoService() {
+ boolean noService = false;
+
+ if (sVoiceRegState == ServiceState.STATE_OUT_OF_SERVICE
+ // && sRilVoiceRegState == ServiceState.REGISTRATION_STATE_NOT_REGISTERED_AND_NOT_SEARCHING
+ && sDataRegState == ServiceState.STATE_OUT_OF_SERVICE
+ // && sRilDataRegState == ServiceState.REGISTRATION_STATE_NOT_REGISTERED_AND_NOT_SEARCHING) {
+ ) {
+ noService = true;
+ } else {
+ noService = false;
+ }
+ logd("noService: " + noService);
+
+ return noService;
+ }
+
+ private int getIccCardType(int slotId) {
+ int simType;
+ String simString = "Unknown";
+
+ simString = ((PhoneProxy) sProxyPhones[slotId]).getIccCard().getIccCardType();
+ if (simString.equals("SIM")) {
+ logd("IccCard type: SIM");
+ simType = ICC_CARD_TYPE_SIM;
+ } else if (simString.equals("USIM")) {
+ logd("IccCard type: USIM");
+ simType = ICC_CARD_TYPE_USIM;
+ } else {
+ logd("IccCard type: Unknown");
+ simType = ICC_CARD_TYPE_UNKNOWN;
+ }
+
+ return simType;
+ }
+
+ private int getRegion(String plmn) {
+ String currentMcc;
+ if (plmn == null) {
+ logd("[getRegion] null PLMN");
+ return REGION_UNKNOWN;
+ }
+ currentMcc = plmn.substring(0, 3);
+ for (String mcc : MCC_TABLE_DOMESTIC) {
+ if (currentMcc.equals(mcc)) {
+ logd("[getRegion] REGION_DOMESTIC");
+ return REGION_DOMESTIC;
+ }
+ }
+ logd("[getRegion] REGION_FOREIGN");
+ return REGION_FOREIGN;
+ }
+
+ private int getUserType(String imsi) {
+ if (imsi != null && !imsi.equals("")) {
+ imsi = imsi.substring(0, 5);
+ for (String mccmnc : PLMN_TABLE_TYPE1) {
+ if (imsi.equals(mccmnc)) {
+ logd("[getUserType] Type1 user");
+ return TYPE1_USER;
+ }
+ }
+ for (String mccmnc : PLMN_TABLE_TYPE3) {
+ if (imsi.equals(mccmnc)) {
+ logd("[getUserType] Type3 user");
+ return TYPE3_USER;
+ }
+ }
+ logd("[getUserType] Type2 user");
+ return TYPE2_USER;
+ } else {
+ logd("[getUserType] null IMSI");
+ return UNKNOWN_USER;
+ }
+ }
+
+ private void resumeCampingProcedure(int slotId) {
+ logd("Resume camping slot" + slotId);
+ String plmnString = sNwPlmnStrings[0];
+ if (isAllowCampOn(plmnString, slotId)) {
+ removeModemStandByTimer();
+ sCi[slotId].setResumeRegistration(sSuspendId, null);
+ } else {
+ logd("Because: " + WorldPhoneUtil.denyReasonToString(sDenyReason));
+ if (sDenyReason == CAMP_ON_DENY_REASON_NEED_SWITCH_TO_FDD) {
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_FDD);
+ } else if (sDenyReason == CAMP_ON_DENY_REASON_NEED_SWITCH_TO_TDD) {
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_TDD);
+ }
+ }
+ }
+
+ private Runnable mTddStandByTimerRunnable = new Runnable() {
+ public void run() {
+ sTddStandByCounter++;
+ if (sTddStandByCounter >= TDD_STANDBY_TIMER.length) {
+ sTddStandByCounter = TDD_STANDBY_TIMER.length - 1;
+ }
+ logd("TDD time out!");
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_FDD);
+ }
+ };
+
+ private Runnable mFddStandByTimerRunnable = new Runnable() {
+ public void run() {
+ sFddStandByCounter++;
+ if (sFddStandByCounter >= FDD_STANDBY_TIMER.length) {
+ sFddStandByCounter = FDD_STANDBY_TIMER.length - 1;
+ }
+ logd("FDD time out!");
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_TDD);
+ }
+ };
+
+ private void removeModemStandByTimer() {
+ if (sWaitInTdd) {
+ logd("Remove TDD wait timer. Set sWaitInTdd = false");
+ sWaitInTdd = false;
+ removeCallbacks(mTddStandByTimerRunnable);
+ }
+ if (sWaitInFdd) {
+ logd("Remove FDD wait timer. Set sWaitInFdd = false");
+ sWaitInFdd = false;
+ removeCallbacks(mFddStandByTimerRunnable);
+ }
+ }
+
+ private void resetAllProperties() {
+ logd("[resetAllProperties]");
+ sNwPlmnStrings = null;
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ sFirstSelect[i] = true;
+ }
+ sDenyReason = CAMP_ON_DENY_REASON_UNKNOWN;
+ resetSimProperties();
+ resetNetworkProperties();
+ }
+
+ private void resetNetworkProperties() {
+ logd("[resetNetworkProperties]");
+ synchronized (sLock) {
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ sSuspendWaitImsi[i] = false;
+ }
+ }
+ }
+
+ private void resetSimProperties() {
+ logd("[resetSimProperties]");
+ synchronized (sLock) {
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ sImsi[i] = "";
+ sIccCardType[i] = ICC_CARD_TYPE_UNKNOWN;
+ }
+ sUserType = UNKNOWN_USER;
+ sMajorSim = WorldPhoneUtil.getMajorSim();
+ }
+ }
+
+ private void searchForDesignateService(String strPlmn) {
+ if (strPlmn == null) {
+ logd("[searchForDesignateService]- null source");
+ return;
+ }
+ strPlmn = strPlmn.substring(0, 5);
+ for (String mccmnc : PLMN_TABLE_TYPE1) {
+ if (strPlmn.equals(mccmnc)) {
+ logd("Find TD service");
+ logd("sUserType: " + sUserType + " sRegion: " + sRegion);
+ logd(ModemSwitchHandler.modemToString(ModemSwitchHandler.getActiveModemType()));
+ handleSwitchModem(ModemSwitchHandler.MD_TYPE_TDD);
+ break;
+ }
+ }
+
+ return;
+ }
+
+ public void setModemSelectionMode(int mode, int modemType) {
+ // Settings.Global.putInt(sContext.getContentResolver(),
+ // Settings.Global.WORLD_PHONE_AUTO_SELECT_MODE, mode);
+ if (mode == SELECTION_MODE_AUTO) {
+ logd("Modem Selection <AUTO>");
+ sMajorSim = WorldPhoneUtil.getMajorSim();
+ handleSimSwitched();
+ } else {
+ logd("Modem Selection <MANUAL>");
+ sMajorSim = AUTO_SWITCH_OFF;
+ handleSwitchModem(modemType);
+ }
+ }
+
+ private static void logd(String msg) {
+ Rlog.d(LOG_TAG, "[WPOM]" + msg);
+ }
+}
diff --git a/src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneUtil.java b/src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneUtil.java
new file mode 100755
index 0000000..f2c5b41
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneUtil.java
@@ -0,0 +1,246 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+package com.mediatek.internal.telephony.worldphone;
+
+import android.content.Context;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.telephony.PhoneRatFamily;
+import android.telephony.Rlog;
+import android.telephony.ServiceState;
+import android.telephony.TelephonyManager;
+
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneBase;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.PhoneProxy;
+import com.android.internal.telephony.TelephonyProperties;
+
+
+/**
+ *@hide
+ */
+public class WorldPhoneUtil implements IWorldPhone {
+ private static final int PROJECT_SIM_NUM = TelephonyManager.getDefault().getSimCount();
+ private static final boolean IS_WORLD_PHONE_SUPPORT = true; // (SystemProperties.getInt(TelephonyProperties.PROPERTY_WORLD_PHONE, 0) == 1);
+ private static final boolean IS_LTE_SUPPORT = (SystemProperties.getInt("ro.mtk_lte_support", 0) == 1);
+ private static Context sContext = null;
+ private static Phone sDefultPhone = null;
+ private static Phone[] sProxyPhones = null;
+ private static Phone[] sActivePhones = new Phone[PROJECT_SIM_NUM];
+
+ public WorldPhoneUtil() {
+ logd("Constructor invoked");
+ sDefultPhone = PhoneFactory.getDefaultPhone();
+ sProxyPhones = PhoneFactory.getPhones();
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ sActivePhones[i] = ((PhoneProxy) sProxyPhones[i]).getActivePhone();
+ }
+ if (sDefultPhone != null) {
+ sContext = sDefultPhone.getContext();
+ } else {
+ logd("DefaultPhone = null");
+ }
+ }
+
+ public static int getProjectSimNum() {
+ return PROJECT_SIM_NUM;
+ }
+
+ public static int getMajorSim() {
+ if (sProxyPhones == null) {
+ logd("[getMajorSim] sProxyPhones = null");
+ return DEFAULT_MAJOR_SIM;
+ }
+ for (int i = 0; i < PROJECT_SIM_NUM; i++) {
+ if ((((PhoneBase) sActivePhones[i]).getPhoneRatFamily()
+ & PhoneRatFamily.PHONE_RAT_FAMILY_3G) == PhoneRatFamily.PHONE_RAT_FAMILY_3G) {
+ logd("[getMajorSim]: " + i);
+ return i;
+ }
+ }
+ logd("[getMajorSim]: fail to get major SIM");
+
+ return DEFAULT_MAJOR_SIM;
+ }
+
+ public static int getModemSelectionMode() {
+ if (sContext == null) {
+ logd("sContext = null");
+ return SELECTION_MODE_AUTO;
+ }
+
+ logd("getModemSelectionMode: always auto!");
+ return SELECTION_MODE_AUTO;
+ /*
+ return Settings.Global.getInt(sContext.getContentResolver(),
+ Settings.Global.WORLD_PHONE_AUTO_SELECT_MODE, SELECTION_MODE_AUTO);
+ */
+ }
+
+ public static boolean isWorldPhoneSupport() {
+ return IS_WORLD_PHONE_SUPPORT;
+ }
+
+ public static boolean isLteSupport() {
+ return IS_LTE_SUPPORT;
+ }
+
+ public static String regionToString(int region) {
+ String regionString;
+ switch (region) {
+ case REGION_UNKNOWN:
+ regionString = "REGION_UNKNOWN";
+ break;
+ case REGION_DOMESTIC:
+ regionString = "REGION_DOMESTIC";
+ break;
+ case REGION_FOREIGN:
+ regionString = "REGION_FOREIGN";
+ break;
+ default:
+ regionString = "Invalid Region";
+ break;
+ }
+
+ return regionString;
+ }
+
+ public static String stateToString(int state) {
+ String stateString;
+ switch (state) {
+ case ServiceState.STATE_POWER_OFF:
+ stateString = "STATE_POWER_OFF";
+ break;
+ case ServiceState.STATE_IN_SERVICE:
+ stateString = "STATE_IN_SERVICE";
+ break;
+ case ServiceState.STATE_OUT_OF_SERVICE:
+ stateString = "STATE_OUT_OF_SERVICE";
+ break;
+ case ServiceState.STATE_EMERGENCY_ONLY:
+ stateString = "STATE_EMERGENCY_ONLY";
+ break;
+ default:
+ stateString = "Invalid State";
+ break;
+ }
+
+ return stateString;
+ }
+
+ public static String regStateToString(int regState) {
+ String rsString;
+ switch (regState) {
+ case ServiceState.REGISTRATION_STATE_NOT_REGISTERED_AND_NOT_SEARCHING:
+ rsString = "REGISTRATION_STATE_NOT_REGISTERED_AND_NOT_SEARCHING";
+ break;
+ case ServiceState.REGISTRATION_STATE_HOME_NETWORK:
+ rsString = "REGISTRATION_STATE_HOME_NETWORK";
+ break;
+ case ServiceState.REGISTRATION_STATE_NOT_REGISTERED_AND_SEARCHING:
+ rsString = "REGISTRATION_STATE_NOT_REGISTERED_AND_SEARCHING";
+ break;
+ case ServiceState.REGISTRATION_STATE_REGISTRATION_DENIED:
+ rsString = "REGISTRATION_STATE_REGISTRATION_DENIED";
+ break;
+ case ServiceState.REGISTRATION_STATE_UNKNOWN:
+ rsString = "REGISTRATION_STATE_UNKNOWN";
+ break;
+ case ServiceState.REGISTRATION_STATE_ROAMING:
+ rsString = "REGISTRATION_STATE_ROAMING";
+ break;
+ default:
+ rsString = "Invalid RegState";
+ break;
+ }
+
+ return rsString;
+ }
+
+ public static String denyReasonToString(int reason) {
+ String drString;
+ switch (reason) {
+ case CAMP_ON_NOT_DENIED:
+ drString = "CAMP_ON_NOT_DENIED";
+ break;
+ case CAMP_ON_DENY_REASON_UNKNOWN:
+ drString = "CAMP_ON_DENY_REASON_UNKNOWN";
+ break;
+ case CAMP_ON_DENY_REASON_NEED_SWITCH_TO_FDD:
+ drString = "CAMP_ON_DENY_REASON_NEED_SWITCH_TO_FDD";
+ break;
+ case CAMP_ON_DENY_REASON_NEED_SWITCH_TO_TDD:
+ drString = "CAMP_ON_DENY_REASON_NEED_SWITCH_TO_TDD";
+ break;
+ case CAMP_ON_DENY_REASON_DOMESTIC_FDD_MD:
+ drString = "CAMP_ON_DENY_REASON_DOMESTIC_FDD_MD";
+ break;
+ default:
+ drString = "Invalid Reason";
+ break;
+ }
+
+ return drString;
+ }
+
+ public static String iccCardTypeToString(int iccCardType) {
+ String iccTypeString;
+ switch (iccCardType) {
+ case ICC_CARD_TYPE_SIM:
+ iccTypeString = "SIM";
+ break;
+ case ICC_CARD_TYPE_USIM:
+ iccTypeString = "USIM";
+ break;
+ case ICC_CARD_TYPE_UNKNOWN:
+ iccTypeString = "Icc Card Type Unknown";
+ break;
+ default:
+ iccTypeString = "Invalid Icc Card Type";
+ break;
+ }
+
+ return iccTypeString;
+ }
+
+ public void setModemSelectionMode(int mode, int modemType) {
+ }
+
+ private static void logd(String msg) {
+ Rlog.d(LOG_TAG, "[WPP_UTIL]" + msg);
+ }
+}
diff --git a/src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneWrapper.java b/src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneWrapper.java
new file mode 100755
index 0000000..6f7c85f
--- /dev/null
+++ b/src/java/com/mediatek/internal/telephony/worldphone/WorldPhoneWrapper.java
@@ -0,0 +1,86 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+package com.mediatek.internal.telephony.worldphone;
+
+import android.os.SystemProperties;
+import android.telephony.Rlog;
+
+
+
+/**
+ *@hide
+ */
+public class WorldPhoneWrapper implements IWorldPhone {
+ private static int sOperatorSpec = -1;
+ private static IWorldPhone sWorldPhoneInstance = null;
+ private static WorldPhoneUtil sWorldPhoneUtil = null;
+
+ public WorldPhoneWrapper() {
+ }
+
+ public static IWorldPhone getWorldPhoneInstance() {
+ if (sWorldPhoneInstance == null) {
+ String optr = SystemProperties.get("ro.operator.optr");
+ if (optr != null && optr.equals("OP01")) {
+ // sOperatorSpec = POLICY_OP01;
+ logd("getWorldPhoneInstance: POLICY_OP01 not implemented!");
+ sOperatorSpec = POLICY_OM;
+ } else {
+ sOperatorSpec = POLICY_OM;
+ }
+ sWorldPhoneUtil = new WorldPhoneUtil();
+ if (sOperatorSpec == POLICY_OP01) {
+ // sWorldPhoneInstance = new WorldPhoneOp01();
+ } else if (sOperatorSpec == POLICY_OM) {
+ sWorldPhoneInstance = new WorldPhoneOm();
+ }
+ }
+ logd("sOperatorSpec: " + sOperatorSpec + ", isLteSupport: " + WorldPhoneUtil.isLteSupport());
+
+ return sWorldPhoneInstance;
+ }
+
+ public void setModemSelectionMode(int mode, int modemType) {
+ if (sOperatorSpec == POLICY_OP01 || sOperatorSpec == POLICY_OM) {
+ sWorldPhoneInstance.setModemSelectionMode(mode, modemType);
+ } else {
+ logd("Unknown World Phone Spec");
+ }
+ }
+
+ private static void logd(String msg) {
+ Rlog.d(LOG_TAG, "[WPO_WRAPPER]" + msg);
+ }
+}
--
1.9.1