package com.dozuki.ifixit.ui.guide.view; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FixedFragmentStatePagerAdapter; import android.view.View; import com.dozuki.ifixit.App; import com.dozuki.ifixit.R; import com.dozuki.ifixit.model.guide.Guide; import java.util.HashMap; import java.util.Map; public class GuideViewAdapter extends FixedFragmentStatePagerAdapter { private static final int GUIDE_INTRO_POSITION = 0; private static final int GUIDE_CONCLUSION_OFFSET = 1; private Map<Integer, String> mPageLabelMap; private int mStepOffset = 1; // Default these to a page number that doesn't exist. They will be updated // if the guide has tools and parts. private int mToolsPosition = -1; private int mPartsPosition = -1; private int mConclusionPosition = -1; private Guide mGuide; private boolean mIsOfflineGuide; public GuideViewAdapter(FragmentManager fm, Guide guide, boolean isOfflineGuide) { super(fm); mGuide = guide; mIsOfflineGuide = isOfflineGuide; mPageLabelMap = new HashMap<Integer, String>(); if (guideHasTools()) { mToolsPosition = mStepOffset; mStepOffset++; } if (guideHasParts()) { mPartsPosition = mStepOffset; mStepOffset++; } if (!mGuide.isTeardown()) { mConclusionPosition = getCount() - 1; } } @Override public int getCount() { if (mGuide != null) { int count = mGuide.getNumSteps() + mStepOffset; if (!mGuide.isTeardown()) { count += GUIDE_CONCLUSION_OFFSET; } return count; } else { return 0; } } @Override public Fragment getItem(int position) { Fragment fragment; String label = "/guide/view/" + mGuide.getGuideid(); if (position == GUIDE_INTRO_POSITION) { label += "/intro"; fragment = new GuideIntroViewFragment(mGuide); } else if (position == mToolsPosition) { label += "/tools"; fragment = GuidePartsToolsViewFragment.newInstance(mGuide.getTools()); } else if (position == mPartsPosition) { label += "/parts"; fragment = GuidePartsToolsViewFragment.newInstance(mGuide.getParts()); } else if (position == mConclusionPosition) { label += "/conclusion"; fragment = GuideConclusionFragment.newInstance(mGuide); } else { int stepNumber = (position - mStepOffset); label += "/" + (stepNumber + 1); // Step title # should be 1 indexed. fragment = new GuideStepViewFragment(mGuide.getStep(stepNumber), mIsOfflineGuide); } mPageLabelMap.put(position, label); return fragment; } public String getFragmentScreenLabel(int key) { return mPageLabelMap.get(key); } @Override public void destroyItem(View container, int position, Object object) { super.destroyItem(container, position, object); mPageLabelMap.remove(position); } @Override public CharSequence getPageTitle(int position) { if (position == GUIDE_INTRO_POSITION) { return App.get().getString(R.string.introduction); } else if (position == mToolsPosition) { return App.get().getString(R.string.requiredTools); } else if (position == mPartsPosition) { return App.get().getString(R.string.requiredParts); } else if (position == mConclusionPosition) { return App.get().getString(R.string.conclusion); } else { return App.get().getString(R.string.step_number, (position - mStepOffset) + 1); } } public int getStepOffset() { return mStepOffset; } private boolean guideHasTools() { return mGuide.getNumTools() != 0; } private boolean guideHasParts() { return mGuide.getNumParts() != 0; } }