package what.whatandroid.forums.forum;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.util.SparseArray;
import android.view.ViewGroup;
import api.forum.forum.Forum;
import api.soup.MySoup;
import what.whatandroid.callbacks.LoadingListener;
import what.whatandroid.callbacks.OnLoggedInCallback;
/**
* Adapter for swiping through the pages of the forum
*/
public class ForumPagerAdapter extends FragmentStatePagerAdapter implements OnLoggedInCallback, LoadingListener<Forum> {
private LoadingListener<Forum> listener;
private SparseArray<ForumListFragment> fragments;
private int pages, forum;
/**
* Create a fragment pager view displaying the paged lists of posts in the forum
*
* @param pages number of pages to display initially. Will be updated to the total
* amount after loading the first page
* @param forum forum id to display
*/
public ForumPagerAdapter(FragmentManager fm, int pages, int forum){
super(fm);
fragments = new SparseArray<ForumListFragment>();
this.pages = pages;
this.forum = forum;
}
@Override
public Fragment getItem(int position){
//Page numbers start at 1 but positions are 0-indexed
return ForumListFragment.newInstance(forum, position + 1);
}
@Override
public CharSequence getPageTitle(int position){
return "page " + (position + 1) + " of " + pages;
}
@Override
public int getCount(){
return pages;
}
@Override
public Object instantiateItem(ViewGroup container, int position){
ForumListFragment f = (ForumListFragment)super.instantiateItem(container, position);
if (MySoup.isLoggedIn()){
f.onLoggedIn();
}
//We need to load a page to figure out how many pages there are in total, so listen to the first one
if (position == 0){
f.setListener(this);
}
fragments.put(position, f);
return f;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object){
super.destroyItem(container, position, object);
fragments.remove(position);
}
@Override
public void onLoggedIn(){
for (int i = 0; i < fragments.size(); ++i){
fragments.valueAt(i).onLoggedIn();
}
}
public void refresh() {
for (int i = 0; i < fragments.size(); ++i) {
fragments.valueAt(i).refresh();
}
}
public void setLoadingListener(LoadingListener<Forum> listener){
this.listener = listener;
}
/**
* Update the view pager to show all pages in the forum, now that we know how many
* there are
*
* @param data the loaded data
*/
@Override
public void onLoadingComplete(Forum data){
pages = data.getPages();
notifyDataSetChanged();
listener.onLoadingComplete(data);
}
/**
* Set the forum layout to light/default layout for all used fragments.
* @param set True if set light version.
*/
public void setUseLightLayout(boolean set){
for (int i = 0; i < fragments.size(); ++i){
fragments.valueAt(i).setUseLightLayout(set);
}
}
}