Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- From 19044254448d50faed4427ae444ddc6c4717916f Mon Sep 17 00:00:00 2001
- From: olegsvs <oleg.texet@gmail.com>
- Date: Sun, 12 Jun 2016 13:19:03 -0400
- Subject: [PATCH] Patch for 6735 mtk
- Change-Id: Ia7d89678193394b3f54aff3463d62b7909bb18fb
- ---
- .../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 | 528 ++++-
- .../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, 8360 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..b84cb4d 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: {
- @@ -3900,6 +3915,7 @@ public class RIL extends BaseCommands implements CommandsInterface {
- dataCall.suggestedRetryTime = p.readInt();
- dataCall.cid = p.readInt();
- dataCall.active = p.readInt();
- + dataCall.mtu = p.readInt(); // fix for mobile data on MT6753 SoC
- dataCall.type = p.readString();
- dataCall.ifname = p.readString();
- if ((dataCall.status == DcFailCause.NONE.getErrorCode()) &&
- @@ -4378,6 +4394,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 +4417,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 +4498,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 +4684,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 +5104,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 +5331,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 b9432f1..aa5c1e6 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 850a33e..816aa81 100644
- --- a/src/java/com/android/internal/telephony/dataconnection/DcTrackerBase.java
- +++ b/src/java/com/android/internal/telephony/dataconnection/DcTrackerBase.java
- @@ -1807,7 +1807,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);
- @@ -1859,7 +1859,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 e2b8782..2cc6d07 100644
- --- a/src/java/com/android/internal/telephony/gsm/GsmMmiCode.java
- +++ b/src/java/com/android/internal/telephony/gsm/GsmMmiCode.java
- @@ -119,6 +119,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;
- @@ -143,6 +149,9 @@ public final class GsmMmiCode extends Handler implements MmiCode {
- CharSequence mMessage;
- private boolean mIsSsInfo = false;
- + //For ALPS01471897
- + private boolean mUserInitiatedMMI = false;
- + //end
- //***** Class Variables
- @@ -576,10 +585,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;
- @@ -782,6 +802,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 () {
- @@ -792,7 +842,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()) {
- @@ -1010,7 +1066,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;
- @@ -1020,11 +1079,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
- *
- @@ -1036,11 +1112,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
- *
- @@ -1060,6 +1136,7 @@ public final class GsmMmiCode extends Handler implements MmiCode {
- }
- }
- +
- void sendUssd(String ussdMessage) {
- // Treat this as a USSD string
- mIsPendingUSSD = true;
- @@ -1627,4 +1704,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..7e1d320
- --- /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..76d3f39
- --- /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
Add Comment
Please, Sign In to add comment