From ebdabf877cee0e42b3a2006f313516980a865155 Mon Sep 17 00:00:00 2001 From: idelcano Date: Fri, 27 Oct 2017 08:37:14 +0200 Subject: [PATCH 1/2] working on restore of the spinner values after mobile rotation --- .../IFillSavedInstanceValues.java | 8 +++ .../OuTreeMultiQuestionView.java | 62 ++++++++++++++++++- .../malariacare/fragments/SurveyFragment.java | 16 +++++ .../adapters/survey/DynamicTabAdapter.java | 28 ++++++++- 4 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/IFillSavedInstanceValues.java diff --git a/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/IFillSavedInstanceValues.java b/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/IFillSavedInstanceValues.java new file mode 100644 index 0000000000..ac2847ea86 --- /dev/null +++ b/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/IFillSavedInstanceValues.java @@ -0,0 +1,8 @@ +package org.eyeseetea.malariacare.views.question.multiquestion; + +import android.os.Bundle; + +public interface IFillSavedInstanceValues{ + Bundle fillSavedInstanceValues(Bundle savedInstanceValues); + void restoreSavedInstanceValues(Bundle savedInstanceValues); +} diff --git a/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/OuTreeMultiQuestionView.java b/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/OuTreeMultiQuestionView.java index b5cc2d1585..3d11a9f8de 100644 --- a/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/OuTreeMultiQuestionView.java +++ b/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/OuTreeMultiQuestionView.java @@ -1,6 +1,7 @@ package org.eyeseetea.malariacare.views.question.multiquestion; import android.content.Context; +import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.Spinner; @@ -9,6 +10,7 @@ import org.eyeseetea.malariacare.data.database.model.OptionDB; import org.eyeseetea.malariacare.data.database.model.QuestionDB; import org.eyeseetea.malariacare.data.database.model.ValueDB; +import org.eyeseetea.malariacare.data.database.utils.PreferencesState; import org.eyeseetea.malariacare.layout.adapters.general.OptionArrayAdapter; import org.eyeseetea.malariacare.views.question.AOptionQuestionView; import org.eyeseetea.malariacare.views.question.IMultiQuestionView; @@ -19,7 +21,7 @@ import java.util.List; public class OuTreeMultiQuestionView extends AOptionQuestionView implements IQuestionView, - IMultiQuestionView { + IMultiQuestionView, IFillSavedInstanceValues { private CustomTextView header; private Spinner spinnerProvince, spinnerDistrict, spinnerCommune, spinnerVillage; private QuestionDB mQuestionDB; @@ -175,4 +177,62 @@ public void onNothingSelected(AdapterView adapterView) { } }); } + + private void spinnerListenerAction(Spinner spinner, int position, Spinner child, + String defaultText) { + OptionDB optionDB = (OptionDB) spinner.getItemAtPosition(position); + setOptionsWithParent(child, optionDB.getId_option(), defaultText); + } + + @Override + public Bundle fillSavedInstanceValues(Bundle savedInstanceValues) { + if(spinnerProvince.getSelectedItemPosition()!=0){ + savedInstanceValues.putInt("R.id.spinner_province", spinnerProvince.getSelectedItemPosition()); + } + if(spinnerDistrict.getSelectedItemPosition()!=0){ + savedInstanceValues.putInt("R.id.spinner_district", + spinnerDistrict.getSelectedItemPosition()); + } + if(spinnerCommune.getSelectedItemPosition()!=0){ + savedInstanceValues.putInt("R.id.spinner_commune", spinnerCommune.getSelectedItemPosition()); + } + if(spinnerVillage.getSelectedItemPosition()!=0){ + savedInstanceValues.putInt("R.id.spinner_village", spinnerVillage.getSelectedItemPosition()); + } + return savedInstanceValues; + } + + @Override + public void restoreSavedInstanceValues(Bundle savedInstanceValues) { + if(savedInstanceValues.containsKey("R.id.spinner_province")){ + Integer selectedItem = savedInstanceValues.getInt("R.id.spinner_province"); + if(selectedItem!=null) { + spinnerProvince.setSelection(selectedItem); + spinnerListenerAction(spinnerProvince, selectedItem, spinnerDistrict, + PreferencesState.getInstance().getContext().getString(R.string.district)); + } + } + if(savedInstanceValues.containsKey("R.id.spinner_district")){ + Integer selectedItem = savedInstanceValues.getInt("R.id.spinner_district"); + if(selectedItem!=null) { + spinnerDistrict.setSelection(selectedItem); + spinnerListenerAction(spinnerDistrict, selectedItem, spinnerCommune, + PreferencesState.getInstance().getContext().getString(R.string.commune)); + } + } + if(savedInstanceValues.containsKey("R.id.spinner_commune")){ + Integer selectedItem = savedInstanceValues.getInt("R.id.spinner_commune"); + if(selectedItem!=null) { + spinnerCommune.setSelection(selectedItem); + spinnerListenerAction(spinnerCommune, selectedItem, spinnerVillage, + PreferencesState.getInstance().getContext().getString(R.string.village)); + } + } + if(savedInstanceValues.containsKey("R.id.spinner_village")){ + Integer selectedItem = savedInstanceValues.getInt("R.id.spinner_village"); + if(selectedItem!=null) { + spinnerVillage.setSelection(selectedItem); + } + } + } } diff --git a/app/src/main/java/org/eyeseetea/malariacare/fragments/SurveyFragment.java b/app/src/main/java/org/eyeseetea/malariacare/fragments/SurveyFragment.java index 2ea0bc3470..00d6fb943a 100644 --- a/app/src/main/java/org/eyeseetea/malariacare/fragments/SurveyFragment.java +++ b/app/src/main/java/org/eyeseetea/malariacare/fragments/SurveyFragment.java @@ -20,7 +20,9 @@ import android.app.Activity; import android.app.Fragment; +import android.content.res.Configuration; import android.os.Bundle; +import android.os.Parcelable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -231,4 +233,18 @@ private void showSurvey() { new LoadingSurveyException(e); } } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + saveInstanceState(); + } + + public void saveInstanceState() { + dynamicTabAdapter.fillSaveInstanceState(); + } + + public void restoreInstanceState() { + dynamicTabAdapter.restoreSaveInstanceState(); + } } diff --git a/app/src/main/java/org/eyeseetea/malariacare/layout/adapters/survey/DynamicTabAdapter.java b/app/src/main/java/org/eyeseetea/malariacare/layout/adapters/survey/DynamicTabAdapter.java index ff0794e45d..4f7500d5cb 100644 --- a/app/src/main/java/org/eyeseetea/malariacare/layout/adapters/survey/DynamicTabAdapter.java +++ b/app/src/main/java/org/eyeseetea/malariacare/layout/adapters/survey/DynamicTabAdapter.java @@ -28,6 +28,8 @@ import android.content.Context; import android.content.DialogInterface; import android.graphics.Typeface; +import android.os.Bundle; +import android.os.Parcelable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -57,6 +59,7 @@ import org.eyeseetea.malariacare.data.database.utils.PreferencesState; import org.eyeseetea.malariacare.data.database.utils.Session; import org.eyeseetea.malariacare.domain.entity.Validation; +import org.eyeseetea.malariacare.fragments.SurveyFragment; import org.eyeseetea.malariacare.layout.adapters.survey.navigation.NavigationController; import org.eyeseetea.malariacare.layout.adapters.survey.strategies.ADynamicTabAdapterStrategy; import org.eyeseetea.malariacare.layout.adapters.survey.strategies.DynamicTabAdapterStrategy; @@ -80,6 +83,7 @@ import org.eyeseetea.malariacare.views.question.INavigationQuestionView; import org.eyeseetea.malariacare.views.question.IQuestionView; import org.eyeseetea.malariacare.views.question.multiquestion.DatePickerQuestionView; +import org.eyeseetea.malariacare.views.question.multiquestion.IFillSavedInstanceValues; import org.eyeseetea.malariacare.views.question.multiquestion.YearSelectorQuestionView; import org.eyeseetea.malariacare.views.question.singlequestion.ImageRadioButtonSingleQuestionView; import org.eyeseetea.malariacare.views.question.singlequestion.strategies @@ -133,6 +137,7 @@ public class DynamicTabAdapter extends BaseAdapter implements ITabAdapter { public static SwipeTouchListener swipeTouchListener; private boolean mReviewMode = false; private boolean isBackward = true; + Bundle savedInstanceState; public DynamicTabAdapter(Context context, boolean reviewMode) throws NullPointerException { mReviewMode = reviewMode; @@ -548,7 +553,7 @@ public View getView(int position, View convertView, ViewGroup parent) { rowView.requestLayout(); reloadingQuestionFromInvalidOption = false; - + restoreSaveInstanceState(); return rowView; } @@ -978,6 +983,7 @@ public void hideKeyboard(Context c) { * value. */ public void finishOrNext() { + hideKeyboard(PreferencesState.getInstance().getContext()); mDynamicTabAdapterStrategy.finishOrNext(); } @@ -1135,4 +1141,24 @@ private void saveSwitchOption(QuestionDB questionDB, boolean isChecked) { questionDB.saveValuesDDL(selectedOptionDB, questionDB.getValueBySession()); showOrHideChildren(questionDB); } + + public void fillSaveInstanceState() { + savedInstanceState = new Bundle(); + for(IMultiQuestionView multiQuestionView:mMultiQuestionViews){ + if(multiQuestionView instanceof IFillSavedInstanceValues){ + ((IFillSavedInstanceValues)multiQuestionView).fillSavedInstanceValues(savedInstanceState); + } + } + } + + public void restoreSaveInstanceState() { + if(savedInstanceState!=null) { + for (IMultiQuestionView multiQuestionView : mMultiQuestionViews) { + if (multiQuestionView instanceof IFillSavedInstanceValues) { + ((IFillSavedInstanceValues) multiQuestionView).restoreSavedInstanceValues( + savedInstanceState); + } + } + } + } } \ No newline at end of file From a3bafa519d5fb65c0ddac91da2d37d20994d9012 Mon Sep 17 00:00:00 2001 From: idelcano Date: Fri, 27 Oct 2017 11:36:15 +0200 Subject: [PATCH 2/2] use customSpinner and prevent false itemselectedlistener calls --- .../OuTreeMultiQuestionView.java | 39 +++++++++---------- .../layout/multi_question_dropdown_tree.xml | 8 ++-- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/OuTreeMultiQuestionView.java b/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/OuTreeMultiQuestionView.java index 334be02c43..7a2b7687b7 100644 --- a/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/OuTreeMultiQuestionView.java +++ b/app/src/cnm/java/org/eyeseetea/malariacare/views/question/multiquestion/OuTreeMultiQuestionView.java @@ -10,11 +10,11 @@ import org.eyeseetea.malariacare.data.database.model.OptionDB; import org.eyeseetea.malariacare.data.database.model.QuestionDB; import org.eyeseetea.malariacare.data.database.model.ValueDB; -import org.eyeseetea.malariacare.data.database.utils.PreferencesState; import org.eyeseetea.malariacare.layout.adapters.general.OptionArrayAdapter; import org.eyeseetea.malariacare.views.question.AOptionQuestionView; import org.eyeseetea.malariacare.views.question.IMultiQuestionView; import org.eyeseetea.malariacare.views.question.IQuestionView; +import org.eyeseetea.sdk.presentation.views.CustomSpinner; import org.eyeseetea.sdk.presentation.views.CustomTextView; import java.util.ArrayList; @@ -24,7 +24,7 @@ public class OuTreeMultiQuestionView extends AOptionQuestionView implements IQuestionView, IMultiQuestionView, IFillSavedInstanceValues { private CustomTextView header; - private Spinner spinnerProvince, spinnerDistrict, spinnerCommune, spinnerVillage; + private CustomSpinner spinnerProvince, spinnerDistrict, spinnerCommune, spinnerVillage; private QuestionDB mQuestionDB; private boolean optionSetFromSavedValue = false; private List mOptionDBs; @@ -39,10 +39,10 @@ public OuTreeMultiQuestionView(Context context) { private void init(Context context) { inflate(context, R.layout.multi_question_dropdown_tree, this); header = (CustomTextView) findViewById(R.id.row_header_text); - spinnerProvince = (Spinner) findViewById(R.id.spinner_province); - spinnerDistrict = (Spinner) findViewById(R.id.spinner_district); - spinnerCommune = (Spinner) findViewById(R.id.spinner_commune); - spinnerVillage = (Spinner) findViewById(R.id.spinner_village); + spinnerProvince = (CustomSpinner) findViewById(R.id.spinner_province); + spinnerDistrict = (CustomSpinner) findViewById(R.id.spinner_district); + spinnerCommune = (CustomSpinner) findViewById(R.id.spinner_commune); + spinnerVillage = (CustomSpinner) findViewById(R.id.spinner_village); mContext = context; setSpinnerOnItemSelectedListener(spinnerProvince, spinnerDistrict, @@ -183,12 +183,6 @@ public void onNothingSelected(AdapterView adapterView) { }); } - private void spinnerListenerAction(Spinner spinner, int position, Spinner child, - String defaultText) { - OptionDB optionDB = (OptionDB) spinner.getItemAtPosition(position); - setOptionsWithParent(child, optionDB.getId_option(), defaultText); - } - @Override public Bundle fillSavedInstanceValues(Bundle savedInstanceValues) { if(spinnerProvince.getSelectedItemPosition()!=0){ @@ -212,25 +206,28 @@ public void restoreSavedInstanceValues(Bundle savedInstanceValues) { if(savedInstanceValues.containsKey("R.id.spinner_province")){ Integer selectedItem = savedInstanceValues.getInt("R.id.spinner_province"); if(selectedItem!=null) { - spinnerProvince.setSelection(selectedItem); - spinnerListenerAction(spinnerProvince, selectedItem, spinnerDistrict, - PreferencesState.getInstance().getContext().getString(R.string.district)); + spinnerProvince.setSelection(selectedItem, true, true); + OptionDB seltectedOptionDB = (OptionDB)spinnerProvince.getSelectedItem(); + setOptionsWithParent(spinnerDistrict, seltectedOptionDB.getId_option(), + mContext.getString(R.string.district)); } } if(savedInstanceValues.containsKey("R.id.spinner_district")){ Integer selectedItem = savedInstanceValues.getInt("R.id.spinner_district"); if(selectedItem!=null) { - spinnerDistrict.setSelection(selectedItem); - spinnerListenerAction(spinnerDistrict, selectedItem, spinnerCommune, - PreferencesState.getInstance().getContext().getString(R.string.commune)); + spinnerDistrict.setSelection(selectedItem, true, true); + OptionDB seltectedOptionDB = (OptionDB)spinnerDistrict.getSelectedItem(); + setOptionsWithParent(spinnerCommune, seltectedOptionDB.getId_option(), + mContext.getString(R.string.district)); } } if(savedInstanceValues.containsKey("R.id.spinner_commune")){ Integer selectedItem = savedInstanceValues.getInt("R.id.spinner_commune"); if(selectedItem!=null) { - spinnerCommune.setSelection(selectedItem); - spinnerListenerAction(spinnerCommune, selectedItem, spinnerVillage, - PreferencesState.getInstance().getContext().getString(R.string.village)); + spinnerCommune.setSelection(selectedItem, true, true); + OptionDB seltectedOptionDB = (OptionDB)spinnerCommune.getSelectedItem(); + setOptionsWithParent(spinnerVillage, seltectedOptionDB.getId_option(), + mContext.getString(R.string.district)); } } if(savedInstanceValues.containsKey("R.id.spinner_village")){ diff --git a/app/src/cnm/res/layout/multi_question_dropdown_tree.xml b/app/src/cnm/res/layout/multi_question_dropdown_tree.xml index d47a3ae902..e87b89e314 100644 --- a/app/src/cnm/res/layout/multi_question_dropdown_tree.xml +++ b/app/src/cnm/res/layout/multi_question_dropdown_tree.xml @@ -24,7 +24,7 @@ app:font_name="@string/normal_font" /> - - - -