wizard finished

This commit is contained in:
Solovyev_S 2013-07-01 13:00:02 +04:00
parent 5518a38f16
commit cba364f036
12 changed files with 186 additions and 107 deletions

View File

@ -201,9 +201,7 @@
<string name="c_first_start_text_title">Приветствие</string> <string name="c_first_start_text_title">Приветствие</string>
<string name="c_first_start_text">Спасибо за выбор Калькулятора++!\n\nКалькулятор++ - это мощный инструмент для <string name="c_first_start_text">Спасибо за выбор Калькулятора++!\n\nКалькулятор++ - это мощный инструмент для
проведения ежедневных расчётов.\n\nДля избавление от рекламы и поддержки проекта вы можете воспользоваться проведения ежедневных расчётов.
специальной опцией доступной из настроек приложения.\n\nПеред началом работы рекомендуется прочитать FAQ и
подсказки для использования всех возможностей программы (нажмите Меню, затем Помощь)
</string> </string>
<string name="c_calc_show_release_notes_title">Показывать примечания к выпуску</string> <string name="c_calc_show_release_notes_title">Показывать примечания к выпуску</string>

View File

@ -181,7 +181,7 @@
<string name="c_copy_value">複製值</string> <string name="c_copy_value">複製值</string>
<string name="c_first_start_text">感謝您選擇 Calculator++!\n\nCalculator++ <string name="c_first_start_text">感謝您選擇 Calculator++!\n\nCalculator++
是一個強大的計算工具.\n\n您可以從設定選單內的一個特殊選項移除廣告並支持此專案.\n\n強烈建議您在使用本程式之前先閱讀常見問題以及提示 (按下選單鍵, 然後選擇「說明」) 是一個強大的計算工具.
</string> </string>
<string name="c_first_start_text_title">歡迎</string> <string name="c_first_start_text_title">歡迎</string>

View File

@ -196,9 +196,7 @@
<string name="c_copy_value">Copy value</string> <string name="c_copy_value">Copy value</string>
<string name="c_first_start_text">Thank you for choosing Calculator++!\n\nCalculator++ is a powerful tool for making <string name="c_first_start_text">Thank you for choosing Calculator++!\n\nCalculator++ is a powerful tool for making
everyday calculations.\n\nTo remove the ads and support the project you can use special option from application everyday calculations.
settings.\n\nIt\'s highly recommended to read the FAQ and hints before the work to use all the features of
application (press Menu button and then Help)
</string> </string>
<string name="c_first_start_text_title">Welcome</string> <string name="c_first_start_text_title">Welcome</string>

View File

@ -23,6 +23,10 @@
--> -->
<resources> <resources>
<string name="cpp_wizard_next">Next</string>
<string name="cpp_wizard_back">Back</string>
<string name="cpp_wizard_finish">Finish</string>
<string name="cpp_wizard_start">Start wizard</string>
<string name="cpp_wizard_layout_optimized">Optimized</string> <string name="cpp_wizard_layout_optimized">Optimized</string>
<string name="cpp_wizard_layout_big_buttons">Big buttons</string> <string name="cpp_wizard_layout_big_buttons">Big buttons</string>
<string name="cpp_wizard_mode_simple">Simple</string> <string name="cpp_wizard_mode_simple">Simple</string>
@ -47,5 +51,14 @@
<string name="cpp_wizard_mode_title">Choose mode</string> <string name="cpp_wizard_mode_title">Choose mode</string>
<string name="cpp_wizard_onscreen_calculator_title">Calculator in a separate window</string> <string name="cpp_wizard_onscreen_calculator_title">Calculator in a separate window</string>
<string name="cpp_wizard_dragbutton_title">Drag button basics</string> <string name="cpp_wizard_dragbutton_title">Drag button basics</string>
<string name="cpp_wizard_final_title">Almost done!</string>
<string name="cpp_wizard_final_free_and_opensource">Calculator++ is free and open-source: all the features are free
of charge and source code can be found on github.
</string>
<string name="cpp_wizard_final_ways_to_help">There are several ways how you can help to make this app better:
</string>
<string name="cpp_wizard_final_donate">Donating money</string>
<string name="cpp_wizard_final_translate">Translating</string>
<string name="cpp_wizard_final_contribute">Contributing source code</string>
</resources> </resources>

View File

