145 lines
4.4 KiB
Java
145 lines
4.4 KiB
Java
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;
|
|
}
|
|
}
|