/**
* Wire
* Copyright (C) 2016 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.waz.zclient.pages.main.popup;
import android.content.Context;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
public class ViewPagerLikeRecyclerView extends RecyclerView implements GestureDetector.OnGestureListener {
private GestureDetectorCompat gestureDetector;
private int center;
public ViewPagerLikeRecyclerView(Context context) {
this(context, null);
}
public ViewPagerLikeRecyclerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ViewPagerLikeRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
gestureDetector = new GestureDetectorCompat(context, this);
}
@Override
public void setLayoutManager(LayoutManager layoutManager) {
super.setLayoutManager(layoutManager);
if (!(layoutManager instanceof ViewPagerLikeLayoutManager)) {
throw new IllegalArgumentException();
}
}
@Override
public boolean fling(int velocityX, int velocityY) {
final ViewPagerLikeLayoutManager lm = (ViewPagerLikeLayoutManager) getLayoutManager();
super.smoothScrollToPosition(lm.getPositionForVelocity(velocityX));
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
gestureDetector.onTouchEvent(e);
return super.onInterceptTouchEvent(e);
}
@Override
public boolean onTouchEvent(MotionEvent e) {
if (e.getAction() != MotionEvent.ACTION_UP && e.getAction() != MotionEvent.ACTION_CANCEL) {
return super.onTouchEvent(e);
}
if (getScrollState() != SCROLL_STATE_IDLE) {
return super.onTouchEvent(e);
}
smoothScrollToPosition(((ViewPagerLikeLayoutManager) getLayoutManager()).getFixScrollPos());
return super.onTouchEvent(e);
}
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
super.onMeasure(widthSpec, heightSpec);
center = MeasureSpec.getSize(widthSpec) / 2;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {}
@Override
public boolean onSingleTapUp(MotionEvent e) {
if (getAdapter().getItemCount() == 0) {
return false;
}
final ViewPagerLikeLayoutManager lm = (ViewPagerLikeLayoutManager) getLayoutManager();
final int currentPosition = lm.findFirstVisibleItemPosition();
final int targetPosition;
if (e.getX() - center < 0) {
targetPosition = Math.max(currentPosition - 1, 0);
} else {
targetPosition = Math.min(currentPosition + 1, getAdapter().getItemCount() - 1);
}
super.smoothScrollToPosition(targetPosition);
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
}