@ -46,22 +46,14 @@
a:layout_height="wrap_content" a:layout_height="wrap_content"
a:layout_width="0dp" a:layout_width="0dp"
a:layout_weight="1" a:layout_weight="1"
a:text="Prev"/> a:text="@string/cpp_wizard_back"/>
<Button <Button
a:id="@+id/wizard_next_button" a:id="@+id/wizard_next_button"
a:layout_height="wrap_content" a:layout_height="wrap_content"
a:layout_width="0dp" a:layout_width="0dp"
a:layout_weight="1" a:layout_weight="1"
a:text="Next"/> a:text="@string/cpp_wizard_next"/>
<Button
a:id="@+id/wizard_finish_button"
a:layout_height="wrap_content"
a:layout_width="0dp"
a:layout_weight="1"
a:visibility="gone"
a:text="Finish"/>
</LinearLayout> </LinearLayout>

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2013 serso aka se.solovyev
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~ Contact details
~
~ Email: se.solovyev@gmail.com
~ Site: http://se.solovyev.org
-->
<LinearLayout
xmlns:a="http://schemas.android.com/apk/res/android"
a:layout_width="match_parent"
a:layout_height="match_parent"
a:orientation="vertical">
<TextView a:layout_height="wrap_content"
a:layout_width="match_parent"
a:text="@string/cpp_wizard_final_free_and_opensource"/>
<TextView a:layout_height="wrap_content"
a:layout_width="match_parent"
a:layout_marginTop="10dp"
a:text="@string/cpp_wizard_final_ways_to_help"/>
<Button a:id="@+id/cpp_wizard_final_donate_button"
a:layout_height="wrap_content"
a:layout_width="match_parent"
a:text="@string/cpp_wizard_final_donate"/>
<Button a:id="@+id/cpp_wizard_final_translate_button"
a:layout_height="wrap_content"
a:layout_width="match_parent"
a:text="@string/cpp_wizard_final_translate"/>
<Button a:id="@+id/cpp_wizard_final_contribute_button"
a:layout_height="wrap_content"
a:layout_width="match_parent"
a:text="@string/cpp_wizard_final_contribute"/>
</LinearLayout>

View File

