package com.androsz.electricsleepbeta.app.wizard; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.View; import android.widget.Button; import com.androsz.electricsleepbeta.R; import com.androsz.electricsleepbeta.app.HostActivity; import com.androsz.electricsleepbeta.app.Log; import com.androsz.electricsleepbeta.widget.DisablableTitlePageIndicator; import com.androsz.electricsleepbeta.widget.DisablableViewPager; public abstract class WizardActivity extends HostActivity { private static final String TAG = WizardActivity.class.getSimpleName(); private DisablableViewPager wizardPager; private DisablableTitlePageIndicator indicator; private IndicatorPageChangeListener indicatorListener; @Override protected int getContentAreaLayoutId() { return R.layout.activity_wizard; } @Override public void onBackPressed() { onLeftButtonClick(null); } private final class IndicatorPageChangeListener implements OnPageChangeListener { private int lastSettledPosition = 0; private int lastPosition = -2; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // lastPosition = position; } @Override public void onPageScrollStateChanged(int state) { // if we are settled on a new page... if (state == ViewPager.SCROLL_STATE_IDLE && lastSettledPosition != lastPosition) { lastSettledPosition = lastPosition; setupNavigationButtons(lastSettledPosition); onPerformWizardAction(lastSettledPosition); } } @Override public void onPageSelected(int position) { lastPosition = position; } public int getLastSettledPosition() { return lastSettledPosition; } public void setLastSettledPosition(int index) { lastSettledPosition = index; } } protected abstract PagerAdapter getPagerAdapter(); //WARNING: THIS WILL BREAK if FragmentPagerAdapter's same, internal string changes. protected static String makeFragmentName(int index) { return "android:switcher:" + R.id.wizardPager + ":" + index; } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); wizardPager = (DisablableViewPager) findViewById(R.id.wizardPager); wizardPager.setAdapter(getPagerAdapter()); indicator = (DisablableTitlePageIndicator) findViewById(R.id.indicator); indicator.setFooterColor(getResources().getColor(R.color.primary1)); indicatorListener = new IndicatorPageChangeListener(); indicator.setOnPageChangeListener(indicatorListener); int initialPosition = 0; indicator.setViewPager(wizardPager, initialPosition); Log.d(TAG, "this happens"); if (savedInstanceState != null) { initialPosition = savedInstanceState.getInt("child"); setCurrentWizardIndex(initialPosition); indicatorListener.setLastSettledPosition(initialPosition); Log.d(TAG, "and that happens"); } } @Override protected void onResume() { super.onResume(); Log.d(TAG, "evilonresume"); setupNavigationButtons(wizardPager.getCurrentItem()); onPerformWizardAction(wizardPager.getCurrentItem()); } protected abstract void onFinishWizardActivity() throws IllegalStateException; public void onLeftButtonClick(final View v) { int currentItem = getCurrentWizardIndex(); if (currentItem != 0) { setCurrentWizardIndex(currentItem - 1); } else { super.onBackPressed(); } } protected void setCurrentWizardIndex(int index) { indicator.setCurrentItem(index, true); Log.d(TAG, "setCurrentWizardIndex to " + index); } protected int getCurrentWizardIndex() { return indicatorListener.getLastSettledPosition(); } protected void setPagingEnabled(boolean enabled) { this.indicator.setPagingEnabled(enabled); this.wizardPager.setPagingEnabled(enabled); } protected abstract void onPrepareLastSlide(Button rightButton); public void onRightButtonClick(final View v) { final int lastPageIndex = getPagerAdapter().getCount() - 1; final int displayedChildIndex = getCurrentWizardIndex(); if (displayedChildIndex == lastPageIndex) { onFinishWizardActivity(); } else { setCurrentWizardIndex(displayedChildIndex + 1); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("child", getCurrentWizardIndex()); } protected abstract void onPerformWizardAction(int focusedIndex); protected void setupNavigationButtons(int index) { Log.d(TAG, "setupNavigationButtons "+index); final Button leftButton = (Button) findViewById(R.id.leftButton); final Button rightButton = (Button) findViewById(R.id.rightButton); final int lastChildIndex = getPagerAdapter().getCount() - 1; if (index > -1 && index < lastChildIndex) { leftButton.setText(R.string.back); rightButton.setText(R.string.next); } else if (index == lastChildIndex) { leftButton.setText(R.string.back); rightButton.setText(R.string.finish); onPrepareLastSlide(rightButton); } } }