package org.solovyev.android.calculator.wizard;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import com.viewpagerindicator.PageIndicator;
import org.solovyev.android.calculator.*;
import org.solovyev.android.calculator.language.Languages;
import org.solovyev.android.wizard.*;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
public class WizardActivity extends BaseActivity implements WizardsAware, SharedPreferences.OnSharedPreferenceChangeListener {
@Nonnull
private final WizardUi<WizardActivity> wizardUi = new WizardUi<>(this, this, 0);
@Nonnull
private final DialogListener dialogListener = new DialogListener();
@Nonnull
private ViewPager pager;
@Nonnull
private WizardPagerAdapter pagerAdapter;
@Nullable
private AlertDialog dialog;
@Inject
SharedPreferences preferences;
@Inject
Languages languages;
@Inject
Wizards wizards;
public WizardActivity() {
super(R.layout.cpp_activity_wizard, 0);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
wizardUi.onCreate(savedInstanceState);
final ListWizardFlow flow = (ListWizardFlow) wizardUi.getFlow();
pager = (ViewPager) findViewById(R.id.pager);
pagerAdapter = new WizardPagerAdapter(flow, getSupportFragmentManager());
pager.setAdapter(pagerAdapter);
final PageIndicator titleIndicator = (PageIndicator) findViewById(R.id.pager_indicator);
titleIndicator.setViewPager(pager);
final Wizard wizard = wizardUi.getWizard();
titleIndicator.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
final WizardStep step = flow.getStepAt(position);
wizardUi.setStep(step);
WizardUi.tryPutStep(getIntent(), step);
wizard.saveLastStep(step);
}
});
if (savedInstanceState == null) {
final int position = flow.getPositionFor(wizardUi.getStep());
pager.setCurrentItem(position);
}
if (wizard.getLastSavedStepName() == null) {
wizard.saveLastStep(wizardUi.getStep());
}
preferences.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void inject(@Nonnull AppComponent component) {
super.inject(component);
component.inject(this);
}
@Override
public void onBackPressed() {
if (pager.getCurrentItem() == 0) {
finishWizardAbruptly();
} else {
pager.setCurrentItem(pager.getCurrentItem() - 1);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
wizardUi.onSaveInstanceState(outState);
}
@Override
protected void onPause() {
super.onPause();
wizardUi.onPause();
}
@Nonnull
@Override
public Wizards getWizards() {
return wizards;
}
public void setWizards(@Nonnull Wizards wizards) {
this.wizards = wizards;
}
public void finishWizardAbruptly() {
final String wizardName = wizardUi.getWizard().getName();
final boolean confirmed = wizardName.equals(CalculatorWizards.RELEASE_NOTES) || wizardName.equals(CalculatorWizards.DEFAULT_WIZARD_FLOW);
finishWizardAbruptly(confirmed);
}
public void finishWizardAbruptly(boolean confirmed) {
if (!confirmed) {
if (dialog != null) {
return;
}
final AlertDialog.Builder b = new AlertDialog.Builder(this, App.getTheme().alertDialogTheme);
b.setTitle(R.string.cpp_wizard_finish_confirmation_title).
setMessage(R.string.cpp_wizard_finish_confirmation).
setNegativeButton(R.string.cpp_no, dialogListener).
setPositiveButton(R.string.cpp_yes, dialogListener).
setOnCancelListener(dialogListener);
dialog = b.create();
dialog.setOnDismissListener(dialogListener);
dialog.show();
return;
}
dismissDialog();
wizardUi.finishWizardAbruptly();
finish();
}
public void finishWizard() {
wizardUi.finishWizard();
finish();
}
public boolean canGoNext() {
final int position = pager.getCurrentItem();
return position != pagerAdapter.getCount() - 1;
}
public boolean canGoPrev() {
final int position = pager.getCurrentItem();
return position != 0;
}
public void goNext() {
final int position = pager.getCurrentItem();
if (position < pagerAdapter.getCount() - 1) {
final WizardFragment fragment = (WizardFragment) pagerAdapter.getItem(position);
fragment.onNext();
pager.setCurrentItem(position + 1, true);
}
}
public void goPrev() {
final int position = pager.getCurrentItem();
if (position > 0) {
final WizardFragment fragment = (WizardFragment) pagerAdapter.getItem(position);
fragment.onPrev();
pager.setCurrentItem(position - 1, true);
}
}
public WizardFlow getFlow() {
return wizardUi.getFlow();
}
public Wizard getWizard() {
return wizardUi.getWizard();
}
@Override
protected void onDestroy() {
preferences.unregisterOnSharedPreferenceChangeListener(this);
dismissDialog();
super.onDestroy();
}
private void dismissDialog() {
if (dialog != null) {
dialog.dismiss();
dialog = null;
}
}
private class WizardPagerAdapter extends FragmentStatePagerAdapter {
@Nonnull
private final ListWizardFlow flow;
public WizardPagerAdapter(@Nonnull ListWizardFlow flow, @Nonnull FragmentManager fm) {
super(fm);
this.flow = flow;
}
@Override
public Fragment getItem(int position) {
final WizardStep step = flow.getStepAt(position);
final String className = step.getFragmentClass().getName();
final Bundle args = step.getFragmentArgs();
return Fragment.instantiate(WizardActivity.this, className, args);
}
@Override
public int getCount() {
return flow.getCount();
}
}
private class DialogListener implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener, DialogInterface.OnCancelListener {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
finishWizardAbruptly(true);
}
}
public void onDismiss(DialogInterface d) {
dialog = null;
}
@Override
public void onCancel(DialogInterface d) {
dialog = null;
}
}
}