package com.kaichunlin.transition.adapter;
import android.support.annotation.NonNull;
import android.support.v4.util.ArrayMap;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks;
import com.github.ksoichiro.android.observablescrollview.ScrollState;
import com.kaichunlin.transition.AbstractTransitionBuilder;
import com.kaichunlin.transition.Transition;
/**
* TODO work in progress
*
* Created by Kai-Chun Lin on 2015/5/7.
*/
public class ObservableScrollViewCallbacksAdapter extends AbstractAdapter implements ObservableScrollViewCallbacks {
private enum Direction {
UNKOWN,
UP,
DOWN
}
private ArrayMap<Transition, Integer> mRanges = new ArrayMap<>();
private ObservableScrollViewCallbacks mCallback;
private int mStartY;
private int mLastScrollY;
private boolean mResetStartLocationOnChangeDirection;
private Direction mDirection = Direction.UNKOWN;
private OnChangeDirectionListener mOnChangeDirectionListener;
@Override
public void addTransition(AbstractTransitionBuilder builder) {
//TODO guess/retrieve range
throw new UnsupportedOperationException();
}
/**
*
* @param transitionBuilder
* @param range
*/
public void addTransition(@NonNull AbstractTransitionBuilder transitionBuilder, int range) {
addTransition(transitionBuilder.build(), range);
}
@Override
public void addTransition(Transition transition) {
//TODO guess/retrieve range
throw new UnsupportedOperationException();
}
/**
*
* @param transition
* @param range
*/
public void addTransition(@NonNull Transition transition, int range) {
super.addTransition(transition);
mRanges.put(transition, range);
}
@Override
public boolean removeTransition(Transition transition) {
boolean result = super.removeTransition(transition);
mRanges.remove(transition);
return result;
}
/**
*
* @param resetStartLocationOnChangeDirection
*/
public void setResetStartLocationOnChangeDirection(boolean resetStartLocationOnChangeDirection) {
mResetStartLocationOnChangeDirection = resetStartLocationOnChangeDirection;
}
@Override
public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {
if (firstScroll) {
mStartY = scrollY;
startTransition();
return;
}
if (mLastScrollY < scrollY && mDirection != Direction.DOWN) {
mDirection = Direction.DOWN;
if (mOnChangeDirectionListener != null) {
mOnChangeDirectionListener.onDown();
}
if (mResetStartLocationOnChangeDirection) {
mStartY = scrollY;
}
} else if (mLastScrollY > scrollY && mDirection != Direction.UP) {
mDirection = Direction.UP;
if (mOnChangeDirectionListener != null) {
mOnChangeDirectionListener.onUp();
}
if (mResetStartLocationOnChangeDirection) {
mStartY = scrollY;
}
}
getTransitionManager().updateProgress(scrollY - mStartY);
mLastScrollY = scrollY;
if (mCallback != null) {
mCallback.onScrollChanged(scrollY, firstScroll, dragging);
}
}
@Override
public void onDownMotionEvent() {
if (mCallback != null) {
mCallback.onDownMotionEvent();
}
}
@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) {
stopTransition();
if (mCallback != null) {
mCallback.onUpOrCancelMotionEvent(scrollState);
}
}
/**
*
* @param callback
*/
public void setCallBack(ObservableScrollViewCallbacks callback) {
this.mCallback = callback;
}
/**
*
* @return
*/
public OnChangeDirectionListener getOnChangeDirectionListener() {
return mOnChangeDirectionListener;
}
/**
*
* @param onChangeDirectionListener
*/
public void setOnChangeDirectionListener(OnChangeDirectionListener onChangeDirectionListener) {
this.mOnChangeDirectionListener = onChangeDirectionListener;
}
/**
*
*/
public interface OnChangeDirectionListener {
void onUp();
void onDown();
}
}