package org.wordpress.android.widgets;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
/**
* ScrollView which reports when user has scrolled up or down, and when scrolling has completed
*/
public class WPScrollView extends ScrollView {
public interface ScrollDirectionListener {
void onScrollUp(float distanceY);
void onScrollDown(float distanceY);
void onScrollCompleted();
}
private ScrollDirectionListener mScrollDirectionListener;
private int mInitialScrollCheckY;
private static final int SCROLL_CHECK_DELAY = 250;
public WPScrollView(Context context) {
this(context, null);
}
public WPScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public WPScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setScrollDirectionListener(ScrollDirectionListener listener) {
mScrollDirectionListener = listener;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mScrollDirectionListener != null
&& event.getActionMasked() == MotionEvent.ACTION_MOVE
&& event.getHistorySize() > 0) {
float initialY = event.getHistoricalY(event.getHistorySize() - 1);
float distanceY = initialY - event.getY();
if (distanceY < 0) {
mScrollDirectionListener.onScrollUp(distanceY);
startScrollCheck();
} else if (distanceY > 0) {
mScrollDirectionListener.onScrollDown(distanceY);
startScrollCheck();
}
}
return super.onTouchEvent(event);
}
private void startScrollCheck() {
mInitialScrollCheckY = getScrollY();
post(mScrollTask);
}
private final Runnable mScrollTask = new Runnable() {
@Override
public void run() {
if (mInitialScrollCheckY == getScrollY()) {
mScrollDirectionListener.onScrollCompleted();
} else {
mInitialScrollCheckY = getScrollY();
postDelayed(mScrollTask, SCROLL_CHECK_DELAY);
}
}
};
public boolean canScrollUp() {
return canScrollVertically(-1);
}
public boolean canScrollDown() {
return canScrollVertically(1);
}
}