package tellh.com.gitclub.presentation.view.fragment.explore; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.os.Bundle; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.TabLayout; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.ImageView; import com.getbase.floatingactionbutton.FloatingActionButton; import com.getbase.floatingactionbutton.FloatingActionsMenu; import com.tellh.nolistadapter.adapter.FooterLoadMoreAdapterWrapper.UpdateType; import java.util.List; import javax.inject.Inject; import rx.functions.Action1; import tellh.com.gitclub.R; import tellh.com.gitclub.common.AndroidApplication; import tellh.com.gitclub.common.base.LazyFragment; import tellh.com.gitclub.common.config.Constant; import tellh.com.gitclub.common.utils.Utils; import tellh.com.gitclub.di.component.DaggerExploreComponent; import tellh.com.gitclub.model.entity.RepositoryInfo; import tellh.com.gitclub.model.entity.ShowCase; import tellh.com.gitclub.model.entity.ShowCaseInfo; import tellh.com.gitclub.model.entity.Trending; import tellh.com.gitclub.presentation.contract.ExploreContract; import tellh.com.gitclub.presentation.contract.bus.RxBus; import tellh.com.gitclub.presentation.contract.bus.event.GetShowcaseDetailEvent; import tellh.com.gitclub.presentation.contract.bus.event.OnBackPressEvent; import tellh.com.gitclub.presentation.contract.bus.event.OnClickOutsideToHideEvent; import tellh.com.gitclub.presentation.view.adapter.CommonViewPagerAdapter; import tellh.com.gitclub.presentation.widget.FabAnimationHelper; import tellh.com.gitclub.presentation.widget.OnPageChangeListenerAdapter; import tellh.com.gitclub.presentation.widget.ShowcaseListBottomSheetDialog; import static com.tellh.nolistadapter.adapter.FooterLoadMoreAdapterWrapper.REFRESH; import static tellh.com.gitclub.presentation.contract.ExploreContract.*; import static tellh.com.gitclub.presentation.contract.ExploreContract.GANK_IO; import static tellh.com.gitclub.presentation.contract.ExploreContract.ListType; import static tellh.com.gitclub.presentation.contract.ExploreContract.OnListFragmentInteractListener; import static tellh.com.gitclub.presentation.contract.ExploreContract.Presenter; import static tellh.com.gitclub.presentation.contract.ExploreContract.SHOWCASES; import static tellh.com.gitclub.presentation.contract.ExploreContract.TRENDING; public class ExploreFragment extends LazyFragment implements ExploreContract.View, OnListFragmentInteractListener { @Inject Presenter presenter; private ViewPager mViewPager; private ShowCaseListFragment showCaseListFragment; private TrendingListFragment trendingListFragment; private RepositoryInfoListFragment gankDataListFragment; private RepositoryInfoListFragment arsenalDataListFragment; private FloatingActionButton fabLang; private FloatingActionButton fabSince; private FloatingActionsMenu fabMenu; private ShowcaseListBottomSheetDialog showcaseListDialog; private ImageView ivHeader; private CollapsingToolbarLayout collapsingLayout; private boolean hasInitGankPage = false; private boolean hasInitArsenalPage = false; public ExploreFragment() { // Required empty public constructor } public static ExploreFragment newInstance() { return new ExploreFragment(); } @Override public void initData(Bundle savedInstanceState) { presenter.listTrending(); presenter.listShowCase(); trendingListFragment.showLoading(); showCaseListFragment.showLoading(); addSubscription(RxBus.getDefault().toObservable(GetShowcaseDetailEvent.class) .subscribe(new Action1<GetShowcaseDetailEvent>() { @Override public void call(GetShowcaseDetailEvent getShowcaseDetailEvent) { presenter.getShowcaseDetail(getShowcaseDetailEvent.showCase); } })); } private void initDagger() { DaggerExploreComponent.builder() .appComponent(AndroidApplication.getInstance().getAppComponent()) .build().inject(this); presenter.attachView(this); } @Override public int getLayoutId() { return R.layout.frag_explore; } @Override public void initView() { initDagger(); //find view Toolbar toolbar = (Toolbar) mRootView.findViewById(R.id.toolbar); mViewPager = (ViewPager) mRootView.findViewById(R.id.viewpager); TabLayout tabLayout = (TabLayout) mRootView.findViewById(R.id.tab); collapsingLayout = (CollapsingToolbarLayout) mRootView.findViewById(R.id.collapsing_toolbar); fabLang = (FloatingActionButton) mRootView.findViewById(R.id.fab_language); fabSince = (FloatingActionButton) mRootView.findViewById(R.id.fab_since); fabMenu = (FloatingActionsMenu) mRootView.findViewById(R.id.fab); ivHeader = (ImageView) mRootView.findViewById(R.id.iv_header); // init toolbar setHasOptionsMenu(true); toolbar.setTitle(R.string.explore); ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); collapsingLayout.setTitle(Utils.getString(R.string.explore)); //init viewpager and tab setupViewPager(); tabLayout.setupWithViewPager(mViewPager); //fab initFab(); } private void initFab() { fabLang.setOnClickListener(new android.view.View.OnClickListener() { @Override public void onClick(android.view.View view) { presenter.getDialogLang().show(); fabMenu.collapse(); } }); fabSince.setOnClickListener(new android.view.View.OnClickListener() { @Override public void onClick(android.view.View view) { presenter.getDialogSince().show(); fabMenu.collapse(); } }); addSubscription(RxBus.getDefault().toObservable(OnBackPressEvent.class).subscribe(new Action1<OnBackPressEvent>() { @Override public void call(OnBackPressEvent event) { if (fabMenu == null || !fabMenu.isExpanded()) return; fabMenu.collapse(); event.hasConsume = true; } })); addSubscription(RxBus.getDefault().toObservable(OnClickOutsideToHideEvent.class).subscribe(new Action1<OnClickOutsideToHideEvent>() { @Override public void call(OnClickOutsideToHideEvent event) { if (fabMenu == null || !fabMenu.isExpanded()) return; fabMenu.collapse(); event.consume = true; } })); } private void setupViewPager() { CommonViewPagerAdapter viewPagerAdapter = new CommonViewPagerAdapter(getFragmentManager()); trendingListFragment = TrendingListFragment.newInstance(); trendingListFragment.setListFragmentInteractListener(this); viewPagerAdapter.addFragment("Trending", trendingListFragment); showCaseListFragment = ShowCaseListFragment.newInstance(); showCaseListFragment.setListFragmentInteractListener(this); viewPagerAdapter.addFragment("ShowCases", showCaseListFragment); gankDataListFragment = RepositoryInfoListFragment.newInstance(GANK_IO, Constant.PER_PAGE_GANK); gankDataListFragment.setListFragmentInteractListener(this); viewPagerAdapter.addFragment("Gank.IO", gankDataListFragment); arsenalDataListFragment = RepositoryInfoListFragment.newInstance(ARSENAL, Constant.PER_PAGE_ARSENAL); arsenalDataListFragment.setListFragmentInteractListener(this); viewPagerAdapter.addFragment("Arsenal", arsenalDataListFragment); mViewPager.setOffscreenPageLimit(4); mViewPager.setAdapter(viewPagerAdapter); mViewPager.addOnPageChangeListener(new OnPageChangeListenerAdapter() { @Override public void onPageSelected(int position) { if (position == 0) { collapsingLayout.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.light_purple)); Utils.setImageWithFade(ivHeader, R.drawable.train); FabAnimationHelper.show(fabMenu, new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); fabMenu.setVisibility(View.VISIBLE); } }); } else if (position == 1) { collapsingLayout.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.orange_red)); Utils.setImageWithFade(ivHeader, R.drawable.sun); FabAnimationHelper.hide(fabMenu, new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); fabMenu.setVisibility(View.INVISIBLE); } }); } else if (position == 2) { if (!hasInitGankPage) { presenter.listGankData(1); gankDataListFragment.showLoading(); hasInitGankPage = true; } collapsingLayout.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.light_blue)); Utils.setImageWithFade(ivHeader, R.drawable.sky); FabAnimationHelper.hide(fabMenu, new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); fabMenu.setVisibility(View.INVISIBLE); } }); } else if (position == 3) { if (!hasInitArsenalPage) { presenter.listArsenalData(1); arsenalDataListFragment.showLoading(); hasInitArsenalPage = true; } collapsingLayout.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.purple)); Utils.setImageWithFade(ivHeader, R.drawable.arsenal); FabAnimationHelper.hide(fabMenu, new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); fabMenu.setVisibility(View.INVISIBLE); } }); } } }); } @Override public void onDestroy() { super.onDestroy(); if (presenter != null) presenter.detachView(); showCaseListFragment = null; trendingListFragment = null; gankDataListFragment = null; arsenalDataListFragment = null; } @Override public void showOnError(String msg, @ListType int type) { showOnError(msg); switch (type) { case GANK_IO: gankDataListFragment.hideLoading(); break; case SHOWCASES: showCaseListFragment.hideLoading(); showCaseListFragment.showErrorView(); break; case TRENDING: trendingListFragment.hideLoading(); trendingListFragment.showErrorView(); break; case ARSENAL: arsenalDataListFragment.hideLoading(); break; } } @Override public void onGetTrending(List<Trending> trendings) { trendingListFragment.onGet(trendings); } @Override public void onGetShowcases(List<ShowCase> showCases) { showCaseListFragment.onGet(showCases); } @Override public void onGetGankData(List<RepositoryInfo> repositoryList, @UpdateType int updateType) { gankDataListFragment.onGet(repositoryList, updateType); if (updateType == REFRESH) gankDataListFragment.hideLoading(); } @Override public void onGetShowcasesDetail(ShowCaseInfo showCaseInfo) { if (showcaseListDialog == null) showcaseListDialog = new ShowcaseListBottomSheetDialog(getContext(), presenter); showcaseListDialog.refreshAndShow(showCaseInfo); } @Override public void onGetArsenalData(List<RepositoryInfo> repositoryList, int updateType) { arsenalDataListFragment.onGet(repositoryList, updateType); if (updateType == REFRESH) arsenalDataListFragment.hideLoading(); } @Override public void onFetchData(@ListType int type, int page) { switch (type) { case SHOWCASES: presenter.listShowCase(); break; case TRENDING: presenter.listTrending(); break; case GANK_IO: presenter.listGankData(page); break; case ARSENAL: presenter.listArsenalData(page); break; } } @Override public Presenter getPresenter() { return presenter; } @Override //the first page will not be lazy loaded. protected boolean shouldLazyLoad() { return false; } @Override public void showOnError(@UpdateType int updateType, String msg) { showOnError(msg); // gankDataListFragment.showOnError(msg, updateType); } }