protected boolean saveHistory(String expr, String result, boolean ensureResult) {
    if (mHistory == null) {
      return false;
    }

    expr = cleanExpression(expr);
    if (!ensureResult
        || (!TextUtils.isEmpty(expr)
            && !TextUtils.isEmpty(result)
            && !Solver.equal(expr, result)
            && (mHistory.current() == null || !mHistory.current().getFormula().equals(expr)))) {
      mHistory.enter(expr, result);
      return true;
    }
    return false;
  }
 protected void incrementGroupId() {
   mHistory.incrementGroupId();
 }
  @Override
  protected void onResume() {
    super.onResume();

    // Load up to date history
    mPersist = new Persist(this);
    mPersist.load();
    mHistory = mPersist.getHistory();
    incrementGroupId();

    // When history is open, the display is saved as a Display Entry. Cache it if it exists.
    HistoryEntry displayEntry = null;
    if (mHistoryAdapter != null) {
      displayEntry = mHistoryAdapter.getDisplayEntry();
    }

    // Create a new History Adapter (with the up-to-date history)
    mHistoryAdapter = new HistoryAdapter(this, mEvaluator.getSolver(), mHistory);
    mHistoryAdapter.setOnItemClickListener(
        new HistoryAdapter.OnItemClickListener() {
          @Override
          public void onItemClick(final HistoryEntry entry) {
            mDisplayView.collapse(
                new AnimationFinishedListener() {
                  @Override
                  public void onAnimationFinished() {
                    mFormulaEditText.setText(entry.getFormula());
                  }
                });
          }
        });
    mHistoryAdapter.setOnItemLongclickListener(
        new HistoryAdapter.OnItemLongClickListener() {
          @Override
          public void onItemLongClick(HistoryEntry entry) {
            Clipboard.copy(getBaseContext(), entry.getResult());
          }
        });

    // Restore the Display Entry (if it existed)
    if (displayEntry != null) {
      mHistoryAdapter.setDisplayEntry(displayEntry.getFormula(), displayEntry.getResult());
    }

    // Observe! Set! Typical adapter stuff.
    mHistory.setObserver(
        new History.Observer() {
          @Override
          public void notifyDataSetChanged() {
            mHistoryAdapter.notifyDataSetChanged();
          }
        });
    mDisplayView.setAdapter(mHistoryAdapter);
    mDisplayView.attachToRecyclerView(
        new ItemTouchHelper(
            new ItemTouchHelper.SimpleCallback(
                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT,
                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
              @Override
              public boolean onMove(
                  RecyclerView recyclerView,
                  RecyclerView.ViewHolder viewHolder,
                  RecyclerView.ViewHolder target) {
                return false;
              }

              @Override
              public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                if (viewHolder.getAdapterPosition() < mHistory.getEntries().size()) {
                  HistoryEntry item = mHistory.getEntries().get(viewHolder.getAdapterPosition());
                  mHistory.remove(item);
                  mHistoryAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
                }
              }
            }));
    mDisplayView.scrollToMostRecent();
  }