package com.fastaccess.ui.modules.floating;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.graphics.Point;
import android.support.annotation.NonNull;
import android.support.v4.content.Loader;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.AccelerateInterpolator;
import com.fastaccess.R;
import com.fastaccess.helper.AnimHelper;
import com.fastaccess.helper.Logger;
import com.fastaccess.helper.PrefConstant;
import com.fastaccess.helper.PrefHelper;
import com.fastaccess.helper.ViewHelper;
import com.fastaccess.ui.base.mvp.presenter.BasePresenter;
import com.fastaccess.ui.widgets.floating.FloatingView;
import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView;
import java.util.List;
/**
* Created by Kosh on 23 Oct 2016, 12:18 AM
*/
public class BaseFloatingPresenter<M, V extends BaseFloatingMvp.BaseView<M>> extends BasePresenter<V> implements BaseFloatingMvp.BasePresenter<M, V> {
private final TimeInterpolator moveEdgeInterpolator = new AccelerateInterpolator();
protected BaseFloatingPresenter(@NonNull V view) {
super(view);
}
@Override public void onViewMoving(int x, int y) {
if (isAttached()) getView().onViewMoving(x, y);
}
@Override public void onSingleTapped() {
if (isAttached()) getView().onSingleTapped();
}
@Override public void onDoubleTapped() {
if (isAttached()) getView().onDoubleTapped();
}
@Override public void onLongPressed() {
if (isAttached()) getView().onLongPressed();
}
@Override public void onSwipe(int swipeDirection) {}//Op-out
@Override public void onBackPressed() {
onTouchOutside();
}
@Override public void onTouchOutside() {
if (isAttached()) getView().onTouchedOutside();
}
@Override public void onStoppedMoving() {
if (isAttached()) getView().onStoppedMoving();
}
@Override public void onConfigChanged(int orientation) {
if (isAttached()) getView().onConfigChanged(orientation);
}
@Override public void onItemClick(int position, View v, M item) {
if (isAttached()) getView().onTouchedOutside();
}
@Override public void onItemLongClick(int position, View v, M item) {
onItemClick(position, v, item);
}
@Override public void onUpdateWindowParams(@NonNull WindowManager windowManager,
@NonNull WindowManager.LayoutParams originalParams,
@NonNull FloatingView floatingView,
int x, int y) {
originalParams.x = x;
originalParams.y = y;
windowManager.updateViewLayout(floatingView, originalParams);
}
@Override public void onToggleVisibility(final boolean showFloating, @NonNull final WindowManager windowManager,
@NonNull final WindowManager.LayoutParams originalParams, @NonNull final View view,
@NonNull final FloatingView floatingView, final boolean isHorizontal) {
if (showFloating) {
AnimHelper.animateVisibility(view, false, new AnimHelper.AnimationCallback() {
@Override public void onAnimationStart() {}
@Override public void onAnimationEnd() {
if (!isAttached()) return;
getView().setupParamsSize();
AnimHelper.animateVisibility(floatingView, true);
}
});
} else {
AnimHelper.animateVisibility(floatingView, false, new AnimHelper.AnimationCallback() {
@Override public void onAnimationEnd() {
AnimHelper.animateVisibility(view, true, new AnimHelper.AnimationCallback() {
@Override public void onAnimationEnd() {}
@Override public void onAnimationStart() {
if (!isAttached()) return;
if (isHorizontal) {
final DynamicRecyclerView recycler = (DynamicRecyclerView) view.findViewById(R.id.recycler);
originalParams.width = ViewHelper.getWidthFromRecyclerView(recycler, windowManager);
}
windowManager.updateViewLayout(view, originalParams);
}
});
}
@Override public void onAnimationStart() {}
});
}
}
@Override public void onMoveToEdge(@NonNull final WindowManager windowManager, @NonNull final WindowManager.LayoutParams originalParams,
@NonNull final FloatingView floatingView, @NonNull Point szWindow) {
if (!PrefHelper.getBoolean(PrefConstant.FA_EDGES_STICKY)) return;
int w = originalParams.width;
final boolean isMoveRightEdge = originalParams.x + w / 2 <= szWindow.x / 2;
final int goalPositionX = isMoveRightEdge ? 0 : szWindow.x - w;
Logger.e(originalParams.x, goalPositionX, isMoveRightEdge);
if (!isAttached() || !floatingView.isShown()) return;
ValueAnimator mMoveEdgeAnimator = ValueAnimator.ofInt(originalParams.x, goalPositionX);
mMoveEdgeAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override public void onAnimationUpdate(ValueAnimator animation) {
if (!isAttached() || !floatingView.isShown()) return;
originalParams.x = (Integer) animation.getAnimatedValue();
windowManager.updateViewLayout(floatingView, originalParams);
getView().onUpdateXY();
}
});
mMoveEdgeAnimator.setDuration(200L);
mMoveEdgeAnimator.setInterpolator(moveEdgeInterpolator);
mMoveEdgeAnimator.start();
}
@Override public void onLoadComplete(Loader<List<M>> loader, List<M> data) {
if (isAttached()) getView().onLoaderLoaded(data);
}
}