diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentEditActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentEditActivity.java index e59ec4a3..5fb78383 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentEditActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentEditActivity.java @@ -19,6 +19,8 @@ import com.sismics.docs.event.DocumentAddEvent; import com.sismics.docs.event.DocumentEditEvent; import com.sismics.docs.listener.JsonHttpResponseHandler; import com.sismics.docs.resource.DocumentResource; +import com.sismics.docs.ui.form.Validator; +import com.sismics.docs.ui.form.validator.Required; import com.sismics.docs.ui.view.DatePickerView; import com.sismics.docs.ui.view.TagsCompleteTextView; import com.sismics.docs.util.PreferenceUtil; @@ -45,7 +47,12 @@ public class DocumentEditActivity extends ActionBarActivity { /** * Document edited. */ - JSONObject document; + private JSONObject document; + + /** + * Form validator. + */ + private Validator validator; // View cache private EditText titleEditText; @@ -105,7 +112,10 @@ public class DocumentEditActivity extends ActionBarActivity { tagsEditText.allowDuplicates(false); tagsEditText.setAdapter(new TagAutoCompleteAdapter(this, 0, tagList)); - // TODO Form validation + // Validation + validator = new Validator(this, true); + validator.addValidable(titleEditText, new Required()); + // Fill the activity if (document == null) { datePickerView.setDate(new Date()); @@ -133,6 +143,11 @@ public class DocumentEditActivity extends ActionBarActivity { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.save: + validator.validate(); + if (!validator.isValidated()) { + return true; + } + // Metadata final String title = titleEditText.getText().toString(); final String description = descriptionEditText.getText().toString(); diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java index fa952854..27ff193b 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java @@ -62,10 +62,10 @@ public class LoginActivity extends ActionBarActivity { progressBar.setVisibility(View.VISIBLE); // Form validation - final Validator validator = new Validator(false); - validator.addValidable(this, txtServer, new Required()); - validator.addValidable(this, txtUsername, new Required()); - validator.addValidable(this, txtPassword, new Required()); + final Validator validator = new Validator(this, false); + validator.addValidable(txtServer, new Required()); + validator.addValidable(txtUsername, new Required()); + validator.addValidable(txtPassword, new Required()); validator.setOnValidationChanged(new CallbackListener() { @Override public void onComplete() { diff --git a/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validable.java b/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validable.java index 9dd57d3f..ca06640d 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validable.java +++ b/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validable.java @@ -2,14 +2,23 @@ package com.sismics.docs.ui.form; import android.view.View; +import com.sismics.docs.ui.form.validator.ValidatorType; + public class Validable { + private final ValidatorType[] validatorTypes; + private View view; private boolean isValidated = false; + public Validable(ValidatorType... validatorTypes) { + this.validatorTypes = validatorTypes; + } + /** * Getter of view. + * * @return view */ public View getView() { @@ -18,6 +27,7 @@ public class Validable { /** * Setter of view. + * * @param view view */ public void setView(View view) { @@ -26,6 +36,7 @@ public class Validable { /** * Getter of isValidated. + * * @return isValidated */ public boolean isValidated() { @@ -34,9 +45,19 @@ public class Validable { /** * Setter of isValidated. + * * @param isValidated isValidated */ public void setValidated(boolean isValidated) { this.isValidated = isValidated; } + + /** + * Getter of validatorTypes. + * + * @return validatorTypes + */ + public ValidatorType[] getValidatorTypes() { + return validatorTypes; + } } diff --git a/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validator.java b/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validator.java index 9404c5d7..9538114c 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validator.java +++ b/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validator.java @@ -22,7 +22,7 @@ public class Validator { /** * List of validable elements. */ - private Map validables = new HashMap(); + private Map validables = new HashMap(); /** * Callback when the validation of one element has changed. @@ -33,13 +33,19 @@ public class Validator { * True if the validator show validation errors. */ private boolean showErrors; + + /** + * Context. + */ + private Context context; /** * Constructor. * * @param showErrors True to display validation errors */ - public Validator(boolean showErrors) { + public Validator(Context context, boolean showErrors) { + this.context = context; this.showErrors = showErrors; } @@ -58,12 +64,11 @@ public class Validator { * @param editText Edit text * @param validatorTypes Validators */ - public void addValidable(final Context context, final EditText editText, final ValidatorType...validatorTypes) { - final Validable validable = new Validable(); + public void addValidable(final EditText editText, final ValidatorType... validatorTypes) { + final Validable validable = new Validable(validatorTypes); validables.put(editText, validable); editText.addTextChangedListener(new TextWatcher() { - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // NOP @@ -76,24 +81,7 @@ public class Validator { @Override public void afterTextChanged(Editable s) { - validable.setValidated(true); - for (ValidatorType validatorType : validatorTypes) { - if (!validatorType.validate(s.toString())) { - if (showErrors) { - editText.setError(validatorType.getErrorMessage(context)); - } - validable.setValidated(false); - break; - } - } - - if (validable.isValidated()) { - editText.setError(null); - } - - if (onValidationChanged != null) { - onValidationChanged.onComplete(); - } + validate(editText, validable); } }); } @@ -107,7 +95,43 @@ public class Validator { public boolean isValidated(View view) { return validables.get(view).isValidated(); } - + + /** + * Validate a specific EditText. + * + * @param editText EditText + * @param validable Validable + */ + private void validate(EditText editText, Validable validable) { + validable.setValidated(true); + for (ValidatorType validatorType : validable.getValidatorTypes()) { + if (!validatorType.validate(editText.getEditableText().toString())) { + if (showErrors) { + editText.setError(validatorType.getErrorMessage(context)); + } + validable.setValidated(false); + break; + } + } + + if (validable.isValidated()) { + editText.setError(null); + } + + if (onValidationChanged != null) { + onValidationChanged.onComplete(); + } + } + + /** + * Validate everything now. + */ + public void validate() { + for (Map.Entry entry : validables.entrySet()) { + validate(entry.getKey(), entry.getValue()); + } + } + /** * Returns true if all elements are validated. *