/**
   * Reads all PGPKeyRing objects from input
   *
   * @param inputData
   * @return
   */
  private void generateListOfKeyrings(InputData inputData) {
    PositionAwareInputStream progressIn = new PositionAwareInputStream(inputData.getInputStream());

    // need to have access to the bufferedInput, so we can reuse it for the possible
    // PGPObject chunks after the first one, e.g. files with several consecutive ASCII
    // armor blocks
    BufferedInputStream bufferedInput = new BufferedInputStream(progressIn);
    try {
      // parse all keyrings
      Iterator<UncachedKeyRing> it = UncachedKeyRing.fromStream(bufferedInput);
      while (it.hasNext()) {
        UncachedKeyRing ring = it.next();
        ImportKeysListEntry item = new ImportKeysListEntry(getContext(), ring);
        mData.add(item);
        mParcelableRings.put(item.hashCode(), new ParcelableKeyRing(ring.getEncoded()));
      }
    } catch (IOException e) {
      Log.e(Constants.TAG, "IOException on parsing key file! Return NoValidKeysException!", e);
      OperationResult.OperationLog log = new OperationResult.OperationLog();
      log.add(OperationResult.LogType.MSG_GET_NO_VALID_KEYS, 0);
      GetKeyResult getKeyResult = new GetKeyResult(GetKeyResult.RESULT_ERROR_NO_VALID_KEYS, log);
      mEntryListWrapper =
          new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mData, getKeyResult);
    }
  }
  @NonNull
  public OperationResult execute(ChangeUnlockParcel unlockParcel, CryptoInputParcel cryptoInput) {
    OperationResult.OperationLog log = new OperationResult.OperationLog();
    log.add(OperationResult.LogType.MSG_ED, 0);

    if (unlockParcel == null || unlockParcel.mMasterKeyId == null) {
      log.add(OperationResult.LogType.MSG_ED_ERROR_NO_PARCEL, 1);
      return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
    }

    // Perform actual modification
    PgpEditKeyResult modifyResult;
    {
      PgpKeyOperation keyOperations =
          new PgpKeyOperation(new ProgressScaler(mProgressable, 0, 70, 100));

      try {
        log.add(
            OperationResult.LogType.MSG_ED_FETCHING,
            1,
            KeyFormattingUtils.convertKeyIdToHex(unlockParcel.mMasterKeyId));

        CanonicalizedSecretKeyRing secRing =
            mProviderHelper.getCanonicalizedSecretKeyRing(unlockParcel.mMasterKeyId);
        modifyResult = keyOperations.modifyKeyRingPassphrase(secRing, cryptoInput, unlockParcel);

        if (modifyResult.isPending()) {
          // obtain original passphrase from user
          log.add(modifyResult, 1);
          return new EditKeyResult(log, modifyResult);
        }
      } catch (ProviderHelper.NotFoundException e) {
        log.add(OperationResult.LogType.MSG_ED_ERROR_KEY_NOT_FOUND, 2);
        return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
      }
    }

    log.add(modifyResult, 1);

    if (!modifyResult.success()) {
      // error is already logged by modification
      return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
    }

    // Cannot cancel from here on out!
    mProgressable.setPreventCancel();

    // It's a success, so this must be non-null now
    UncachedKeyRing ring = modifyResult.getRing();

    SaveKeyringResult saveResult =
        mProviderHelper.saveSecretKeyRing(ring, new ProgressScaler(mProgressable, 70, 95, 100));
    log.add(saveResult, 1);

    // If the save operation didn't succeed, exit here
    if (!saveResult.success()) {
      return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
    }

    updateProgress(R.string.progress_done, 100, 100);
    log.add(OperationResult.LogType.MSG_ED_SUCCESS, 0);
    return new EditKeyResult(EditKeyResult.RESULT_OK, log, ring.getMasterKeyId());
  }