/** @return all available cell information or null if none. */ public List<CellInfo> getAllCellInfo() { CellInfoResult result = new CellInfoResult(); if (VDBG) log("SST.getAllCellInfo(): E"); int ver = mCi.getRilVersion(); if (ver >= 8) { if (isCallerOnDifferentThread()) { if ((SystemClock.elapsedRealtime() - mLastCellInfoListTime) > LAST_CELL_INFO_LIST_MAX_AGE_MS) { Message msg = obtainMessage(EVENT_GET_CELL_INFO_LIST, result); synchronized (result.lockObj) { result.list = null; mCi.getCellInfoList(msg); try { result.lockObj.wait(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } else { if (DBG) log("SST.getAllCellInfo(): return last, back to back calls"); result.list = mLastCellInfoList; } } else { if (DBG) log("SST.getAllCellInfo(): return last, same thread can't block"); result.list = mLastCellInfoList; } } else { if (DBG) log("SST.getAllCellInfo(): not implemented"); result.list = null; } synchronized (result.lockObj) { if (result.list != null) { if (DBG) log("SST.getAllCellInfo(): X size=" + result.list.size() + " list=" + result.list); return result.list; } else { if (DBG) log("SST.getAllCellInfo(): X size=0 list=null"); return null; } } }
@Override public void handleMessage(Message msg) { switch (msg.what) { case EVENT_SET_RADIO_POWER_OFF: synchronized (this) { if (mPendingRadioPowerOffAfterDataOff && (msg.arg1 == mPendingRadioPowerOffAfterDataOffTag)) { if (DBG) log("EVENT_SET_RADIO_OFF, turn radio off now."); hangupAndPowerOff(); mPendingRadioPowerOffAfterDataOffTag += 1; mPendingRadioPowerOffAfterDataOff = false; } else { log( "EVENT_SET_RADIO_OFF is stale arg1=" + msg.arg1 + "!= tag=" + mPendingRadioPowerOffAfterDataOffTag); } } break; case EVENT_ICC_CHANGED: onUpdateIccAvailability(); break; case EVENT_GET_CELL_INFO_LIST: { AsyncResult ar = (AsyncResult) msg.obj; CellInfoResult result = (CellInfoResult) ar.userObj; synchronized (result.lockObj) { if (ar.exception != null) { log("EVENT_GET_CELL_INFO_LIST: error ret null, e=" + ar.exception); result.list = null; } else { result.list = (List<CellInfo>) ar.result; if (VDBG) { log( "EVENT_GET_CELL_INFO_LIST: size=" + result.list.size() + " list=" + result.list); } } mLastCellInfoListTime = SystemClock.elapsedRealtime(); mLastCellInfoList = result.list; result.lockObj.notify(); } break; } case EVENT_UNSOL_CELL_INFO_LIST: { AsyncResult ar = (AsyncResult) msg.obj; if (ar.exception != null) { log("EVENT_UNSOL_CELL_INFO_LIST: error ignoring, e=" + ar.exception); } else { List<CellInfo> list = (List<CellInfo>) ar.result; if (DBG) { log("EVENT_UNSOL_CELL_INFO_LIST: size=" + list.size() + " list=" + list); } mLastCellInfoListTime = SystemClock.elapsedRealtime(); mLastCellInfoList = list; mPhoneBase.notifyCellInfo(list); } break; } case EVENT_IMS_STATE_CHANGED: // received unsol mCi.getImsRegistrationState(this.obtainMessage(EVENT_IMS_STATE_DONE)); break; case EVENT_IMS_STATE_DONE: AsyncResult ar = (AsyncResult) msg.obj; if (ar.exception == null) { int[] responseArray = (int[]) ar.result; mImsRegistered = (responseArray[0] == 1) ? true : false; } break; default: log("Unhandled message with number: " + msg.what); break; } }