From eee013ee4947de2bfd653b148978e34858510c05 Mon Sep 17 00:00:00 2001 From: Negue Date: Tue, 25 Apr 2017 22:31:56 +0200 Subject: [PATCH] Show progress while saving & dialog if not all required fields are filled --- .../res/layout/activity_create_challenge.xml | 28 +++-- Habitica/res/values/strings.xml | 3 +- .../activities/CreateChallengeActivity.java | 104 ++++++++++++------ 3 files changed, 82 insertions(+), 53 deletions(-) diff --git a/Habitica/res/layout/activity_create_challenge.xml b/Habitica/res/layout/activity_create_challenge.xml index 613709647..685f103f7 100644 --- a/Habitica/res/layout/activity_create_challenge.xml +++ b/Habitica/res/layout/activity_create_challenge.xml @@ -169,25 +169,23 @@ android:text="Tag" android:textColor="#cc000000" /> - - + android:id="@+id/create_challenge_tag_input_layout" + app:hintTextAppearance="@style/TextAppearance.AppCompat"> + + You don\'t have enough gems to create a challenge. Identify your challenge with a tag .. Please set a tag. - Please add at least one task. + You need at least 1 task to create a challenge. Please set a title. - Please set a description. diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/CreateChallengeActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/CreateChallengeActivity.java index 34fd278d1..99da457b2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/CreateChallengeActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/CreateChallengeActivity.java @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.ui.activities; +import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.res.Resources; @@ -9,6 +10,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.TextInputLayout; import android.support.v7.app.ActionBar; +import android.support.v7.app.AlertDialog; import android.support.v7.widget.AppCompatCheckedTextView; import android.support.v7.widget.AppCompatTextView; import android.support.v7.widget.LinearLayoutManager; @@ -26,6 +28,7 @@ import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; +import com.github.underscore.$; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.components.AppComponent; @@ -50,6 +53,7 @@ import javax.inject.Inject; import butterknife.BindView; import butterknife.OnClick; +import rx.Observable; public class CreateChallengeActivity extends BaseActivity { public static final String CHALLENGE_ID_KEY = "challengeId"; @@ -69,15 +73,16 @@ public class CreateChallengeActivity extends BaseActivity { @BindView(R.id.create_challenge_prize) EditText createChallengePrize; + + @BindView(R.id.create_challenge_tag_input_layout) + TextInputLayout createChallengeTagInputLayout; + @BindView(R.id.create_challenge_tag) EditText createChallengeTag; @BindView(R.id.create_challenge_gem_error) TextView createChallengeGemError; - @BindView(R.id.create_challenge_tag_error) - TextView createChallengeTagError; - @BindView(R.id.create_challenge_task_error) TextView createChallengeTaskError; @@ -129,52 +134,80 @@ public class CreateChallengeActivity extends BaseActivity { return true; } + private boolean savingInProgress = false; + @Override public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.action_save && validateAllFields()) { + if (item.getItemId() == R.id.action_save && !savingInProgress && validateAllFields()) { + savingInProgress = true; + ProgressDialog dialog = ProgressDialog.show(this, "", "Saving challenge data. Please wait...", true, false); + + Observable observable; + if (editMode) { - updateChallenge(); + observable = updateChallenge(); } else { - createChallenge(); + observable = createChallenge(); } + + observable.subscribe(challenge -> { + dialog.dismiss(); + savingInProgress = false; + finish(); + }, throwable -> { + dialog.dismiss(); + savingInProgress = false; + }); + } else if(item.getItemId() == android.R.id.home){ + finish(); + + return true; } return super.onOptionsItemSelected(item); } private boolean validateAllFields() { - int errors = 0; + ArrayList errorMessages = new ArrayList<>(); if (getEditTextString(createChallengeTitle).isEmpty()) { - errors++; - createChallengeTitleInputLayout.setError(getString(R.string.challenge_create_error_title)); + String titleEmptyError = getString(R.string.challenge_create_error_title); + createChallengeTitleInputLayout.setError(titleEmptyError); + errorMessages.add(titleEmptyError); } else { createChallengeTitleInputLayout.setErrorEnabled(false); } - if (getEditTextString(createChallengeDescription).isEmpty()) { - errors++; - createChallengeDescriptionInputLayout.setError(getString(R.string.challenge_create_error_description)); + if (getEditTextString(createChallengeTag).isEmpty()) { + String tagEmptyError = getString(R.string.challenge_create_error_tag); + + createChallengeTagInputLayout.setError(tagEmptyError); + errorMessages.add(tagEmptyError); } else { - createChallengeDescriptionInputLayout.setErrorEnabled(false); + createChallengeTagInputLayout.setErrorEnabled(false); } - if (getEditTextString(createChallengeTag).isEmpty()) { - errors++; - createChallengeTagError.setVisibility(View.VISIBLE); - } else { - createChallengeTagError.setVisibility(View.GONE); + String prizeError = checkPrizeAndMinimumForTavern(); + + if(!prizeError.isEmpty()){ + errorMessages.add(prizeError); } // all "Add {*}"-Buttons are one task itself, so we need atleast more than 4 if (challengeTasks.getTaskList().size() <= 4) { - errors++; createChallengeTaskError.setVisibility(View.VISIBLE); + errorMessages.add(getString(R.string.challenge_create_error_no_tasks)); } else { createChallengeTaskError.setVisibility(View.GONE); } - return errors == 0; + AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setMessage($.join(errorMessages, "\n")); + + AlertDialog alert = builder.create(); + alert.show(); + + return errorMessages.size() == 0; } @Override @@ -258,7 +291,9 @@ public class CreateChallengeActivity extends BaseActivity { checkPrizeAndMinimumForTavern(); } - private void checkPrizeAndMinimumForTavern() { + private String checkPrizeAndMinimumForTavern() { + String errorResult = ""; + String inputValue = createChallengePrize.getText().toString(); if (inputValue.isEmpty()) { @@ -274,16 +309,21 @@ public class CreateChallengeActivity extends BaseActivity { if (selectedLocation == 0 && currentVal == 0) { createChallengeGemError.setVisibility(View.VISIBLE); - createChallengeGemError.setText(R.string.challenge_create_error_tavern_one_gem); + String error = getString(R.string.challenge_create_error_tavern_one_gem); + createChallengeGemError.setText(error); + errorResult = error; } else if (currentVal > gemCount) { createChallengeGemError.setVisibility(View.VISIBLE); - createChallengeGemError.setText(R.string.challenge_create_error_enough_gems); + String error = getString(R.string.challenge_create_error_enough_gems); + createChallengeGemError.setText(error); + errorResult = error; } else { createChallengeGemError.setVisibility(View.GONE); } challengeRemoveGemBtn.setEnabled(currentVal != 0); + return errorResult; } private void fillControls() { @@ -455,7 +495,7 @@ public class CreateChallengeActivity extends BaseActivity { return c; } - private void createChallenge() { + private Observable createChallenge() { Challenge c = getChallengeData(); List taskList = challengeTasks.getTaskList(); @@ -464,14 +504,10 @@ public class CreateChallengeActivity extends BaseActivity { taskList.remove(addTodo); taskList.remove(addReward); - challengeRepository.createChallenge(c, taskList).subscribe(createdChallenge -> { - finish(); - }, throwable -> { - // UHOH - }); + return challengeRepository.createChallenge(c, taskList); } - private void updateChallenge() { + private Observable updateChallenge() { Challenge c = getChallengeData(); List taskList = challengeTasks.getTaskList(); @@ -480,14 +516,10 @@ public class CreateChallengeActivity extends BaseActivity { taskList.remove(addTodo); taskList.remove(addReward); - challengeRepository.updateChallenge(c, taskList, new ArrayList<>(addedTasks.values()), + return challengeRepository.updateChallenge(c, taskList, new ArrayList<>(addedTasks.values()), new ArrayList<>(updatedTasks.values()), new ArrayList<>(removedTasks.keySet()) - ).subscribe(createdChallenge -> { - finish(); - }, throwable -> { - // UHOH - }); + ); } private void addOrUpdateTaskInList(Task task) {