private void showContextMenuFromView(
      final View openingView,
      int feedItem,
      FeedContextMenu.OnFeedContextMenuItemClickListener listener) {
    if (!isContextMenuShowing) {
      isContextMenuShowing = true;
      contextMenuView = new FeedContextMenu(openingView.getContext());
      contextMenuView.bindToItem(feedItem);
      contextMenuView.addOnAttachStateChangeListener(this);
      contextMenuView.setOnFeedMenuItemClickListener(listener);

      ((ViewGroup) openingView.getRootView().findViewById(android.R.id.content))
          .addView(contextMenuView);

      contextMenuView
          .getViewTreeObserver()
          .addOnPreDrawListener(
              new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                  contextMenuView.getViewTreeObserver().removeOnPreDrawListener(this);
                  setupContextMenuInitialPosition(openingView);
                  performShowAnimation();
                  return false;
                }
              });
    }
  }
  private void performDismissAnimation() {
    try {
      contextMenuView.setPivotX(contextMenuView.getWidth() / 2);
      contextMenuView.setPivotY(contextMenuView.getHeight());
      contextMenuView
          .animate()
          .scaleX(0.1f)
          .scaleY(0.1f)
          .setDuration(150)
          .setInterpolator(new AccelerateInterpolator())
          .setStartDelay(100)
          .setListener(
              new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                  if (contextMenuView != null) {
                    contextMenuView.dismiss();
                  }
                  isContextMenuDismissing = false;
                }
              });
    } catch (Exception ex) {

    }
  }
 private void setupContextMenuInitialPosition(View openingView) {
   final int[] openingViewLocation = new int[2];
   openingView.getLocationOnScreen(openingViewLocation);
   int additionalBottomMargin = Utils.dpToPx(16);
   contextMenuView.setTranslationX(openingViewLocation[0] - additionalBottomMargin * 3);
   contextMenuView.setTranslationY(
       openingViewLocation[1] - contextMenuView.getHeight() - additionalBottomMargin);
 }
 private void performShowAnimation() {
   contextMenuView.setPivotX(contextMenuView.getWidth() / 2);
   contextMenuView.setPivotY(contextMenuView.getHeight());
   contextMenuView.setScaleX(0.1f);
   contextMenuView.setScaleY(0.1f);
   contextMenuView
       .animate()
       .scaleX(1f)
       .scaleY(1f)
       .setDuration(150)
       .setInterpolator(new OvershootInterpolator())
       .setListener(
           new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
               isContextMenuShowing = false;
             }
           });
 }
 public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
   if (contextMenuView != null) {
     hideContextMenu();
     contextMenuView.setTranslationY(contextMenuView.getTranslationY() - dy);
   }
 }