package com.reactnativenavigation.screens;
import android.annotation.SuppressLint;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.widget.ScrollView;
import com.facebook.react.uimanager.RootViewUtil;
import com.reactnativenavigation.events.Event;
import com.reactnativenavigation.events.ViewPagerScreenChangedEvent;
import com.reactnativenavigation.events.ViewPagerScreenScrollStartEvent;
import com.reactnativenavigation.params.PageParams;
import com.reactnativenavigation.params.ScreenParams;
import com.reactnativenavigation.views.CollapsingContentView;
import com.reactnativenavigation.views.ContentView;
import com.reactnativenavigation.views.LeftButtonOnClickListener;
import com.reactnativenavigation.views.TopBar;
import com.reactnativenavigation.views.collapsingToolbar.CollapseAmount;
import com.reactnativenavigation.views.collapsingToolbar.CollapseCalculator;
import com.reactnativenavigation.views.collapsingToolbar.CollapsingTopBar;
import com.reactnativenavigation.views.collapsingToolbar.CollapsingView;
import com.reactnativenavigation.views.collapsingToolbar.CollapsingViewMeasurer;
import com.reactnativenavigation.views.collapsingToolbar.CollapsingViewPager;
import com.reactnativenavigation.views.collapsingToolbar.CollapsingViewPagerContentViewMeasurer;
import com.reactnativenavigation.views.collapsingToolbar.OnScrollListener;
import com.reactnativenavigation.views.collapsingToolbar.OnScrollViewAddedListener;
import com.reactnativenavigation.views.collapsingToolbar.ScrollListener;
import com.reactnativenavigation.views.collapsingToolbar.behaviours.CollapseBehaviour;
@SuppressLint("ViewConstructor")
public class CollapsingViewPagerScreen extends ViewPagerScreen {
public CollapsingViewPagerScreen(AppCompatActivity activity, ScreenParams screenParams, LeftButtonOnClickListener backButtonListener) {
super(activity, screenParams, backButtonListener);
}
@Override
protected TopBar createTopBar() {
final CollapsingTopBar topBar = new CollapsingTopBar(getContext(), styleParams);
topBar.setScrollListener(getScrollListener(topBar));
return topBar;
}
@Override
protected ViewPager createViewPager(Context context) {
CollapsingViewPager viewPager = new CollapsingViewPager(context);
if (screenParams.styleParams.drawScreenBelowTopBar) {
viewPager.setViewMeasurer(new CollapsingViewMeasurer((CollapsingTopBar) topBar, this, styleParams));
}
return viewPager;
}
protected ContentView createContentView(PageParams tab) {
CollapsingContentView contentView = new CollapsingContentView(getContext(), tab.screenId, tab.navigationParams);
contentView.setViewMeasurer(new CollapsingViewPagerContentViewMeasurer((CollapsingTopBar) topBar, this, screenParams.styleParams));
setupCollapseDetection(contentView);
return contentView;
}
private void setupCollapseDetection(CollapsingContentView contentView) {
ScrollListener scrollListener = getScrollListener((CollapsingView) topBar);
contentView.setupCollapseDetection(scrollListener, new OnScrollViewAddedListener() {
@Override
public void onScrollViewAdded(ScrollView scrollView) {
((CollapsingTopBar) topBar).onScrollViewAdded(scrollView);
}
});
}
private ScrollListener getScrollListener(final CollapsingView topBar) {
return new ScrollListener(new CollapseCalculator(topBar, getCollapseBehaviour()),
new OnScrollListener() {
@Override
public void onScroll(MotionEvent event, CollapseAmount amount) {
RootViewUtil.getRootView(getCurrentPage()).onChildStartedNativeGesture(event);
topBar.collapse(amount);
((CollapsingView) viewPager).collapse(amount);
}
@Override
public void onFling(CollapseAmount amount) {
topBar.fling(amount);
((CollapsingView) viewPager).fling(amount);
}
},
getCollapseBehaviour()
);
}
private CollapseBehaviour getCollapseBehaviour() {
return screenParams.styleParams.collapsingTopBarParams.collapseBehaviour;
}
@Override
public void onEvent(Event event) {
super.onEvent(event);
if (ViewPagerScreenScrollStartEvent.TYPE.equals(event.getType()) || ViewPagerScreenChangedEvent.TYPE.equals(event.getType())) {
if (screenParams.styleParams.collapsingTopBarParams.expendOnTopTabChange) {
((CollapsingView) topBar).collapse(new CollapseAmount(CollapseCalculator.Direction.Down));
((CollapsingView) viewPager).collapse(new CollapseAmount(CollapseCalculator.Direction.Down));
}
}
}
@Override
public void destroy() {
super.destroy();
for (ContentView contentView : contentViews) {
if (contentView instanceof CollapsingContentView) {
((CollapsingContentView) contentView).destroy();
}
}
topBar.destroy();
}
protected ContentView getCurrentPage() {
return (ContentView) viewPager.getChildAt(viewPager.getCurrentItem());
}
}