package com.kickstarter.ui.adapters;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;
import com.kickstarter.libs.utils.DiscoveryUtils;
import com.kickstarter.models.Category;
import com.kickstarter.services.DiscoveryParams;
import com.kickstarter.ui.ArgumentsKey;
import com.kickstarter.ui.fragments.DiscoveryFragment;
import java.util.List;
import rx.Observable;
public final class DiscoveryPagerAdapter extends FragmentPagerAdapter {
private final Delegate delegate;
private List<DiscoveryFragment> fragments;
private List<String> pageTitles;
public interface Delegate {
void discoveryPagerAdapterSetPrimaryPage(DiscoveryPagerAdapter adapter, int position);
}
public DiscoveryPagerAdapter(final @NonNull FragmentManager fragmentManager, final @NonNull List<DiscoveryFragment> fragments,
final @NonNull List<String> pageTitles, final Delegate delegate) {
super(fragmentManager);
this.delegate = delegate;
this.fragments = fragments;
this.pageTitles = pageTitles;
}
@Override
public void setPrimaryItem(final @NonNull ViewGroup container, final int position, final @NonNull Object object) {
super.setPrimaryItem(container, position, object);
this.delegate.discoveryPagerAdapterSetPrimaryPage(this, position);
}
@Override
public @NonNull Object instantiateItem(final @NonNull ViewGroup container, final int position) {
final DiscoveryFragment fragment = (DiscoveryFragment) super.instantiateItem(container, position);
this.fragments.set(position, fragment);
return fragment;
}
@Override
public @NonNull Fragment getItem(final int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return DiscoveryParams.Sort.values().length;
}
@Override
public CharSequence getPageTitle(final int position) {
return this.pageTitles.get(position);
}
/**
* Passes along root categories to its fragment position to help fetch appropriate projects.
*/
public void takeCategoriesForPosition(final @NonNull List<Category> categories, final int position) {
Observable.from(this.fragments)
.filter(DiscoveryFragment::isInstantiated)
.filter(frag -> {
final int fragmentPosition = frag.getArguments().getInt(ArgumentsKey.DISCOVERY_SORT_POSITION);
return fragmentPosition == position;
})
.subscribe(frag -> frag.takeCategories(categories));
}
/**
* Take current params from activity and pass to the appropriate fragment.
*/
public void takeParams(final @NonNull DiscoveryParams params) {
Observable.from(this.fragments)
.filter(DiscoveryFragment::isInstantiated)
.filter(frag -> {
final int fragmentPosition = frag.getArguments().getInt(ArgumentsKey.DISCOVERY_SORT_POSITION);
return DiscoveryUtils.positionFromSort(params.sort()) == fragmentPosition;
})
.subscribe(frag -> frag.updateParams(params));
}
/**
* Call when the view model tells us to clear specific pages.
*/
public void clearPages(final @NonNull List<Integer> pages) {
Observable.from(this.fragments)
.filter(DiscoveryFragment::isInstantiated)
.filter(frag -> {
final int fragmentPosition = frag.getArguments().getInt(ArgumentsKey.DISCOVERY_SORT_POSITION);
return pages.contains(fragmentPosition);
})
.subscribe(DiscoveryFragment::clearPage);
}
}