From 0c9d7dda799f8d2b6d689f5031bbbc6560ef3841 Mon Sep 17 00:00:00 2001 From: Emanuele Tonello Date: Thu, 15 Mar 2018 18:20:35 +0100 Subject: [PATCH 01/12] added compile options --- convalida/build.gradle | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/convalida/build.gradle b/convalida/build.gradle index f2db007..8ce83e1 100644 --- a/convalida/build.gradle +++ b/convalida/build.gradle @@ -8,6 +8,12 @@ android { defaultConfig { minSdkVersion versions.minSdk + + javaCompileOptions { + annotationProcessorOptions { + includeCompileClasspath = true + } + } } compileOptions { From 5540e6d45569c9c856900e85b1b71cadb57f9714 Mon Sep 17 00:00:00 2001 From: Wellington Costa Date: Mon, 19 Mar 2018 15:13:47 -0300 Subject: [PATCH 02/12] Added compile options --- convalida/build.gradle | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/convalida/build.gradle b/convalida/build.gradle index ca13c39..86c7072 100644 --- a/convalida/build.gradle +++ b/convalida/build.gradle @@ -8,6 +8,12 @@ android { defaultConfig { minSdkVersion versions.minSdk + + javaCompileOptions { + annotationProcessorOptions { + includeCompileClasspath true + } + } } compileOptions { From 6aaf2bdf2edc18b1f50c27a88aac467d40ee0454 Mon Sep 17 00:00:00 2001 From: Emanuele Tonello Date: Tue, 20 Mar 2018 10:04:22 +0100 Subject: [PATCH 03/12] added some additional patterns for password validation --- .../main/java/convalida/library/util/Patterns.java | 11 ++++++++--- .../main/java/convalida/sample/SampleActivity.java | 5 +++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/convalida/src/main/java/convalida/library/util/Patterns.java b/convalida/src/main/java/convalida/library/util/Patterns.java index ed8cfbb..7c7dbac 100644 --- a/convalida/src/main/java/convalida/library/util/Patterns.java +++ b/convalida/src/main/java/convalida/library/util/Patterns.java @@ -7,14 +7,19 @@ public class Patterns { public static final String NUMERIC_ONLY = "^\\d+$"; + public static final String ALPHA_ONLY = "\\w+"; + public static final String LOWER_CASE_ONLY = "^[a-z]+$"; public static final String UPPER_CASE_ONLY = "^[A-Z]+$"; - public static final String LOWER_UPPER_CASE = "^(?=.*[a-z])(?=.*[A-Z]).{1,}+$"; + public static final String ALPHA_MIXED_CASE = "^(?=.*[a-z])(?=.*[A-Z]).{1,}+$"; + + public static final String ALPHA_NUMERIC = "(?=.*[a-zA-Z])(?=.*[\\d]).+"; - public static final String LOWER_UPPER_CASE_NUMERIC = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{1,}+$"; + public static final String MIXED_CASE_NUMERIC = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{1,}+$"; - public static final String LOWER_UPPER_CASE_NUMERIC_SPECIAL = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=])(?=\\S+$).{1,}$"; + public static final String ALPHA_NUMERIC_MIXED_CASE = "(?=.*[a-z])(?=.*[A-Z])(?=.*[\\d]).+"; + public static final String ALPHA_NUMERIC_MIXED_CASE_SYMBOLS = "(?=.*[a-z])(?=.*[A-Z])(?=.*[\\d])(?=.*([^\\w])).+"; } diff --git a/sample/src/main/java/convalida/sample/SampleActivity.java b/sample/src/main/java/convalida/sample/SampleActivity.java index aefe3e2..fc358ee 100644 --- a/sample/src/main/java/convalida/sample/SampleActivity.java +++ b/sample/src/main/java/convalida/sample/SampleActivity.java @@ -19,7 +19,8 @@ import convalida.annotations.PasswordValidation; import convalida.annotations.ValidateOnClick; -import static convalida.library.util.Patterns.LOWER_UPPER_CASE_NUMERIC; +import static convalida.library.util.Patterns.MIXED_CASE_NUMERIC; + /** * @author Wellington Costa on 05/06/17. @@ -42,7 +43,7 @@ public class SampleActivity extends AppCompatActivity { EditText confirmEmailField; @BindView(R.id.password_field) - @PasswordValidation(min = 3, pattern = LOWER_UPPER_CASE_NUMERIC, errorMessage = R.string.invalid_password) + @PasswordValidation(min = 3, pattern = MIXED_CASE_NUMERIC, errorMessage = R.string.invalid_password) EditText passwordField; @BindView(R.id.confirm_password_field) From 51abaaa830cb07bcf8a5dd4ca52b3db404a0e4db Mon Sep 17 00:00:00 2001 From: Emanuele Tonello Date: Tue, 20 Mar 2018 10:04:53 +0100 Subject: [PATCH 04/12] added password pattern to readme. formatted markdown --- README.md | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 156fb61..219c99e 100644 --- a/README.md +++ b/README.md @@ -2,21 +2,21 @@ ![Logo](logo.png) -__Convalida__ - (Italian for "validation") +**Convalida** - (Italian for "validation") Convalida is a simple, lightweight and powerful field validation library for Android. ## Why Convalida? -- Annotation-based; -- Compile-time; -- Compatible with other annotation-based libraries and frameworks such as [ButterKnife][1], [AndroidAnnotations][2], etc; -- Works with __Stock Android Widgets__; -- Based on [Material Design Error Patterns][4]; +- Annotation-based; +- Compile-time; +- Compatible with other annotation-based libraries and frameworks such as [ButterKnife][1], [AndroidAnnotations][2], etc; +- Works with **Stock Android Widgets**; +- Based on [Material Design Error Patterns][4]; ## Quick Start -__Step 1__ - Annotate your fields with [Convalida Annotations][3]: +**Step 1** - Annotate your fields with [Convalida Annotations][3]: ```java @NotEmptyValidation(R.string.field_required) @@ -37,7 +37,7 @@ EditText confirmEmailField; @PatternValidation(errorMessage = R.string.invalid_phone, pattern = PHONE_PATTERN) EditText phoneField; -@PasswordValidation(min = 3, errorMessage = R.string.invalid_password) +@PasswordValidation(min = 3, pattern = MIXED_CASE_NUMERIC, errorMessage = R.string.invalid_password) EditText passwordField; @ConfirmPasswordValidation(R.string.passwords_not_match) @@ -47,10 +47,9 @@ EditText confirmPasswordField; Button validateButton; ``` -__Step 2__ - Initialize Convalida: +**Step 2** - Initialize Convalida (notice that the it starts with the same name of the Activity): ```java - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -59,7 +58,7 @@ protected void onCreate(Bundle savedInstanceState) { } ``` -__Step 3__ - Run the validations by clicking in the button mapped with ```@ValidateOnClick``` and handle success or error: +**Step 3** - Run the validations by clicking in the button mapped with `@ValidateOnClick` and handle success or error: ```java @OnValidationSuccess @@ -73,20 +72,20 @@ public void onValidationError() { } ``` -*Note: Only the method annotated with ```@OnValidationSuccess``` is required.* +_Note: Only the method annotated with `@OnValidationSuccess` is required._ -__Step 4__ - If you want to clear the validations: +**Step 4** - If you want to clear the validations: ```java @ClearValidationsOnClick Button clearValidationsButton; ``` -__Remember: You must initialize the views (e.g [ButterKnife][1]) before apply the validations.__ +**Remember: You must initialize the views (e.g [ButterKnife][1]) before apply the validations.** ## Download -__Step 1__ - Add the JitPack repository to your root build.gradle file: +**Step 1** - Add the JitPack repository to your root build.gradle file: ```groovy allprojects { @@ -97,7 +96,7 @@ allprojects { } ``` -__Step 2__ - Add the dependencies: +**Step 2** - Add the dependencies: ```groovy dependencies { @@ -122,8 +121,10 @@ dependencies { See the License for the specific language governing permissions and limitations under the License. - [1]: https://github.com/JakeWharton/butterknife + [2]: https://github.com/androidannotations/androidannotations + [3]: https://github.com/WellingtonCosta/convalida/tree/master/convalida-annotations/src/main/java/convalida/annotations + [4]: https://material.io/guidelines/patterns/errors.html From 2d47d7cad81fc5b69c717457bf386ad9fc68e89e Mon Sep 17 00:00:00 2001 From: Wellington Costa Date: Thu, 29 Mar 2018 21:04:53 -0300 Subject: [PATCH 05/12] NotEmpty files renamed to Required --- ...alidation.java => RequiredValidation.java} | 2 +- .../java/convalida/compiler/Constants.java | 4 +-- .../compiler/ConvalidaProcessor.java | 26 +++++++++---------- .../java/convalida/compiler/JavaFiler.java | 12 ++++----- ...yValidator.java => RequiredValidator.java} | 4 +-- ...orTest.java => RequiredValidatorTest.java} | 6 ++--- .../java/convalida/validators/TestSuite.java | 2 +- 7 files changed, 28 insertions(+), 28 deletions(-) rename convalida-annotations/src/main/java/convalida/annotations/{NotEmptyValidation.java => RequiredValidation.java} (92%) rename convalida-validators/src/main/java/convalida/validators/{NotEmptyValidator.java => RequiredValidator.java} (80%) rename convalida-validators/src/test/java/convalida/validators/{NotEmptyValidatorTest.java => RequiredValidatorTest.java} (76%) diff --git a/convalida-annotations/src/main/java/convalida/annotations/NotEmptyValidation.java b/convalida-annotations/src/main/java/convalida/annotations/RequiredValidation.java similarity index 92% rename from convalida-annotations/src/main/java/convalida/annotations/NotEmptyValidation.java rename to convalida-annotations/src/main/java/convalida/annotations/RequiredValidation.java index f6420bc..61aa06c 100644 --- a/convalida-annotations/src/main/java/convalida/annotations/NotEmptyValidation.java +++ b/convalida-annotations/src/main/java/convalida/annotations/RequiredValidation.java @@ -14,7 +14,7 @@ */ @Target(FIELD) @Retention(SOURCE) -public @interface NotEmptyValidation { +public @interface RequiredValidation { @StringRes int errorMessage(); diff --git a/convalida-compiler/src/main/java/convalida/compiler/Constants.java b/convalida-compiler/src/main/java/convalida/compiler/Constants.java index 913e98f..81be11f 100644 --- a/convalida-compiler/src/main/java/convalida/compiler/Constants.java +++ b/convalida-compiler/src/main/java/convalida/compiler/Constants.java @@ -16,7 +16,7 @@ class Constants { static final ClassName VALIDATOR_SET = ClassName.get("convalida.validators", "ValidatorSet"); - static final String NOT_EMPTY_ANNOTATION = "convalida.annotations.NotEmptyValidation"; + static final String REQUIRED_ANNOTATION = "convalida.annotations.RequiredValidation"; static final String EMAIL_ANNOTATION = "convalida.annotations.EmailValidation"; static final String CONFIRM_EMAIL_VALIDATION = "convalida.annotations.ConfirmEmailValidation"; static final String PATTERN_ANNOTATION = "convalida.annotations.PatternValidation"; @@ -27,7 +27,7 @@ class Constants { private static final String VALIDATORS_PACKAGE = "convalida.validators"; - static final ClassName NOT_EMPTY_VALIDATOR = ClassName.get(VALIDATORS_PACKAGE, "NotEmptyValidator"); + static final ClassName REQUIRED_VALIDATOR = ClassName.get(VALIDATORS_PACKAGE, "RequiredValidator"); static final ClassName EMAIL_VALIDATOR = ClassName.get(VALIDATORS_PACKAGE, "EmailValidator"); static final ClassName CONFIRM_EMAIL_VALIDATOR = ClassName.get(VALIDATORS_PACKAGE, "ConfirmEmailValidator"); static final ClassName PATTERN_VALIDATOR = ClassName.get(VALIDATORS_PACKAGE, "PatternValidator"); diff --git a/convalida-compiler/src/main/java/convalida/compiler/ConvalidaProcessor.java b/convalida-compiler/src/main/java/convalida/compiler/ConvalidaProcessor.java index 9a71071..7696dfa 100644 --- a/convalida-compiler/src/main/java/convalida/compiler/ConvalidaProcessor.java +++ b/convalida-compiler/src/main/java/convalida/compiler/ConvalidaProcessor.java @@ -43,7 +43,7 @@ import convalida.annotations.ConfirmPasswordValidation; import convalida.annotations.EmailValidation; import convalida.annotations.LengthValidation; -import convalida.annotations.NotEmptyValidation; +import convalida.annotations.RequiredValidation; import convalida.annotations.OnValidationError; import convalida.annotations.OnValidationSuccess; import convalida.annotations.OnlyNumberValidation; @@ -61,7 +61,7 @@ import static convalida.compiler.Constants.CONFIRM_PASSWORD_ANNOTATION; import static convalida.compiler.Constants.EMAIL_ANNOTATION; import static convalida.compiler.Constants.LENGTH_ANNOTATION; -import static convalida.compiler.Constants.NOT_EMPTY_ANNOTATION; +import static convalida.compiler.Constants.REQUIRED_ANNOTATION; import static convalida.compiler.Constants.ONLY_NUMBER_ANNOTATION; import static convalida.compiler.Constants.PASSWORD_ANNOTATION; import static convalida.compiler.Constants.PATTERN_ANNOTATION; @@ -75,7 +75,7 @@ */ @AutoService(Processor.class) @SupportedAnnotationTypes({ - NOT_EMPTY_ANNOTATION, + REQUIRED_ANNOTATION, EMAIL_ANNOTATION, CONFIRM_EMAIL_VALIDATION, PATTERN_ANNOTATION, @@ -113,7 +113,7 @@ public synchronized void init(ProcessingEnvironment processingEnvironment) { private Set> getSupportedAnnotations() { Set> annotations = new LinkedHashSet<>(); - annotations.add(NotEmptyValidation.class); + annotations.add(RequiredValidation.class); annotations.add(EmailValidation.class); annotations.add(ConfirmEmailValidation.class); annotations.add(PatternValidation.class); @@ -154,13 +154,13 @@ private List findAndParseValidations(RoundEnvironment env) { scanForRClasses(env); - // Process each @NotEmptyValidation element - for (Element element : env.getElementsAnnotatedWith(NotEmptyValidation.class)) { + // Process each @RequiredValidation element + for (Element element : env.getElementsAnnotatedWith(RequiredValidation.class)) { if (!SuperficialValidation.validateElement(element)) continue; try { - parseNotEmptyValidation(element, parents, validationFields); + parseRequiredValidation(element, parents, validationFields); } catch (Exception e) { - logParsingError(element, NotEmptyValidation.class, e); + logParsingError(element, RequiredValidation.class, e); } } @@ -380,21 +380,21 @@ private void parseClearValidationsOnClick(Element parent, ValidationClass valida } } - private void parseNotEmptyValidation(Element element, Set parents, List validationFields) { - boolean hasError = isInvalid(NotEmptyValidation.class, element) || isInaccessible(NotEmptyValidation.class, element); + private void parseRequiredValidation(Element element, Set parents, List validationFields) { + boolean hasError = isInvalid(RequiredValidation.class, element) || isInaccessible(RequiredValidation.class, element); if (hasError) { return; } - int errorMessageResourceId = element.getAnnotation(NotEmptyValidation.class).errorMessage(); - boolean autoDismiss = element.getAnnotation(NotEmptyValidation.class).autoDismiss(); + int errorMessageResourceId = element.getAnnotation(RequiredValidation.class).errorMessage(); + boolean autoDismiss = element.getAnnotation(RequiredValidation.class).autoDismiss(); QualifiedId qualifiedId = elementToQualifiedId(element, errorMessageResourceId); parents.add(element.getEnclosingElement()); validationFields.add(new ValidationField( element, - NotEmptyValidation.class, + RequiredValidation.class, getId(qualifiedId), autoDismiss )); diff --git a/convalida-compiler/src/main/java/convalida/compiler/JavaFiler.java b/convalida-compiler/src/main/java/convalida/compiler/JavaFiler.java index b8531cf..82f1164 100644 --- a/convalida-compiler/src/main/java/convalida/compiler/JavaFiler.java +++ b/convalida-compiler/src/main/java/convalida/compiler/JavaFiler.java @@ -24,8 +24,8 @@ import static convalida.compiler.Constants.LENGTH_ANNOTATION; import static convalida.compiler.Constants.LENGTH_VALIDATOR; import static convalida.compiler.Constants.NON_NULL; -import static convalida.compiler.Constants.NOT_EMPTY_ANNOTATION; -import static convalida.compiler.Constants.NOT_EMPTY_VALIDATOR; +import static convalida.compiler.Constants.REQUIRED_ANNOTATION; +import static convalida.compiler.Constants.REQUIRED_VALIDATOR; import static convalida.compiler.Constants.ONLY_NUMBER_ANNOTATION; import static convalida.compiler.Constants.ONLY_NUMBER_VALIDATOR; import static convalida.compiler.Constants.OVERRIDE; @@ -81,8 +81,8 @@ private static CodeBlock createValidationsCodeBlock(final ValidationClass valida for(ValidationField field : validationClass.fields) { switch (field.annotationClassName) { - case NOT_EMPTY_ANNOTATION: - builder.add(createNotEmptyValidationCodeBlock(field)); + case REQUIRED_ANNOTATION: + builder.add(createRequiredValidationCodeBlock(field)); break; case EMAIL_ANNOTATION: builder.add(createEmailValidationCodeBlock(field)); @@ -123,11 +123,11 @@ private static CodeBlock createValidationsCodeBlock(final ValidationClass valida return builder.build(); } - private static CodeBlock createNotEmptyValidationCodeBlock(ValidationField field) { + private static CodeBlock createRequiredValidationCodeBlock(ValidationField field) { return CodeBlock.builder() .addStatement( "validatorSet.addValidator(new $T(target.$N, target.getString($L), $L))", - NOT_EMPTY_VALIDATOR, + REQUIRED_VALIDATOR, field.name, field.id.code, field.autoDismiss diff --git a/convalida-validators/src/main/java/convalida/validators/NotEmptyValidator.java b/convalida-validators/src/main/java/convalida/validators/RequiredValidator.java similarity index 80% rename from convalida-validators/src/main/java/convalida/validators/NotEmptyValidator.java rename to convalida-validators/src/main/java/convalida/validators/RequiredValidator.java index bd20ed0..e6867f9 100644 --- a/convalida-validators/src/main/java/convalida/validators/NotEmptyValidator.java +++ b/convalida-validators/src/main/java/convalida/validators/RequiredValidator.java @@ -5,9 +5,9 @@ /** * @author Wellington Costa on 21/06/2017. */ -public class NotEmptyValidator extends AbstractValidator { +public class RequiredValidator extends AbstractValidator { - public NotEmptyValidator( + public RequiredValidator( EditText editText, String errorMessage, boolean autoDismiss) { diff --git a/convalida-validators/src/test/java/convalida/validators/NotEmptyValidatorTest.java b/convalida-validators/src/test/java/convalida/validators/RequiredValidatorTest.java similarity index 76% rename from convalida-validators/src/test/java/convalida/validators/NotEmptyValidatorTest.java rename to convalida-validators/src/test/java/convalida/validators/RequiredValidatorTest.java index 6beb2fd..a806fcf 100644 --- a/convalida-validators/src/test/java/convalida/validators/NotEmptyValidatorTest.java +++ b/convalida-validators/src/test/java/convalida/validators/RequiredValidatorTest.java @@ -8,16 +8,16 @@ /** * @author Wellington Costa on 01/11/2017. */ -public class NotEmptyValidatorTest extends BaseTest { +public class RequiredValidatorTest extends BaseTest { @Test public void emptyValue() { - NotEmptyValidator validator = new NotEmptyValidator(mockEditText, errorMessage, true); + RequiredValidator validator = new RequiredValidator(mockEditText, errorMessage, true); when(mockEditText.getText().toString()).thenReturn(""); assertEquals(validator.validate(), false); } @Test public void validValue() { - NotEmptyValidator validator = new NotEmptyValidator(mockEditText, errorMessage, true); + RequiredValidator validator = new RequiredValidator(mockEditText, errorMessage, true); when(mockEditText.getText().toString()).thenReturn("test"); assertEquals(validator.validate(), true); } diff --git a/convalida-validators/src/test/java/convalida/validators/TestSuite.java b/convalida-validators/src/test/java/convalida/validators/TestSuite.java index 8418fe4..e63af93 100644 --- a/convalida-validators/src/test/java/convalida/validators/TestSuite.java +++ b/convalida-validators/src/test/java/convalida/validators/TestSuite.java @@ -9,7 +9,7 @@ */ @RunWith(Suite.class) @SuiteClasses({ - NotEmptyValidatorTest.class, + RequiredValidatorTest.class, EmailValidatorTest.class, ConfirmEmailValidatorTest.class, LengthValidatorTest.class, From 896af28abca37cfc42bcd89f98e7e1ff5f4a008c Mon Sep 17 00:00:00 2001 From: Wellington Costa Date: Thu, 29 Mar 2018 21:05:10 -0300 Subject: [PATCH 06/12] Removed Validator interface --- .../main/java/convalida/validators/Validator.java | 12 ------------ .../main/java/convalida/validators/ValidatorSet.java | 8 ++++---- .../java/convalida/validators/ValidatorSetTest.java | 12 ++++++------ 3 files changed, 10 insertions(+), 22 deletions(-) delete mode 100644 convalida-validators/src/main/java/convalida/validators/Validator.java diff --git a/convalida-validators/src/main/java/convalida/validators/Validator.java b/convalida-validators/src/main/java/convalida/validators/Validator.java deleted file mode 100644 index 8c47dbb..0000000 --- a/convalida-validators/src/main/java/convalida/validators/Validator.java +++ /dev/null @@ -1,12 +0,0 @@ -package convalida.validators; - -/** - * @author Wellington Costa on 21/06/2017. - */ -interface Validator { - - boolean validate(); - - void clear(); - -} diff --git a/convalida-validators/src/main/java/convalida/validators/ValidatorSet.java b/convalida-validators/src/main/java/convalida/validators/ValidatorSet.java index 876df60..512e8de 100644 --- a/convalida-validators/src/main/java/convalida/validators/ValidatorSet.java +++ b/convalida-validators/src/main/java/convalida/validators/ValidatorSet.java @@ -10,7 +10,7 @@ */ public final class ValidatorSet { - private Set validators; + private Set validators; private boolean isValid; public ValidatorSet() { @@ -18,7 +18,7 @@ public ValidatorSet() { this.isValid = true; } - public void addValidator(Validator validator) { + public void addValidator(AbstractValidator validator) { this.validators.add(validator); } @@ -30,7 +30,7 @@ public boolean isValid() { private void executeValidators() { List validationResults = new ArrayList<>(); - for(Validator validator : validators) { + for(AbstractValidator validator : validators) { validationResults.add(validator.validate()); } @@ -43,7 +43,7 @@ private void executeValidators() { } public void clearValidators() { - for (Validator validator : validators) { + for (AbstractValidator validator : validators) { validator.clear(); } } diff --git a/convalida-validators/src/test/java/convalida/validators/ValidatorSetTest.java b/convalida-validators/src/test/java/convalida/validators/ValidatorSetTest.java index f585d30..4b47506 100644 --- a/convalida-validators/src/test/java/convalida/validators/ValidatorSetTest.java +++ b/convalida-validators/src/test/java/convalida/validators/ValidatorSetTest.java @@ -18,37 +18,37 @@ public class ValidatorSetTest extends BaseTest { } @Test public void addOneValidator() { - validatorSet.addValidator(new NotEmptyValidator(mockEditText, errorMessage, true)); + validatorSet.addValidator(new RequiredValidator(mockEditText, errorMessage, true)); assertEquals(validatorSet.getValidatorsSize(), 1); } @Test public void addTwoValidators() { - validatorSet.addValidator(new NotEmptyValidator(mockEditText, errorMessage, true)); + validatorSet.addValidator(new RequiredValidator(mockEditText, errorMessage, true)); validatorSet.addValidator(new EmailValidator(mockEditText, errorMessage, true)); assertEquals(validatorSet.getValidatorsSize(), 2); } @Test public void addThreeValidators() { - validatorSet.addValidator(new NotEmptyValidator(mockEditText, errorMessage, true)); + validatorSet.addValidator(new RequiredValidator(mockEditText, errorMessage, true)); validatorSet.addValidator(new EmailValidator(mockEditText, errorMessage, true)); validatorSet.addValidator(new LengthValidator(mockEditText,0, 5, errorMessage, true)); assertEquals(validatorSet.getValidatorsSize(), 3); } @Test public void executeValidationsWithSuccess() { - validatorSet.addValidator(new NotEmptyValidator(mockEditText, errorMessage, true)); + validatorSet.addValidator(new RequiredValidator(mockEditText, errorMessage, true)); when(mockEditText.getText().toString()).thenReturn("test"); assertEquals(validatorSet.isValid(), true); } @Test public void executeValidationsWithError() { - validatorSet.addValidator(new NotEmptyValidator(mockEditText, errorMessage, true)); + validatorSet.addValidator(new RequiredValidator(mockEditText, errorMessage, true)); when(mockEditText.getText().toString()).thenReturn(""); assertEquals(validatorSet.isValid(), false); } @Test public void clearValidations() { - validatorSet.addValidator(new NotEmptyValidator(mockEditText, errorMessage, true)); + validatorSet.addValidator(new RequiredValidator(mockEditText, errorMessage, true)); validatorSet.clearValidators(); assertEquals(mockEditText.getError(), null); } From 6ffdcab36f34ce81d04dbff27493758a2864fb59 Mon Sep 17 00:00:00 2001 From: Wellington Costa Date: Mon, 2 Apr 2018 08:04:27 -0300 Subject: [PATCH 07/12] Initial support to validate fields via databinding --- README.md | 2 +- convalida-databinding/.gitignore | 1 + convalida-databinding/build.gradle | 42 ++++ .../src/main/AndroidManifest.xml | 1 + .../databinding/ValidationBindings.java | 169 +++++++++++++ .../databinding/ValidationUtils.java | 52 ++++ .../convalida/databinding/ViewTagUtils.java | 36 +++ .../src/main/res/values/ids.xml | 4 + .../validators/AbstractValidator.java | 4 +- .../convalida/validators/ValidatorSet.java | 13 +- .../validators/ValidatorSetTest.java | 6 +- convalida/build.gradle | 1 + sample/build.gradle | 4 + .../sample/AnnotataionSampleActivityTest.java | 156 ++++++++++++ .../sample/AnotherSampleActivityTest.java | 106 -------- .../sample/DatabindingSampleActivityTest.java | 7 + .../convalida/sample/SampleActivityTest.java | 115 --------- sample/src/main/AndroidManifest.xml | 4 +- ...ty.java => AnnotataionSampleActivity.java} | 36 ++- .../sample/AnotherSampleActivity.java | 73 ------ .../main/java/convalida/sample/Constants.java | 11 + .../sample/DatabindingSampleActivity.java | 50 ++++ .../java/convalida/sample/MainActivity.java | 4 +- .../res/layout/activity_annotation_sample.xml | 223 +++++++++++++++++ .../res/layout/activity_another_sample.xml | 107 -------- .../layout/activity_databinding_sample.xml | 232 ++++++++++++++++++ .../src/main/res/layout/activity_sample.xml | 126 ---------- sample/src/main/res/values/dimens.xml | 4 +- settings.gradle | 2 +- 29 files changed, 1035 insertions(+), 556 deletions(-) create mode 100644 convalida-databinding/.gitignore create mode 100644 convalida-databinding/build.gradle create mode 100644 convalida-databinding/src/main/AndroidManifest.xml create mode 100644 convalida-databinding/src/main/java/convalida/databinding/ValidationBindings.java create mode 100644 convalida-databinding/src/main/java/convalida/databinding/ValidationUtils.java create mode 100644 convalida-databinding/src/main/java/convalida/databinding/ViewTagUtils.java create mode 100644 convalida-databinding/src/main/res/values/ids.xml create mode 100644 sample/src/androidTest/java/convalida/sample/AnnotataionSampleActivityTest.java delete mode 100644 sample/src/androidTest/java/convalida/sample/AnotherSampleActivityTest.java create mode 100644 sample/src/androidTest/java/convalida/sample/DatabindingSampleActivityTest.java delete mode 100644 sample/src/androidTest/java/convalida/sample/SampleActivityTest.java rename sample/src/main/java/convalida/sample/{SampleActivity.java => AnnotataionSampleActivity.java} (61%) delete mode 100644 sample/src/main/java/convalida/sample/AnotherSampleActivity.java create mode 100644 sample/src/main/java/convalida/sample/Constants.java create mode 100644 sample/src/main/java/convalida/sample/DatabindingSampleActivity.java create mode 100644 sample/src/main/res/layout/activity_annotation_sample.xml delete mode 100644 sample/src/main/res/layout/activity_another_sample.xml create mode 100644 sample/src/main/res/layout/activity_databinding_sample.xml delete mode 100644 sample/src/main/res/layout/activity_sample.xml diff --git a/README.md b/README.md index 219c99e..027ed7c 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Convalida is a simple, lightweight and powerful field validation library for And **Step 1** - Annotate your fields with [Convalida Annotations][3]: ```java -@NotEmptyValidation(R.string.field_required) +@RequiredValidation(R.string.field_required) EditText nameField; @LengthValidation(min = 3, errorMessage = R.string.min_3_characters) diff --git a/convalida-databinding/.gitignore b/convalida-databinding/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/convalida-databinding/.gitignore @@ -0,0 +1 @@ +/build diff --git a/convalida-databinding/build.gradle b/convalida-databinding/build.gradle new file mode 100644 index 0000000..91ea143 --- /dev/null +++ b/convalida-databinding/build.gradle @@ -0,0 +1,42 @@ +apply plugin: 'com.android.library' +apply plugin: 'com.github.dcendents.android-maven' +group = 'com.github.WellingtonCosta' + +android { + compileSdkVersion versions.compileSdk + buildToolsVersion versions.buildTools + + defaultConfig { + minSdkVersion versions.minSdk + + javaCompileOptions { + annotationProcessorOptions { + includeCompileClasspath true + } + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_7 + targetCompatibility = JavaVersion.VERSION_1_7 + } + + dataBinding { + enabled true + } +} + +task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' +} + +artifacts { + archives sourcesJar +} + +dependencies { + compile project(':convalida-validators') + + implementation deps.support.design +} \ No newline at end of file diff --git a/convalida-databinding/src/main/AndroidManifest.xml b/convalida-databinding/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9e7ebae --- /dev/null +++ b/convalida-databinding/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/convalida-databinding/src/main/java/convalida/databinding/ValidationBindings.java b/convalida-databinding/src/main/java/convalida/databinding/ValidationBindings.java new file mode 100644 index 0000000..12544bc --- /dev/null +++ b/convalida-databinding/src/main/java/convalida/databinding/ValidationBindings.java @@ -0,0 +1,169 @@ + package convalida.databinding; + + import android.databinding.BindingAdapter; + import android.widget.EditText; + + import convalida.validators.ConfirmEmailValidator; + import convalida.validators.ConfirmPasswordValidator; + import convalida.validators.EmailValidator; + import convalida.validators.LengthValidator; + import convalida.validators.OnlyNumberValidator; + import convalida.validators.PasswordValidator; + import convalida.validators.PatternValidator; + import convalida.validators.RequiredValidator; + +/** + * @author WellingtonCosta on 29/03/18. + */ +public class ValidationBindings { + + @BindingAdapter(value = { + "requiredValidationErrorMessage", + "requiredAutoDismiss" + }, requireAll = false) + public static void requiredValidationBindings( + EditText field, + String errorMessage, + Boolean autoDismiss + ) { + field.setTag(R.id.validation_type, new RequiredValidator( + field, + errorMessage, + autoDismiss != null ? autoDismiss : true + )); + } + + @BindingAdapter(value = { + "emailValidationErrorMessage", + "emailAutoDismiss" + }, requireAll = false) + public static void emailValidationBindings( + EditText field, + String errorMessage, + Boolean autoDismiss + ) { + field.setTag(R.id.validation_type, new EmailValidator( + field, + errorMessage, + autoDismiss != null ? autoDismiss : true + )); + } + + @BindingAdapter(value = { + "confirmEmailValidationEmailField", + "confirmEmailValidationErrorMessage", + "confirmEmailValidationAutoDismiss" + }, requireAll = false) + public static void confirmEmailValidationBindings( + EditText confirmEmailField, + EditText emailField, + String errorMessage, + Boolean autoDismiss + ) { + confirmEmailField.setTag(R.id.validation_type, new ConfirmEmailValidator( + emailField, + confirmEmailField, + errorMessage, + autoDismiss != null ? autoDismiss : true + )); + } + + @BindingAdapter(value = { + "patternValidationErrorMessage", + "patternValidationPattern", + "patternValidationAutoDismiss" + }, requireAll = false) + public static void patternValidationBindings( + EditText field, + String errorMessage, + String pattern, + Boolean autoDismiss + ) { + field.setTag(R.id.validation_type, new PatternValidator( + field, + errorMessage, + pattern, + autoDismiss != null ? autoDismiss : true + )); + } + + @BindingAdapter(value = { + "lengthValidationMin", + "lengthValidationMax", + "lengthValidationErrorMessage", + "lengthValidationAutoDismiss" + }, requireAll = false) + public static void lengthValidationBindings( + EditText field, + int min, + int max, + String errorMessage, + Boolean autoDismiss + ) { + field.setTag(R.id.validation_type, new LengthValidator( + field, + min, + max, + errorMessage, + autoDismiss != null ? autoDismiss : true + )); + } + + @BindingAdapter(value = { + "onlyNumberValidationErrorMessage", + "onlyNumberValidationAutoDismiss" + }, requireAll = false) + public static void onlyNumberValidationBindings( + EditText field, + String errorMessage, + Boolean autoDismiss + ) { + field.setTag(R.id.validation_type, new OnlyNumberValidator( + field, + errorMessage, + autoDismiss != null ? autoDismiss : true + )); + } + + @BindingAdapter(value = { + "passwordValidationErrorMessage", + "passwordValidationMinLength", + "passwordValidationPattern", + "passwordValidationAutoDismiss" + }, requireAll = false) + public static void passwordValidationBindings( + EditText field, + String errorMessage, + Integer minLength, + String pattern, + Boolean autoDismiss + ) { + field.setTag(R.id.validation_type, new PasswordValidator( + field, + minLength != null ? minLength : 0, + pattern != null ? pattern : "", + errorMessage, + autoDismiss != null ? autoDismiss : true + )); + } + + @BindingAdapter(value = { + "confirmPasswordValidationPasswordField", + "confirmPasswordValidationErrorMessage", + "confirmPasswordValidationAutoDismiss" + }, requireAll = false) + public static void confirmPasswordValidationBindings( + EditText confirmPasswordField, + EditText passwordField, + String errorMessage, + Boolean autoDismiss + ) { + confirmPasswordField.setTag(R.id.validation_type, new ConfirmPasswordValidator( + passwordField, + confirmPasswordField, + errorMessage, + autoDismiss != null ? autoDismiss : true + )); + } + +} diff --git a/convalida-databinding/src/main/java/convalida/databinding/ValidationUtils.java b/convalida-databinding/src/main/java/convalida/databinding/ValidationUtils.java new file mode 100644 index 0000000..4541f47 --- /dev/null +++ b/convalida-databinding/src/main/java/convalida/databinding/ValidationUtils.java @@ -0,0 +1,52 @@ +package convalida.databinding; + +import android.view.View; +import android.view.ViewGroup; + +import java.util.List; + +import convalida.validators.AbstractValidator; +import convalida.validators.ValidatorSet; + +/** + * @author WellingtonCosta on 29/03/18. + */ +public class ValidationUtils { + + private static ValidatorSet validatorSet; + + static { + validatorSet = new ValidatorSet(); + } + + public static boolean validateFields(View root) { + if(validatorSet.getValidatorsCount() == 0) { + List views = ViewTagUtils.getViewsByTag( + (ViewGroup) root, + R.id.validation_type + ); + for (View view : views) { + validatorSet.addValidator( + (AbstractValidator) view.getTag(R.id.validation_type) + ); + } + } + return validatorSet.isValid(); + } + + public static void clearValidations(View root) { + if(validatorSet.getValidatorsCount() == 0) { + List views = ViewTagUtils.getViewsByTag( + (ViewGroup) root, + R.id.validation_type + ); + for(View view : views) { + validatorSet.addValidator( + (AbstractValidator) view.getTag(R.id.validation_type) + ); + } + } + validatorSet.clearValidators(); + } + +} \ No newline at end of file diff --git a/convalida-databinding/src/main/java/convalida/databinding/ViewTagUtils.java b/convalida-databinding/src/main/java/convalida/databinding/ViewTagUtils.java new file mode 100644 index 0000000..5de1afe --- /dev/null +++ b/convalida-databinding/src/main/java/convalida/databinding/ViewTagUtils.java @@ -0,0 +1,36 @@ +package convalida.databinding; + +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author WellingtonCosta on 29/03/18. + */ +class ViewTagUtils { + + static List getViewsByTag(ViewGroup root, int tagId) { + List views = new ArrayList<>(); + int childCount = root.getChildCount(); + for(int i = 0; i < childCount; i++) { + View child = root.getChildAt(i); + if(child != null) { + if (child instanceof ViewGroup) { + views.addAll(getViewsByTag((ViewGroup) child, tagId)); + } + addViewWhenContainsTag(tagId, views, child); + } + } + return views; + } + + private static void addViewWhenContainsTag(int tagId, List views, View view) { + Object tagValue = view.getTag(tagId); + if (tagValue != null) { + views.add(view); + } + } + +} diff --git a/convalida-databinding/src/main/res/values/ids.xml b/convalida-databinding/src/main/res/values/ids.xml new file mode 100644 index 0000000..84b97db --- /dev/null +++ b/convalida-databinding/src/main/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/convalida-validators/src/main/java/convalida/validators/AbstractValidator.java b/convalida-validators/src/main/java/convalida/validators/AbstractValidator.java index 90b40a2..e4687be 100644 --- a/convalida-validators/src/main/java/convalida/validators/AbstractValidator.java +++ b/convalida-validators/src/main/java/convalida/validators/AbstractValidator.java @@ -8,7 +8,7 @@ /** * @author Wellington Costa on 21/06/2017. */ -public abstract class AbstractValidator implements Validator { +public abstract class AbstractValidator { private EditText editText; private String errorMessage; @@ -45,13 +45,11 @@ private Boolean viewIsVisible() { editText.getVisibility() == View.INVISIBLE); } - @Override public boolean validate() { executeValidation(editText.getText().toString()); return !hasError; } - @Override public void clear() { EditTextUtils.setError(editText, null); } diff --git a/convalida-validators/src/main/java/convalida/validators/ValidatorSet.java b/convalida-validators/src/main/java/convalida/validators/ValidatorSet.java index 512e8de..1efa8d9 100644 --- a/convalida-validators/src/main/java/convalida/validators/ValidatorSet.java +++ b/convalida-validators/src/main/java/convalida/validators/ValidatorSet.java @@ -1,20 +1,19 @@ package convalida.validators; import java.util.ArrayList; -import java.util.HashSet; +import java.util.LinkedList; import java.util.List; -import java.util.Set; /** * @author Wellington Costa on 21/06/2017. */ public final class ValidatorSet { - private Set validators; + private List validators; private boolean isValid; public ValidatorSet() { - this.validators = new HashSet<>(); + this.validators = new LinkedList<>(); this.isValid = true; } @@ -48,7 +47,11 @@ public void clearValidators() { } } - public int getValidatorsSize() { + public List getValidators() { + return validators; + } + + public int getValidatorsCount() { return validators.size(); } diff --git a/convalida-validators/src/test/java/convalida/validators/ValidatorSetTest.java b/convalida-validators/src/test/java/convalida/validators/ValidatorSetTest.java index 4b47506..8059064 100644 --- a/convalida-validators/src/test/java/convalida/validators/ValidatorSetTest.java +++ b/convalida-validators/src/test/java/convalida/validators/ValidatorSetTest.java @@ -19,20 +19,20 @@ public class ValidatorSetTest extends BaseTest { @Test public void addOneValidator() { validatorSet.addValidator(new RequiredValidator(mockEditText, errorMessage, true)); - assertEquals(validatorSet.getValidatorsSize(), 1); + assertEquals(validatorSet.getValidatorsCount(), 1); } @Test public void addTwoValidators() { validatorSet.addValidator(new RequiredValidator(mockEditText, errorMessage, true)); validatorSet.addValidator(new EmailValidator(mockEditText, errorMessage, true)); - assertEquals(validatorSet.getValidatorsSize(), 2); + assertEquals(validatorSet.getValidatorsCount(), 2); } @Test public void addThreeValidators() { validatorSet.addValidator(new RequiredValidator(mockEditText, errorMessage, true)); validatorSet.addValidator(new EmailValidator(mockEditText, errorMessage, true)); validatorSet.addValidator(new LengthValidator(mockEditText,0, 5, errorMessage, true)); - assertEquals(validatorSet.getValidatorsSize(), 3); + assertEquals(validatorSet.getValidatorsCount(), 3); } @Test public void executeValidationsWithSuccess() { diff --git a/convalida/build.gradle b/convalida/build.gradle index 86c7072..5bec3d6 100644 --- a/convalida/build.gradle +++ b/convalida/build.gradle @@ -34,6 +34,7 @@ artifacts { dependencies { compile project(':convalida-annotations') compile project(':convalida-validators') + compile project(':convalida-databinding') implementation deps.support.annotations implementation deps.support.compat diff --git a/sample/build.gradle b/sample/build.gradle index 7466fee..790649b 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -27,6 +27,10 @@ android { minifyEnabled true } } + + dataBinding { + enabled true + } } dependencies { diff --git a/sample/src/androidTest/java/convalida/sample/AnnotataionSampleActivityTest.java b/sample/src/androidTest/java/convalida/sample/AnnotataionSampleActivityTest.java new file mode 100644 index 0000000..caf6797 --- /dev/null +++ b/sample/src/androidTest/java/convalida/sample/AnnotataionSampleActivityTest.java @@ -0,0 +1,156 @@ +package convalida.sample; + +import android.support.test.filters.LargeTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard; +import static android.support.test.espresso.action.ViewActions.scrollTo; +import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static convalida.sample.TestUtils.testFieldWithAValidValue; +import static convalida.sample.TestUtils.testFieldWithAnInvalidValue; +import static convalida.sample.TestUtils.testFieldWithEmptyValue; +import static org.hamcrest.CoreMatchers.not; + +/** + * @author Wellington Costa on 12/11/2017. + */ +@LargeTest +@RunWith(AndroidJUnit4.class) +public class AnnotataionSampleActivityTest { + + @Rule + public ActivityTestRule activityTestRule = + new ActivityTestRule<>(AnnotataionSampleActivity.class); + + @Test + public void executeValidationsWithEmptyFields() { + onView(withId(R.id.validate_button)) + .perform(closeSoftKeyboard()) + .perform(scrollTo(), click()); + + onView(withText(R.string.field_required)) + .perform(scrollTo()) + .check(matches(isDisplayed())); + + onView(withText(R.string.min_3_characters)) + .perform(scrollTo()) + .check(matches(isDisplayed())); + + onView(withText(R.string.only_numbers)) + .perform(scrollTo()) + .check(matches(isDisplayed())); + + onView(withText(R.string.invalid_phone)) + .perform(scrollTo()) + .check(matches(isDisplayed())); + + onView(withText(R.string.invalid_email)) + .perform(scrollTo()) + .check(matches(isDisplayed())); + + onView(withText(R.string.invalid_password)) + .perform(scrollTo()) + .check(matches(isDisplayed())); + } + + @Test + public void clearValidations() { + onView(withId(R.id.validate_button)) + .perform(closeSoftKeyboard()) + .perform(scrollTo(), click()); + + onView(withId(R.id.clear_button)) + .perform(scrollTo(), click()); + + onView(withText(R.string.field_required)) + .check(matches(not(isDisplayed()))); + + onView(withText(R.string.min_3_characters)) + .check(matches(not(isDisplayed()))); + + onView(withText(R.string.only_numbers)) + .check(matches(not(isDisplayed()))); + + onView(withText(R.string.invalid_phone)) + .check(matches(not(isDisplayed()))); + + onView(withText(R.string.invalid_email)) + .check(matches(not(isDisplayed()))); + + onView(withText(R.string.emails_not_match)) + .check(matches(not(isDisplayed()))); + + onView(withText(R.string.invalid_password)) + .check(matches(not(isDisplayed()))); + + onView(withText(R.string.passwords_not_match)) + .check(matches(not(isDisplayed()))); + } + + /*@Test + public void testNameField() { + testFieldWithEmptyValue(R.id.validate_button, R.string.field_required); + testFieldWithAValidValue(R.id.name_field, R.string.field_required, "Wellington"); + } + + @Test + public void testNicknameField() { + testFieldWithEmptyValue(R.id.validate_button, R.string.min_3_characters); + testFieldWithAnInvalidValue(R.id.nickname_field, R.string.min_3_characters, "We"); + testFieldWithAValidValue(R.id.nickname_field, R.string.min_3_characters, "Well"); + } + + @Test + public void testAgeField() { + testFieldWithEmptyValue(R.id.validate_button, R.string.only_numbers); + testFieldWithAnInvalidValue(R.id.age_field, R.string.only_numbers, "abc"); + testFieldWithAValidValue(R.id.age_field, R.string.only_numbers, "21"); + } + + @Test + public void testPhoneField() { + testFieldWithEmptyValue(R.id.validate_button, R.string.invalid_phone); + testFieldWithAnInvalidValue(R.id.phone_field, R.string.invalid_phone, "558586846409"); + testFieldWithAValidValue(R.id.phone_field, R.string.invalid_phone, "+55(85)8684-6409"); + } + + @Test + public void testEmailField() { + testFieldWithEmptyValue(R.id.validate_button, R.string.invalid_email); + testFieldWithAnInvalidValue(R.id.email_field, R.string.invalid_email, "well@email"); + testFieldWithAValidValue(R.id.email_field, R.string.invalid_email, "well@email.com"); + } + + @Test + public void testConfirmEmailField() { + testFieldWithAValidValue(R.id.email_field, R.string.invalid_email, "wellington@email.com"); + testFieldWithAnInvalidValue(R.id.confirm_email_field, R.string.emails_not_match, "wellington@email.co"); + testFieldWithAValidValue(R.id.confirm_email_field, R.string.emails_not_match, "wellington@email.com"); + } + + @Test + public void testPasswordField() { + testFieldWithEmptyValue(R.id.validate_button, R.string.invalid_password); + testFieldWithAnInvalidValue(R.id.password_field, R.string.invalid_password, "asdASD"); + testFieldWithAValidValue(R.id.password_field, R.string.invalid_password, "asdASD123"); + } + + @Test + public void testConfirmPasswordField() { + testFieldWithAValidValue(R.id.password_field, R.string.invalid_password, "asdASD123"); + testFieldWithAnInvalidValue(R.id.confirm_password_field, R.string.passwords_not_match, "asdASD"); + testFieldWithAValidValue(R.id.confirm_password_field, R.string.passwords_not_match, "asdASD123"); + }*/ + +} \ No newline at end of file diff --git a/sample/src/androidTest/java/convalida/sample/AnotherSampleActivityTest.java b/sample/src/androidTest/java/convalida/sample/AnotherSampleActivityTest.java deleted file mode 100644 index e0723e0..0000000 --- a/sample/src/androidTest/java/convalida/sample/AnotherSampleActivityTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package convalida.sample; - -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard; -import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; - -/** - * @author Wellington Costa on 14/11/2017. - */ -@RunWith(AndroidJUnit4.class) -public class AnotherSampleActivityTest { - - @Rule - public ActivityTestRule activityTestRule = new ActivityTestRule<>(AnotherSampleActivity.class); - - @Test - public void executeValidationsWithEmptyFields() { - onView(withId(R.id.validate_button)) - .perform(closeSoftKeyboard()) - .check(matches(isDisplayed())) - .perform(click()); - - onView(withText(R.string.field_required)) - .check(matches(isDisplayed())); - - onView(withText(R.string.min_3_characters)) - .check(matches(isDisplayed())); - - onView(withText(R.string.only_numbers)) - .check(matches(isDisplayed())); - - onView(withText(R.string.invalid_phone)) - .check(matches(isDisplayed())); - } - - @Test - public void clearAllValidations() { - onView(withId(R.id.validate_button)) - .perform(closeSoftKeyboard()) - .check(matches(isDisplayed())) - .perform(click()); - - onView(withId(R.id.clear_button)) - .check(matches(isDisplayed())) - .perform(click()); - - onView(withText(R.string.field_required)) - .check(doesNotExist()); - - onView(withText(R.string.min_3_characters)) - .check(doesNotExist()); - - onView(withText(R.string.only_numbers)) - .check(doesNotExist()); - - onView(withText(R.string.invalid_phone)) - .check(doesNotExist()); - } - - @Test - public void testNameField() { - TestUtils.testFieldWithEmptyValue(R.id.validate_button, R.string.field_required); - - TestUtils.testFieldWithAValidValue(R.id.name_field, R.string.field_required, "Wellington"); - } - - @Test - public void testNicknameField() { - TestUtils.testFieldWithEmptyValue(R.id.validate_button, R.string.min_3_characters); - - TestUtils.testFieldWithAnInvalidValue(R.id.nickname_field, R.string.min_3_characters, "We"); - - TestUtils.testFieldWithAValidValue(R.id.nickname_field, R.string.min_3_characters, "Well"); - } - - @Test - public void testAgeField() { - TestUtils.testFieldWithEmptyValue(R.id.validate_button, R.string.only_numbers); - - TestUtils.testFieldWithAnInvalidValue(R.id.age_field, R.string.only_numbers, "abc"); - - TestUtils.testFieldWithAValidValue(R.id.age_field, R.string.only_numbers, "21"); - } - - @Test - public void testPhoneField() { - TestUtils.testFieldWithEmptyValue(R.id.validate_button, R.string.invalid_phone); - - TestUtils.testFieldWithAnInvalidValue(R.id.phone_field, R.string.invalid_phone, "558586846409"); - - TestUtils.testFieldWithAValidValue(R.id.phone_field, R.string.invalid_phone, "+55(85)8684-6409"); - } - -} \ No newline at end of file diff --git a/sample/src/androidTest/java/convalida/sample/DatabindingSampleActivityTest.java b/sample/src/androidTest/java/convalida/sample/DatabindingSampleActivityTest.java new file mode 100644 index 0000000..a64f00f --- /dev/null +++ b/sample/src/androidTest/java/convalida/sample/DatabindingSampleActivityTest.java @@ -0,0 +1,7 @@ +package convalida.sample; + +/** + * @author Wellington Costa on 14/11/2017. + */ +//@RunWith(AndroidJUnit4.class) +public class DatabindingSampleActivityTest { } \ No newline at end of file diff --git a/sample/src/androidTest/java/convalida/sample/SampleActivityTest.java b/sample/src/androidTest/java/convalida/sample/SampleActivityTest.java deleted file mode 100644 index 5349a5b..0000000 --- a/sample/src/androidTest/java/convalida/sample/SampleActivityTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package convalida.sample; - -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard; -import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; - -/** - * @author Wellington Costa on 12/11/2017. - */ -@RunWith(AndroidJUnit4.class) -public class SampleActivityTest { - - @Rule - public ActivityTestRule activityTestRule = new ActivityTestRule<>(SampleActivity.class); - - @Test - public void executeValidationsWithEmptyFields() { - onView(withId(R.id.validate_button)) - .perform(closeSoftKeyboard()) - .check(matches(isDisplayed())) - .perform(click()); - - onView(withText(R.string.field_required)) - .check(matches(isDisplayed())); - - onView(withText(R.string.invalid_email)) - .check(matches(isDisplayed())); - - onView(withText(R.string.invalid_password)) - .check(matches(isDisplayed())); - } - - @Test - public void clearAllValidations() { - onView(withId(R.id.validate_button)) - .perform(closeSoftKeyboard()) - .check(matches(isDisplayed())) - .perform(click()); - - onView(withId(R.id.clear_button)) - .check(matches(isDisplayed())) - .perform(click()); - - onView(withText(R.string.field_required)) - .check(doesNotExist()); - - onView(withText(R.string.invalid_email)) - .check(doesNotExist()); - - onView(withText(R.string.emails_not_match)) - .check(doesNotExist()); - - onView(withText(R.string.invalid_password)) - .check(doesNotExist()); - - onView(withText(R.string.passwords_not_match)) - .check(doesNotExist()); - } - - @Test - public void testNameField() { - TestUtils.testFieldWithEmptyValue(R.id.validate_button, R.string.field_required); - - TestUtils.testFieldWithAValidValue(R.id.name_field, R.string.field_required, "Wellington"); - } - - @Test - public void testEmailField() { - TestUtils.testFieldWithEmptyValue(R.id.validate_button, R.string.invalid_email); - - TestUtils.testFieldWithAnInvalidValue(R.id.email_field, R.string.invalid_email, "well@email"); - - TestUtils.testFieldWithAValidValue(R.id.email_field, R.string.invalid_email, "well@email.com"); - } - - @Test - public void testConfirmEmailField() { - TestUtils.testFieldWithAValidValue(R.id.email_field, R.string.invalid_email, "wellington@email.com"); - - TestUtils.testFieldWithAnInvalidValue(R.id.confirm_email_field, R.string.emails_not_match, "wellington@email.co"); - - TestUtils.testFieldWithAValidValue(R.id.confirm_email_field, R.string.emails_not_match, "wellington@email.com"); - } - - @Test - public void testPasswordField() { - TestUtils.testFieldWithEmptyValue(R.id.validate_button, R.string.invalid_password); - - TestUtils.testFieldWithAnInvalidValue(R.id.password_field, R.string.invalid_password, "asdASD"); - - TestUtils.testFieldWithAValidValue(R.id.password_field, R.string.invalid_password, "asdASD123"); - } - - @Test - public void testConfirmPasswordField() { - TestUtils.testFieldWithAValidValue(R.id.password_field, R.string.invalid_password, "asdASD123"); - - TestUtils.testFieldWithAnInvalidValue(R.id.confirm_password_field, R.string.passwords_not_match, "asdASD"); - - TestUtils.testFieldWithAValidValue(R.id.confirm_password_field, R.string.passwords_not_match, "asdASD123"); - } - -} \ No newline at end of file diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 48a2773..fe116eb 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -15,8 +15,8 @@ - - + + \ No newline at end of file diff --git a/sample/src/main/java/convalida/sample/SampleActivity.java b/sample/src/main/java/convalida/sample/AnnotataionSampleActivity.java similarity index 61% rename from sample/src/main/java/convalida/sample/SampleActivity.java rename to sample/src/main/java/convalida/sample/AnnotataionSampleActivity.java index fc358ee..a969660 100644 --- a/sample/src/main/java/convalida/sample/SampleActivity.java +++ b/sample/src/main/java/convalida/sample/AnnotataionSampleActivity.java @@ -1,11 +1,11 @@ package convalida.sample; import android.os.Bundle; +import android.support.constraint.ConstraintLayout; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.widget.Button; import android.widget.EditText; -import android.widget.LinearLayout; import butterknife.BindView; import butterknife.ButterKnife; @@ -13,27 +13,43 @@ import convalida.annotations.ConfirmEmailValidation; import convalida.annotations.ConfirmPasswordValidation; import convalida.annotations.EmailValidation; -import convalida.annotations.NotEmptyValidation; +import convalida.annotations.LengthValidation; import convalida.annotations.OnValidationError; import convalida.annotations.OnValidationSuccess; +import convalida.annotations.OnlyNumberValidation; import convalida.annotations.PasswordValidation; +import convalida.annotations.PatternValidation; +import convalida.annotations.RequiredValidation; import convalida.annotations.ValidateOnClick; import static convalida.library.util.Patterns.MIXED_CASE_NUMERIC; +import static convalida.sample.Constants.PHONE_PATTERN; /** * @author Wellington Costa on 05/06/17. */ -public class SampleActivity extends AppCompatActivity { +public class AnnotataionSampleActivity extends AppCompatActivity { - @BindView(R.id.linear_layout) - LinearLayout linearLayout; + @BindView(R.id.constraint_layout) + ConstraintLayout constraintLayout; @BindView(R.id.name_field) - @NotEmptyValidation(errorMessage = R.string.field_required) + @RequiredValidation(errorMessage = R.string.field_required) EditText nameField; + @BindView(R.id.nickname_field) + @LengthValidation(min = 3, errorMessage = R.string.min_3_characters) + EditText nickNameField; + + @BindView(R.id.age_field) + @OnlyNumberValidation(errorMessage = R.string.only_numbers) + EditText ageField; + + @BindView(R.id.phone_field) + @PatternValidation(pattern = PHONE_PATTERN, errorMessage = R.string.invalid_phone) + EditText phoneField; + @BindView(R.id.email_field) @EmailValidation(errorMessage = R.string.invalid_email) EditText emailField; @@ -61,19 +77,19 @@ public class SampleActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_sample); + setContentView(R.layout.activity_annotation_sample); ButterKnife.bind(this); - SampleActivityFieldsValidation.init(this); + AnnotataionSampleActivityFieldsValidation.init(this); } @OnValidationSuccess public void onValidationSuccess() { - Snackbar.make(linearLayout, "Yay!", Snackbar.LENGTH_LONG).show(); + Snackbar.make(constraintLayout, "Yay!", Snackbar.LENGTH_LONG).show(); } @OnValidationError public void onValidationError() { - Snackbar.make(linearLayout, "Something is wrong :(", Snackbar.LENGTH_LONG).show(); + Snackbar.make(constraintLayout, "Something is wrong :(", Snackbar.LENGTH_LONG).show(); } } \ No newline at end of file diff --git a/sample/src/main/java/convalida/sample/AnotherSampleActivity.java b/sample/src/main/java/convalida/sample/AnotherSampleActivity.java deleted file mode 100644 index e0bf654..0000000 --- a/sample/src/main/java/convalida/sample/AnotherSampleActivity.java +++ /dev/null @@ -1,73 +0,0 @@ -package convalida.sample; - -import android.os.Bundle; -import android.support.design.widget.Snackbar; -import android.support.v7.app.AppCompatActivity; -import android.widget.Button; -import android.widget.EditText; -import android.widget.LinearLayout; - -import butterknife.BindView; -import butterknife.ButterKnife; -import convalida.annotations.ClearValidationsOnClick; -import convalida.annotations.LengthValidation; -import convalida.annotations.NotEmptyValidation; -import convalida.annotations.OnValidationError; -import convalida.annotations.OnValidationSuccess; -import convalida.annotations.OnlyNumberValidation; -import convalida.annotations.PatternValidation; -import convalida.annotations.ValidateOnClick; - -/** - * @author Wellington Costa on 05/06/17. - */ -public class AnotherSampleActivity extends AppCompatActivity { - - private static final String PHONE_PATTERN = "[\\+]\\d{2}[\\(]\\d{2}[\\)]\\d{4}[\\-]\\d{4}"; - - @BindView(R.id.linear_layout) - LinearLayout linearLayout; - - @BindView(R.id.name_field) - @NotEmptyValidation(errorMessage = R.string.field_required) - EditText nameField; - - @BindView(R.id.nickname_field) - @LengthValidation(min = 3, errorMessage = R.string.min_3_characters) - EditText nickNameField; - - @BindView(R.id.age_field) - @OnlyNumberValidation(errorMessage = R.string.only_numbers) - EditText ageField; - - @BindView(R.id.phone_field) - @PatternValidation(pattern = PHONE_PATTERN, errorMessage = R.string.invalid_phone) - EditText phoneField; - - @ValidateOnClick - @BindView(R.id.validate_button) - Button validateButton; - - @ClearValidationsOnClick - @BindView(R.id.clear_button) - Button clearValidationsButton; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_another_sample); - ButterKnife.bind(this); - AnotherSampleActivityFieldsValidation.init(this); - } - - @OnValidationSuccess - public void onValidationSuccess() { - Snackbar.make(linearLayout, "Yay!", Snackbar.LENGTH_LONG).show(); - } - - @OnValidationError - public void onValidationError() { - Snackbar.make(linearLayout, "Something is wrong :(", Snackbar.LENGTH_LONG).show(); - } - -} \ No newline at end of file diff --git a/sample/src/main/java/convalida/sample/Constants.java b/sample/src/main/java/convalida/sample/Constants.java new file mode 100644 index 0000000..a81a961 --- /dev/null +++ b/sample/src/main/java/convalida/sample/Constants.java @@ -0,0 +1,11 @@ +package convalida.sample; + +/** + * @author WellingtonCosta on 29/03/18. + */ + +public class Constants { + + public static final String PHONE_PATTERN = "[\\+]\\d{2}[\\(]\\d{2}[\\)]\\d{4}[\\-]\\d{4}"; + +} diff --git a/sample/src/main/java/convalida/sample/DatabindingSampleActivity.java b/sample/src/main/java/convalida/sample/DatabindingSampleActivity.java new file mode 100644 index 0000000..e5ecdac --- /dev/null +++ b/sample/src/main/java/convalida/sample/DatabindingSampleActivity.java @@ -0,0 +1,50 @@ +package convalida.sample; + +import android.databinding.DataBindingUtil; +import android.os.Bundle; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.view.View; + +import convalida.databinding.ValidationUtils; +import convalida.sample.databinding.ActivityDatabindingSampleBinding; + +/** + * @author Wellington Costa on 05/06/17. + */ +public class DatabindingSampleActivity extends AppCompatActivity { + + private ActivityDatabindingSampleBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = DataBindingUtil.setContentView(this, R.layout.activity_databinding_sample); + binding.validateButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean isValid = ValidationUtils.validateFields(binding.getRoot()); + if(isValid) { + Snackbar.make( + binding.getRoot(), + "Yay!", + Snackbar.LENGTH_LONG + ).show(); + } else { + Snackbar.make( + binding.getRoot(), + "Something is wrong :(", + Snackbar.LENGTH_LONG + ).show(); + } + } + }); + binding.clearButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ValidationUtils.clearValidations(binding.getRoot()); + } + }); + } + +} \ No newline at end of file diff --git a/sample/src/main/java/convalida/sample/MainActivity.java b/sample/src/main/java/convalida/sample/MainActivity.java index 6824d3f..41277f7 100644 --- a/sample/src/main/java/convalida/sample/MainActivity.java +++ b/sample/src/main/java/convalida/sample/MainActivity.java @@ -18,11 +18,11 @@ protected void onCreate(Bundle savedInstanceState) { @OnClick(R.id.sample_1) public void showSample1() { - startActivity(new Intent(this, SampleActivity.class)); + startActivity(new Intent(this, AnnotataionSampleActivity.class)); } @OnClick(R.id.sample_2) public void showSample2() { - startActivity(new Intent(this, AnotherSampleActivity.class)); + startActivity(new Intent(this, DatabindingSampleActivity.class)); } } diff --git a/sample/src/main/res/layout/activity_annotation_sample.xml b/sample/src/main/res/layout/activity_annotation_sample.xml new file mode 100644 index 0000000..b6ec3b3 --- /dev/null +++ b/sample/src/main/res/layout/activity_annotation_sample.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample/src/main/res/layout/activity_another_sample.xml b/sample/src/main/res/layout/activity_another_sample.xml deleted file mode 100644 index 5fad0b9..0000000 --- a/sample/src/main/res/layout/activity_another_sample.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -