package org.solovyev.android.calculator.wizard; import android.app.Activity; import android.content.Context; import android.os.Bundle; import org.solovyev.android.calculator.release.ChooseThemeReleaseNoteStep; import org.solovyev.android.calculator.release.ReleaseNoteStep; import org.solovyev.android.calculator.release.ReleaseNotes; import org.solovyev.android.wizard.BaseWizard; import org.solovyev.android.wizard.ListWizardFlow; import org.solovyev.android.wizard.Wizard; import org.solovyev.android.wizard.WizardFlow; import org.solovyev.android.wizard.WizardStep; import org.solovyev.android.wizard.Wizards; import java.util.ArrayList; import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; import static org.solovyev.android.calculator.wizard.CalculatorWizardStep.last; import static org.solovyev.android.calculator.wizard.CalculatorWizardStep.welcome; public class CalculatorWizards implements Wizards { public static final String FIRST_TIME_WIZARD = "first-wizard"; public static final String RELEASE_NOTES = "release-notes"; public static final String RELEASE_NOTES_VERSION = "version"; public static final String DEFAULT_WIZARD_FLOW = "app-wizard"; @Nonnull private final Context context; public CalculatorWizards(@Nonnull Context context) { this.context = context; } @Nonnull static WizardFlow newDefaultWizardFlow() { final List<WizardStep> wizardSteps = new ArrayList<WizardStep>(); for (WizardStep wizardStep : CalculatorWizardStep.values()) { if (wizardStep != welcome && wizardStep != last && wizardStep.isVisible()) { wizardSteps.add(wizardStep); } } return new ListWizardFlow(wizardSteps); } @Nonnull static WizardFlow newReleaseNotesWizardFlow(@Nonnull Context context, @Nullable Bundle arguments) { final List<WizardStep> wizardSteps = new ArrayList<WizardStep>(); final int startVersion = arguments != null ? arguments.getInt(RELEASE_NOTES_VERSION, 0) : 0; List<Integer> versions = ReleaseNotes.getReleaseNotesVersions(context, startVersion); final int size = versions.size(); if (size > 7) { versions = versions.subList(0, 7); } for (Integer version : versions) { switch (version) { case ChooseThemeReleaseNoteStep.VERSION_CODE: wizardSteps.add(new ChooseThemeReleaseNoteStep(version)); break; default: wizardSteps.add(new ReleaseNoteStep(version)); break; } } return new ListWizardFlow(wizardSteps); } @Nonnull static WizardFlow newFirstTimeWizardFlow() { final List<WizardStep> wizardSteps = new ArrayList<WizardStep>(); for (WizardStep wizardStep : CalculatorWizardStep.values()) { if (wizardStep.isVisible()) { wizardSteps.add(wizardStep); } } return new ListWizardFlow(wizardSteps); } @Nonnull @Override public Class<? extends Activity> getActivityClassName() { return WizardActivity.class; } @Nonnull @Override public Wizard getWizard(@Nullable String name, @Nullable Bundle arguments) { if (name == null) { return getWizard(FIRST_TIME_WIZARD, arguments); } if (FIRST_TIME_WIZARD.equals(name)) { return newBaseWizard(FIRST_TIME_WIZARD, newFirstTimeWizardFlow()); } else if (DEFAULT_WIZARD_FLOW.equals(name)) { return newBaseWizard(DEFAULT_WIZARD_FLOW, newDefaultWizardFlow()); } else if (RELEASE_NOTES.equals(name)) { return newBaseWizard(RELEASE_NOTES, newReleaseNotesWizardFlow(context, arguments)); } else { throw new IllegalArgumentException("Wizard flow " + name + " is not supported"); } } @Nonnull @Override public Wizard getWizard(@Nullable String name) throws IllegalArgumentException { return getWizard(name, null); } @Nonnull private BaseWizard newBaseWizard(@Nonnull String name, @Nonnull WizardFlow flow) { return new BaseWizard(name, context, flow); } }