@Override
  public void onDismissed(Snackbar snackbar, int event) {
    if (!mOnDismissedCalled) {
      // onDismissed is called multiple times
      mOnDismissedCalled = true;

      // !NOTE: here to secure bug with FABBehaviour where for some unknown reason fab wasn't
      // translated to original pos
      ViewCompat.animate(mMainActivity.getFabMenu()).translationY(0);

      if (!mUndoOnClickListener.undoTriggered()) {
        // undo not triggered ready to delete
        if (MyApplication.getWritableDatabase().deleteNote(mNote)) {
          // note deleted successfully
          BaseController baseController = BaseController.getInstance();
          if (baseController.getControllerId() != Constants.CONTROLLER_BIN) {
            // item is still current controller, remove it
            new RemoveItemFromMainTask(
                    MyApplication.getAppContext().getString(R.string.note_moved_to_bin))
                .execute(mNote);

          } else {
            // if in bin controller add newly deleted note
            // !NOTE: delete mode is already set in db#deleteNote()
            baseController.onNewNoteAdded(mNote.getMode());
          }
        } else {
          // failed to delete note, revert it back
          MyDebugger.log("Failed to send note to recycler bin!");
          mMainActivity.mMainAdapter.addItem(mPosition, mNote);
        }
      }
    }
  }
  /**
   * @param selectedId the nav drawer id to switch on
   * @param preventExecutionIfSameId must be false when called onCreate() else true
   * @param loadNewContent flag indicating whether the controller should load new content
   */
  public void applySelectedOption(
      int selectedId, boolean preventExecutionIfSameId, boolean loadNewContent) {
    if (mMainActivity.mSelectedId == selectedId) {
      // current option is already selected, scroll to top and expand appbar
      mMainActivity.getAppBarLayout().setExpanded(true, true); // animate appbar expanding
      mMainActivity.getRecyclerView().smoothScrollToPosition(0); // scroll to first item
      if (preventExecutionIfSameId) return; // prevent further execution if flag is up
    }

    if (preventExecutionIfSameId || selectedId == R.id.navigation_item_bin) {
      // private controller is selected or we are bin (both selected or screen rotation),
      // save previous selected id cuz bin fab animation will bug
      mMainActivity.mPreviousSelectedId = mMainActivity.mSelectedId;
    }

    // !NOTE: this is executing only if the selected id is not already selected or
    // if applySelectedOption() is called from OnCreate(), in this case it should be executed
    // because MainActivity#mSelectedId is set to all_notes_id but the selected option isn't
    // actually applied
    switch (selectedId) {
      case R.id.navigation_item_all_notes:
        mMainActivity.mSelectedId = selectedId;
        BaseController.setInstance(new AllNotesController(mMainActivity));
        break;
      case R.id.navigation_item_starred:
        mMainActivity.mSelectedId = selectedId;
        BaseController.setInstance(new ImportantController(mMainActivity));
        break;
      case R.id.navigation_item_private:
        mMainActivity.mSelectedId = selectedId;
        BaseController.setInstance(new PrivateController(mMainActivity));
        break;
      case R.id.navigation_item_bin:
        mMainActivity.mSelectedId = selectedId;
        BaseController.setInstance(new BinController(mMainActivity));
        break;
      case R.id.navigation_item_explore:
        // mMainActivity.startActivity(new Intent(mMainActivity, ExploreActivity.class));
        MyDebugger.toast(mMainActivity, "Explore not implemented, yet!");
        return;
      case R.id.navigation_item_settings:
        // mMainActivity.startActivity(new Intent(mMainActivity, SettingsActivity.class));
        MyDebugger.toast(mMainActivity, "Settings not implemented, yet!");
        return;
      default:
        return;
    }

    if (preventExecutionIfSameId) {
      // preventExecutionIfSameId is false only when called by onCreate() in MainActivity
      // so if its true user has switched labels and there wasn't screen rotation in private

      mMainActivity.mLoadNewContentPrivate = false; // the controller should load new content
      // only when there was a screen rotation in private label
    }

    // !NOTE: preventExecutionIfSameId flag matches with scrollToTop in setContent(), cuz:
    // 1.when method is called from onCreate() the flag is FALSE: the activity is fresh created or
    // coming from
    // screen rotation in both cases content shouldn't be scrolled to top
    // 2. when method is called from nav drawer on click the flag is TRUE: new controller should be
    // chosen and
    // then new content should be scrolled (!if the current id is reselected code execution will be
    // stopped at
    // the start on applySelectedOption()
    BaseController.getInstance().setContent(preventExecutionIfSameId, loadNewContent);

    if (mMainActivity.mMenu != null) {
      // mMenu is already created, prepare its new options according controller
      mMainActivity.onPrepareOptionsMenu(mMainActivity.mMenu);
    }
  }