package io.codetail.fragments.mover; import android.os.Bundle; import android.support.annotation.Nullable; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import com.squareup.otto.Subscribe; import java.util.List; import javax.inject.Inject; import hugo.weaving.DebugLog; import io.codetail.WatchMeApplication; import io.codetail.adapters.WatchMeAdapterNew; import io.codetail.client.State; import io.codetail.client.models.Video; import io.codetail.client.mover.FetchAvailableVideoQualities; import io.codetail.client.mover.FetchCategoryPage; import io.codetail.client.mover.Mover; import io.codetail.fragments.NavigationFragment; import io.codetail.utils.ScrollManager; import io.codetail.watchme.R; import io.codetail.work.JobManager; import static android.view.View.NO_ID; public class CategoryFragment extends MoverRecycleFragment { public final static String SELECTED_CATEGORY = "selected_category"; public final static String CURRENT_PAGE = "current_page"; final static String PAGES_COUNT = "pages_count "; final static int UNKNOWN_STATE = -2; private String[] mCategories; private String mSelectedCategory; private int mSelectedCategoryPosition; private int mCurrentPageNumber = 1; private int mCategoryPagesCount; private WatchMeAdapterNew mWatchMeAdapter; @Inject JobManager mJobManager; private long mPendingJobId = NO_ID; private boolean mAlreadyCreated; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(savedInstanceState != null) { mSelectedCategoryPosition = savedInstanceState.getInt(SELECTED_CATEGORY, 0); mCurrentPageNumber = savedInstanceState.getInt(CURRENT_PAGE); mCategoryPagesCount = savedInstanceState.getInt(PAGES_COUNT); } } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); NavigationFragment navigation = (NavigationFragment) getFragmentManager() .findFragmentById(R.id.navigation_fragment); mWatchMeAdapter = getWatchMeAdapter(); WatchMeApplication application = WatchMeApplication.getApplication(); application.inject(this); application.inject(getScrollManager()); application.inject(mWatchMeAdapter); mCategories = getResources().getStringArray(R.array.mover_category_list_for_app); if(savedInstanceState != null){ mSelectedCategory = mCategories[mSelectedCategoryPosition]; navigation.setSelected(mSelectedCategoryPosition); }else{ if(getArguments() != null) { Bundle args = getArguments(); String watchId = args.getString("watchId"); if(!TextUtils.isEmpty(watchId)){ mJobManager.addJob(new FetchAvailableVideoQualities(watchId)); setSelected(0); return; } setSelected(args.getString(SELECTED_CATEGORY), args.getInt(CURRENT_PAGE)); navigation.setSelected(mSelectedCategoryPosition); return; } if(!mAlreadyCreated) { navigation.setSelected(0); setSelected(0); } } mAlreadyCreated = true; } @Override public void onResume() { super.onResume(); NavigationFragment navigation = (NavigationFragment) getFragmentManager() .findFragmentById(R.id.navigation_fragment); navigation.setSelected(mSelectedCategoryPosition); } @DebugLog public void renderPaginatedPage(List<Video> videos){ mWatchMeAdapter.add(getString(R.string.section_paginated_page, mCurrentPageNumber), videos, videos.size()); } @DebugLog public void renderMainPage(List<Video> recommends, List<Video> popular, List<Video> videos){ mWatchMeAdapter.add(getString(R.string.section_recommendations), recommends, Math.min(recommends.size(), 3)); mWatchMeAdapter.add(getString(R.string.section_popular), popular, Math.min(popular.size(), 3)); mWatchMeAdapter.add(getString(R.string.section_last_added), videos, videos.size()); if(!getScrollManager().isToolbarVisible()){ ViewGroup toolbarWrapper = (ViewGroup) (getWatchMeActivity()).getToolbar() .getParent(); getScrollManager().show(toolbarWrapper); } } @DebugLog @Subscribe @SuppressWarnings("unused") public void onLoadMoreItemsEvent(ScrollManager.LoadMoreItems items){ if(isPageLoading() || !canLoadMorePages()){ return; } mPendingJobId = mJobManager.addJob(new FetchCategoryPage(mSelectedCategory, mCurrentPageNumber + 1)); } @Override @DebugLog @Subscribe @SuppressWarnings("unused") public void onSuggestionAvailable(Mover.Suggestion suggestion) { super.onSuggestionAvailable(suggestion); } boolean isPageLoading(){ return mPendingJobId != NO_ID; } boolean canLoadMorePages(){ return mCategoryPagesCount > 1 || mCategoryPagesCount == UNKNOWN_STATE; } @Subscribe @SuppressWarnings("unused") public void onStartLoadingPage(State.OnStartLoadingPage event){ if(event.page < 2){ getRecycleView().scrollToPosition(0); mWatchMeAdapter.clear(); if(!isProgressVisible()){ showProgress(); } } } @Subscribe @SuppressWarnings("unused") public void onResponse(State.OnPageResponseEvent event){ Mover.CategoryPage page = (Mover.CategoryPage) event.page; mPendingJobId = NO_ID; mCategoryPagesCount = page.getPagesCount(); mCurrentPageNumber = 1; if(mCategoryPagesCount == -1) { mCategoryPagesCount = UNKNOWN_STATE; } showContent(); renderMainPage(page.getRecommends(), page.getPopular(), page.getVideos()); } @Subscribe @SuppressWarnings("unused") public void onResponse(State.OnPaginatedPageResponseEvent event){ Mover.PaginatedPage page = (Mover.PaginatedPage) event.page; mPendingJobId = NO_ID; mCurrentPageNumber = page.getPageNumber(); mCategoryPagesCount = page.getPagesCount(); mCategoryPagesCount = page.getPagesCount(); showContent(); renderPaginatedPage(page.getVideos()); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(SELECTED_CATEGORY, mSelectedCategoryPosition); outState.putInt(CURRENT_PAGE, mCurrentPageNumber); outState.putInt(PAGES_COUNT, mCategoryPagesCount); } public void setSelected(String item, int pageNum){ int position = 0; for(int index = 0; index < mCategories.length; index++){ if(mCategories[index].equals(item)){ position = index; } } mSelectedCategoryPosition = position; mSelectedCategory = item.trim(); if(mPendingJobId != NO_ID){ mJobManager.cancelJobInBackground(mPendingJobId, false); } mPendingJobId = mJobManager.addJob(new FetchCategoryPage(mSelectedCategory, pageNum)); } public void setSelected(int position){ mSelectedCategoryPosition = position; mSelectedCategory = mCategories[position].trim(); if(mPendingJobId != NO_ID){ mJobManager.cancelJobInBackground(mPendingJobId, false); } mPendingJobId = mJobManager.addJob(new FetchCategoryPage(mSelectedCategory, 1)); } @Override public void onDestroy() { super.onDestroy(); if(mPendingJobId != NO_ID){ mJobManager.cancelJobInBackground(mPendingJobId, false); } } @Override public JobManager getJobManager() { return mJobManager; } }