@ -28,6 +28,7 @@ import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.solovyev.android.calculator.wizard.WizardStep.last;
import static org.solovyev.android.calculator.wizard.Wizards.DEFAULT_WIZARD_FLOW; import static org.solovyev.android.calculator.wizard.Wizards.DEFAULT_WIZARD_FLOW;
import static org.solovyev.android.calculator.wizard.Wizards.FIRST_TIME_WIZARD; import static org.solovyev.android.calculator.wizard.Wizards.FIRST_TIME_WIZARD;
import static org.solovyev.android.calculator.wizard.WizardStep.welcome; import static org.solovyev.android.calculator.wizard.WizardStep.welcome;
@ -50,7 +51,7 @@ final class AppWizardFlow implements WizardFlow {
static AppWizardFlow newDefaultWizardFlow() { static AppWizardFlow newDefaultWizardFlow() {
final List<WizardStep> wizardSteps = new ArrayList<WizardStep>(); final List<WizardStep> wizardSteps = new ArrayList<WizardStep>();
for (WizardStep wizardStep : WizardStep.values()) { for (WizardStep wizardStep : WizardStep.values()) {
if (wizardStep != welcome && wizardStep.isVisible()) { if (wizardStep != welcome && wizardStep != last && wizardStep.isVisible()) {
wizardSteps.add(wizardStep); wizardSteps.add(wizardStep);
} }
} }

View File

@ -30,6 +30,7 @@ import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.view.View; import android.view.View;
import android.widget.Button;
import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.R;
@ -67,8 +68,7 @@ public final class CalculatorWizardActivity extends FragmentActivity {
*/ */
private View prevButton; private View prevButton;
private View nextButton; private Button nextButton;
private View finishButton;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -77,8 +77,7 @@ public final class CalculatorWizardActivity extends FragmentActivity {
setContentView(R.layout.cpp_wizard); setContentView(R.layout.cpp_wizard);
prevButton = findViewById(R.id.wizard_prev_button); prevButton = findViewById(R.id.wizard_prev_button);
nextButton = findViewById(R.id.wizard_next_button); nextButton = (Button) findViewById(R.id.wizard_next_button);
finishButton = findViewById(R.id.wizard_finish_button);
String wizardName = getIntent().getStringExtra(FLOW); String wizardName = getIntent().getStringExtra(FLOW);
String stepName = getIntent().getStringExtra(STEP); String stepName = getIntent().getStringExtra(STEP);
@ -109,29 +108,10 @@ public final class CalculatorWizardActivity extends FragmentActivity {
initTitle(); initTitle();
initNextButton(); initNextButton();
initFinishButton();
initPrevButton(); initPrevButton();
} }
} }
private void initFinishButton() {
final WizardStep nextStep = flow.getNextStep(step);
if (nextStep == null) {
finishButton.setVisibility(VISIBLE);
finishButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (tryGoNext()) {
finishFlow();
}
}
});
} else {
finishButton.setVisibility(GONE);
finishButton.setOnClickListener(null);
}
}
private void initTitle() { private void initTitle() {
setTitle(step.getTitleResId()); setTitle(step.getTitleResId());
} }
@ -157,10 +137,17 @@ public final class CalculatorWizardActivity extends FragmentActivity {
private void initNextButton() { private void initNextButton() {
final WizardStep nextStep = flow.getNextStep(step); final WizardStep nextStep = flow.getNextStep(step);
if (nextStep == null) { if (nextStep == null) {
nextButton.setVisibility(GONE); nextButton.setText(R.string.cpp_wizard_finish);
nextButton.setOnClickListener(null); nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (tryGoNext()) {
finishFlow();
}
}
});
} else { } else {
nextButton.setVisibility(VISIBLE); nextButton.setText(step.getNextButtonTitleResId());
nextButton.setOnClickListener(new View.OnClickListener() { nextButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -284,10 +271,6 @@ public final class CalculatorWizardActivity extends FragmentActivity {
return nextButton; return nextButton;
} }
View getFinishButton() {
return finishButton;
}
/* /*
********************************************************************** **********************************************************************
* *

View File

@ -0,0 +1,69 @@
package org.solovyev.android.calculator.wizard;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.preference.Preference;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import net.robotmedia.billing.BillingController;
import org.solovyev.android.ads.AdsController;
import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.preferences.CalculatorPurchaseDialogActivity;
import static android.content.Intent.ACTION_VIEW;
public class FinalWizardStep extends Fragment {
private static final String GITHUB_URL = "https://github.com/serso/android-calculatorpp";
private static final String CROWDIN_URL = "http://crowdin.net/project/calculatorpp";
private Button donateButton;
private Button translateButton;
private Button contributeButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.cpp_wizard_step_final, null);
}
@Override
public void onViewCreated(View root, Bundle savedInstanceState) {
super.onViewCreated(root, savedInstanceState);
donateButton = (Button) root.findViewById(R.id.cpp_wizard_final_donate_button);
donateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getActivity(), CalculatorPurchaseDialogActivity.class));
}
});
translateButton = (Button) root.findViewById(R.id.cpp_wizard_final_translate_button);
translateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showUrl(CROWDIN_URL);
}
});
contributeButton = (Button) root.findViewById(R.id.cpp_wizard_final_contribute_button);
contributeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showUrl(GITHUB_URL);
}
});
}
private void showUrl(String url) {
startActivity(new Intent(ACTION_VIEW, Uri.parse(url)));
}
}

View File

@ -48,23 +48,7 @@ import static org.solovyev.android.calculator.wizard.OnScreenCalculatorWizardSte
*/ */
enum WizardStep { enum WizardStep {
welcome(WelcomeWizardStep.class, R.string.cpp_wizard_welcome_title) { welcome(WelcomeWizardStep.class, R.string.cpp_wizard_welcome_title, R.string.cpp_wizard_start),
@Override
boolean onNext(@Nonnull Fragment fragment) {
return true;
}
@Override
boolean onPrev(@Nonnull Fragment fragment) {
return true;
}
@Nullable
@Override
Bundle getFragmentArgs() {
return null;
}
},
choose_layout(ChooseLayoutWizardStep.class, R.string.cpp_wizard_layout_title) { choose_layout(ChooseLayoutWizardStep.class, R.string.cpp_wizard_layout_title) {
@Override @Override
@ -79,11 +63,6 @@ enum WizardStep {
return true; return true;
} }
@Override
boolean onPrev(@Nonnull Fragment fragment) {
return true;
}
@Nullable @Nullable
@Override @Override
Bundle getFragmentArgs() { Bundle getFragmentArgs() {
@ -113,11 +92,6 @@ enum WizardStep {
return true; return true;
} }
@Override
boolean onPrev(@Nonnull Fragment fragment) {
return true;
}
@Nullable @Nullable
@Override @Override
Bundle getFragmentArgs() { Bundle getFragmentArgs() {
@ -141,11 +115,6 @@ enum WizardStep {
return true; return true;
} }
@Override
boolean onPrev(@Nonnull Fragment fragment) {
return true;
}
@Nullable @Nullable
@Override @Override
Bundle getFragmentArgs() { Bundle getFragmentArgs() {
@ -157,32 +126,25 @@ enum WizardStep {
} }
}, },
drag_button_step(DragButtonWizardStep.class, R.string.cpp_wizard_dragbutton_title) { drag_button(DragButtonWizardStep.class, R.string.cpp_wizard_dragbutton_title),
@Override
boolean onNext(@Nonnull Fragment fragment) {
return true;
}
@Override last(FinalWizardStep.class, R.string.cpp_wizard_final_title);
boolean onPrev(@Nonnull Fragment fragment) {
return true;
}
@Nullable
@Override
Bundle getFragmentArgs() {
return null;
}
};
@Nonnull @Nonnull
private final Class<? extends Fragment> fragmentClass; private final Class<? extends Fragment> fragmentClass;
private final int titleResId; private final int titleResId;
private final int nextButtonTitleResId;
WizardStep(@Nonnull Class<? extends Fragment> fragmentClass, int titleResId) { WizardStep(@Nonnull Class<? extends Fragment> fragmentClass, int titleResId) {
this(fragmentClass, titleResId, R.string.cpp_wizard_next);
}
WizardStep(@Nonnull Class<? extends Fragment> fragmentClass, int titleResId, int nextButtonTitleResId) {
this.fragmentClass = fragmentClass; this.fragmentClass = fragmentClass;
this.titleResId = titleResId; this.titleResId = titleResId;
this.nextButtonTitleResId = nextButtonTitleResId;
} }
public String getFragmentTag() { public String getFragmentTag() {
@ -198,12 +160,22 @@ enum WizardStep {
return titleResId; return titleResId;
} }
abstract boolean onNext(@Nonnull Fragment fragment); int getNextButtonTitleResId() {
return nextButtonTitleResId;
}
abstract boolean onPrev(@Nonnull Fragment fragment); boolean onNext(@Nonnull Fragment fragment) {
return true;
}
boolean onPrev(@Nonnull Fragment fragment) {
return true;
}
@Nullable @Nullable
abstract Bundle getFragmentArgs(); Bundle getFragmentArgs() {
return null;
}
public boolean isVisible() { public boolean isVisible() {
return true; return true;

View File

@ -156,11 +156,10 @@ public class CalculatorWizardActivityTest {
} }
@Test @Test
public void testNextButtonShouldNotBeShownAtTheEnd() throws Exception { public void testNextButtonShouldBeShownAtTheEnd() throws Exception {
setLastStep(); setLastStep();
assertEquals(VISIBLE, activity.getPrevButton().getVisibility()); assertEquals(VISIBLE, activity.getPrevButton().getVisibility());
assertEquals(GONE, activity.getNextButton().getVisibility()); assertEquals(VISIBLE, activity.getNextButton().getVisibility());
assertEquals(VISIBLE, activity.getFinishButton().getVisibility());
} }
private void setLastStep() { private void setLastStep() {
@ -171,7 +170,6 @@ public class CalculatorWizardActivityTest {
public void testPrevButtonShouldNotBeShownAtTheStart() throws Exception { public void testPrevButtonShouldNotBeShownAtTheStart() throws Exception {
setFirstStep(); setFirstStep();
assertEquals(VISIBLE, activity.getNextButton().getVisibility()); assertEquals(VISIBLE, activity.getNextButton().getVisibility());
assertEquals(GONE, activity.getFinishButton().getVisibility());
assertEquals(GONE, activity.getPrevButton().getVisibility()); assertEquals(GONE, activity.getPrevButton().getVisibility());
} }
@ -182,9 +180,9 @@ public class CalculatorWizardActivityTest {
@Test @Test
public void testShouldSaveLastWizardStateOnPause() throws Exception { public void testShouldSaveLastWizardStateOnPause() throws Exception {
assertNull(Wizards.getLastSavedWizardStepName(activity.getFlow().getName())); assertNull(Wizards.getLastSavedWizardStepName(activity.getFlow().getName()));
activity.setStep(WizardStep.drag_button_step); activity.setStep(WizardStep.drag_button);
activity.onPause(); activity.onPause();
assertEquals(WizardStep.drag_button_step.getName(), Wizards.getLastSavedWizardStepName(activity.getFlow().getName())); assertEquals(WizardStep.drag_button.getName(), Wizards.getLastSavedWizardStepName(activity.getFlow().getName()));
} }
@Test @Test

View File

@ -115,11 +115,11 @@ public class WizardStepTest {
WizardStep.choose_layout.onNext(layoutFragment); WizardStep.choose_layout.onNext(layoutFragment);
} }
@Config(qualifiers = "large") /* @Config(qualifiers = "large")
@Test @Test
public void testChooseLayoutShouldBeVisibleForTablet() throws Exception { public void testChooseLayoutShouldBeVisibleForTablet() throws Exception {
assertTrue(WizardStep.choose_layout.isVisible()); assertTrue(WizardStep.choose_layout.isVisible());
} }*/
@Config(qualifiers = "normal") @Config(qualifiers = "normal")
@Test @Test