package com.quran.labs.androidquran.ui.helpers; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.view.ViewGroup; import com.quran.labs.androidquran.data.Constants; import com.quran.labs.androidquran.data.QuranInfo; import com.quran.labs.androidquran.ui.fragment.QuranPageFragment; import com.quran.labs.androidquran.ui.fragment.TabletFragment; import com.quran.labs.androidquran.ui.fragment.TranslationFragment; import timber.log.Timber; import static com.quran.labs.androidquran.data.Constants.PAGES_LAST; import static com.quran.labs.androidquran.data.Constants.PAGES_LAST_DUAL; public class QuranPageAdapter extends FragmentStatePagerAdapter { private boolean mIsShowingTranslation = false; private boolean mIsDualPages = false; public QuranPageAdapter(FragmentManager fm, boolean dualPages, boolean isShowingTranslation) { super(fm, dualPages ? "dualPages" : "singlePage"); mIsDualPages = dualPages; mIsShowingTranslation = isShowingTranslation; } public void setTranslationMode() { if (!mIsShowingTranslation) { mIsShowingTranslation = true; notifyDataSetChanged(); } } public void setQuranMode() { if (mIsShowingTranslation) { mIsShowingTranslation = false; notifyDataSetChanged(); } } public boolean getIsShowingTranslation() { return mIsShowingTranslation; } @Override public int getItemPosition(Object object) { /* when the ViewPager gets a notifyDataSetChanged (or invalidated), * it goes through its set of saved views and runs this method on * each one to figure out whether or not it should remove the view * or not. the default implementation returns POSITION_UNCHANGED, * which means that "this page is as is." * * as noted in http://stackoverflow.com/questions/7263291 in one * of the answers, if you're just updating your view (changing a * field's value, etc), this is highly inefficient (because you * recreate the view for nothing). * * in our case, however, this is the right thing to do since we * change the fragment completely when we notifyDataSetChanged. */ return POSITION_NONE; } @Override public int getCount() { return mIsDualPages ? PAGES_LAST_DUAL : PAGES_LAST; } @Override public Fragment getItem(int position) { int page = QuranInfo.getPageFromPos(position, mIsDualPages); Timber.d("getting page: %d", page); if (mIsDualPages) { return TabletFragment.newInstance(page, mIsShowingTranslation ? TabletFragment.Mode.TRANSLATION : TabletFragment.Mode.ARABIC); } else if (mIsShowingTranslation) { return TranslationFragment.newInstance(page); } else { return QuranPageFragment.newInstance(page); } } @Override public void destroyItem(ViewGroup container, int position, Object object) { Fragment f = (Fragment) object; Timber.d("destroying item: %d, %s", position, f); cleanupFragment(f); super.destroyItem(container, position, object); } @Override public void cleanupFragment(Fragment f) { if (f instanceof QuranPageFragment) { ((QuranPageFragment) f).cleanup(); } else if (f instanceof TabletFragment) { ((TabletFragment) f).cleanup(); } } public QuranPage getFragmentIfExistsForPage(int page) { if (page < Constants.PAGES_FIRST || PAGES_LAST < page) { return null; } int position = QuranInfo.getPosFromPage(page, mIsDualPages); Fragment fragment = getFragmentIfExists(position); return fragment instanceof QuranPage && fragment.isAdded() ? (QuranPage) fragment : null; } }