package com.shaweibo.biu.ui.common;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.OvershootInterpolator;
import com.shaweibo.biu.Utils.Utility;
/**
* Created by froger_mcs on 16.12.14.
*/
public class StatusContextMenuManager extends RecyclerView.OnScrollListener implements View.OnAttachStateChangeListener {
private static StatusContextMenuManager instance;
private StatusContextMenu contextMenuView;
private boolean isContextMenuDismissing;
private boolean isContextMenuShowing;
public static StatusContextMenuManager getInstance() {
if (instance == null) {
instance = new StatusContextMenuManager();
}
return instance;
}
private StatusContextMenuManager() {
}
public void toggleContextMenuFromView(View openingView, int feedItem, StatusContextMenu.OnStatusContextMenuItemClickListener listener) {
if (contextMenuView == null) {
showContextMenuFromView(openingView, feedItem, listener);
} else {
hideContextMenu();
}
}
private void showContextMenuFromView(final View openingView, int feedItem, StatusContextMenu.OnStatusContextMenuItemClickListener listener) {
if (!isContextMenuShowing) {
isContextMenuShowing = true;
contextMenuView = new StatusContextMenu(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 setupContextMenuInitialPosition(View openingView) {
final int[] openingViewLocation = new int[2];
openingView.getLocationOnScreen(openingViewLocation);
int additionalBottomMargin = Utility.dpToPx(16);
contextMenuView.setTranslationX(openingViewLocation[0] - contextMenuView.getWidth()+openingView.getWidth());
// contextMenuView.setTranslationY(openingViewLocation[1] - contextMenuView.getHeight() - additionalBottomMargin);
contextMenuView.setTranslationY(openingViewLocation[1] + additionalBottomMargin);
}
private void performShowAnimation() {
contextMenuView.setPivotX(contextMenuView.getWidth() );
contextMenuView.setPivotY(0);
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 hideContextMenu() {
if (!isContextMenuDismissing) {
isContextMenuDismissing = true;
performDismissAnimation();
}
}
private void performDismissAnimation() {
contextMenuView.setPivotX(contextMenuView.getWidth() );
contextMenuView.setPivotY(0);
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;
}
});
}
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (contextMenuView != null) {
hideContextMenu();
contextMenuView.setTranslationY(contextMenuView.getTranslationY() - dy);
}
}
@Override
public void onViewAttachedToWindow(View v) {
}
@Override
public void onViewDetachedFromWindow(View v) {
contextMenuView = null;
}
}