diff --git a/android-app/src/main/java/org/solovyev/android/calculator/wizard/CalculatorWizardActivity.java b/android-app/src/main/java/org/solovyev/android/calculator/wizard/CalculatorWizardActivity.java index 62b06d84..bac018ce 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/wizard/CalculatorWizardActivity.java +++ b/android-app/src/main/java/org/solovyev/android/calculator/wizard/CalculatorWizardActivity.java @@ -1,5 +1,7 @@ package org.solovyev.android.calculator.wizard; +import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -20,8 +22,8 @@ import static android.view.View.VISIBLE; */ public final class CalculatorWizardActivity extends SherlockFragmentActivity { - private static final String FLOW = "flow"; - private static final String STEP = "step"; + static final String FLOW = "flow"; + static final String STEP = "step"; /* ********************************************************************** @@ -55,8 +57,8 @@ public final class CalculatorWizardActivity extends SherlockFragmentActivity { nextButton = findViewById(R.id.wizard_next_button); finishButton = findViewById(R.id.wizard_finish_button); - String wizardName = null; - WizardStep step = null; + String wizardName = getIntent().getStringExtra(FLOW); + WizardStep step = (WizardStep) getIntent().getSerializableExtra(STEP); if (savedInstanceState != null) { wizardName = savedInstanceState.getString(FLOW); step = (WizardStep) savedInstanceState.getSerializable(STEP); @@ -71,7 +73,7 @@ public final class CalculatorWizardActivity extends SherlockFragmentActivity { setStep(step); } - private void setStep(@Nonnull WizardStep step) { + void setStep(@Nonnull WizardStep step) { if (this.step == null || !this.step.equals(step)) { final FragmentManager fm = getSupportFragmentManager(); final FragmentTransaction ft = fm.beginTransaction(); @@ -191,6 +193,7 @@ public final class CalculatorWizardActivity extends SherlockFragmentActivity { protected void onSaveInstanceState(Bundle out) { super.onSaveInstanceState(out); + out.putString(FLOW, flow.getName()); out.putSerializable(STEP, step); } @@ -201,4 +204,18 @@ public final class CalculatorWizardActivity extends SherlockFragmentActivity { WizardFlow getFlow() { return flow; } + + /* + ********************************************************************** + * + * STATIC/INNER + * + ********************************************************************** + */ + + public static void startWizard(@Nonnull String name, @Nonnull Context context) { + final Intent intent = new Intent(context, CalculatorWizardActivity.class); + intent.putExtra(FLOW, name); + context.startActivity(intent); + } } diff --git a/android-app/src/main/java/org/solovyev/android/calculator/wizard/FirstTimeWizardFlow.java b/android-app/src/main/java/org/solovyev/android/calculator/wizard/FirstTimeWizardFlow.java index 3c5528ec..52323490 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/wizard/FirstTimeWizardFlow.java +++ b/android-app/src/main/java/org/solovyev/android/calculator/wizard/FirstTimeWizardFlow.java @@ -22,8 +22,9 @@ final class FirstTimeWizardFlow implements WizardFlow { FirstTimeWizardFlow() { final List wizardSteps = new ArrayList(); - wizardSteps.add(welcome); - wizardSteps.add(choose_mode); + for (WizardStep wizardStep : WizardStep.values()) { + wizardSteps.add(wizardStep); + } this.listWizardFlow = new ListWizardFlow(NAME, wizardSteps); } diff --git a/android-app/src/main/java/org/solovyev/android/calculator/wizard/Wizard.java b/android-app/src/main/java/org/solovyev/android/calculator/wizard/Wizard.java index 0733ed6b..d35347e8 100644 --- a/android-app/src/main/java/org/solovyev/android/calculator/wizard/Wizard.java +++ b/android-app/src/main/java/org/solovyev/android/calculator/wizard/Wizard.java @@ -17,6 +17,8 @@ public final class Wizard { public static WizardFlow getWizardFlow(@Nonnull String name) { if(FirstTimeWizardFlow.NAME.equals(name)) { return new FirstTimeWizardFlow(); + } else if(AppWizardFlow.NAME.equals(name)) { + return new AppWizardFlow(); } else { throw new IllegalArgumentException("Wizard flow " + name + " is not supported"); } diff --git a/android-app/src/test/java/org/solovyev/android/calculator/wizard/CalculatorWizardActivityTest.java b/android-app/src/test/java/org/solovyev/android/calculator/wizard/CalculatorWizardActivityTest.java index eac1819c..45eedf01 100644 --- a/android-app/src/test/java/org/solovyev/android/calculator/wizard/CalculatorWizardActivityTest.java +++ b/android-app/src/test/java/org/solovyev/android/calculator/wizard/CalculatorWizardActivityTest.java @@ -1,9 +1,17 @@ package org.solovyev.android.calculator.wizard; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; + +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; +import org.robolectric.shadows.ShadowActivity; import org.robolectric.util.ActivityController; import static org.junit.Assert.assertEquals; @@ -17,16 +25,84 @@ import static org.junit.Assert.assertNotNull; @RunWith(value = RobolectricTestRunner.class) public class CalculatorWizardActivityTest { + private ActivityController controller; + private CalculatorWizardActivity activity; + + @Before + public void setUp() throws Exception { + controller = Robolectric.buildActivity(CalculatorWizardActivity.class); + activity = controller.get(); + } + @Test - public void testRestoreState() throws Exception { - final ActivityController controller = Robolectric.buildActivity(CalculatorWizardActivity.class); + public void testCreate() throws Exception { controller.attach(); controller.create(); - final CalculatorWizardActivity activity = controller.get(); assertNotNull(activity.getFlow()); assertEquals(FirstTimeWizardFlow.NAME, activity.getFlow().getName()); assertNotNull(activity.getStep()); assertEquals(activity.getFlow().getFirstStep(), activity.getStep()); + + activity.setStep(WizardStep.choose_mode); + + final Bundle outState = new Bundle(); + controller.saveInstanceState(outState); + + controller = Robolectric.buildActivity(CalculatorWizardActivity.class); + controller.create(outState); + + activity = controller.get(); + assertNotNull(activity.getFlow()); + assertEquals(FirstTimeWizardFlow.NAME, activity.getFlow().getName()); + assertNotNull(activity.getStep()); + assertEquals(WizardStep.choose_mode, activity.getStep()); + + final Intent intent = new Intent(); + intent.setClass(activity, CalculatorWizardActivity.class); + intent.putExtra(CalculatorWizardActivity.FLOW, AppWizardFlow.NAME); + controller = Robolectric.buildActivity(CalculatorWizardActivity.class).withIntent(intent); + activity = controller.get(); + controller.create(null); + assertEquals(AppWizardFlow.NAME, activity.getFlow().getName()); + assertEquals(activity.getFlow().getFirstStep(), activity.getStep()); + + final Bundle outState1 = new Bundle(); + controller.saveInstanceState(outState1); + + controller = Robolectric.buildActivity(CalculatorWizardActivity.class); + activity = controller.get(); + controller.create(outState1); + assertEquals(AppWizardFlow.NAME, activity.getFlow().getName()); + assertEquals(activity.getFlow().getFirstStep(), activity.getStep()); + } + + @Test + public void testFragment() throws Exception { + controller.create().start().resume(); + + final FragmentManager fm = activity.getSupportFragmentManager(); + Fragment f = fm.findFragmentByTag(WizardStep.welcome.getFragmentTag()); + Assert.assertNotNull(f); + Assert.assertTrue(f.isAdded()); + + activity.setStep(WizardStep.choose_mode); + + f = fm.findFragmentByTag(WizardStep.choose_mode.getFragmentTag()); + Assert.assertNotNull(f); + Assert.assertTrue(f.isAdded()); + } + + @Test + public void testSetStep() throws Exception { + controller.create(); + activity.setStep(WizardStep.choose_mode); + } + + @Test + public void testStartWizard() throws Exception { + final ShadowActivity shadowActivity = Robolectric.shadowOf(controller.get()); + CalculatorWizardActivity.startWizard(AppWizardFlow.NAME, shadowActivity.getApplicationContext()); + Assert.assertNotNull(shadowActivity.getNextStartedActivity()); } }