package com.reactnativenavigation.screens;
import android.content.Context;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import com.reactnativenavigation.params.BaseScreenParams;
import com.reactnativenavigation.params.FabParams;
import com.reactnativenavigation.params.PageParams;
import com.reactnativenavigation.params.ScreenParams;
import com.reactnativenavigation.params.TitleBarLeftButtonParams;
import com.reactnativenavigation.views.ContentView;
import com.reactnativenavigation.views.LeftButtonOnClickListener;
import com.reactnativenavigation.views.TopTabs;
import java.util.ArrayList;
import java.util.List;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
public class ViewPagerScreen extends Screen {
private static final int OFFSCREEN_PAGE_LIMIT = 99;
protected List<ContentView> contentViews;
protected ViewPager viewPager;
public ViewPagerScreen(AppCompatActivity activity, ScreenParams screenParams, LeftButtonOnClickListener backButtonListener) {
super(activity, screenParams, backButtonListener);
}
@Override
public BaseScreenParams getScreenParams() {
return screenParams.topTabParams.get(getCurrentItem());
}
@Override
public void setTitleBarLeftButton(String navigatorEventId, LeftButtonOnClickListener backButtonListener, TitleBarLeftButtonParams titleBarLeftButtonParams) {
super.setTitleBarLeftButton(getNavigatorEventId(), backButtonListener, titleBarLeftButtonParams);
}
@Override
public void setFab(FabParams fabParams) {
super.setFab(fabParams);
getScreenParams().fabParams = fabParams;
}
@Override
public ContentView getContentView() {
return contentViews.get(getCurrentItem());
}
@Override
protected void createContent() {
TopTabs topTabs = topBar.initTabs();
createViewPager();
addPages();
setupViewPager(topTabs);
setTopTabIcons(topTabs);
}
private void createViewPager() {
viewPager = createViewPager(getContext());
viewPager.setOffscreenPageLimit(OFFSCREEN_PAGE_LIMIT);
LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
if (screenParams.styleParams.drawScreenBelowTopBar) {
lp.addRule(BELOW, topBar.getId());
}
addView(viewPager, lp);
}
protected ViewPager createViewPager(Context context) {
return new ViewPager(context);
}
private void addPages() {
contentViews = new ArrayList<>();
for (PageParams tab : screenParams.topTabParams) {
addPage(tab);
}
}
private void addPage(PageParams tab) {
ContentView contentView = createContentView(tab);
addContent(contentView);
contentViews.add(contentView);
}
protected ContentView createContentView(PageParams tab) {
return new ContentView(getContext(), tab.screenId, tab.navigationParams);
}
private void setupViewPager(TabLayout tabLayout) {
ContentViewPagerAdapter adapter = new ContentViewPagerAdapter(contentViews, screenParams.topTabParams);
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(adapter);
tabLayout.setupWithViewPager(viewPager);
}
private void setTopTabIcons(TopTabs topTabs) {
for (int i = 0; i < topTabs.getTabCount(); i++) {
PageParams pageParams = screenParams.topTabParams.get(i);
if (pageParams.tabIcon != null) {
topTabs.getTabAt(i).setIcon(pageParams.tabIcon);
}
}
topTabs.setTopTabsIconColor(screenParams.styleParams);
}
private void addContent(ContentView contentView) {
LayoutParams params = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
viewPager.addView(contentView, params);
}
@Override
public void unmountReactView() {
for (ContentView contentView : contentViews) {
contentView.unmountReactView();
}
}
@Override
public void setOnDisplayListener(OnDisplayListener onContentViewDisplayedListener) {
contentViews.get(0).setOnDisplayListener(onContentViewDisplayedListener);
}
@Override
public String getScreenInstanceId() {
return screenParams.topTabParams.get(getCurrentItem()).navigationParams.screenInstanceId;
}
@Override
public String getNavigatorEventId() {
return screenParams.topTabParams.get(getCurrentItem()).navigationParams.navigatorEventId;
}
private int getCurrentItem() {
return viewPager == null ? 0 : viewPager.getCurrentItem();
}
public void selectTopTabByTabIndex(int index) {
viewPager.setCurrentItem(index);
}
@Override
public boolean hasScreenInstance(String screenInstanceId) {
for (PageParams topTabParam : screenParams.topTabParams) {
if(screenInstanceId.equals(topTabParam.getScreenInstanceId())) {
return true;
}
}
return false;
}
public void selectTopTabByTabByScreen(String screenInstanceId) {
for (int i = 0; i < screenParams.topTabParams.size(); i++) {
if (screenParams.topTabParams.get(i).getScreenInstanceId().equals(screenInstanceId)) {
viewPager.setCurrentItem(i);
}
}
}
}