public void dispose() {
   mStateStart = null;
   mStateCmdParamsReady = null;
   mCmdParamsFactory.dispose();
   mCmdParamsFactory = null;
   mCurrentRilMessage = null;
   mCaller = null;
   sInstance = null;
 }
  private RilMessageDecoder(Handler caller, IccFileHandler fh) {
    super("RilMessageDecoder");

    addState(mStateStart);
    addState(mStateCmdParamsReady);
    setInitialState(mStateStart);

    mCaller = caller;
    mCmdParamsFactory = CommandParamsFactory.getInstance(this, fh);
  }
  private boolean decodeMessageParams(RilMessage rilMsg) {
    boolean decodingStarted;

    mCurrentRilMessage = rilMsg;
    switch (rilMsg.mId) {
      case CatService.MSG_ID_SESSION_END:
      case CatService.MSG_ID_CALL_SETUP:
        mCurrentRilMessage.mResCode = ResultCode.OK;
        sendCmdForExecution(mCurrentRilMessage);
        decodingStarted = false;
        break;
      case CatService.MSG_ID_PROACTIVE_COMMAND:
      case CatService.MSG_ID_EVENT_NOTIFY:
      case CatService.MSG_ID_REFRESH:
        byte[] rawData = null;
        try {
          rawData = IccUtils.hexStringToBytes((String) rilMsg.mData);
        } catch (Exception e) {
          // zombie messages are dropped
          CatLog.d(this, "decodeMessageParams dropping zombie messages");
          decodingStarted = false;
          break;
        }
        try {
          // Start asynch parsing of the command parameters.
          mCmdParamsFactory.make(BerTlv.decode(rawData));
          decodingStarted = true;
        } catch (ResultException e) {
          // send to Service for proper RIL communication.
          CatLog.d(this, "decodeMessageParams: caught ResultException e=" + e);
          mCurrentRilMessage.mResCode = e.result();
          sendCmdForExecution(mCurrentRilMessage);
          decodingStarted = false;
        }
        break;
      default:
        decodingStarted = false;
        break;
    }
    return decodingStarted;
  }