/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.adapter;
import java.util.HashMap;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.FilterAdapter.FilterDataSourceChangedListener;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.subtasks.SubtasksHelper;
public class TaskListFragmentPagerAdapter extends FragmentStatePagerAdapter implements FilterDataSourceChangedListener {
private final HashMap<Integer, Fragment> positionToFragment;
private final FilterAdapter filterAdapter; // Shares an adapter instance with the filter list fragment
public TaskListFragmentPagerAdapter(FragmentManager fm, FilterAdapter filterAdapter) {
super(fm);
this.filterAdapter = filterAdapter;
filterAdapter.setDataSourceChangedListener(this);
positionToFragment = new HashMap<Integer, Fragment>();
}
@Override
public void filterDataSourceChanged() {
notifyDataSetChanged();
}
/**
* Instantiates and returns a fragment for the filter at the specified position.
* Also maps the position to the fragment in a cache for later lookup
*/
@Override
public Fragment getItem(int position) {
Filter filter = filterAdapter.getItem(position);
Fragment fragment = getFragmentForFilter(filter);
positionToFragment.put(position, fragment);
return fragment;
}
/**
* Lookup the fragment for the specified position
* @param position
* @return
*/
public Fragment lookupFragmentForPosition(int position) {
return positionToFragment.get(position);
}
@Override
public CharSequence getPageTitle(int position) {
return filterAdapter.getItem(position).title;
}
/**
* Adds the specified filter to the data source if it doesn't exist,
* returning the position of that filter regardless
* @param filter
* @return
*/
public int addOrLookup(Filter filter) {
return filterAdapter.addOrLookup(filter);
}
public int getPosition(Filter filter) {
return filterAdapter.getPosition(filter);
}
public void remove(Filter filter) {
filterAdapter.remove(filter);
}
/**
* Get the filter at the specified position
* @param position
* @return
*/
public Filter getFilter(int position) {
return filterAdapter.getItem(position);
}
@Override
public int getCount() {
return filterAdapter.getCount();
}
private Fragment getFragmentForFilter(Filter filter) {
Bundle extras = getExtrasForFilter(filter);
Class<?> customList = null;
if (SubtasksHelper.shouldUseSubtasksFragmentForFilter(filter))
customList = SubtasksHelper.subtasksClassForFilter(filter);
return TaskListFragment.instantiateWithFilterAndExtras(filter, extras, customList);
}
// Constructs extras corresponding to the specified filter that can be used as arguments to the fragment
private Bundle getExtrasForFilter(Filter filter) {
Bundle extras = null;
if (filter instanceof FilterWithCustomIntent)
extras = ((FilterWithCustomIntent) filter).customExtras;
if (extras == null)
extras = new Bundle();
if (filter != null)
extras.putParcelable(TaskListFragment.TOKEN_FILTER, filter);
return extras;
}
@Override
public Parcelable saveState() {
return null; // Don't save state
}
}