private void handlePasswordError(int res) {
   state = State.FAILED;
   StringBuilder sb = new StringBuilder(getScString());
   sb.append("\n");
   sb.append(context.getText(res));
   message = sb;
   phone.onMMIDone(this);
 }
  private void onQueryComplete(AsyncResult ar) {
    StringBuilder sb = new StringBuilder(getScString());
    sb.append("\n");

    if (ar.exception != null) {
      state = State.FAILED;
      sb.append(getErrorMessage(ar));
    } else {
      int[] ints = (int[]) ar.result;

      if (ints.length != 0) {
        if (ints[0] == 0) {
          sb.append(context.getText(com.android.internal.R.string.serviceDisabled));
        } else if (sc.equals(SC_WAIT)) {
          // Call Waiting includes additional data in the response.
          sb.append(createQueryCallWaitingResultMessage(ints[1]));
        } else if (isServiceCodeCallBarring(sc)) {
          // ints[0] for Call Barring is a bit vector of services
          sb.append(createQueryCallBarringResultMessage(ints[0]));
        } else if (ints[0] == 1) {
          // for all other services, treat it as a boolean
          sb.append(context.getText(com.android.internal.R.string.serviceEnabled));
        } else {
          sb.append(context.getText(com.android.internal.R.string.mmiError));
        }
      } else {
        sb.append(context.getText(com.android.internal.R.string.mmiError));
      }
      state = State.COMPLETE;
    }

    message = sb;
    phone.onMMIDone(this);
  }
  private CharSequence createQueryCallBarringResultMessage(int serviceClass) {
    StringBuilder sb =
        new StringBuilder(context.getText(com.android.internal.R.string.serviceEnabledFor));

    for (int classMask = 1; classMask <= SERVICE_CLASS_MAX; classMask <<= 1) {
      if ((classMask & serviceClass) != 0) {
        sb.append("\n");
        sb.append(serviceClassToCFString(classMask & serviceClass));
      }
    }
    return sb;
  }
  private void onQueryCfComplete(AsyncResult ar) {
    StringBuilder sb = new StringBuilder(getScString());
    sb.append("\n");

    if (ar.exception != null) {
      state = State.FAILED;
      sb.append(getErrorMessage(ar));
    } else {
      CallForwardInfo infos[];

      infos = (CallForwardInfo[]) ar.result;

      if (infos.length == 0) {
        // Assume the default is not active
        sb.append(context.getText(com.android.internal.R.string.serviceDisabled));

        // Set unconditional CFF in SIM to false
        if (phone.mSIMRecords != null) {
          phone.setCallForwardingPreference(false);
          phone.mSIMRecords.setVoiceCallForwardingFlag(1, false);
        } else {
          Log.w(LOG_TAG, "setVoiceCallForwardingFlag aborted. sim records is null.");
        }
      } else {

        SpannableStringBuilder tb = new SpannableStringBuilder();

        // Each bit in the service class gets its own result line
        // The service classes may be split up over multiple
        // CallForwardInfos. So, for each service class, find out
        // which CallForwardInfo represents it and then build
        // the response text based on that

        for (int serviceClassMask = 1;
            serviceClassMask <= SERVICE_CLASS_MAX;
            serviceClassMask <<= 1) {
          for (int i = 0, s = infos.length; i < s; i++) {
            if ((serviceClassMask & infos[i].serviceClass) != 0) {
              tb.append(makeCFQueryResultMessage(infos[i], serviceClassMask));
              tb.append("\n");
            }
          }
        }
        sb.append(tb);
      }

      state = State.COMPLETE;
    }

    message = sb;
    phone.onMMIDone(this);
  }
  private void onSetComplete(AsyncResult ar) {
    StringBuilder sb = new StringBuilder(getScString());
    sb.append("\n");

    if (ar.exception != null) {
      state = State.FAILED;
      if (ar.exception instanceof CommandException) {
        CommandException.Error err = ((CommandException) (ar.exception)).getCommandError();
        if (err == CommandException.Error.PASSWORD_INCORRECT) {
          if (isPinCommand()) {
            // look specifically for the PUK commands and adjust
            // the message accordingly.
            if (sc.equals(SC_PUK) || sc.equals(SC_PUK2)) {
              sb.append(context.getText(com.android.internal.R.string.badPuk));
            } else {
              sb.append(context.getText(com.android.internal.R.string.badPin));
            }
          } else {
            sb.append(context.getText(com.android.internal.R.string.passwordIncorrect));
          }
        } else if (err == CommandException.Error.SIM_PUK2) {
          sb.append(context.getText(com.android.internal.R.string.badPin));
          sb.append("\n");
          sb.append(context.getText(com.android.internal.R.string.needPuk2));
        } else if (err == CommandException.Error.FDN_CHECK_FAILURE) {
          Log.i(LOG_TAG, "FDN_CHECK_FAILURE");
          sb.append(context.getText(com.android.internal.R.string.mmiFdnError));
        } else {
          sb.append(context.getText(com.android.internal.R.string.mmiError));
        }
      } else {
        sb.append(context.getText(com.android.internal.R.string.mmiError));
      }
    } else if (isActivate()) {
      state = State.COMPLETE;
      if (isCallFwdRegister) {
        sb.append(context.getText(com.android.internal.R.string.serviceRegistered));
        isCallFwdRegister = false;
      } else {
        sb.append(context.getText(com.android.internal.R.string.serviceEnabled));
      }
      // Record CLIR setting
      if (sc.equals(SC_CLIR)) {
        phone.saveClirSetting(CommandsInterface.CLIR_INVOCATION);
      }
    } else if (isDeactivate()) {
      state = State.COMPLETE;
      sb.append(context.getText(com.android.internal.R.string.serviceDisabled));
      // Record CLIR setting
      if (sc.equals(SC_CLIR)) {
        phone.saveClirSetting(CommandsInterface.CLIR_SUPPRESSION);
      }
    } else if (isRegister()) {
      state = State.COMPLETE;
      sb.append(context.getText(com.android.internal.R.string.serviceRegistered));
    } else if (isErasure()) {
      state = State.COMPLETE;
      sb.append(context.getText(com.android.internal.R.string.serviceErased));
    } else {
      state = State.FAILED;
      sb.append(context.getText(com.android.internal.R.string.mmiError));
    }

    message = sb;
    phone.onMMIDone(this);
  }
  private void onGetClirComplete(AsyncResult ar) {
    StringBuilder sb = new StringBuilder(getScString());
    sb.append("\n");

    if (ar.exception != null) {
      state = State.FAILED;
      sb.append(getErrorMessage(ar));
    } else {
      int clirArgs[];

      clirArgs = (int[]) ar.result;

      // the 'm' parameter from TS 27.007 7.7
      switch (clirArgs[1]) {
        case 0: // CLIR not provisioned
          sb.append(context.getText(com.android.internal.R.string.serviceNotProvisioned));
          state = State.COMPLETE;
          break;

        case 1: // CLIR provisioned in permanent mode
          sb.append(context.getText(com.android.internal.R.string.CLIRPermanent));
          state = State.COMPLETE;
          break;

        case 2: // unknown (e.g. no network, etc.)
          sb.append(context.getText(com.android.internal.R.string.mmiError));
          state = State.FAILED;
          break;

        case 3: // CLIR temporary mode presentation restricted

          // the 'n' parameter from TS 27.007 7.7
          switch (clirArgs[0]) {
            default:
            case 0: // Default
              sb.append(context.getText(com.android.internal.R.string.CLIRDefaultOnNextCallOn));
              break;
            case 1: // CLIR invocation
              sb.append(context.getText(com.android.internal.R.string.CLIRDefaultOnNextCallOn));
              break;
            case 2: // CLIR suppression
              sb.append(context.getText(com.android.internal.R.string.CLIRDefaultOnNextCallOff));
              break;
          }
          state = State.COMPLETE;
          break;

        case 4: // CLIR temporary mode presentation allowed
          // the 'n' parameter from TS 27.007 7.7
          switch (clirArgs[0]) {
            default:
            case 0: // Default
              sb.append(context.getText(com.android.internal.R.string.CLIRDefaultOffNextCallOff));
              break;
            case 1: // CLIR invocation
              sb.append(context.getText(com.android.internal.R.string.CLIRDefaultOffNextCallOn));
              break;
            case 2: // CLIR suppression
              sb.append(context.getText(com.android.internal.R.string.CLIRDefaultOffNextCallOff));
              break;
          }

          state = State.COMPLETE;
          break;
      }
    }

    message = sb;
    phone.onMMIDone(this);
  }