package org.solovyev.android.calculator.wizard; import android.content.SharedPreferences; import android.graphics.Typeface; import android.os.Bundle; import android.support.annotation.LayoutRes; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import org.solovyev.android.calculator.AppComponent; import org.solovyev.android.calculator.BaseActivity; import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.release.ChooseThemeReleaseNoteFragment; import org.solovyev.android.calculator.release.ChooseThemeReleaseNoteStep; import org.solovyev.android.calculator.release.ReleaseNoteFragment; import org.solovyev.android.calculator.release.ReleaseNoteStep; import org.solovyev.android.views.Adjuster; import org.solovyev.android.wizard.Wizard; import org.solovyev.android.wizard.WizardFlow; import org.solovyev.android.wizard.WizardStep; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.inject.Inject; import static org.solovyev.android.calculator.App.cast; public abstract class WizardFragment extends Fragment implements View.OnClickListener { @Nullable protected TextView nextButton; @Nullable protected TextView prevButton; @Inject SharedPreferences preferences; @Inject Typeface typeface; private WizardStep step; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); inject(cast(this).getComponent()); step = findStepByClassName(); } protected void inject(@Nonnull AppComponent component) { component.inject(this); } @Nonnull private WizardStep findStepByClassName() { if (this instanceof ReleaseNoteFragment) { return new ReleaseNoteStep(getArguments()); } if (this instanceof ChooseThemeReleaseNoteFragment) { return new ChooseThemeReleaseNoteStep(getArguments()); } for (CalculatorWizardStep step : CalculatorWizardStep.values()) { if (step.getFragmentClass().equals(getClass())) { return step; } } throw new AssertionError("Wizard step for class " + getClass() + " was not found"); } @Nonnull @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_wizard, container, false); final ViewGroup content = (ViewGroup) view.findViewById(R.id.wizard_content); inflater.inflate(getViewResId(), content, true); Adjuster.maxWidth(content, getResources().getDimensionPixelSize(R.dimen.cpp_wizard_max_width)); nextButton = (TextView) view.findViewById(R.id.wizard_next); if (nextButton != null) { nextButton.setOnClickListener(this); } prevButton = (TextView) view.findViewById(R.id.wizard_prev); if (prevButton != null) { prevButton.setOnClickListener(this); } final Wizard wizard = getWizardActivity().getWizard(); final WizardFlow flow = wizard.getFlow(); final boolean canGoNext = flow.getNextStep(step) != null; final boolean canGoPrev = flow.getPrevStep(step) != null; final boolean firstTimeWizard = TextUtils.equals(wizard.getName(), CalculatorWizards.FIRST_TIME_WIZARD); if (canGoNext) { if (canGoPrev || !firstTimeWizard) { setupNextButton(R.string.cpp_wizard_next); } else { setupNextButton(R.string.cpp_wizard_start); } } else { setupNextButton(R.string.cpp_wizard_finish); } if (canGoPrev) { setupPrevButton(R.string.cpp_wizard_back); } else { if (firstTimeWizard) { setupPrevButton(R.string.cpp_wizard_skip); } } return view; } @Override public void onViewCreated(View view, @android.support.annotation.Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); BaseActivity.fixFonts(view, typeface); } protected final void setupNextButton(int textResId) { assert nextButton != null; nextButton.setText(textResId); nextButton.setVisibility(View.VISIBLE); } protected final void setupPrevButton(int textResId) { assert prevButton != null; prevButton.setText(textResId); prevButton.setVisibility(View.VISIBLE); } @LayoutRes protected abstract int getViewResId(); @Override public void onClick(View v) { final int id = v.getId(); final WizardActivity activity = getWizardActivity(); switch (id) { case R.id.wizard_next: if (activity.canGoNext()) { activity.goNext(); } else { activity.finishWizard(); } break; case R.id.wizard_prev: if (activity.canGoPrev()) { activity.goPrev(); } else { activity.finishWizardAbruptly(); } break; } } private WizardActivity getWizardActivity() { return (WizardActivity) getActivity(); } public WizardStep getStep() { if (step == null) { step = findStepByClassName(); } return step; } public void onNext() { getStep().onNext(this); } public void onPrev() { getStep().onPrev(this); } }