PageRenderTime 66ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/device/zte/warp2/overlay/frameworks/base/telephony/java/com/android/internal/telephony/ZTEQualcommRIL.java

https://github.com/Dm47021/Sugar-Kang-AOSP-JB
Java | 960 lines | 711 code | 139 blank | 110 comment | 86 complexity | 968bd550f1f90c2dac5f972a10493614 MD5 | raw file
Possible License(s): GPL-3.0, Apache-2.0
  1. /*
  2. * Copyright (C) 2011 The CyanogenMod Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.android.internal.telephony;
  17. import static com.android.internal.telephony.RILConstants.*;
  18. import android.content.Context;
  19. import android.os.AsyncResult;
  20. import android.os.Handler;
  21. import android.os.HandlerThread;
  22. import android.os.Looper;
  23. import android.os.Message;
  24. import android.os.Parcel;
  25. import android.telephony.SmsMessage;
  26. import android.os.SystemProperties;
  27. import android.text.TextUtils;
  28. import android.util.Log;
  29. import com.android.internal.telephony.RILConstants;
  30. import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
  31. import com.android.internal.telephony.cdma.CdmaInformationRecords;
  32. import java.util.ArrayList;
  33. /**
  34. * Qualcomm RIL class for basebands that do not send the SIM status
  35. * piggybacked in RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED. Instead,
  36. * these radios will send radio state and we have to query for SIM
  37. * status separately.
  38. * Custom Qualcomm No SimReady RIL for ZTE
  39. *
  40. * {@hide}
  41. */
  42. public class ZTEQualcommRIL extends RIL implements CommandsInterface {
  43. protected HandlerThread mIccThread;
  44. protected IccHandler mIccHandler;
  45. protected String mAid;
  46. protected int mPinState;
  47. boolean RILJ_LOGV = false;
  48. boolean RILJ_LOGD = true;
  49. private final int RIL_INT_RADIO_OFF = 0;
  50. private final int RIL_INT_RADIO_UNAVALIABLE = 1;
  51. private final int RIL_INT_RADIO_ON = 2;
  52. private final int RIL_INT_RADIO_ON_NG = 10;
  53. public ZTEQualcommRIL(Context context, int networkMode, int cdmaSubscription) {
  54. super(context, networkMode, cdmaSubscription);
  55. }
  56. @Override
  57. protected void
  58. processSolicited (Parcel p) {
  59. int serial, error;
  60. boolean found = false;
  61. serial = p.readInt();
  62. error = p.readInt();
  63. RILRequest rr;
  64. rr = findAndRemoveRequestFromList(serial);
  65. if (rr == null) {
  66. Log.w(LOG_TAG, "Unexpected solicited response! sn: "
  67. + serial + " error: " + error);
  68. return;
  69. }
  70. Object ret = null;
  71. if (error == 0 || p.dataAvail() > 0) {
  72. /* Convert RIL_REQUEST_GET_MODEM_VERSION back */
  73. if (SystemProperties.get("ro.cm.device").indexOf("e73") == 0 &&
  74. rr.mRequest == 220) {
  75. rr.mRequest = RIL_REQUEST_BASEBAND_VERSION;
  76. }
  77. // either command succeeds or command fails but with data payload
  78. try {switch (rr.mRequest) {
  79. /*
  80. cat libs/telephony/ril_commands.h \
  81. | egrep "^ *{RIL_" \
  82. | sed -re 's/\{([^,]+),[^,]+,([^}]+).+/case \1: ret = \2(p); break;/'
  83. */
  84. case RIL_REQUEST_GET_SIM_STATUS: ret = responseIccCardStatus(p); break;
  85. case RIL_REQUEST_ENTER_SIM_PIN: ret = responseInts(p); break;
  86. case RIL_REQUEST_ENTER_SIM_PUK: ret = responseInts(p); break;
  87. case RIL_REQUEST_ENTER_SIM_PIN2: ret = responseInts(p); break;
  88. case RIL_REQUEST_ENTER_SIM_PUK2: ret = responseInts(p); break;
  89. case RIL_REQUEST_CHANGE_SIM_PIN: ret = responseInts(p); break;
  90. case RIL_REQUEST_CHANGE_SIM_PIN2: ret = responseInts(p); break;
  91. case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: ret = responseInts(p); break;
  92. case RIL_REQUEST_GET_CURRENT_CALLS: ret = responseCallList(p); break;
  93. case RIL_REQUEST_DIAL: ret = responseVoid(p); break;
  94. case RIL_REQUEST_GET_IMSI: ret = responseString(p); break;
  95. case RIL_REQUEST_HANGUP: ret = responseVoid(p); break;
  96. case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: ret = responseVoid(p); break;
  97. case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: ret = responseVoid(p); break;
  98. case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: ret = responseVoid(p); break;
  99. case RIL_REQUEST_CONFERENCE: ret = responseVoid(p); break;
  100. case RIL_REQUEST_UDUB: ret = responseVoid(p); break;
  101. case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: ret = responseInts(p); break;
  102. case RIL_REQUEST_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break;
  103. case RIL_REQUEST_VOICE_REGISTRATION_STATE: ret = responseStrings(p); break;
  104. case RIL_REQUEST_DATA_REGISTRATION_STATE: ret = responseStrings(p); break;
  105. case RIL_REQUEST_OPERATOR: ret = responseStrings(p); break;
  106. case RIL_REQUEST_RADIO_POWER: ret = responseVoid(p); break;
  107. case RIL_REQUEST_DTMF: ret = responseVoid(p); break;
  108. case RIL_REQUEST_SEND_SMS: ret = responseSMS(p); break;
  109. case RIL_REQUEST_SEND_SMS_EXPECT_MORE: ret = responseSMS(p); break;
  110. case RIL_REQUEST_SETUP_DATA_CALL: ret = responseSetupDataCall(p); break;
  111. case RIL_REQUEST_SIM_IO: ret = responseICC_IO(p); break;
  112. case RIL_REQUEST_SEND_USSD: ret = responseVoid(p); break;
  113. case RIL_REQUEST_CANCEL_USSD: ret = responseVoid(p); break;
  114. case RIL_REQUEST_GET_CLIR: ret = responseInts(p); break;
  115. case RIL_REQUEST_SET_CLIR: ret = responseVoid(p); break;
  116. case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: ret = responseCallForward(p); break;
  117. case RIL_REQUEST_SET_CALL_FORWARD: ret = responseVoid(p); break;
  118. case RIL_REQUEST_QUERY_CALL_WAITING: ret = responseInts(p); break;
  119. case RIL_REQUEST_SET_CALL_WAITING: ret = responseVoid(p); break;
  120. case RIL_REQUEST_SMS_ACKNOWLEDGE: ret = responseVoid(p); break;
  121. case RIL_REQUEST_GET_IMEI: ret = responseString(p); break;
  122. case RIL_REQUEST_GET_IMEISV: ret = responseString(p); break;
  123. case RIL_REQUEST_ANSWER: ret = responseVoid(p); break;
  124. case RIL_REQUEST_DEACTIVATE_DATA_CALL: ret = responseVoid(p); break;
  125. case RIL_REQUEST_QUERY_FACILITY_LOCK: ret = responseInts(p); break;
  126. case RIL_REQUEST_SET_FACILITY_LOCK: ret = responseInts(p); break;
  127. case RIL_REQUEST_CHANGE_BARRING_PASSWORD: ret = responseVoid(p); break;
  128. case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: ret = responseInts(p); break;
  129. case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: ret = responseVoid(p); break;
  130. case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: ret = responseVoid(p); break;
  131. case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : ret = responseOperatorInfos(p); break;
  132. case RIL_REQUEST_DTMF_START: ret = responseVoid(p); break;
  133. case RIL_REQUEST_DTMF_STOP: ret = responseVoid(p); break;
  134. case RIL_REQUEST_BASEBAND_VERSION: ret = responseString(p); break;
  135. case RIL_REQUEST_SEPARATE_CONNECTION: ret = responseVoid(p); break;
  136. case RIL_REQUEST_SET_MUTE: ret = responseVoid(p); break;
  137. case RIL_REQUEST_GET_MUTE: ret = responseInts(p); break;
  138. case RIL_REQUEST_QUERY_CLIP: ret = responseInts(p); break;
  139. case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: ret = responseInts(p); break;
  140. case RIL_REQUEST_DATA_CALL_LIST: ret = responseDataCallList(p); break;
  141. case RIL_REQUEST_RESET_RADIO: ret = responseVoid(p); break;
  142. case RIL_REQUEST_OEM_HOOK_RAW: ret = responseRaw(p); break;
  143. case RIL_REQUEST_OEM_HOOK_STRINGS: ret = responseStrings(p); break;
  144. case RIL_REQUEST_SCREEN_STATE: ret = responseVoid(p); break;
  145. case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: ret = responseVoid(p); break;
  146. case RIL_REQUEST_WRITE_SMS_TO_SIM: ret = responseInts(p); break;
  147. case RIL_REQUEST_DELETE_SMS_ON_SIM: ret = responseVoid(p); break;
  148. case RIL_REQUEST_SET_BAND_MODE: ret = responseVoid(p); break;
  149. case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: ret = responseInts(p); break;
  150. case RIL_REQUEST_STK_GET_PROFILE: ret = responseString(p); break;
  151. case RIL_REQUEST_STK_SET_PROFILE: ret = responseVoid(p); break;
  152. case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: ret = responseString(p); break;
  153. case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: ret = responseVoid(p); break;
  154. case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: ret = responseInts(p); break;
  155. case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: ret = responseVoid(p); break;
  156. case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: ret = responseVoid(p); break;
  157. case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: ret = responseGetPreferredNetworkType(p); break;
  158. case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: ret = responseCellList(p); break;
  159. case RIL_REQUEST_SET_LOCATION_UPDATES: ret = responseVoid(p); break;
  160. case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: ret = responseVoid(p); break;
  161. case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: ret = responseVoid(p); break;
  162. case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: ret = responseInts(p); break;
  163. case RIL_REQUEST_SET_TTY_MODE: ret = responseVoid(p); break;
  164. case RIL_REQUEST_QUERY_TTY_MODE: ret = responseInts(p); break;
  165. case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: ret = responseVoid(p); break;
  166. case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: ret = responseInts(p); break;
  167. case RIL_REQUEST_CDMA_FLASH: ret = responseVoid(p); break;
  168. case RIL_REQUEST_CDMA_BURST_DTMF: ret = responseVoid(p); break;
  169. case RIL_REQUEST_CDMA_SEND_SMS: ret = responseSMS(p); break;
  170. case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: ret = responseVoid(p); break;
  171. case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: ret = responseGmsBroadcastConfig(p); break;
  172. case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: ret = responseVoid(p); break;
  173. case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: ret = responseVoid(p); break;
  174. case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: ret = responseCdmaBroadcastConfig(p); break;
  175. case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: ret = responseVoid(p); break;
  176. case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: ret = responseVoid(p); break;
  177. case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: ret = responseVoid(p); break;
  178. case RIL_REQUEST_CDMA_SUBSCRIPTION: ret = responseStrings(p); break;
  179. case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: ret = responseInts(p); break;
  180. case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: ret = responseVoid(p); break;
  181. case RIL_REQUEST_DEVICE_IDENTITY: ret = responseStrings(p); break;
  182. case RIL_REQUEST_GET_SMSC_ADDRESS: ret = responseString(p); break;
  183. case RIL_REQUEST_SET_SMSC_ADDRESS: ret = responseVoid(p); break;
  184. case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break;
  185. case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: ret = responseVoid(p); break;
  186. case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: ret = responseVoid(p); break;
  187. /*case 104: ret = responseInts(p); break; // RIL_REQUEST_VOICE_RADIO_TECH
  188. case 105: ret = responseInts(p); break; // RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE
  189. case 106: ret = responseStrings(p); break; // RIL_REQUEST_CDMA_PRL_VERSION
  190. case 107: ret = responseInts(p); break; // RIL_REQUEST_IMS_REGISTRATION_STATE
  191. case 108: ret = responseSMS(p); break; // RIL_REQUEST_IMS_SEND_SMS*/
  192. case 104: ret = responseInts(p); break; // RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE
  193. case 105: ret = responseInts(p); break; // RIL_REQUEST_VOICE_RADIO_TECH
  194. case 106: ret = responseInts(p); break; // RIL_REQUEST_IMS_REGISTRATION_STATE
  195. case 107: ret = responseSMS(p); break; // RIL_REQUEST_IMS_SEND_SMS
  196. case 108: ret = responseInts(p); break; // RIL_REQUEST_GET_DATA_CALL_PROFILE
  197. case 109: ret = responseVoid(p); break; // RIL_REQUEST_SET_UICC_SUBSCRIPTION_SOURCE
  198. case 110: ret = responseVoid(p); break; // RIL_REQUEST_SET_DATA_SUBSCRIPTION_SOURCE
  199. case 111: ret = responseInts(p); break; // RIL_REQUEST_GET_UICC_SUBSCRIPTION_SOURCE
  200. case 112: ret = responseInts(p); break; // RIL_REQUEST_GET_DATA_SUBSCRIPTION_SOURCE
  201. case 113: ret = responseVoid(p); break; // RIL_REQUEST_SET_SUBSCRIPTION_MODE
  202. case 114: ret = responseVoid(p); break; // RIL_REQUEST_SET_TRANSMIT_POWER
  203. case 115: ret = responseVoid(p); break; // RIL_REQUEST_ZTE_NETWORK_UNLOCK
  204. case 116: ret = responseInts(p); break; // RIL_REQUEST_ZTE_GET_PREF_ONLY
  205. case 117: ret = responseString(p); break; // RIL_REQUEST_ZTE_BAND_SETTING
  206. case 118: ret = responseInts(p); break; // RIL_REQUEST_ZTE_GET_CDMA_CURRENT_STATE
  207. default:
  208. throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest);
  209. //break;
  210. }} catch (Throwable tr) {
  211. // Exceptions here usually mean invalid RIL responses
  212. Log.w(LOG_TAG, rr.serialString() + "< "
  213. + requestToString(rr.mRequest)
  214. + " exception, possible invalid RIL response", tr);
  215. if (rr.mResult != null) {
  216. AsyncResult.forMessage(rr.mResult, null, tr);
  217. rr.mResult.sendToTarget();
  218. }
  219. rr.release();
  220. return;
  221. }
  222. }
  223. if (error != 0) {
  224. rr.onError(error, ret);
  225. rr.release();
  226. return;
  227. }
  228. if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
  229. + " " + retToString(rr.mRequest, ret));
  230. if (rr.mResult != null) {
  231. AsyncResult.forMessage(rr.mResult, ret, null);
  232. rr.mResult.sendToTarget();
  233. }
  234. rr.release();
  235. }
  236. @Override
  237. protected void
  238. processUnsolicited (Parcel p) {
  239. Object ret;
  240. int dataPosition = p.dataPosition(); // save off position within the Parcel
  241. int response = p.readInt();
  242. switch(response) {
  243. case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: ret = responseVoid(p);
  244. //case 1031: ret = responseVoid(p); break;
  245. //case 1032: ret = responseInts(p); break;
  246. case 1033: ret = responseVoid(p); break;
  247. case 1034: ret = responseInts(p); break; // RIL_UNSOL_VOICE_RADIO_TECH_CHANGED
  248. case 1035: ret = responseVoid(p); break; // RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED
  249. case 1036: ret = responseInts(p); break; // RIL_UNSOL_RESPONSE_TETHERED_MODE_STATE_CHANGED
  250. case 1037: ret = responseVoid(p); break; // RIL_UNSOL_RESPONSE_DATA_NETWORK_STATE_CHANGED
  251. case 1038: ret = responseString(p); break; // RIL_UNSOL_ON_SS
  252. case 1039: ret = responseString(p); break; // RIL_UNSOL_STK_CC_ALPHA_NOTIFY
  253. case 1040: ret = responseInts(p); break; // RIL_UNSOL_SUBSCRIPTION_READY
  254. case 1041: ret = responseInts(p); break; // RIL_UNSOL_ZTE_NETWORK_LOCK_STATE
  255. case 1042: ret = responseInts(p); break; // RIL_UNSOL_ZTE_MIP_STATUS
  256. case 1043: ret = responseInts(p); break; // RILC
  257. /*case 1034: ret = responseInts(p); break; // RIL_UNSOL_VOICE_RADIO_TECH_CHANGED
  258. case 1035: ret = responseVoid(p); break; // RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED
  259. case 1036: ret = responseInts(p); break; // RIL_UNSOL_RESPONSE_TETHERED_MODE_STATE_CHANGED
  260. case 1037: ret = responseVoid(p); break; // RIL_UNSOL_RESPONSE_DATA_NETWORK_STATE_CHANGED
  261. case 1038: ret = responseString(p); break; // RIL_UNSOL_ON_SS
  262. case 1039: ret = responseString(p); break; // RIL_UNSOL_STK_CC_ALPHA_NOTIFY
  263. case 1040: ret = responseInts(p); break; // RIL_UNSOL_SUBSCRIPTION_READY
  264. case 1041: ret = responseInts(p); break; // RIL_UNSOL_ZTE_NETWORK_LOCK_STATE
  265. case 1042: ret = responseInts(p); break; // RIL_UNSOL_ZTE_MIP_STATUS
  266. case 1043: ret = responseInts(p); break; // RILC*/
  267. default:
  268. // Rewind the Parcel
  269. p.setDataPosition(dataPosition);
  270. // Forward responses that we are not overriding to the super class
  271. super.processUnsolicited(p);
  272. return;
  273. }
  274. switch(response) {
  275. case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
  276. int state = p.readInt();
  277. setRadioStateFromRILInt(state);
  278. break;
  279. /*case 1034:
  280. if (RILJ_LOGD) unsljLogRet(response, ret);
  281. if (mVoiceRadioTechChangedRegistrants != null) {
  282. mVoiceRadioTechChangedRegistrants.notifyRegistrants(
  283. new AsyncResult(null, ret, null));
  284. }
  285. break;*/
  286. /*case 1035:
  287. if (RILJ_LOGD) unsljLog(response);
  288. mImsNetworkStateChangedRegistrants
  289. .notifyRegistrants(new AsyncResult(null, null, null));
  290. break;*/
  291. /*case 1036:
  292. if (RILJ_LOGD) unsljLogvRet(response, ret);
  293. if (mTetheredModeStateRegistrants != null) {
  294. if (ret != null) {
  295. mTetheredModeStateRegistrants.notifyRegistrants(
  296. new AsyncResult (null, ret, null));
  297. } else {
  298. Log.e(LOG_TAG, "null returned, expected non-null");
  299. }
  300. }
  301. break;*/
  302. //case 1037:
  303. //if (RILJ_LOGD)unsljLog(response);
  304. //mDataNetworkStateRegistrants.notifyRegistrants(new AsyncResult(null, null, null));
  305. // break;
  306. /*case 1039:
  307. if (RILJ_LOGD) unsljLogRet(response, ret);
  308. if (mCatCcAlphaRegistrant != null) {
  309. mCatCcAlphaRegistrant.notifyRegistrant(
  310. new AsyncResult (null, ret, null));
  311. }
  312. break;*/
  313. case 1043:
  314. if (RILJ_LOGD) unsljLogRet(response, ret);
  315. setRadioPower(false, null);
  316. setPreferredNetworkType(mPreferredNetworkType, null);
  317. setCdmaSubscriptionSource(mCdmaSubscription, null);
  318. notifyRegistrantsRilConnectionChanged(((int[])ret)[0]);
  319. break;
  320. //case 1031:
  321. //case 1032:
  322. case 1033:
  323. case 1034:
  324. case 1035:
  325. case 1036:
  326. case 1037:
  327. case 1038:
  328. case 1039:
  329. case 1040:
  330. case 1041:
  331. case 1042:
  332. break;
  333. }
  334. }
  335. private void notifyRegistrantsRilConnectionChanged(int rilVer) {
  336. mRilVersion = rilVer;
  337. if (mRilConnectedRegistrants != null) {
  338. mRilConnectedRegistrants.notifyRegistrants(
  339. new AsyncResult (null, new Integer(rilVer), null));
  340. }
  341. }
  342. private void setRadioStateFromRILInt (int stateCode) {
  343. CommandsInterface.RadioState radioState;
  344. HandlerThread handlerThread;
  345. Looper looper;
  346. IccHandler iccHandler;
  347. switch (stateCode) {
  348. case RIL_INT_RADIO_OFF:
  349. radioState = CommandsInterface.RadioState.RADIO_OFF;
  350. if (mIccHandler != null) {
  351. mIccThread = null;
  352. mIccHandler = null;
  353. }
  354. break;
  355. case RIL_INT_RADIO_UNAVALIABLE:
  356. radioState = CommandsInterface.RadioState.RADIO_UNAVAILABLE;
  357. break;
  358. case RIL_INT_RADIO_ON:
  359. case RIL_INT_RADIO_ON_NG:
  360. if (mIccHandler == null) {
  361. handlerThread = new HandlerThread("IccHandler");
  362. mIccThread = handlerThread;
  363. mIccThread.start();
  364. looper = mIccThread.getLooper();
  365. mIccHandler = new IccHandler(this,looper);
  366. mIccHandler.run();
  367. }
  368. if (mPhoneType == RILConstants.CDMA_PHONE) {
  369. radioState = CommandsInterface.RadioState.RUIM_NOT_READY;
  370. } else {
  371. radioState = CommandsInterface.RadioState.SIM_NOT_READY;
  372. }
  373. setRadioState(radioState);
  374. break;
  375. default:
  376. throw new RuntimeException("Unrecognized RIL_RadioState: " + stateCode);
  377. }
  378. setRadioState (radioState);
  379. }
  380. class IccHandler extends Handler implements Runnable {
  381. private static final int EVENT_RADIO_ON = 1;
  382. private static final int EVENT_ICC_STATUS_CHANGED = 2;
  383. private static final int EVENT_GET_ICC_STATUS_DONE = 3;
  384. private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 4;
  385. private RIL mRil;
  386. private boolean mRadioOn = false;
  387. public IccHandler (RIL ril, Looper looper) {
  388. super (looper);
  389. mRil = ril;
  390. }
  391. public void handleMessage (Message paramMessage) {
  392. switch (paramMessage.what) {
  393. case EVENT_RADIO_ON:
  394. mRadioOn = true;
  395. Log.d(LOG_TAG, "Radio on -> Forcing sim status update");
  396. sendMessage(obtainMessage(EVENT_ICC_STATUS_CHANGED));
  397. break;
  398. case EVENT_GET_ICC_STATUS_DONE:
  399. AsyncResult asyncResult = (AsyncResult) paramMessage.obj;
  400. if (asyncResult.exception != null) {
  401. Log.e (LOG_TAG, "IccCardStatusDone shouldn't return exceptions!", asyncResult.exception);
  402. break;
  403. }
  404. IccCardStatus status = (IccCardStatus) asyncResult.result;
  405. if (status.getNumApplications() == 0) {
  406. if (!mRil.getRadioState().isOn()) {
  407. break;
  408. }
  409. if (mPhoneType == RILConstants.CDMA_PHONE) {
  410. mRil.setRadioState(CommandsInterface.RadioState.RUIM_LOCKED_OR_ABSENT);
  411. } else {
  412. mRil.setRadioState(CommandsInterface.RadioState.SIM_LOCKED_OR_ABSENT);
  413. }
  414. } else {
  415. int appIndex = -1;
  416. if (mPhoneType == RILConstants.CDMA_PHONE) {
  417. appIndex = status.getCdmaSubscriptionAppIndex();
  418. Log.d(LOG_TAG, "This is a CDMA PHONE " + appIndex);
  419. } else {
  420. appIndex = status.getGsmUmtsSubscriptionAppIndex();
  421. Log.d(LOG_TAG, "This is a GSM PHONE " + appIndex);
  422. }
  423. IccCardApplication application = status.getApplication(appIndex);
  424. IccCardApplication.AppState app_state = application.app_state;
  425. IccCardApplication.AppType app_type = application.app_type;
  426. switch (app_state) {
  427. case APPSTATE_PIN:
  428. case APPSTATE_PUK:
  429. switch (app_type) {
  430. case APPTYPE_SIM:
  431. case APPTYPE_USIM:
  432. mRil.setRadioState(CommandsInterface.RadioState.SIM_LOCKED_OR_ABSENT);
  433. break;
  434. case APPTYPE_RUIM:
  435. mRil.setRadioState(CommandsInterface.RadioState.RUIM_LOCKED_OR_ABSENT);
  436. break;
  437. default:
  438. Log.e(LOG_TAG, "Currently we don't handle SIMs of type: " + app_type);
  439. return;
  440. }
  441. break;
  442. case APPSTATE_READY:
  443. switch (app_type) {
  444. case APPTYPE_SIM:
  445. case APPTYPE_USIM:
  446. mRil.setRadioState(CommandsInterface.RadioState.SIM_READY);
  447. break;
  448. case APPTYPE_RUIM:
  449. mRil.setRadioState(CommandsInterface.RadioState.RUIM_READY);
  450. break;
  451. default:
  452. Log.e(LOG_TAG, "Currently we don't handle SIMs of type: " + app_type);
  453. return;
  454. }
  455. break;
  456. default:
  457. return;
  458. }
  459. }
  460. break;
  461. case EVENT_ICC_STATUS_CHANGED:
  462. if (mRadioOn) {
  463. Log.d(LOG_TAG, "Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus");
  464. mRil.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE, paramMessage.obj));
  465. } else {
  466. Log.d(LOG_TAG, "Received EVENT_ICC_STATUS_CHANGED while radio is not ON. Ignoring");
  467. }
  468. break;
  469. case EVENT_RADIO_OFF_OR_UNAVAILABLE:
  470. mRadioOn = false;
  471. // disposeCards(); // to be verified;
  472. default:
  473. Log.e(LOG_TAG, " Unknown Event " + paramMessage.what);
  474. break;
  475. }
  476. }
  477. public void run () {
  478. mRil.registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, null);
  479. Message msg = obtainMessage(EVENT_RADIO_ON);
  480. mRil.getIccCardStatus(msg);
  481. }
  482. }
  483. @Override
  484. public void
  485. supplyIccPin(String pin, Message result) {
  486. //Note: This RIL request has not been renamed to ICC,
  487. // but this request is also valid for SIM and RUIM
  488. RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PIN, result);
  489. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
  490. rr.mp.writeString(mAid);
  491. rr.mp.writeString(pin);
  492. send(rr);
  493. }
  494. @Override
  495. public void
  496. supplyIccPuk(String puk, String newPin, Message result) {
  497. //Note: This RIL request has not been renamed to ICC,
  498. // but this request is also valid for SIM and RUIM
  499. RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PUK, result);
  500. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
  501. rr.mp.writeString(mAid);
  502. rr.mp.writeString(puk);
  503. rr.mp.writeString(newPin);
  504. send(rr);
  505. }
  506. @Override
  507. public void
  508. supplyIccPin2(String pin, Message result) {
  509. //Note: This RIL request has not been renamed to ICC,
  510. // but this request is also valid for SIM and RUIM
  511. RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PIN2, result);
  512. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
  513. rr.mp.writeString(mAid);
  514. rr.mp.writeString(pin);
  515. send(rr);
  516. }
  517. @Override
  518. public void
  519. supplyIccPuk2(String puk, String newPin2, Message result) {
  520. //Note: This RIL request has not been renamed to ICC,
  521. // but this request is also valid for SIM and RUIM
  522. RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PUK2, result);
  523. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
  524. rr.mp.writeString(mAid);
  525. rr.mp.writeString(puk);
  526. rr.mp.writeString(newPin2);
  527. send(rr);
  528. }
  529. @Override
  530. public void
  531. changeIccPin(String oldPin, String newPin, Message result) {
  532. //Note: This RIL request has not been renamed to ICC,
  533. // but this request is also valid for SIM and RUIM
  534. RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_SIM_PIN, result);
  535. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
  536. rr.mp.writeString(mAid);
  537. rr.mp.writeString(oldPin);
  538. rr.mp.writeString(newPin);
  539. send(rr);
  540. }
  541. @Override
  542. public void
  543. changeIccPin2(String oldPin2, String newPin2, Message result) {
  544. //Note: This RIL request has not been renamed to ICC,
  545. // but this request is also valid for SIM and RUIM
  546. RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_SIM_PIN2, result);
  547. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
  548. rr.mp.writeString(mAid);
  549. rr.mp.writeString(oldPin2);
  550. rr.mp.writeString(newPin2);
  551. send(rr);
  552. }
  553. @Override
  554. public void
  555. supplyNetworkDepersonalization(String netpin, Message result) {
  556. RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, result);
  557. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
  558. rr.mp.writeInt(3);
  559. rr.mp.writeString(netpin);
  560. send(rr);
  561. }
  562. @Override
  563. public void
  564. getIMSI(Message result) {
  565. RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_IMSI, result);
  566. rr.mp.writeString(mAid);
  567. if (RILJ_LOGD) riljLog(rr.serialString() +
  568. "> getIMSI:RIL_REQUEST_GET_IMSI " +
  569. RIL_REQUEST_GET_IMSI +
  570. " aid: " + mAid +
  571. " " + requestToString(rr.mRequest));
  572. send(rr);
  573. }
  574. @Override
  575. public void
  576. setupDataCall(String radioTechnology, String profile, String apn,
  577. String user, String password, String authType, String ipVersion,
  578. Message result) {
  579. RILRequest rr
  580. = RILRequest.obtain(RIL_REQUEST_SETUP_DATA_CALL, result);
  581. rr.mp.writeInt(7);
  582. rr.mp.writeString(radioTechnology);
  583. rr.mp.writeString(profile);
  584. rr.mp.writeString(apn);
  585. rr.mp.writeString(user);
  586. rr.mp.writeString(password);
  587. rr.mp.writeString(authType);
  588. rr.mp.writeString("IP"); // ipVersion
  589. if (RILJ_LOGD) riljLog(rr.serialString() + "> "
  590. + requestToString(rr.mRequest) + " " + radioTechnology + " "
  591. + profile + " " + apn + " " + user + " "
  592. + password + " " + authType + " " + ipVersion);
  593. send(rr);
  594. }
  595. @Override
  596. public void
  597. iccIO (int command, int fileid, String path, int p1, int p2, int p3,
  598. String data, String pin2, Message result) {
  599. //Note: This RIL request has not been renamed to ICC,
  600. // but this request is also valid for SIM and RUIM
  601. RILRequest rr
  602. = RILRequest.obtain(RIL_REQUEST_SIM_IO, result);
  603. rr.mp.writeString(mAid);
  604. rr.mp.writeInt(command);
  605. rr.mp.writeInt(fileid);
  606. rr.mp.writeString(path);
  607. rr.mp.writeInt(p1);
  608. rr.mp.writeInt(p2);
  609. rr.mp.writeInt(p3);
  610. rr.mp.writeString(data);
  611. rr.mp.writeString(pin2);
  612. if (RILJ_LOGD) riljLog(rr.serialString() + "> iccIO: "
  613. + " aid: " + mAid + " "
  614. + requestToString(rr.mRequest)
  615. + " 0x" + Integer.toHexString(command)
  616. + " 0x" + Integer.toHexString(fileid) + " "
  617. + " path: " + path + ","
  618. + p1 + "," + p2 + "," + p3);
  619. send(rr);
  620. }
  621. @Override
  622. public void
  623. setNetworkSelectionModeManual(String operatorNumeric, Message response) {
  624. RILRequest rr
  625. = RILRequest.obtain(RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
  626. response);
  627. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
  628. + " " + operatorNumeric);
  629. rr.mp.writeInt(2);
  630. rr.mp.writeString(operatorNumeric);
  631. rr.mp.writeString("NOCHANGE");
  632. send(rr);
  633. }
  634. @Override
  635. public void
  636. queryFacilityLock (String facility, String password, int serviceClass,
  637. Message response) {
  638. RILRequest rr = RILRequest.obtain(RIL_REQUEST_QUERY_FACILITY_LOCK, response);
  639. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
  640. + " aid: " + mAid + " facility: " + facility);
  641. if (facility.equals("SC") &&
  642. SystemProperties.get("ro.cm.device").indexOf("e73") == 0) {
  643. int [] iccstatus = new int[1];
  644. iccstatus[0] = mPinState;
  645. AsyncResult.forMessage(response, iccstatus, null);
  646. response.sendToTarget();
  647. } else {
  648. // count strings
  649. rr.mp.writeInt(4);
  650. rr.mp.writeString(mAid);
  651. rr.mp.writeString(facility);
  652. rr.mp.writeString(password);
  653. rr.mp.writeString(Integer.toString(serviceClass));
  654. send(rr);
  655. }
  656. }
  657. @Override
  658. public void
  659. setFacilityLock (String facility, boolean lockState, String password,
  660. int serviceClass, Message response) {
  661. String lockString;
  662. RILRequest rr
  663. = RILRequest.obtain(RIL_REQUEST_SET_FACILITY_LOCK, response);
  664. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
  665. + " aid: " + mAid + " facility: " + facility
  666. + " lockstate: " + lockState);
  667. // count strings
  668. rr.mp.writeInt(5);
  669. rr.mp.writeString(mAid);
  670. rr.mp.writeString(facility);
  671. lockString = (lockState)?"1":"0";
  672. rr.mp.writeString(lockString);
  673. rr.mp.writeString(password);
  674. rr.mp.writeString(Integer.toString(serviceClass));
  675. send(rr);
  676. }
  677. @Override
  678. protected Object
  679. responseIccCardStatus(Parcel p) {
  680. IccCardApplication ca;
  681. IccCardStatus status = new IccCardStatus();
  682. status.setCardState(p.readInt());
  683. status.setUniversalPinState(p.readInt());
  684. int gsmUmtsSubscriptionAppCount = p.readInt();
  685. for (int i = 0; i < gsmUmtsSubscriptionAppCount; i++) {
  686. if (i == 0)
  687. status.setGsmUmtsSubscriptionAppIndex(p.readInt());
  688. else
  689. p.readInt();
  690. }
  691. int cdmaSubscriptionAppCount = p.readInt();
  692. for (int i = 0; i < cdmaSubscriptionAppCount; i++) {
  693. if (i == 0)
  694. status.setCdmaSubscriptionAppIndex(p.readInt());
  695. else
  696. p.readInt();
  697. }
  698. int numApplications = p.readInt();
  699. // limit to maximum allowed applications
  700. if (numApplications > IccCardStatus.CARD_MAX_APPS) {
  701. numApplications = IccCardStatus.CARD_MAX_APPS;
  702. }
  703. status.setNumApplications(numApplications);
  704. for (int i = 0 ; i < numApplications ; i++) {
  705. ca = new IccCardApplication();
  706. ca.app_type = ca.AppTypeFromRILInt(p.readInt());
  707. ca.app_state = ca.AppStateFromRILInt(p.readInt());
  708. ca.perso_substate = ca.PersoSubstateFromRILInt(p.readInt());
  709. ca.aid = p.readString();
  710. ca.app_label = p.readString();
  711. ca.pin1_replaced = p.readInt();
  712. ca.pin1 = ca.PinStateFromRILInt(p.readInt());
  713. ca.pin2 = ca.PinStateFromRILInt(p.readInt());
  714. status.addApplication(ca);
  715. p.readInt();
  716. p.readInt();
  717. p.readInt();
  718. p.readInt();
  719. }
  720. int appIndex = -1;
  721. if (mPhoneType == RILConstants.CDMA_PHONE) {
  722. appIndex = status.getCdmaSubscriptionAppIndex();
  723. Log.d(LOG_TAG, "This is a CDMA PHONE " + appIndex);
  724. } else {
  725. appIndex = status.getGsmUmtsSubscriptionAppIndex();
  726. Log.d(LOG_TAG, "This is a GSM PHONE " + appIndex);
  727. }
  728. IccCardApplication application = status.getApplication(appIndex);
  729. mAid = application.aid;
  730. mPinState = (application.pin1 == IccCardStatus.PinState.PINSTATE_DISABLED ||
  731. application.pin1 == IccCardStatus.PinState.PINSTATE_UNKNOWN) ? 0 : 1;
  732. return status;
  733. }
  734. @Override
  735. protected DataCallState getDataCallState(Parcel p, int version) {
  736. DataCallState dataCall = new DataCallState();
  737. boolean oldRil = needsOldRilFeature("datacall");
  738. if (!oldRil)
  739. return super.getDataCallState(p, version);
  740. dataCall.version = 3; // was dataCall.version = version;
  741. dataCall.cid = p.readInt();
  742. dataCall.active = p.readInt();
  743. dataCall.type = p.readString();
  744. p.readString(); // apn
  745. String addresses = p.readString();
  746. if (!TextUtils.isEmpty(addresses)) {
  747. dataCall.addresses = addresses.split(" ");
  748. }
  749. dataCall.ifname = "rmnet0";
  750. p.readInt(); // RadioTechnology
  751. p.readInt(); // inactiveReason
  752. dataCall.dnses = new String[2];
  753. dataCall.dnses[0] = SystemProperties.get("net."+dataCall.ifname+".dns1");
  754. dataCall.dnses[1] = SystemProperties.get("net."+dataCall.ifname+".dns2");
  755. return dataCall;
  756. }
  757. @Override
  758. protected Object
  759. responseSetupDataCall(Parcel p) {
  760. DataCallState dataCall;
  761. boolean oldRil = needsOldRilFeature("datacall");
  762. if (!oldRil)
  763. return super.responseSetupDataCall(p);
  764. dataCall = new DataCallState();
  765. dataCall.version = 3;
  766. dataCall.cid = 0; // Integer.parseInt(p.readString());
  767. p.readString();
  768. dataCall.ifname = p.readString();
  769. if (TextUtils.isEmpty(dataCall.ifname)) {
  770. throw new RuntimeException(
  771. "RIL_REQUEST_SETUP_DATA_CALL response, no ifname");
  772. }
  773. String addresses = p.readString();
  774. if (!TextUtils.isEmpty(addresses)) {
  775. dataCall.addresses = addresses.split(" ");
  776. }
  777. dataCall.dnses = new String[2];
  778. dataCall.dnses[0] = SystemProperties.get("net."+dataCall.ifname+".dns1");
  779. dataCall.dnses[1] = SystemProperties.get("net."+dataCall.ifname+".dns2");
  780. dataCall.active = 1;
  781. dataCall.status = 0;
  782. return dataCall;
  783. }
  784. @Override
  785. protected Object
  786. responseOperatorInfos(Parcel p) {
  787. String strings[] = (String [])responseStrings(p);
  788. ArrayList<OperatorInfo> ret;
  789. if (strings.length % 5 != 0) {
  790. throw new RuntimeException(
  791. "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS: invalid response. Got "
  792. + strings.length + " strings, expected multiple of 5");
  793. }
  794. ret = new ArrayList<OperatorInfo>(strings.length / 5);
  795. for (int i = 0 ; i < strings.length ; i += 5) {
  796. ret.add (
  797. new OperatorInfo(
  798. strings[i+0],
  799. strings[i+1],
  800. strings[i+2],
  801. strings[i+3]));
  802. }
  803. return ret;
  804. }
  805. @Override
  806. public void
  807. getBasebandVersion (Message response) {
  808. if (SystemProperties.get("ro.cm.device").indexOf("e73") == 0) {
  809. /* This model wants a RIL_REQUEST_GET_MODEM_VERSION */
  810. RILRequest rr
  811. = RILRequest.obtain(220, response);
  812. if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
  813. send(rr);
  814. } else {
  815. super.getBasebandVersion(response);
  816. }
  817. }
  818. }