package org.solovyev.android.wizard; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import javax.annotation.Nonnull; import javax.annotation.Nullable; public class WizardUi<A extends FragmentActivity> { private static final String FLOW = "flow"; private static final String ARGUMENTS = "arguments"; private static final String STEP = "step"; @Nonnull protected final A activity; @Nonnull protected final WizardsAware wizardsAware; protected final int layoutResId; protected WizardStep step; protected Wizard wizard; public WizardUi(@Nonnull A activity, @Nonnull WizardsAware wizardsAware, int layoutResId) { this.activity = activity; this.wizardsAware = wizardsAware; this.layoutResId = layoutResId; } public static void startWizard(@Nonnull Wizards wizards, @Nonnull Context context) { context.startActivity(createLaunchIntent(wizards, null, context)); } public static void startWizard(@Nonnull Wizards wizards, @Nullable String name, @Nonnull Context context) { context.startActivity(createLaunchIntent(wizards, name, context)); } public static void continueWizard(@Nonnull Wizards wizards, @Nonnull String name, @Nonnull Context context) { final Intent intent = createLaunchIntent(wizards, name, context); final Wizard wizard = wizards.getWizard(name); final String step = wizard.getLastSavedStepName(); tryPutStep(intent, step); context.startActivity(intent); } public static void tryPutStep(@Nonnull Intent intent, @Nullable WizardStep step) { tryPutStep(intent, step != null ? step.getName() : null); } private static void tryPutStep(@Nonnull Intent intent, @Nullable String step) { if (step != null) { intent.putExtra(STEP, step); } } @Nonnull public static Intent createLaunchIntent(@Nonnull Wizards wizards, @Nullable String name, @Nonnull Context context) { return createLaunchIntent(wizards, name, context, null); } @Nonnull public static Intent createLaunchIntent(@Nonnull Wizards wizards, @Nullable String name, @Nonnull Context context, @Nullable Bundle arguments) { final Intent intent = new Intent(context, wizards.getActivityClassName()); intent.putExtra(FLOW, name); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.putExtra(ARGUMENTS, arguments); return intent; } public void onCreate(@Nullable Bundle savedInstanceState) { if (layoutResId != 0) { activity.setContentView(layoutResId); } final Intent intent = activity.getIntent(); String wizardName = intent.getStringExtra(FLOW); String stepName = intent.getStringExtra(STEP); if (savedInstanceState != null) { wizardName = savedInstanceState.getString(FLOW); stepName = savedInstanceState.getString(STEP); } final Bundle arguments = intent.getBundleExtra(ARGUMENTS); wizard = wizardsAware.getWizards().getWizard(wizardName, arguments); if (stepName != null) { step = wizard.getFlow().getStepByName(stepName); } if (step == null) { step = wizard.getFlow().getFirstStep(); } } public void finishWizardAbruptly() { finishWizard(true); } public void finishWizard() { finishWizard(false); } protected final void finishWizard(boolean forceFinish) { if (wizard != null && step != null) { wizard.saveFinished(step, forceFinish); } activity.finish(); } @Nonnull protected final FragmentManager getFragmentManager() { return activity.getSupportFragmentManager(); } public void onSaveInstanceState(@Nonnull Bundle out) { out.putString(FLOW, wizard.getName()); out.putString(STEP, step.getName()); } public void onPause() { if (wizard != null && step != null) { wizard.saveLastStep(step); } } public WizardStep getStep() { return step; } public void setStep(WizardStep step) { this.step = step; } public WizardFlow getFlow() { return wizard.getFlow(); } public Wizard getWizard() { return wizard; } }