package ru.noties.scrollable;

/**
 * Use this interface to handle specific *close-up* logic for {@link ScrollableLayout},
 * use with {@link ScrollableLayout#setCloseUpAlgorithm(CloseUpAlgorithm)}
 * @see DefaultCloseUpAlgorithm
 * Created by Dimitry Ivanov on 22.05.2015.
 */
public interface CloseUpAlgorithm {

    /**
     * This method computes end scroll y after fling event was detected
     * @param layout {@link ScrollableLayout}
     * @param isScrollingBottom whether {@link ScrollableLayout} would scroll to top or bottom
     * @param nowY current scroll y of the *layout*
     * @param suggestedY scroll y that is suggested
     * @param maxY current max scroll y of the *layout*
     * @return end scroll y value for the *layout* to animate to
     */
    int getFlingFinalY(ScrollableLayout layout, boolean isScrollingBottom, int nowY, int suggestedY, int maxY);

    /**
     * This method will be fired after scroll state of a {@link ScrollableLayout} would be considered idle
     * @param layout {@link ScrollableLayout}
     * @param nowY current scroll y of the *layout*
     * @param maxY current max scroll y of the *layout*
     * @see ScrollableLayout#getConsiderIdleMillis()
     * @see ScrollableLayout#setConsiderIdleMillis(long)
     * @return end scroll y value for the *layout* to animate to
     */
    int getIdleFinalY(ScrollableLayout layout, int nowY, int maxY);
}