From d4d76e4f1ed6878de7c55cb0214bcbf878c62dc3 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Nascimento Date: Sat, 11 Nov 2017 11:59:27 -0200 Subject: [PATCH 1/2] Refatora para 2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Mudança de pacote - Inclusão do fix para manter a máscara de Real - Atualização de libs - Atualização do build system --- .travis.yml | 54 +++-- CHANGELOG.md | 5 + README.md | 8 +- build.gradle | 7 +- canarinho/build.gradle | 6 +- canarinho/src/main/AndroidManifest.xml | 2 +- .../canarinho/DigitoPara.java | 2 +- .../canarinho/formatador/Formatador.java | 83 ++++--- .../canarinho/formatador/FormatadorBase.java | 29 ++- .../formatador/FormatadorBoleto.java | 48 ++-- .../canarinho/formatador/FormatadorCEP.java | 5 +- .../formatador/FormatadorCPFCNPJ.java | 10 +- .../formatador/FormatadorLinhaDigitavel.java | 26 ++- .../formatador/FormatadorTelefone.java | 52 +++-- .../canarinho/formatador/FormatadorValor.java | 11 +- .../canarinho/validator/Validador.java | 8 +- .../canarinho/validator/ValidadorBoleto.java | 6 +- .../canarinho/validator/ValidadorCEP.java | 4 +- .../canarinho/validator/ValidadorCNPJ.java | 6 +- .../canarinho/validator/ValidadorCPF.java | 6 +- .../canarinho/validator/ValidadorCPFCNPJ.java | 7 +- .../validator/ValidadorTelefone.java | 7 +- .../watcher/BaseCanarinhoTextWatcher.java | 13 +- .../watcher/BoletoBancarioTextWatcher.java | 10 +- .../canarinho/watcher/CEPTextWatcher.java | 8 +- .../canarinho/watcher/CPFCNPJTextWatcher.java | 10 +- .../watcher/MascaraNumericaTextWatcher.java | 8 +- .../watcher/TelefoneTextWatcher.java | 10 +- .../watcher/ValorMonetarioWatcher.java | 6 +- .../watcher/evento/EventoDeValidacao.java | 2 +- .../evento/EventoDeValidacaoDeBoleto.java | 2 +- canarinho/src/main/res/values/strings.xml | 3 - gradle.properties | 1 - gradle/wrapper/gradle-wrapper.properties | 3 +- sample/build.gradle | 66 ++++-- .../DemoWatchersInstrumentationTest.java | 70 +++--- sample/src/main/AndroidManifest.xml | 4 +- .../sample/ui/activity/MainActivity.java | 12 +- .../ui/adapter/WatchersPagerAdapter.java | 9 +- .../ui/fragment/BaseWatcherFragment.java | 4 +- ...anarinhoValorMonetarioWatcherFragment.java | 23 +- .../sample/ui/fragment/WatcherFragment.java | 35 +-- .../canarinho/sample/ui/model/Watchers.java | 221 ++++++++++++++++++ .../canarinho/sample/ui/model/Watchers.java | 170 -------------- .../main/res/drawable-hdpi/ic_launcher.png | Bin 4872 -> 0 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 2983 -> 0 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 6922 -> 0 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 11178 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_launcher.png | Bin 16487 -> 0 bytes sample/src/main/res/layout/main_activity.xml | 9 +- sample/src/main/res/values/colors.xml | 1 - sample/src/main/res/values/strings.xml | 2 - sample/src/main/res/values/styles.xml | 3 +- .../canarinho/test/TesteFormatadorBOLETO.java | 6 +- .../canarinho/test/TesteFormatadorCEP.java | 6 +- .../canarinho/test/TesteFormatadorCNPJ.java | 6 +- .../canarinho/test/TesteFormatadorCPF.java | 6 +- .../test/TesteFormatadorCPFCNPJ.java | 6 +- .../test/TesteFormatadorLinhaDigitavel.java | 6 +- .../test/TesteFormatadorTelefone.java | 6 +- .../canarinho/test/TesteFormatadorValor.java | 8 +- .../canarinho/test/TesteValidadores.java | 6 +- .../test/watcher/BoletoTextWatcherTest.java | 29 ++- .../watcher/ValorMonetarioWatcherTest.java | 9 +- tools/linters/checkstyle/checkstyle.xml | 13 +- tools/linters/checkstyle/suppressions.xml | 2 +- tools/linters/findbugs/findbugs-filter.xml | 2 +- tools/linters/linters.gradle | 56 +++-- 68 files changed, 717 insertions(+), 547 deletions(-) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/DigitoPara.java (99%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/formatador/Formatador.java (51%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/formatador/FormatadorBase.java (73%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/formatador/FormatadorBoleto.java (55%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/formatador/FormatadorCEP.java (89%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/formatador/FormatadorCPFCNPJ.java (89%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/formatador/FormatadorLinhaDigitavel.java (87%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/formatador/FormatadorTelefone.java (69%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/formatador/FormatadorValor.java (90%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/validator/Validador.java (88%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/validator/ValidadorBoleto.java (96%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/validator/ValidadorCEP.java (92%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/validator/ValidadorCNPJ.java (92%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/validator/ValidadorCPF.java (94%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/validator/ValidadorCPFCNPJ.java (90%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/validator/ValidadorTelefone.java (90%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/watcher/BaseCanarinhoTextWatcher.java (94%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/watcher/BoletoBancarioTextWatcher.java (92%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/watcher/CEPTextWatcher.java (84%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/watcher/CPFCNPJTextWatcher.java (83%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/watcher/MascaraNumericaTextWatcher.java (93%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/watcher/TelefoneTextWatcher.java (84%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/watcher/ValorMonetarioWatcher.java (95%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/watcher/evento/EventoDeValidacao.java (94%) rename canarinho/src/main/java/br/com/{concretesolutions => concrete}/canarinho/watcher/evento/EventoDeValidacaoDeBoleto.java (89%) delete mode 100644 canarinho/src/main/res/values/strings.xml rename sample/src/androidTest/java/br/com/{concretesolutions => concrete}/canarinho/sample/DemoWatchersInstrumentationTest.java (83%) rename sample/src/main/java/br/com/{concretesolutions => concrete}/canarinho/sample/ui/activity/MainActivity.java (69%) rename sample/src/main/java/br/com/{concretesolutions => concrete}/canarinho/sample/ui/adapter/WatchersPagerAdapter.java (67%) rename sample/src/main/java/br/com/{concretesolutions => concrete}/canarinho/sample/ui/fragment/BaseWatcherFragment.java (62%) rename sample/src/main/java/br/com/{concretesolutions => concrete}/canarinho/sample/ui/fragment/CanarinhoValorMonetarioWatcherFragment.java (59%) rename sample/src/main/java/br/com/{concretesolutions => concrete}/canarinho/sample/ui/fragment/WatcherFragment.java (52%) create mode 100644 sample/src/main/java/br/com/concrete/canarinho/sample/ui/model/Watchers.java delete mode 100644 sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/model/Watchers.java delete mode 100644 sample/src/main/res/drawable-hdpi/ic_launcher.png delete mode 100644 sample/src/main/res/drawable-mdpi/ic_launcher.png delete mode 100644 sample/src/main/res/drawable-xhdpi/ic_launcher.png delete mode 100644 sample/src/main/res/drawable-xxhdpi/ic_launcher.png delete mode 100644 sample/src/main/res/drawable-xxxhdpi/ic_launcher.png rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/TesteFormatadorBOLETO.java (94%) rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/TesteFormatadorCEP.java (94%) rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/TesteFormatadorCNPJ.java (95%) rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/TesteFormatadorCPF.java (96%) rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/TesteFormatadorCPFCNPJ.java (97%) rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/TesteFormatadorLinhaDigitavel.java (90%) rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/TesteFormatadorTelefone.java (93%) rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/TesteFormatadorValor.java (92%) rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/TesteValidadores.java (96%) rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/watcher/BoletoTextWatcherTest.java (74%) rename sample/src/test/java/br/com/{concretesolutions => concrete}/canarinho/test/watcher/ValorMonetarioWatcherTest.java (90%) diff --git a/.travis.yml b/.travis.yml index b2c8afa..5e294d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,28 +1,48 @@ language: android +sudo: required jdk: oraclejdk8 -sudo: required # For faster internet speeds and more memory -before_install: - - mkdir "$ANDROID_HOME/licenses" || true - - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license" - - echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license" - -android: - components: - - tools - - tools + before_cache: - - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ + -rm -f $HOME/.gradle/caches/modules-2/modules-2.lock + -rm -fr $HOME/.gradle/caches/*/plugin-resolution/ + cache: directories: - - $HOME/.gradle/caches/ - - $HOME/.gradle/wrapper/ - - $HOME/.android/build-cache + -$HOME/.gradle/caches/ + -$HOME/.gradle/wrapper/ + +before_install: + # Download SDK + - echo yes | sdkmanager "tools" &>/dev/null + - echo yes | sdkmanager "platform-tools" &>/dev/null + - echo yes | sdkmanager "build-tools;26.0.2" &>/dev/null + - echo yes | sdkmanager "platforms;android-26" &>/dev/null + # Download emulator + - echo yes | sdkmanager "platforms;android-19" &>/dev/null + - echo yes | sdkmanager "system-images;android-19;default;armeabi-v7a" &>/dev/null + - echo yes | sdkmanager --licenses &>/dev/null + # Setup emulator + - echo no | avdmanager create avd --force -n test -k "system-images;android-19;default;armeabi-v7a" &>/dev/null + - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window & &>/dev/null before_script: - - ${ANDROID_HOME}tools/bin/sdkmanager --channel=3 "tools" "platform-tools" "build-tools;26.0.1" "platforms;android-26" "extras;google;m2repository" + # Make sure the emulator is available + - android-wait-for-emulator + + # Turn off animations + - adb shell settings put global window_animation_scale 0 & + - adb shell settings put global transition_animation_scale 0 & + - adb shell settings put global animator_duration_scale 0 & + + # For Multidex issue for devices API < 19 + - adb shell setprop dalvik.vm.dexopt-flags v=n,o=v + - adb shell stop installd + - adb shell start installd + + # Wake up + - adb shell input keyevent 82 & script: - - ./gradlew clean assemble check :sample:test + - ./gradlew clean check --stacktrace --info after_failure: "cat $TRAVIS_BUILD_DIR/sample/build/outputs/lint-results-debug.xml" diff --git a/CHANGELOG.md b/CHANGELOG.md index 92af0cd..8006f7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 2.0.0 + - Alterado o pacote da bilbioteca. Junto a reformulação do nome da própria Concrete (remoção de Solutions) + - Corrige issue #19. Obrigado a @luisfernandezbr pelo fix + - Atualiza sistema de build + ## 1.2.0 - Adicionada configuração de `ValorMonetarioWatcher` - É possível deixar o símbolo de Real diff --git a/README.md b/README.md index d619202..a79e6df 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ Exemplo de declaração no layout: android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/hint_value" - android:inputType="textFilter|number" + android:inputType="number" android:maxLength="13" android:text="0,00" /> ``` @@ -100,6 +100,12 @@ Para isso, usamos um `EventoDeValidacao` que possui os seguintes callbacks: - `void parcialmenteValido(String valorAtual)`: chamado quando o valor ainda não está completo e também não está inválido - `void totalmenteValido(String valorAtual)`: chamado quando o valor está completo e válido +Um exemplo de implementação: + +```java + +``` + Veja exemplos de implementação no sample. ## Changelog diff --git a/build.gradle b/build.gradle index 718f8a4..db17eb4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,11 @@ buildscript { repositories { - google() jcenter() + google() } + dependencies { - classpath 'com.android.tools.build:gradle:3.0.0-beta7' + classpath 'com.android.tools.build:gradle:3.0.0' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' } @@ -12,7 +13,7 @@ buildscript { allprojects { repositories { - google() jcenter() + google() } } diff --git a/canarinho/build.gradle b/canarinho/build.gradle index f100caf..146136b 100644 --- a/canarinho/build.gradle +++ b/canarinho/build.gradle @@ -6,14 +6,14 @@ ext { bintrayName = 'canarinho' bintrayUserOrg = 'concretesolutions' - publishedGroupId = 'br.com.concretesolutions' + publishedGroupId = 'br.com.concrete' libraryName = 'Android Canarinho' artifact = 'canarinho' libraryDescription = 'Utilitários Android para padrões Brasileiros' siteUrl = 'https://github.com/concretesolutions/canarinho' gitUrl = 'https://github.com/concretesolutions/canarinho.git' - libraryVersion = '1.3.0-snapshot' + libraryVersion = '2.0.0' developerId = 'cs-victor-nascimento' developerName = 'Victor Oliveira Nascimento' @@ -25,7 +25,7 @@ ext { android { compileSdkVersion 26 - buildToolsVersion "26.0.1" + buildToolsVersion "26.0.2" defaultConfig { minSdkVersion 15 diff --git a/canarinho/src/main/AndroidManifest.xml b/canarinho/src/main/AndroidManifest.xml index ca4abf0..11652ea 100644 --- a/canarinho/src/main/AndroidManifest.xml +++ b/canarinho/src/main/AndroidManifest.xml @@ -1 +1 @@ - \ No newline at end of file + diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/DigitoPara.java b/canarinho/src/main/java/br/com/concrete/canarinho/DigitoPara.java similarity index 99% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/DigitoPara.java rename to canarinho/src/main/java/br/com/concrete/canarinho/DigitoPara.java index b2dfbe9..9b0e683 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/DigitoPara.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/DigitoPara.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho; +package br.com.concrete.canarinho; import android.util.SparseArray; diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/Formatador.java b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/Formatador.java similarity index 51% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/Formatador.java rename to canarinho/src/main/java/br/com/concrete/canarinho/formatador/Formatador.java index 1eafa9c..7ed7e0c 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/Formatador.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/Formatador.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.formatador; +package br.com.concrete.canarinho.formatador; import java.util.regex.Pattern; @@ -10,48 +10,63 @@ public interface Formatador { // Formatadores /** - * Singleton de formatação de CEP + * Singleton de formatação de CEP. */ - Formatador CEP = new FormatadorBase(Padroes.CEP_FORMATADO, "$1-$2", Padroes.CEP_DESFORMATADO, "$1$2"); + Formatador CEP = new FormatadorBase( + Padroes.CEP_FORMATADO, + "$1-$2", + Padroes.CEP_DESFORMATADO, + "$1$2" + ); /** - * Singleton de formatação de CPF + * Singleton de formatação de CPF. */ - Formatador CPF = new FormatadorBase(Padroes.CPF_FORMATADO, "$1.$2.$3-$4", Padroes.CPF_DESFORMATADO, "$1$2$3$4"); + Formatador CPF = new FormatadorBase( + Padroes.CPF_FORMATADO, + "$1.$2.$3-$4", + Padroes.CPF_DESFORMATADO, + "$1$2$3$4" + ); /** - * Singleton de formatação de CNPJ + * Singleton de formatação de CNPJ. */ - Formatador CNPJ = new FormatadorBase(Padroes.CNPJ_FORMATADO, "$1.$2.$3/$4-$5", Padroes.CNPJ_DESFORMATADO, - "$1$2$3$4$5"); + Formatador CNPJ = new FormatadorBase( + Padroes.CNPJ_FORMATADO, + "$1.$2.$3/$4-$5", + Padroes.CNPJ_DESFORMATADO, + "$1$2$3$4$5" + ); /** - * Singleton de formatação de CPF e CNPJ + * Singleton de formatação de CPF e CNPJ. */ Formatador CPF_CNPJ = FormatadorCPFCNPJ.getInstance(); /** - * Singleton de formatação de valores monetários + * Singleton de formatação de valores monetários. */ FormatadorValor VALOR = FormatadorValor.getInstance(false); /** - * Singleton de formatação de valores monetários com símbolo do Real + * Singleton de formatação de valores monetários com símbolo do Real. */ FormatadorValor VALOR_COM_SIMBOLO = FormatadorValor.getInstance(true); /** - * Singleton de formatação de boletos bancários + * Singleton de formatação de boletos bancários. */ Formatador BOLETO = FormatadorBoleto.getInstance(); /** - * Singleton de formatação de telefones (DDD) número + * Singleton de formatação de telefones (DDD) número. */ Formatador TELEFONE = FormatadorTelefone.getInstance(); /** - * Singleton de formatação de linha digitável. Transforma números do código de barras em linha digitável. + * Singleton de formatação de linha digitável. Transforma números do código de barras em linha + * digitável. */ Formatador LINHA_DIGITAVEL = FormatadorLinhaDigitavel.getInstance(); @@ -88,24 +103,32 @@ public interface Formatador { boolean podeSerFormatado(String value); /** - * Classe para guardar os padrões de experssões regulares usados no framework + * Classe para guardar os padrões de experssões regulares usados no framework. */ abstract class Padroes { - // Patterns - public static final Pattern CEP_FORMATADO = Pattern - .compile("(\\d{5})-(\\d{3})"); - public static final Pattern CEP_DESFORMATADO = Pattern - .compile("(\\d{5})(\\d{3})"); - public static final Pattern CNPJ_FORMATADO = Pattern - .compile("(\\d{2})[.](\\d{3})[.](\\d{3})/(\\d{4})-(\\d{2})"); - public static final Pattern CNPJ_DESFORMATADO = Pattern - .compile("(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})"); - public static final Pattern CPF_FORMATADO = Pattern - .compile("(\\d{3})[.](\\d{3})[.](\\d{3})-(\\d{2})"); - public static final Pattern CPF_DESFORMATADO = Pattern - .compile("(\\d{3})(\\d{3})(\\d{3})(\\d{2})"); - public static final Pattern PADRAO_SOMENTE_NUMEROS = Pattern - .compile("[^0-9]"); + + public static final Pattern PADRAO_SOMENTE_NUMEROS = Pattern.compile("[^0-9]"); + public static final Pattern CEP_FORMATADO = Pattern.compile("(\\d{5})-(\\d{3})"); + public static final Pattern CEP_DESFORMATADO = Pattern.compile("(\\d{5})(\\d{3})"); + + public static final Pattern CNPJ_FORMATADO = Pattern.compile( + "(\\d{2})[.](\\d{3})[.](\\d{3})/(\\d{4})-(\\d{2})" + ); + + public static final Pattern CNPJ_DESFORMATADO = Pattern.compile( + "(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})" + ); + + public static final Pattern CPF_FORMATADO = Pattern.compile( + "(\\d{3})[.](\\d{3})[.](\\d{3})-(\\d{2})" + ); + + public static final Pattern CPF_DESFORMATADO = Pattern.compile( + "(\\d{3})(\\d{3})(\\d{3})(\\d{2})" + ); + + private Padroes() { + } } } diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorBase.java b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorBase.java similarity index 73% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorBase.java rename to canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorBase.java index 5be65cb..db95b28 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorBase.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorBase.java @@ -1,9 +1,12 @@ -package br.com.concretesolutions.canarinho.formatador; +package br.com.concrete.canarinho.formatador; import java.util.regex.Matcher; import java.util.regex.Pattern; -/** */ +/** + * Classe utilitária para a implementação de todos os formatadores que precisam apenas da aplicação + * de {@link Pattern}s. + */ final class FormatadorBase implements Formatador { private final Pattern formatted; @@ -15,13 +18,19 @@ final class FormatadorBase implements Formatador { private final String unformattedReplacement; /** - * TODO adicionar JavaDoc - * @param formatted descrever conteúdo - * @param formattedReplacement descrever conteúdo - * @param unformatted descrever conteúdo + * Constrói um formatador que recebe a configuração de formatação e substituição. + * + * @param formatted descrever conteúdo + * @param formattedReplacement descrever conteúdo + * @param unformatted descrever conteúdo * @param unformattedReplacement descrever conteúdo */ - FormatadorBase(Pattern formatted, String formattedReplacement, Pattern unformatted, String unformattedReplacement) { + FormatadorBase( + Pattern formatted, + String formattedReplacement, + Pattern unformatted, + String unformattedReplacement) { + this.formatted = formatted; this.formattedReplacement = formattedReplacement; this.unformatted = unformatted; @@ -69,11 +78,7 @@ public final boolean estaFormatado(String value) { @Override public final boolean podeSerFormatado(String value) { - if (value == null) { - return false; - } - - return unformatted.matcher(value).matches(); + return value != null && unformatted.matcher(value).matches(); } private String matchAndReplace(Matcher matcher, String replacement) { diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorBoleto.java b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorBoleto.java similarity index 55% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorBoleto.java rename to canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorBoleto.java index d3f5fbc..80d949b 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorBoleto.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorBoleto.java @@ -1,23 +1,41 @@ -package br.com.concretesolutions.canarinho.formatador; +package br.com.concrete.canarinho.formatador; import java.util.regex.Pattern; -/** */ +/** + * Formatador especializado para linha digitável de boletos bancários. Ele detecta automaticamente + * se o boleto é do tipo tributos ou de conveniados. Caso o boleto comece com o número '8', então + * é aplicada a formatação: 888888888888 888888888888 888888888888 888888888888. Caso contrário, + * usa-se o padrão 99999.99999 99999.999999 99999.999999 9 99999999999999. + */ public final class FormatadorBoleto implements Formatador { - private static final Pattern TRIBUTO_FORMATADO = Pattern - .compile("(\\d{12})\\s(\\d{12})\\s(\\d{12})\\s(\\d{12})"); - private static final Pattern TRIBUTO_DESFORMATADO = Pattern - .compile("(\\d{12})(\\d{12})(\\d{12})(\\d{12})"); - private static final FormatadorBase FORMATADOR_TRIBUTOS = new FormatadorBase(TRIBUTO_FORMATADO, - "$1 $2 $3 $4", TRIBUTO_DESFORMATADO, "$1$2$3$4"); - - private static final Pattern NORMAL_FORMATADO = Pattern - .compile("(\\d{5})[.](\\d{5})\\s(\\d{5})[.](\\d{6})\\s(\\d{5})[.](\\d{6})\\s(\\d)\\s(\\d{14})"); - private static final Pattern NORMAL_DESFORMATADO = Pattern - .compile("(\\d{5})(\\d{5})(\\d{5})(\\d{6})(\\d{5})(\\d{6})(\\d{1})(\\d{14})"); - private static final FormatadorBase FORMATADOR_NORMAL = new FormatadorBase(NORMAL_FORMATADO, - "$1.$2 $3.$4 $5.$6 $7 $8", NORMAL_DESFORMATADO, "$1$2$3$4$5$6$7$8"); + private static final Pattern TRIBUTO_FORMATADO = + Pattern.compile("(\\d{12})\\s(\\d{12})\\s(\\d{12})\\s(\\d{12})"); + private static final Pattern TRIBUTO_DESFORMATADO = + Pattern.compile("(\\d{12})(\\d{12})(\\d{12})(\\d{12})"); + + private static final FormatadorBase FORMATADOR_TRIBUTOS = new FormatadorBase( + TRIBUTO_FORMATADO, + "$1 $2 $3 $4", + TRIBUTO_DESFORMATADO, + "$1$2$3$4" + ); + + private static final Pattern NORMAL_FORMATADO = Pattern.compile( + "(\\d{5})[.](\\d{5})\\s(\\d{5})[.](\\d{6})\\s(\\d{5})[.](\\d{6})\\s(\\d)\\s(\\d{14})" + ); + + private static final Pattern NORMAL_DESFORMATADO = Pattern.compile( + "(\\d{5})(\\d{5})(\\d{5})(\\d{6})(\\d{5})(\\d{6})(\\d{1})(\\d{14})" + ); + + private static final FormatadorBase FORMATADOR_NORMAL = new FormatadorBase( + NORMAL_FORMATADO, + "$1.$2 $3.$4 $5.$6 $7 $8", + NORMAL_DESFORMATADO, + "$1$2$3$4$5$6$7$8" + ); // No instance creation private FormatadorBoleto() { diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorCEP.java b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorCEP.java similarity index 89% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorCEP.java rename to canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorCEP.java index 221ab19..6c2fae8 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorCEP.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorCEP.java @@ -1,8 +1,7 @@ -package br.com.concretesolutions.canarinho.formatador; +package br.com.concrete.canarinho.formatador; /** - * Formata CEP - * Ver exemplos no Sample. + * Formatador para CEP. Segue o padrão 99999-999. */ public final class FormatadorCEP implements Formatador { diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorCPFCNPJ.java b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorCPFCNPJ.java similarity index 89% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorCPFCNPJ.java rename to canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorCPFCNPJ.java index f81a8e8..31b0178 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorCPFCNPJ.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorCPFCNPJ.java @@ -1,9 +1,8 @@ -package br.com.concretesolutions.canarinho.formatador; +package br.com.concrete.canarinho.formatador; /** - * Formatador para CPF e CNPJ no mesmo campo. Formata como CPF até 11 dígitos numéricos. - * Depois formata como CNPJ. - * Ver exemplos no Sample. + * Formatador para CPF e CNPJ no mesmo campo. Formata como CPF até 11 dígitos numéricos. Depois + * formata como CNPJ. */ public final class FormatadorCPFCNPJ implements Formatador { @@ -59,7 +58,8 @@ private boolean ehCpf(String value) { throw new IllegalArgumentException("Valor não pode ser nulo"); } - final String desformatado = Formatador.Padroes.PADRAO_SOMENTE_NUMEROS.matcher(value).replaceAll(""); + final String desformatado = Formatador.Padroes.PADRAO_SOMENTE_NUMEROS.matcher(value) + .replaceAll(""); return desformatado.length() < 12; } diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorLinhaDigitavel.java b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorLinhaDigitavel.java similarity index 87% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorLinhaDigitavel.java rename to canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorLinhaDigitavel.java index 4d96649..09b6c35 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorLinhaDigitavel.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorLinhaDigitavel.java @@ -1,11 +1,12 @@ -package br.com.concretesolutions.canarinho.formatador; +package br.com.concrete.canarinho.formatador; -import br.com.concretesolutions.canarinho.DigitoPara; -import br.com.concretesolutions.canarinho.validator.ValidadorBoleto; +import br.com.concrete.canarinho.DigitoPara; +import br.com.concrete.canarinho.validator.ValidadorBoleto; /** - * Transforma a linha digitável de um boleto em um código de boleto e vice-versa. Use o metodo {@link #formata(String)} - * para transformar a linha digitavel em boleto e {@link #desformata(String)}. + * Transforma a linha digitável de um boleto em um código de boleto e vice-versa. Use o metodo + * {@link #formata(String)} para transformar a linha digitavel em boleto e + * {@link #desformata(String)}. * Para verificar se um valor esta em linha digitável ou em boleto, usar os métodos: *
    *
  • {@link #estaFormatado(String)}: indicará se está em formata de boleto
  • @@ -25,7 +26,8 @@ static FormatadorLinhaDigitavel getInstance() { public String formata(String value) { if (value == null || value.length() != 44) { - throw new IllegalArgumentException("Linha digitável deve conter 44 caracteres. " + value); + throw new IllegalArgumentException("Linha digitável deve conter 44 caracteres. " + + "Valor possui " + value + " caracteres"); } if (value.startsWith("8")) { @@ -81,12 +83,15 @@ public String desformata(String valor) { throw new IllegalArgumentException("Valor não pode estar nulo."); } - String valorDesformatadao = Padroes.PADRAO_SOMENTE_NUMEROS.matcher(valor).replaceAll(""); + String valorDesformatadao = Padroes.PADRAO_SOMENTE_NUMEROS.matcher(valor) + .replaceAll(""); if (valorDesformatadao.charAt(0) == '8') { if (valorDesformatadao.length() != 48) { - throw new IllegalArgumentException("Valor para boletos que iniciam com 8 deve conter 48 dígitos"); + throw new IllegalArgumentException( + "Valor para boletos que iniciam com 8 deve conter 48 dígitos" + ); } final StringBuilder builder = new StringBuilder(valorDesformatadao); @@ -130,8 +135,9 @@ public boolean estaFormatado(String value) { @Override public boolean podeSerFormatado(String value) { - final String sanitizado = Padroes.PADRAO_SOMENTE_NUMEROS.matcher(value).replaceAll(""); - return sanitizado.length() == 44; + return Padroes.PADRAO_SOMENTE_NUMEROS.matcher(value) + .replaceAll("") + .length() == 44; } private static class SingletonHolder { diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorTelefone.java b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorTelefone.java similarity index 69% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorTelefone.java rename to canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorTelefone.java index cc0edee..1443692 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorTelefone.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorTelefone.java @@ -1,23 +1,41 @@ -package br.com.concretesolutions.canarinho.formatador; +package br.com.concrete.canarinho.formatador; import java.util.regex.Pattern; -/** */ +/** + * Formata no padrão de telefone brasileiro: (99) 99999-9999 ou (99) 9999-9999. + */ public final class FormatadorTelefone implements Formatador { - private static final Pattern NOVE_DIGITOS_FORMATADO = Pattern - .compile("\\((\\d{2})\\)\\s(\\d{5})-(\\d{4})"); - private static final Pattern NOVE_DIGITOS_DESFORMATADO = Pattern - .compile("(\\d{2})(\\d{5})(\\d{4})"); - private static final FormatadorBase FORMATADOR_NOVE_DIGITOS = new FormatadorBase(NOVE_DIGITOS_FORMATADO, - "($1) $2-$3", NOVE_DIGITOS_DESFORMATADO, "$1$2$3"); + private static final Pattern NOVE_DIGITOS_FORMATADO = Pattern.compile( + "\\((\\d{2})\\)\\s(\\d{5})-(\\d{4})" + ); - private static final Pattern OITO_DIGITOS_FORMATADO = Pattern - .compile("\\((\\d{2})\\)\\s(\\d{4})-(\\d{4})"); - private static final Pattern OITO_DIGITOS_DESFORMATADO = Pattern - .compile("(\\d{2})(\\d{4})(\\d{4})"); - private static final FormatadorBase FORMATADOR_OITO_DIGITOS = new FormatadorBase(OITO_DIGITOS_FORMATADO, - "($1) $2-$3", OITO_DIGITOS_DESFORMATADO, "$1$2$3"); + private static final Pattern NOVE_DIGITOS_DESFORMATADO = Pattern.compile( + "(\\d{2})(\\d{5})(\\d{4})" + ); + + private static final Pattern OITO_DIGITOS_FORMATADO = Pattern.compile( + "\\((\\d{2})\\)\\s(\\d{4})-(\\d{4})" + ); + + private static final Pattern OITO_DIGITOS_DESFORMATADO = Pattern.compile( + "(\\d{2})(\\d{4})(\\d{4})" + ); + + private static final FormatadorBase FORMATADOR_NOVE_DIGITOS = new FormatadorBase( + NOVE_DIGITOS_FORMATADO, + "($1) $2-$3", + NOVE_DIGITOS_DESFORMATADO, + "$1$2$3" + ); + + private static final FormatadorBase FORMATADOR_OITO_DIGITOS = new FormatadorBase( + OITO_DIGITOS_FORMATADO, + "($1) $2-$3", + OITO_DIGITOS_DESFORMATADO, + "$1$2$3" + ); private FormatadorTelefone() { } @@ -67,12 +85,12 @@ private boolean ehNoveDigitos(String value) { throw new IllegalArgumentException("Valor não pode ser nulo"); } - final String desformatado = Formatador.Padroes.PADRAO_SOMENTE_NUMEROS.matcher(value).replaceAll(""); - return desformatado.length() > 10; + return Formatador.Padroes.PADRAO_SOMENTE_NUMEROS.matcher(value) + .replaceAll("") + .length() > 10; } private static class SingletonHolder { private static final FormatadorTelefone INSTANCE = new FormatadorTelefone(); } - } diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorValor.java b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorValor.java similarity index 90% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorValor.java rename to canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorValor.java index c74070b..554055a 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/formatador/FormatadorValor.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorValor.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.formatador; +package br.com.concrete.canarinho.formatador; import java.math.BigDecimal; import java.text.DecimalFormat; @@ -27,10 +27,10 @@ public final class FormatadorValor implements Formatador { private static final String SIMBOLO_REAL = "R$ "; static { - final DecimalFormatSymbols decimalFormatSymbols = FORMATADOR_MOEDA.getDecimalFormatSymbols(); - decimalFormatSymbols.setCurrencySymbol(""); + final DecimalFormatSymbols decimalSymbols = FORMATADOR_MOEDA.getDecimalFormatSymbols(); + decimalSymbols.setCurrencySymbol(""); FORMATADOR_MOEDA.setMinimumFractionDigits(2); - FORMATADOR_MOEDA.setDecimalFormatSymbols(decimalFormatSymbols); + FORMATADOR_MOEDA.setDecimalFormatSymbols(decimalSymbols); FORMATADOR_MOEDA.setNegativePrefix("-"); FORMATADOR_MOEDA.setNegativeSuffix(""); FORMATADOR_MOEDA.setPositivePrefix(""); @@ -70,7 +70,8 @@ public String desformata(String value) { realValue = value.substring(value.indexOf(SIMBOLO_REAL)); } - final BigDecimal valor = (BigDecimal) FORMATADOR_MOEDA.parse(realValue, new ParsePosition(0)); + final BigDecimal valor = (BigDecimal) FORMATADOR_MOEDA.parse(realValue, + new ParsePosition(0)); return valor.toPlainString(); } diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/Validador.java b/canarinho/src/main/java/br/com/concrete/canarinho/validator/Validador.java similarity index 88% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/Validador.java rename to canarinho/src/main/java/br/com/concrete/canarinho/validator/Validador.java index 5490be4..6051893 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/Validador.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/validator/Validador.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.validator; +package br.com.concrete.canarinho.validator; import android.text.Editable; @@ -6,10 +6,10 @@ * Interface de validação de campos. Há basicamente duas formas de validação: *
      *
    • Uma {@link String} completa
    • - *
    • Um {@link Editable} e um {@link br.com.concretesolutions.canarinho.validator.Validador.ResultadoParcial}
    • + *
    • Um {@link Editable} e um {@link br.com.concrete.canarinho.validator.Validador.ResultadoParcial}
    • *
    * No primeiro caso o retorno será: true ou false. No segundo caso, o resultado será sempre - * atualizado no objeto {@link br.com.concretesolutions.canarinho.validator.Validador.ResultadoParcial} passado. + * atualizado no objeto {@link br.com.concrete.canarinho.validator.Validador.ResultadoParcial} passado. */ public interface Validador { @@ -48,7 +48,7 @@ public interface Validador { /** * Valida um {@link Editable} retornando o - * {@link br.com.concretesolutions.canarinho.validator.Validador.ResultadoParcial} + * {@link br.com.concrete.canarinho.validator.Validador.ResultadoParcial} * * @param valor Editable * @param resultadoParcial Objeto com o estado da validação diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorBoleto.java b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorBoleto.java similarity index 96% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorBoleto.java rename to canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorBoleto.java index e546d3d..d7bd556 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorBoleto.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorBoleto.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.validator; +package br.com.concrete.canarinho.validator; import android.text.Editable; import android.text.SpannableStringBuilder; import java.util.regex.Pattern; -import br.com.concretesolutions.canarinho.DigitoPara; -import br.com.concretesolutions.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.DigitoPara; +import br.com.concrete.canarinho.formatador.Formatador; /** * Implementação de @{link Validador} para boleto diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCEP.java b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCEP.java similarity index 92% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCEP.java rename to canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCEP.java index 2dd0f97..11cc185 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCEP.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCEP.java @@ -1,8 +1,8 @@ -package br.com.concretesolutions.canarinho.validator; +package br.com.concrete.canarinho.validator; import android.text.Editable; -import br.com.concretesolutions.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.formatador.Formatador; /** * Implementação de @{link Validador} para CEP (Código de endereçamento Postal) diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCNPJ.java b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCNPJ.java similarity index 92% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCNPJ.java rename to canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCNPJ.java index 309812d..93a690b 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCNPJ.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCNPJ.java @@ -1,9 +1,9 @@ -package br.com.concretesolutions.canarinho.validator; +package br.com.concrete.canarinho.validator; import android.text.Editable; -import br.com.concretesolutions.canarinho.DigitoPara; -import br.com.concretesolutions.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.DigitoPara; +import br.com.concrete.canarinho.formatador.Formatador; /** * Implementação de @{link Validador} para CNPJ diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCPF.java b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCPF.java similarity index 94% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCPF.java rename to canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCPF.java index 5b6e354..5b362dd 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCPF.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCPF.java @@ -1,9 +1,9 @@ -package br.com.concretesolutions.canarinho.validator; +package br.com.concrete.canarinho.validator; import android.text.Editable; -import br.com.concretesolutions.canarinho.DigitoPara; -import br.com.concretesolutions.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.DigitoPara; +import br.com.concrete.canarinho.formatador.Formatador; /** * Implementação de @{link Validador} para CPF diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCPFCNPJ.java b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCPFCNPJ.java similarity index 90% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCPFCNPJ.java rename to canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCPFCNPJ.java index 31860ad..5f385e1 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorCPFCNPJ.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorCPFCNPJ.java @@ -1,12 +1,9 @@ -package br.com.concretesolutions.canarinho.validator; +package br.com.concrete.canarinho.validator; import android.text.Editable; -import br.com.concretesolutions.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.formatador.Formatador; -/** - * Created by tpinho on 8/20/15. - */ public final class ValidadorCPFCNPJ implements Validador { // No instance creation diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorTelefone.java b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorTelefone.java similarity index 90% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorTelefone.java rename to canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorTelefone.java index 8f31902..53b2376 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/validator/ValidadorTelefone.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/validator/ValidadorTelefone.java @@ -1,12 +1,9 @@ -package br.com.concretesolutions.canarinho.validator; +package br.com.concrete.canarinho.validator; import android.text.Editable; -import br.com.concretesolutions.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.formatador.Formatador; -/** - * Created by tpinho on 6/26/15. - */ public final class ValidadorTelefone implements Validador { // No instance creation diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/BaseCanarinhoTextWatcher.java b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/BaseCanarinhoTextWatcher.java similarity index 94% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/BaseCanarinhoTextWatcher.java rename to canarinho/src/main/java/br/com/concrete/canarinho/watcher/BaseCanarinhoTextWatcher.java index f9f4858..a08051b 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/BaseCanarinhoTextWatcher.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/BaseCanarinhoTextWatcher.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.watcher; +package br.com.concrete.canarinho.watcher; import android.text.Editable; import android.text.Selection; import android.text.TextWatcher; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.validator.Validador; -import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacao; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.validator.Validador; +import br.com.concrete.canarinho.watcher.evento.EventoDeValidacao; /** * Classe base para Watchers que possuem máscara e efetuam validação. @@ -33,8 +33,9 @@ public boolean isMudancaInterna() { return mudancaInterna; } - public EventoDeValidacao getEventoDeValidacao() { - return eventoDeValidacao; + @SuppressWarnings("unchecked") + public T getEventoDeValidacao() { + return (T) eventoDeValidacao; } public void setEventoDeValidacao(EventoDeValidacao eventoDeValidacao) { diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/BoletoBancarioTextWatcher.java b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/BoletoBancarioTextWatcher.java similarity index 92% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/BoletoBancarioTextWatcher.java rename to canarinho/src/main/java/br/com/concrete/canarinho/watcher/BoletoBancarioTextWatcher.java index 58b09b7..8b00135 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/BoletoBancarioTextWatcher.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/BoletoBancarioTextWatcher.java @@ -1,14 +1,14 @@ -package br.com.concretesolutions.canarinho.watcher; +package br.com.concrete.canarinho.watcher; import android.text.Editable; import android.text.InputFilter; import java.util.Arrays; -import br.com.concretesolutions.canarinho.validator.Validador; -import br.com.concretesolutions.canarinho.validator.ValidadorBoleto; -import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacao; -import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacaoDeBoleto; +import br.com.concrete.canarinho.validator.Validador; +import br.com.concrete.canarinho.validator.ValidadorBoleto; +import br.com.concrete.canarinho.watcher.evento.EventoDeValidacao; +import br.com.concrete.canarinho.watcher.evento.EventoDeValidacaoDeBoleto; /** * {@link android.text.TextWatcher} responsável por formatar e validar um {@link diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/CEPTextWatcher.java b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/CEPTextWatcher.java similarity index 84% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/CEPTextWatcher.java rename to canarinho/src/main/java/br/com/concrete/canarinho/watcher/CEPTextWatcher.java index c240274..0ae8a73 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/CEPTextWatcher.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/CEPTextWatcher.java @@ -1,11 +1,11 @@ -package br.com.concretesolutions.canarinho.watcher; +package br.com.concrete.canarinho.watcher; import android.text.Editable; import android.text.InputFilter; -import br.com.concretesolutions.canarinho.validator.Validador; -import br.com.concretesolutions.canarinho.validator.ValidadorCEP; -import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacao; +import br.com.concrete.canarinho.validator.Validador; +import br.com.concrete.canarinho.validator.ValidadorCEP; +import br.com.concrete.canarinho.watcher.evento.EventoDeValidacao; /** * {@link android.text.TextWatcher} responsável por formatar e validar um {@link android.widget.EditText} para CEPs. diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/CPFCNPJTextWatcher.java b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/CPFCNPJTextWatcher.java similarity index 83% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/CPFCNPJTextWatcher.java rename to canarinho/src/main/java/br/com/concrete/canarinho/watcher/CPFCNPJTextWatcher.java index 6b9b784..84ddac4 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/CPFCNPJTextWatcher.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/CPFCNPJTextWatcher.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.watcher; +package br.com.concrete.canarinho.watcher; import android.text.Editable; import android.text.InputFilter; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.validator.Validador; -import br.com.concretesolutions.canarinho.validator.ValidadorCPFCNPJ; -import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacao; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.validator.Validador; +import br.com.concrete.canarinho.validator.ValidadorCPFCNPJ; +import br.com.concrete.canarinho.watcher.evento.EventoDeValidacao; /** * {@link android.text.TextWatcher} responsável por formatar e validar um diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/MascaraNumericaTextWatcher.java b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/MascaraNumericaTextWatcher.java similarity index 93% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/MascaraNumericaTextWatcher.java rename to canarinho/src/main/java/br/com/concrete/canarinho/watcher/MascaraNumericaTextWatcher.java index dc71582..4ed6bba 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/MascaraNumericaTextWatcher.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/MascaraNumericaTextWatcher.java @@ -1,17 +1,17 @@ -package br.com.concretesolutions.canarinho.watcher; +package br.com.concrete.canarinho.watcher; import android.text.Editable; import android.text.InputFilter; import java.util.Arrays; -import br.com.concretesolutions.canarinho.validator.Validador; -import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacao; +import br.com.concrete.canarinho.validator.Validador; +import br.com.concrete.canarinho.watcher.evento.EventoDeValidacao; /** * Máscara c/ validação genérica para campos numéricos. * - * @see br.com.concretesolutions.canarinho.watcher.MascaraNumericaTextWatcher.Builder + * @see br.com.concrete.canarinho.watcher.MascaraNumericaTextWatcher.Builder */ public final class MascaraNumericaTextWatcher extends BaseCanarinhoTextWatcher { diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/TelefoneTextWatcher.java b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/TelefoneTextWatcher.java similarity index 84% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/TelefoneTextWatcher.java rename to canarinho/src/main/java/br/com/concrete/canarinho/watcher/TelefoneTextWatcher.java index f3f520e..6a420be 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/TelefoneTextWatcher.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/TelefoneTextWatcher.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.watcher; +package br.com.concrete.canarinho.watcher; import android.text.Editable; import android.text.InputFilter; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.validator.Validador; -import br.com.concretesolutions.canarinho.validator.ValidadorTelefone; -import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacao; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.validator.Validador; +import br.com.concrete.canarinho.validator.ValidadorTelefone; +import br.com.concrete.canarinho.watcher.evento.EventoDeValidacao; /** * {@link android.text.TextWatcher} responsável por formatar e validar um diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/ValorMonetarioWatcher.java b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/ValorMonetarioWatcher.java similarity index 95% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/ValorMonetarioWatcher.java rename to canarinho/src/main/java/br/com/concrete/canarinho/watcher/ValorMonetarioWatcher.java index d4a2402..d2638e9 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/ValorMonetarioWatcher.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/ValorMonetarioWatcher.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.watcher; +package br.com.concrete.canarinho.watcher; import android.text.Editable; import android.text.InputFilter; @@ -8,7 +8,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; -import br.com.concretesolutions.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.formatador.Formatador; /** * TextWatcher para valores monetários @@ -79,7 +79,7 @@ public void afterTextChanged(Editable s) { private void atualizaTexto(Editable editable, String valor) { mudancaInterna = true; - InputFilter[] oldFilters = editable.getFilters(); + final InputFilter[] oldFilters = editable.getFilters(); editable.setFilters(new InputFilter[] {}); editable.replace(0, editable.length(), valor); diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/evento/EventoDeValidacao.java b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/evento/EventoDeValidacao.java similarity index 94% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/evento/EventoDeValidacao.java rename to canarinho/src/main/java/br/com/concrete/canarinho/watcher/evento/EventoDeValidacao.java index 98c7eb2..4b91c91 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/evento/EventoDeValidacao.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/evento/EventoDeValidacao.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.watcher.evento; +package br.com.concrete.canarinho.watcher.evento; /** * Interface para quem estiver usando este TextWatcher poder ter uma ação quando um erro de validação acontecer. diff --git a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/evento/EventoDeValidacaoDeBoleto.java b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/evento/EventoDeValidacaoDeBoleto.java similarity index 89% rename from canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/evento/EventoDeValidacaoDeBoleto.java rename to canarinho/src/main/java/br/com/concrete/canarinho/watcher/evento/EventoDeValidacaoDeBoleto.java index 85b0136..98030b8 100644 --- a/canarinho/src/main/java/br/com/concretesolutions/canarinho/watcher/evento/EventoDeValidacaoDeBoleto.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/watcher/evento/EventoDeValidacaoDeBoleto.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.watcher.evento; +package br.com.concrete.canarinho.watcher.evento; /** * Evento de validação específico para boletos que permite saber qual o bloco que diff --git a/canarinho/src/main/res/values/strings.xml b/canarinho/src/main/res/values/strings.xml deleted file mode 100644 index 6d51856..0000000 --- a/canarinho/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Library - diff --git a/gradle.properties b/gradle.properties index f64e84b..bb22fff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,2 @@ org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true -android.enableAapt2=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 26f0c69..702c4b6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Thu Nov 24 13:58:48 BRST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.3.1-all.zip diff --git a/sample/build.gradle b/sample/build.gradle index 391c1f7..8855f9e 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'com.android.application' +apply plugin: 'jacoco' android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { - applicationId "br.com.concretesolutions.canarinho.sample" + applicationId "br.com.concrete.canarinho.sample" minSdkVersion 15 targetSdkVersion 26 versionCode 1 @@ -14,6 +15,11 @@ android { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { + + debug { + testCoverageEnabled true + } + release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' @@ -25,28 +31,58 @@ android { exclude 'META-INF/NOTICE.txt' exclude 'LICENSE.txt' } + + testOptions { + execution 'ANDROID_TEST_ORCHESTRATOR' + unitTests { + includeAndroidResources = true + } + } } def supportLibsVersion = '26.1.0' dependencies { - compile project(':canarinho') + implementation project(':canarinho') + + implementation "com.android.support:appcompat-v7:$supportLibsVersion" + implementation "com.android.support:cardview-v7:$supportLibsVersion" + implementation "com.android.support:design:$supportLibsVersion" - compile "com.android.support:design:$supportLibsVersion" - compile "com.android.support:cardview-v7:$supportLibsVersion" - compile "com.android.support:appcompat-v7:$supportLibsVersion" + androidTestUtil 'com.android.support.test:orchestrator:1.0.1' - androidTestCompile("com.android.support:support-annotations:$supportLibsVersion") - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') - androidTestCompile('com.android.support.test:runner:0.5') + androidTestImplementation("com.android.support:support-annotations:$supportLibsVersion") + androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1') + androidTestImplementation('com.android.support.test:runner:1.0.1') - testCompile 'junit:junit:4.12' - testCompile 'org.khronos:opengl-api:gl1.1-android-2.1_r1' - testCompile 'org.hamcrest:hamcrest-all:1.3' - testCompile 'net.vidageek:mirror:1.6.1' - testCompile('org.robolectric:robolectric:3.1.4') { - exclude group: 'commons-logging', module: 'commons-logging' - exclude group: 'org.apache.httpcomponents', module: 'httpclient' + testImplementation 'junit:junit:4.12' + testImplementation 'org.hamcrest:hamcrest-all:1.3' + testImplementation 'org.robolectric:robolectric:3.5.1' +} + +jacoco { + toolVersion = "0.7.4+" +} + +task fullCoverageReport(type: JacocoReport) { + dependsOn 'createDebugCoverageReport' + dependsOn 'testDebugUnitTest' + + reports { + xml.enabled true + html.enabled true } + + def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', + '**/*Test*.*', 'android/**/*.*'] + def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter) + def mainSrc = "${project.projectDir}/src/main/java" + + sourceDirectories = files([mainSrc]) + classDirectories = files([debugTree]) + executionData = fileTree(dir: "$buildDir", includes: [ + "jacoco/testDebugUnitTest.exec", + "outputs/code-coverage/connected/*coverage.ec" + ]) } diff --git a/sample/src/androidTest/java/br/com/concretesolutions/canarinho/sample/DemoWatchersInstrumentationTest.java b/sample/src/androidTest/java/br/com/concrete/canarinho/sample/DemoWatchersInstrumentationTest.java similarity index 83% rename from sample/src/androidTest/java/br/com/concretesolutions/canarinho/sample/DemoWatchersInstrumentationTest.java rename to sample/src/androidTest/java/br/com/concrete/canarinho/sample/DemoWatchersInstrumentationTest.java index 3701c81..3f5b191 100644 --- a/sample/src/androidTest/java/br/com/concretesolutions/canarinho/sample/DemoWatchersInstrumentationTest.java +++ b/sample/src/androidTest/java/br/com/concrete/canarinho/sample/DemoWatchersInstrumentationTest.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.sample; +package br.com.concrete.canarinho.sample; import android.os.Build; import android.support.test.espresso.UiController; @@ -14,8 +14,8 @@ import org.junit.Test; import org.junit.runner.RunWith; -import br.com.concretesolutions.canarinho.sample.ui.activity.MainActivity; -import br.com.concretesolutions.canarinho.sample.ui.model.Watchers; +import br.com.concrete.canarinho.sample.ui.activity.MainActivity; +import br.com.concrete.canarinho.sample.ui.model.Watchers; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.clearText; @@ -40,12 +40,10 @@ public class DemoWatchersInstrumentationTest { public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); @Test - public void consegueDigitarUmBoletoNormalValido() throws InterruptedException { + public void consegueDigitarUmBoletoNormalValido() { navigateToTab(Watchers.BOLETO_BANCARIO); - Thread.sleep(1000L); - onView(allOf(withId(R.id.edit_text), isDisplayed())) .perform(typeText("34199310130010011560900500990007800000000000000")); @@ -53,33 +51,29 @@ public void consegueDigitarUmBoletoNormalValido() throws InterruptedException { } @Test - public void consegueValidarUmBoletoSetandoOCodigoInteiro() throws InterruptedException { + public void consegueValidarUmBoletoSetandoOCodigoInteiro() { navigateToTab(Watchers.BOLETO_BANCARIO); onView(allOf(withId(R.id.edit_text), isDisplayed())) .perform(paste("34199310130010011560900500990007800000000000000")); - Thread.sleep(1000L); - onView(withText("Campo válido!")).check(matches(isDisplayed())); } @Test - public void consegueValidarUmBoletoTributoSetandoOCodigoInteiro() throws InterruptedException { + public void consegueValidarUmBoletoTributoSetandoOCodigoInteiro() { navigateToTab(Watchers.BOLETO_BANCARIO); onView(allOf(withId(R.id.edit_text), isDisplayed())) .perform(paste("812345678901812345678901812345678901812345678901")); - Thread.sleep(1000L); - onView(withText("Campo válido!")).check(matches(isDisplayed())); } @Test - public void consegueDigitarUmBoletoNormalComBlocosInvalidos() throws InterruptedException { + public void consegueDigitarUmBoletoNormalComBlocosInvalidos() { navigateToTab(Watchers.BOLETO_BANCARIO); @@ -100,7 +94,7 @@ public void consegueDigitarUmBoletoNormalComBlocosInvalidos() throws Interrupted } @Test - public void consegueDigitarUmBoletoTributoValido() throws InterruptedException { + public void consegueDigitarUmBoletoTributoValido() { navigateToTab(Watchers.BOLETO_BANCARIO); @@ -121,7 +115,7 @@ public void consegueDigitarUmBoletoTributoValido() throws InterruptedException { } @Test - public void consegueDigitarUmBoletoNormalComBlocosInvalidosComMensagemCustomizada() throws InterruptedException { + public void consegueDigitarUmBoletoNormalComBlocosInvalidosComMensagemCustomizada() { navigateToTab(Watchers.BOLETO_BANCARIO_MSG_CUSTOM); @@ -142,7 +136,7 @@ public void consegueDigitarUmBoletoNormalComBlocosInvalidosComMensagemCustomizad } @Test - public void consegueDigitarUmCPFValido() throws InterruptedException { + public void consegueDigitarUmCPFValido() { navigateToTab(Watchers.CPF); @@ -154,7 +148,7 @@ public void consegueDigitarUmCPFValido() throws InterruptedException { } @Test - public void consegueDigitarUmCPFInvalido() throws InterruptedException { + public void consegueDigitarUmCPFInvalido() { navigateToTab(Watchers.CPF); @@ -163,7 +157,7 @@ public void consegueDigitarUmCPFInvalido() throws InterruptedException { } @Test - public void consegueDigitarUmCNPJValido() throws InterruptedException { + public void consegueDigitarUmCNPJValido() { navigateToTab(Watchers.CNPJ); @@ -175,7 +169,7 @@ public void consegueDigitarUmCNPJValido() throws InterruptedException { } @Test - public void consegueDigitarUmCNPJInvalido() throws InterruptedException { + public void consegueDigitarUmCNPJInvalido() { navigateToTab(Watchers.CNPJ); onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(typeText("95621433000180")); @@ -183,7 +177,7 @@ public void consegueDigitarUmCNPJInvalido() throws InterruptedException { } @Test - public void consegueDigitarUmTelefoneValido() throws InterruptedException { + public void consegueDigitarUmTelefoneValido() { navigateToTab(Watchers.TELEFONE); @@ -201,33 +195,37 @@ public void consegueDigitarUmTelefoneValido() throws InterruptedException { } @Test - public void consegueDigitarUmValorMonetarioFormatado() throws Throwable { + public void consegueDigitarUmValorMonetarioFormatado() throws InterruptedException { navigateToTab(Watchers.VALOR_MONETARIO); + Thread.sleep(200L); + onView(allOf(withId(R.id.edit_text), isDisplayed())) .perform(typeText("1")) - .check(matches(withText("0,01"))) // inicia com 0,0X + .check(matches(withText("R$ 0,01"))) // inicia com 0,0X .perform(typeText("2")) - .check(matches(withText("0,12"))) // 0,XY + .check(matches(withText("R$ 0,12"))) // 0,XY .perform(typeText("3")) - .check(matches(withText("1,23"))) // X,YZ + .check(matches(withText("R$ 1,23"))) // X,YZ .perform(typeText("4")) - .check(matches(withText("12,34"))) // etc, etc, etc + .check(matches(withText("R$ 12,34"))) // etc, etc, etc .perform(typeText("5")) - .check(matches(withText("123,45"))) + .check(matches(withText("R$ 123,45"))) .perform(typeText("6")) - .check(matches(withText("1.234,56"))) + .check(matches(withText("R$ 1.234,56"))) .perform(typeText("7")) - .check(matches(withText("12.345,67"))) + .check(matches(withText("R$ 12.345,67"))) .perform(typeText("8")) - .check(matches(withText("123.456,78"))) + .check(matches(withText("R$ 123.456,78"))) .perform(typeText("9")) - .check(matches(withText("1.234.567,89"))); + .check(matches(withText("R$ 1.234.567,89"))) + .perform(clearText()) + .check(matches(withText("R$ 0,00"))); } @Test - public void consegueDigitarCPFCNPJValido() throws Throwable { + public void consegueDigitarCPFCNPJValido() { navigateToTab(Watchers.CPF_CNPJ); @@ -238,7 +236,7 @@ public void consegueDigitarCPFCNPJValido() throws Throwable { } @Test - public void consegueDigitarCPFCNPJInvalido() throws Throwable { + public void consegueDigitarCPFCNPJInvalido() { navigateToTab(Watchers.CPF_CNPJ); @@ -250,7 +248,7 @@ public void consegueDigitarCPFCNPJInvalido() throws Throwable { } @Test - public void consegueDigitarUmCEPValido() throws Throwable { + public void consegueDigitarUmCEPValido() { navigateToTab(Watchers.CEP); @@ -261,7 +259,7 @@ public void consegueDigitarUmCEPValido() throws Throwable { } @Test - public void consegueUtilizarUmaMascaraGenericaSemValidadorOuEvento() throws Throwable { + public void consegueUtilizarUmaMascaraGenericaSemValidadorOuEvento() { navigateToTab(Watchers.MASCARA_GENERICA); @@ -270,15 +268,13 @@ public void consegueUtilizarUmaMascaraGenericaSemValidadorOuEvento() throws Thro .check(matches(withText("1-2-3-4-5"))); } - private void navigateToTab(Watchers watcher) throws InterruptedException { + private void navigateToTab(Watchers watcher) { onView( allOf( withText(watcher.getTitle()), isDescendantOfA(withId(R.id.tabs))) ) .perform(scrollTo(), click()); - - Thread.sleep(500L); } private ViewAction paste(final String type) { diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 291f253..39079e6 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="br.com.concrete.canarinho.sample"> - + diff --git a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/activity/MainActivity.java b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/activity/MainActivity.java similarity index 69% rename from sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/activity/MainActivity.java rename to sample/src/main/java/br/com/concrete/canarinho/sample/ui/activity/MainActivity.java index 4af2f1b..2932e46 100644 --- a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/activity/MainActivity.java +++ b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/activity/MainActivity.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.sample.ui.activity; +package br.com.concrete.canarinho.sample.ui.activity; import android.os.Bundle; import android.support.design.widget.TabLayout; @@ -7,8 +7,8 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; -import br.com.concretesolutions.canarinho.sample.R; -import br.com.concretesolutions.canarinho.sample.ui.adapter.WatchersPagerAdapter; +import br.com.concrete.canarinho.sample.R; +import br.com.concrete.canarinho.sample.ui.adapter.WatchersPagerAdapter; /** */ public class MainActivity extends AppCompatActivity { @@ -20,7 +20,7 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); - final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); final ActionBar supportActionBar = getSupportActionBar(); @@ -29,10 +29,10 @@ public void onCreate(Bundle savedInstanceState) { supportActionBar.setDisplayShowTitleEnabled(false); } - viewPager = (ViewPager) findViewById(R.id.viewpager); + viewPager = findViewById(R.id.viewpager); viewPager.setAdapter(new WatchersPagerAdapter(this)); - final TabLayout tabs = (TabLayout) findViewById(R.id.tabs); + final TabLayout tabs = findViewById(R.id.tabs); tabs.setupWithViewPager(viewPager); } } diff --git a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/adapter/WatchersPagerAdapter.java b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/adapter/WatchersPagerAdapter.java similarity index 67% rename from sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/adapter/WatchersPagerAdapter.java rename to sample/src/main/java/br/com/concrete/canarinho/sample/ui/adapter/WatchersPagerAdapter.java index 512b3ae..1fad80b 100644 --- a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/adapter/WatchersPagerAdapter.java +++ b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/adapter/WatchersPagerAdapter.java @@ -1,12 +1,11 @@ -package br.com.concretesolutions.canarinho.sample.ui.adapter; +package br.com.concrete.canarinho.sample.ui.adapter; import android.content.Context; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; -import br.com.concretesolutions.canarinho.sample.ui.activity.MainActivity; -import br.com.concretesolutions.canarinho.sample.ui.fragment.BaseWatcherFragment; -import br.com.concretesolutions.canarinho.sample.ui.model.Watchers; +import br.com.concrete.canarinho.sample.ui.activity.MainActivity; +import br.com.concrete.canarinho.sample.ui.model.Watchers; public class WatchersPagerAdapter extends FragmentPagerAdapter { @@ -20,7 +19,7 @@ public WatchersPagerAdapter(MainActivity mainActivity) { @Override public Fragment getItem(int position) { - return models[position].buildFragment(context); + return models[position].buildFragment(); } @Override diff --git a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/fragment/BaseWatcherFragment.java b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/fragment/BaseWatcherFragment.java similarity index 62% rename from sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/fragment/BaseWatcherFragment.java rename to sample/src/main/java/br/com/concrete/canarinho/sample/ui/fragment/BaseWatcherFragment.java index 20d772c..b09a388 100644 --- a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/fragment/BaseWatcherFragment.java +++ b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/fragment/BaseWatcherFragment.java @@ -1,8 +1,8 @@ -package br.com.concretesolutions.canarinho.sample.ui.fragment; +package br.com.concrete.canarinho.sample.ui.fragment; import android.support.v4.app.Fragment; -import br.com.concretesolutions.canarinho.sample.ui.model.Watchers; +import br.com.concrete.canarinho.sample.ui.model.Watchers; public abstract class BaseWatcherFragment extends Fragment { diff --git a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/fragment/CanarinhoValorMonetarioWatcherFragment.java b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/fragment/CanarinhoValorMonetarioWatcherFragment.java similarity index 59% rename from sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/fragment/CanarinhoValorMonetarioWatcherFragment.java rename to sample/src/main/java/br/com/concrete/canarinho/sample/ui/fragment/CanarinhoValorMonetarioWatcherFragment.java index 5aedaf0..9acfd49 100644 --- a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/fragment/CanarinhoValorMonetarioWatcherFragment.java +++ b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/fragment/CanarinhoValorMonetarioWatcherFragment.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.sample.ui.fragment; +package br.com.concrete.canarinho.sample.ui.fragment; import android.os.Bundle; import android.support.annotation.Nullable; @@ -10,10 +10,9 @@ import android.widget.EditText; import android.widget.TextView; -import br.com.concretesolutions.canarinho.sample.R; -import br.com.concretesolutions.canarinho.sample.ui.model.Watchers; -import br.com.concretesolutions.canarinho.watcher.BaseCanarinhoTextWatcher; -import br.com.concretesolutions.canarinho.watcher.ValorMonetarioWatcher; +import br.com.concrete.canarinho.sample.R; +import br.com.concrete.canarinho.sample.ui.model.Watchers; +import br.com.concrete.canarinho.watcher.ValorMonetarioWatcher; public class CanarinhoValorMonetarioWatcherFragment extends BaseWatcherFragment { @@ -27,9 +26,9 @@ public class CanarinhoValorMonetarioWatcherFragment extends BaseWatcherFragment public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View layout = inflater.inflate(R.layout.fragment_valor_monetario_watcher, null); - watcherTitle = (TextView) layout.findViewById(R.id.watcher_title); - watcherInputLayout = (TextInputLayout) layout.findViewById(R.id.edit_input_layout); - watcherEdit = (EditText) layout.findViewById(R.id.edit_text); + watcherTitle = layout.findViewById(R.id.watcher_title); + watcherInputLayout = layout.findViewById(R.id.edit_input_layout); + watcherEdit = layout.findViewById(R.id.edit_text); setModel(Watchers.VALOR_MONETARIO); bind(model); return layout; @@ -45,17 +44,11 @@ public CanarinhoValorMonetarioWatcherFragment bind(Watchers model) { } currentWatcher = new ValorMonetarioWatcher.Builder() - .comSimboloReal() .comMantemZerosAoLimpar() + .comSimboloReal() .build(); watcherEdit.addTextChangedListener(currentWatcher); - if (currentWatcher instanceof BaseCanarinhoTextWatcher) { - final BaseCanarinhoTextWatcher canarinhoWatcher = (BaseCanarinhoTextWatcher) currentWatcher; - final Watchers.SampleEventoDeValidacao eventoDeValidacao = (Watchers.SampleEventoDeValidacao) canarinhoWatcher.getEventoDeValidacao(); - eventoDeValidacao.setTextInputLayout(watcherInputLayout); - } - return this; } } diff --git a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/fragment/WatcherFragment.java b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/fragment/WatcherFragment.java similarity index 52% rename from sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/fragment/WatcherFragment.java rename to sample/src/main/java/br/com/concrete/canarinho/sample/ui/fragment/WatcherFragment.java index a8691d2..268cc33 100644 --- a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/fragment/WatcherFragment.java +++ b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/fragment/WatcherFragment.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.sample.ui.fragment; +package br.com.concrete.canarinho.sample.ui.fragment; import android.os.Bundle; import android.support.annotation.Nullable; @@ -10,9 +10,8 @@ import android.widget.EditText; import android.widget.TextView; -import br.com.concretesolutions.canarinho.sample.R; -import br.com.concretesolutions.canarinho.sample.ui.model.Watchers; -import br.com.concretesolutions.canarinho.watcher.BaseCanarinhoTextWatcher; +import br.com.concrete.canarinho.sample.R; +import br.com.concrete.canarinho.sample.ui.model.Watchers; public class WatcherFragment extends BaseWatcherFragment { @@ -21,10 +20,9 @@ public class WatcherFragment extends BaseWatcherFragment { private TextInputLayout watcherInputLayout; private TextWatcher currentWatcher; - public static WatcherFragment newInstance(Watchers model, TextWatcher watcher) { + public static WatcherFragment newInstance(Watchers model) { final WatcherFragment watcherFragment = new WatcherFragment(); watcherFragment.setArguments(new Bundle()); - watcherFragment.setWatcher(watcher); watcherFragment.setModel(model); return watcherFragment; } @@ -34,36 +32,23 @@ public static WatcherFragment newInstance(Watchers model, TextWatcher watcher) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View layout = inflater.inflate(R.layout.fragment_canarinho_watcher, null); - watcherTitle = (TextView) layout.findViewById(R.id.watcher_title); - watcherInputLayout = (TextInputLayout) layout.findViewById(R.id.edit_input_layout); - watcherEdit = (EditText) layout.findViewById(R.id.edit_text); + watcherTitle = layout.findViewById(R.id.watcher_title); + watcherInputLayout = layout.findViewById(R.id.edit_input_layout); + watcherEdit = layout.findViewById(R.id.edit_text); bind(model); return layout; } public WatcherFragment bind(Watchers model) { - watcherTitle.setText(model.getTitle()); - watcherEdit.setHint(model.getHint()); - if (currentWatcher != null) { watcherEdit.removeTextChangedListener(currentWatcher); } + currentWatcher = model.setupWatcher(watcherInputLayout); + watcherTitle.setText(model.getTitle()); + watcherEdit.setHint(model.getHint()); watcherEdit.addTextChangedListener(currentWatcher); - - if (currentWatcher instanceof BaseCanarinhoTextWatcher) { - final BaseCanarinhoTextWatcher canarinhoWatcher = (BaseCanarinhoTextWatcher) currentWatcher; - if (canarinhoWatcher.getEventoDeValidacao() != null) { - final Watchers.SampleEventoDeValidacao eventoDeValidacao = (Watchers.SampleEventoDeValidacao) canarinhoWatcher.getEventoDeValidacao(); - eventoDeValidacao.setTextInputLayout(watcherInputLayout); - } - } - return this; } - - public void setWatcher(TextWatcher currentWatcher) { - this.currentWatcher = currentWatcher; - } } diff --git a/sample/src/main/java/br/com/concrete/canarinho/sample/ui/model/Watchers.java b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/model/Watchers.java new file mode 100644 index 0000000..2729d79 --- /dev/null +++ b/sample/src/main/java/br/com/concrete/canarinho/sample/ui/model/Watchers.java @@ -0,0 +1,221 @@ +package br.com.concrete.canarinho.sample.ui.model; + +import android.support.design.widget.TextInputLayout; +import android.support.v7.app.AlertDialog; +import android.text.TextWatcher; + +import br.com.concrete.canarinho.sample.ui.fragment.BaseWatcherFragment; +import br.com.concrete.canarinho.sample.ui.fragment.CanarinhoValorMonetarioWatcherFragment; +import br.com.concrete.canarinho.sample.ui.fragment.WatcherFragment; +import br.com.concrete.canarinho.validator.Validador; +import br.com.concrete.canarinho.watcher.BoletoBancarioTextWatcher; +import br.com.concrete.canarinho.watcher.CEPTextWatcher; +import br.com.concrete.canarinho.watcher.CPFCNPJTextWatcher; +import br.com.concrete.canarinho.watcher.MascaraNumericaTextWatcher; +import br.com.concrete.canarinho.watcher.TelefoneTextWatcher; +import br.com.concrete.canarinho.watcher.evento.EventoDeValidacao; +import br.com.concrete.canarinho.watcher.evento.EventoDeValidacaoDeBoleto; + +/** + */ +public enum Watchers { + + BOLETO_BANCARIO("Boleto Bancário", "Digite um boleto válido") { + @Override + public WatcherFragment buildFragment() { + return WatcherFragment.newInstance(this); + } + + @Override + public TextWatcher setupWatcher(TextInputLayout textInputLayout) { + return new BoletoBancarioTextWatcher(new SampleEventoDeValidacao(textInputLayout)); + } + }, + BOLETO_BANCARIO_MSG_CUSTOM("Boleto Bancário com mensagem", "Digite um boleto válido") { + @Override + public WatcherFragment buildFragment() { + return WatcherFragment.newInstance(this); + } + + @Override + public TextWatcher setupWatcher(TextInputLayout textInputLayout) { + return new BoletoBancarioTextWatcher(new EventoDeValidacaoBoleto(textInputLayout)); + } + }, + + CPF("CPF", "Digite um CPF válido") { + @Override + public WatcherFragment buildFragment() { + return WatcherFragment.newInstance(this); + } + + @Override + public TextWatcher setupWatcher(TextInputLayout textInputLayout) { + return new MascaraNumericaTextWatcher.Builder() + .paraMascara("###.###.###-##") + .comCallbackDeValidacao(new SampleEventoDeValidacao(textInputLayout)) + .comValidador(Validador.CPF) + .build(); + } + }, + + CNPJ("CNPJ", "Digite um CNPJ válido") { + @Override + public WatcherFragment buildFragment() { + return WatcherFragment.newInstance(this); + } + + @Override + public TextWatcher setupWatcher(TextInputLayout textInputLayout) { + return new MascaraNumericaTextWatcher.Builder() + .paraMascara("##.###.###/####-##") + .comCallbackDeValidacao(new SampleEventoDeValidacao(textInputLayout)) + .comValidador(Validador.CNPJ) + .build(); + } + }, + + TELEFONE("Telefone", "Digite um telefone válido") { + @Override + public WatcherFragment buildFragment() { + return WatcherFragment.newInstance(this); + } + + @Override + public TextWatcher setupWatcher(TextInputLayout textInputLayout) { + return new TelefoneTextWatcher(new SampleEventoDeValidacao(textInputLayout)); + } + }, + + CPF_CNPJ("CPF e CNPJ", "Digite um CPF ou CNPJ válido") { + @Override + public WatcherFragment buildFragment() { + return WatcherFragment.newInstance(this); + } + + @Override + public TextWatcher setupWatcher(TextInputLayout textInputLayout) { + return new CPFCNPJTextWatcher(new SampleEventoDeValidacao(textInputLayout)); + } + }, + + CEP("CEP", "Digite um CEP válido") { + @Override + public WatcherFragment buildFragment() { + return WatcherFragment.newInstance(this); + } + + @Override + public TextWatcher setupWatcher(TextInputLayout textInputLayout) { + return new CEPTextWatcher(new SampleEventoDeValidacao(textInputLayout)); + } + }, + + MASCARA_GENERICA("Máscara genérica", "5 números") { + @Override + public WatcherFragment buildFragment() { + return WatcherFragment.newInstance(this); + } + + @Override + public TextWatcher setupWatcher(TextInputLayout textInputLayout) { + return new MascaraNumericaTextWatcher("#-#-#-#-#"); + } + }, + + VALOR_MONETARIO("Valor monetário", "Digite um valor monetário") { + @Override + public CanarinhoValorMonetarioWatcherFragment buildFragment() { + return new CanarinhoValorMonetarioWatcherFragment(); + } + + @Override + public TextWatcher setupWatcher(TextInputLayout textInputLayout) { + return null; + } + }; + + private final String title; + private final String hint; + + Watchers(String title, String hint) { + this.hint = hint; + this.title = title; + } + + public String getTitle() { + return title; + } + + public String getHint() { + return hint; + } + + public abstract BaseWatcherFragment buildFragment(); + + public abstract TextWatcher setupWatcher(TextInputLayout textInputLayout); + + /** + * {@link EventoDeValidacao} que mostra uma mensagem de erro no {@link TextInputLayout} passado + * como argumento. + */ + public static class SampleEventoDeValidacao implements EventoDeValidacao { + + TextInputLayout textInputLayout; + + public SampleEventoDeValidacao(TextInputLayout textInputLayout) { + this.textInputLayout = textInputLayout; + } + + @Override + public void invalido(String valorAtual, String mensagem) { + textInputLayout.setError(mensagem); + } + + @Override + public void parcialmenteValido(String valorAtual) { + textInputLayout.setErrorEnabled(false); + textInputLayout.setError(null); + } + + @Override + public void totalmenteValido(String valorAtual) { + new AlertDialog.Builder(textInputLayout.getContext()) + .setTitle("Campo válido!") + .setMessage(valorAtual) + .show(); + } + } + + /** + * {@link EventoDeValidacao} que valida blocos de boleto. + * + * @see SampleEventoDeValidacao + */ + public static class EventoDeValidacaoBoleto + extends SampleEventoDeValidacao + implements EventoDeValidacaoDeBoleto { + + EventoDeValidacaoBoleto(TextInputLayout textInputLayout) { + super(textInputLayout); + } + + @Override + public void invalido(String valorAtual, int blocoInvalido) { + + if (blocoInvalido == 1) + textInputLayout.setError("Primeira mensagem"); + + else if (blocoInvalido == 2) + textInputLayout.setError("Segunda mensagem"); + + else if (blocoInvalido == 3) + textInputLayout.setError("Terceira mensagem"); + + else if (blocoInvalido == 4) + textInputLayout.setError("Quarta mensagem"); + + } + } + +} diff --git a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/model/Watchers.java b/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/model/Watchers.java deleted file mode 100644 index 4f89872..0000000 --- a/sample/src/main/java/br/com/concretesolutions/canarinho/sample/ui/model/Watchers.java +++ /dev/null @@ -1,170 +0,0 @@ -package br.com.concretesolutions.canarinho.sample.ui.model; - -import android.content.Context; -import android.support.design.widget.TextInputLayout; -import android.support.v4.app.FragmentActivity; -import android.support.v7.app.AlertDialog; -import android.text.TextWatcher; - -import br.com.concretesolutions.canarinho.sample.ui.fragment.BaseWatcherFragment; -import br.com.concretesolutions.canarinho.sample.ui.fragment.CanarinhoValorMonetarioWatcherFragment; -import br.com.concretesolutions.canarinho.sample.ui.fragment.WatcherFragment; -import br.com.concretesolutions.canarinho.validator.Validador; -import br.com.concretesolutions.canarinho.watcher.BoletoBancarioTextWatcher; -import br.com.concretesolutions.canarinho.watcher.CEPTextWatcher; -import br.com.concretesolutions.canarinho.watcher.CPFCNPJTextWatcher; -import br.com.concretesolutions.canarinho.watcher.MascaraNumericaTextWatcher; -import br.com.concretesolutions.canarinho.watcher.TelefoneTextWatcher; -import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacao; -import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacaoDeBoleto; - -/** - */ -public enum Watchers { - - BOLETO_BANCARIO("Boleto Bancário", "Digite um boleto válido") { - @Override - public WatcherFragment buildFragment(Context context) { - return WatcherFragment.newInstance(this, new BoletoBancarioTextWatcher(new SampleEventoDeValidacao(context))); - } - }, - BOLETO_BANCARIO_MSG_CUSTOM("Boleto Bancário com mensagem", "Digite um boleto válido") { - @Override - public WatcherFragment buildFragment(Context context) { - return WatcherFragment.newInstance(this, new BoletoBancarioTextWatcher(new EventoDeValidacaoBoleto(context))); - } - }, - - CPF("CPF", "Digite um CPF válido") { - @Override - public WatcherFragment buildFragment(Context context) { - return WatcherFragment.newInstance(this, new MascaraNumericaTextWatcher.Builder() - .paraMascara("###.###.###-##") - .comCallbackDeValidacao(new SampleEventoDeValidacao(context)) - .comValidador(Validador.CPF) - .build()); - } - }, - - CNPJ("CNPJ", "Digite um CNPJ válido") { - @Override - public WatcherFragment buildFragment(Context context) { - return WatcherFragment.newInstance(this, new MascaraNumericaTextWatcher.Builder() - .paraMascara("##.###.###/####-##") - .comCallbackDeValidacao(new SampleEventoDeValidacao(context)) - .comValidador(Validador.CNPJ) - .build()); - } - }, - - TELEFONE("Telefone", "Digite um telefone válido") { - @Override - public WatcherFragment buildFragment(Context context) { - return WatcherFragment.newInstance(this, new TelefoneTextWatcher(new SampleEventoDeValidacao(context))); - } - }, - - CPF_CNPJ("CPF e CNPJ", "Digite um CPF ou CNPJ válido") { - @Override - public WatcherFragment buildFragment(Context context) { - return WatcherFragment.newInstance(this, new CPFCNPJTextWatcher(new SampleEventoDeValidacao(context))); - } - }, - - CEP("CEP", "Digite um CEP válido") { - @Override - public WatcherFragment buildFragment(Context context) { - return WatcherFragment.newInstance(this, new CEPTextWatcher(new SampleEventoDeValidacao(context))); - } - }, - - MASCARA_GENERICA("Máscara genérica", "5 números") { - @Override - public WatcherFragment buildFragment(Context context) { - return WatcherFragment.newInstance(this, new MascaraNumericaTextWatcher("#-#-#-#-#")); - } - }, - - VALOR_MONETARIO("Valor monetário", "Digite um valor monetário") { - @Override - public CanarinhoValorMonetarioWatcherFragment buildFragment(Context context) { - return new CanarinhoValorMonetarioWatcherFragment(); - } - }; - - private final String title; - private final String hint; - - Watchers(String title, String hint) { - this.hint = hint; - this.title = title; - } - - public String getTitle() { - return title; - } - - public String getHint() { - return hint; - } - - public abstract BaseWatcherFragment buildFragment(Context context); - - public static class SampleEventoDeValidacao implements EventoDeValidacao { - - protected TextInputLayout textInputLayout; - private Context context; - - public SampleEventoDeValidacao(Context context) { - this.context = context; - } - - @Override - public void invalido(String valorAtual, String mensagem) { - textInputLayout.setError(mensagem); - } - - @Override - public void parcialmenteValido(String valorAtual) { - textInputLayout.setErrorEnabled(false); - textInputLayout.setError(null); - } - - @Override - public void totalmenteValido(String valorAtual) { - new AlertDialog.Builder(context) - .setTitle("Campo válido!") - .setMessage(valorAtual) - .show(); - } - - public void setTextInputLayout(TextInputLayout textInputLayout) { - this.textInputLayout = textInputLayout; - } - } - - public static class EventoDeValidacaoBoleto extends SampleEventoDeValidacao implements EventoDeValidacaoDeBoleto { - - public EventoDeValidacaoBoleto(Context context) { - super(context); - } - - @Override - public void invalido(String valorAtual, int blocoInvalido) { - - if (blocoInvalido == 1) - textInputLayout.setError("Primeira mensagem"); - - else if (blocoInvalido == 2) - textInputLayout.setError("Segunda mensagem"); - - else if (blocoInvalido == 3) - textInputLayout.setError("Terceira mensagem"); - - else if (blocoInvalido == 4) - textInputLayout.setError("Quarta mensagem"); - - } - } - -} diff --git a/sample/src/main/res/drawable-hdpi/ic_launcher.png b/sample/src/main/res/drawable-hdpi/ic_launcher.png deleted file mode 100644 index 5fec548347a9ec196d8a1e09607dccaebd290d78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4872 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 diff --git a/sample/src/main/res/drawable-mdpi/ic_launcher.png b/sample/src/main/res/drawable-mdpi/ic_launcher.png deleted file mode 100644 index 7884bb889a61198320df3d264c6a086567956b68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2983 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 diff --git a/sample/src/main/res/drawable-xhdpi/ic_launcher.png b/sample/src/main/res/drawable-xhdpi/ic_launcher.png deleted file mode 100644 index 684fc52e4c055d868cd6021490dbe3721369d70c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6922 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 diff --git a/sample/src/main/res/drawable-xxhdpi/ic_launcher.png b/sample/src/main/res/drawable-xxhdpi/ic_launcher.png deleted file mode 100644 index fe43e6986220b591524cc485153ecc04fefda68e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11178 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 a@B|?$Mcw~NeFpB}f)r&{pq0{QU;htUS$q=! diff --git a/sample/src/main/res/drawable-xxxhdpi/ic_launcher.png b/sample/src/main/res/drawable-xxxhdpi/ic_launcher.png deleted file mode 100644 index 76d2c5ca873c7795fd3bf38d17c3c6ca935a8745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16487 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 SU + android:layout_height="match_parent"> + android:contentDescription="@string/app_name" + android:src="@mipmap/ic_launcher" /> diff --git a/sample/src/main/res/values/colors.xml b/sample/src/main/res/values/colors.xml index 384d363..55344e5 100644 --- a/sample/src/main/res/values/colors.xml +++ b/sample/src/main/res/values/colors.xml @@ -1,4 +1,3 @@ - #000000 \ No newline at end of file diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index 444726c..7837445 100644 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -1,5 +1,3 @@ Android Canarinho - Abrir menu - Fechar menu diff --git a/sample/src/main/res/values/styles.xml b/sample/src/main/res/values/styles.xml index 3a2c23d..e2e632d 100644 --- a/sample/src/main/res/values/styles.xml +++ b/sample/src/main/res/values/styles.xml @@ -1,9 +1,8 @@ - - diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorBOLETO.java b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorBOLETO.java similarity index 94% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorBOLETO.java rename to sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorBOLETO.java index d18ad67..4e5d9f7 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorBOLETO.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorBOLETO.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.test; +package br.com.concrete.canarinho.test; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.sample.BuildConfig; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.sample.BuildConfig; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCEP.java b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCEP.java similarity index 94% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCEP.java rename to sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCEP.java index 220c75e..e8f53cb 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCEP.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCEP.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.test; +package br.com.concrete.canarinho.test; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.sample.BuildConfig; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.sample.BuildConfig; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCNPJ.java b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCNPJ.java similarity index 95% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCNPJ.java rename to sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCNPJ.java index 8065efe..b8226f0 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCNPJ.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCNPJ.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.test; +package br.com.concrete.canarinho.test; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.sample.BuildConfig; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.sample.BuildConfig; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCPF.java b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCPF.java similarity index 96% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCPF.java rename to sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCPF.java index 1a84415..d26c836 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCPF.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCPF.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.test; +package br.com.concrete.canarinho.test; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.sample.BuildConfig; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.sample.BuildConfig; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCPFCNPJ.java b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCPFCNPJ.java similarity index 97% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCPFCNPJ.java rename to sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCPFCNPJ.java index fb00ab2..a2ee110 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorCPFCNPJ.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorCPFCNPJ.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.test; +package br.com.concrete.canarinho.test; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.sample.BuildConfig; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.sample.BuildConfig; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorLinhaDigitavel.java b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorLinhaDigitavel.java similarity index 90% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorLinhaDigitavel.java rename to sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorLinhaDigitavel.java index 4e78e3a..22a61ca 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorLinhaDigitavel.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorLinhaDigitavel.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.test; +package br.com.concrete.canarinho.test; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.sample.BuildConfig; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.sample.BuildConfig; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorTelefone.java b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorTelefone.java similarity index 93% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorTelefone.java rename to sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorTelefone.java index 82099dd..55d14f5 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorTelefone.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorTelefone.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.test; +package br.com.concrete.canarinho.test; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.sample.BuildConfig; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.sample.BuildConfig; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorValor.java b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorValor.java similarity index 92% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorValor.java rename to sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorValor.java index 43f4b3e..fba71a5 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteFormatadorValor.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/TesteFormatadorValor.java @@ -1,13 +1,13 @@ -package br.com.concretesolutions.canarinho.test; +package br.com.concrete.canarinho.test; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import br.com.concretesolutions.canarinho.formatador.Formatador; -import br.com.concretesolutions.canarinho.formatador.FormatadorValor; -import br.com.concretesolutions.canarinho.sample.BuildConfig; +import br.com.concrete.canarinho.formatador.Formatador; +import br.com.concrete.canarinho.formatador.FormatadorValor; +import br.com.concrete.canarinho.sample.BuildConfig; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteValidadores.java b/sample/src/test/java/br/com/concrete/canarinho/test/TesteValidadores.java similarity index 96% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteValidadores.java rename to sample/src/test/java/br/com/concrete/canarinho/test/TesteValidadores.java index 5f1794d..2ff0882 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/TesteValidadores.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/TesteValidadores.java @@ -1,12 +1,12 @@ -package br.com.concretesolutions.canarinho.test; +package br.com.concrete.canarinho.test; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import br.com.concretesolutions.canarinho.sample.BuildConfig; -import br.com.concretesolutions.canarinho.validator.Validador; +import br.com.concrete.canarinho.sample.BuildConfig; +import br.com.concrete.canarinho.validator.Validador; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/watcher/BoletoTextWatcherTest.java b/sample/src/test/java/br/com/concrete/canarinho/test/watcher/BoletoTextWatcherTest.java similarity index 74% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/watcher/BoletoTextWatcherTest.java rename to sample/src/test/java/br/com/concrete/canarinho/test/watcher/BoletoTextWatcherTest.java index d394b22..d6f1973 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/watcher/BoletoTextWatcherTest.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/watcher/BoletoTextWatcherTest.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.test.watcher; +package br.com.concrete.canarinho.test.watcher; import android.app.Activity; import android.support.design.widget.TextInputLayout; @@ -8,39 +8,38 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; -import org.robolectric.util.ActivityController; +import org.robolectric.android.controller.ActivityController; -import br.com.concretesolutions.canarinho.sample.BuildConfig; -import br.com.concretesolutions.canarinho.sample.ui.model.Watchers; -import br.com.concretesolutions.canarinho.watcher.BoletoBancarioTextWatcher; +import br.com.concrete.canarinho.sample.ui.activity.MainActivity; +import br.com.concrete.canarinho.sample.ui.model.Watchers; +import br.com.concrete.canarinho.watcher.BoletoBancarioTextWatcher; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.robolectric.Robolectric.buildActivity; @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 22) public class BoletoTextWatcherTest { private BoletoBancarioTextWatcher watcher; - private TextInputLayout textInputLayout; private EditText editText; @Before public void setUp() { - final ActivityController activityController = buildActivity(Activity.class); - final Activity activity = activityController.create().get(); - final Watchers.SampleEventoDeValidacao sampleEventoDeValidacao = - new Watchers.SampleEventoDeValidacao(RuntimeEnvironment.application); + final ActivityController activityController = buildActivity(MainActivity.class); + final Activity activity = activityController.create().get(); - activity.setContentView(textInputLayout = new TextInputLayout(activity)); + final TextInputLayout textInputLayout = new TextInputLayout(activity); textInputLayout.addView(editText = new EditText(activity)); activityController.start().resume().visible(); - sampleEventoDeValidacao.setTextInputLayout(textInputLayout); + + final Watchers.SampleEventoDeValidacao sampleEventoDeValidacao = + new Watchers.SampleEventoDeValidacao(textInputLayout); + editText.addTextChangedListener(watcher = new BoletoBancarioTextWatcher(sampleEventoDeValidacao)); + + activity.setContentView(textInputLayout); } @Test diff --git a/sample/src/test/java/br/com/concretesolutions/canarinho/test/watcher/ValorMonetarioWatcherTest.java b/sample/src/test/java/br/com/concrete/canarinho/test/watcher/ValorMonetarioWatcherTest.java similarity index 90% rename from sample/src/test/java/br/com/concretesolutions/canarinho/test/watcher/ValorMonetarioWatcherTest.java rename to sample/src/test/java/br/com/concrete/canarinho/test/watcher/ValorMonetarioWatcherTest.java index b2199f7..bb7ff7f 100644 --- a/sample/src/test/java/br/com/concretesolutions/canarinho/test/watcher/ValorMonetarioWatcherTest.java +++ b/sample/src/test/java/br/com/concrete/canarinho/test/watcher/ValorMonetarioWatcherTest.java @@ -1,4 +1,4 @@ -package br.com.concretesolutions.canarinho.test.watcher; +package br.com.concrete.canarinho.test.watcher; import android.app.Activity; import android.support.design.widget.TextInputLayout; @@ -8,18 +8,17 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; +import org.robolectric.android.controller.ActivityController; import org.robolectric.annotation.Config; -import org.robolectric.util.ActivityController; -import br.com.concretesolutions.canarinho.sample.BuildConfig; -import br.com.concretesolutions.canarinho.watcher.ValorMonetarioWatcher; +import br.com.concrete.canarinho.sample.BuildConfig; +import br.com.concrete.canarinho.watcher.ValorMonetarioWatcher; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.robolectric.Robolectric.buildActivity; @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 22) public class ValorMonetarioWatcherTest { private EditText editText; diff --git a/tools/linters/checkstyle/checkstyle.xml b/tools/linters/checkstyle/checkstyle.xml index 5c969eb..627d806 100644 --- a/tools/linters/checkstyle/checkstyle.xml +++ b/tools/linters/checkstyle/checkstyle.xml @@ -170,12 +170,12 @@ value="GenericWhitespace ''{0}'' is not preceded with whitespace." /> - + - + - + @@ -189,6 +189,11 @@ + + + + @@ -223,7 +228,7 @@ - + diff --git a/tools/linters/checkstyle/suppressions.xml b/tools/linters/checkstyle/suppressions.xml index 6c2342c..8b2c7e1 100644 --- a/tools/linters/checkstyle/suppressions.xml +++ b/tools/linters/checkstyle/suppressions.xml @@ -7,6 +7,6 @@ - + \ No newline at end of file diff --git a/tools/linters/findbugs/findbugs-filter.xml b/tools/linters/findbugs/findbugs-filter.xml index 7dbfcf2..fdbc18a 100644 --- a/tools/linters/findbugs/findbugs-filter.xml +++ b/tools/linters/findbugs/findbugs-filter.xml @@ -9,7 +9,7 @@ - + diff --git a/tools/linters/linters.gradle b/tools/linters/linters.gradle index 12800f5..4aa211d 100644 --- a/tools/linters/linters.gradle +++ b/tools/linters/linters.gradle @@ -4,48 +4,66 @@ apply plugin: 'pmd' check.dependsOn 'checkstyle', 'findbugs', 'pmd' -checkstyle.toolVersion = "8.2" - -task checkstyle(type: Checkstyle) { +checkstyle { + toolVersion '8.2' configFile file("$rootDir/tools/linters/checkstyle/checkstyle.xml") - configProperties.checkstyleSuppressionsPath = - file("$rootDir/tools/linters/checkstyle/suppressions.xml").absolutePath + configProperties.checkstyleSuppressionsPath = file( + "$rootDir/tools/linters/checkstyle/suppressions.xml" + ).absolutePath +} + +findbugs { + toolVersion = '3.0.1' + ignoreFailures = false + effort = 'max' + reportLevel = 'high' + excludeFilter = file("$rootDir/tools/linters/findbugs/findbugs-filter.xml") +} + +pmd { + toolVersion = '5.5.2' + ignoreFailures = false + ruleSetFiles = files("$rootDir/tools/linters/pmd/pmd-ruleset.xml") + ruleSets = [] +} + +task checkstyle(type: Checkstyle, group: 'verification') { source 'src' include '**/*.java' exclude '**/gen/**' + exclude '**/test/**' + exclude '**/androidTest/**' + exclude '**/R.java' + exclude '**/BuildConfig.java' classpath = files() } -task findbugs(type: FindBugs) { - ignoreFailures = false - effort = "max" - reportLevel = "high" - excludeFilter = new File("$rootDir/tools/linters/findbugs/findbugs-filter.xml") - classes = files("$buildDir/intermediates/classes") - +task findbugs(type: FindBugs, dependsOn: 'assemble', group: 'verification') { + classes = files("$projectDir/build/intermediates/classes") source 'src' include '**/*.java' exclude '**/gen/**' reports { + // FindBugs tasks can only have one report enabled xml.enabled = false - html.enabled = true + html.enabled = !xml.enabled + xml.destination file("$projectDir/build/reports/findbugs/findbugs.xml") + html.destination file("$projectDir/build/reports/findbugs/findbugs.html") } classpath = files() } -task pmd(type: Pmd) { - ignoreFailures = false - ruleSetFiles = files("$rootDir/tools/linters/pmd/pmd-ruleset.xml") - ruleSets = [] - +task pmd(type: Pmd, group: 'verification') { source 'src' include '**/*.java' - exclude '**/gen/**' + exclude('**/gen/**', '**/debug/**') reports { xml.enabled = true html.enabled = true + xml.destination file("$projectDir/build/reports/pmd/pmd.xml") + html.destination file("$projectDir/build/reports/pmd/pmd.html") } } \ No newline at end of file From 01ce547045073be7162a92496ecad200496a3d96 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Nascimento Date: Wed, 29 Nov 2017 17:39:17 -0200 Subject: [PATCH 2/2] Atualiza Javadoc de FormatadorBase --- .../com/concrete/canarinho/formatador/FormatadorBase.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorBase.java b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorBase.java index db95b28..6eb9056 100644 --- a/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorBase.java +++ b/canarinho/src/main/java/br/com/concrete/canarinho/formatador/FormatadorBase.java @@ -20,10 +20,10 @@ final class FormatadorBase implements Formatador { /** * Constrói um formatador que recebe a configuração de formatação e substituição. * - * @param formatted descrever conteúdo - * @param formattedReplacement descrever conteúdo - * @param unformatted descrever conteúdo - * @param unformattedReplacement descrever conteúdo + * @param formatted Pattern de regex para formatar o conteúdo + * @param formattedReplacement String com as posições de substituição dos grupos encontrados por regex + * @param unformatted Pattern de regex para DESformatar o conteúdo + * @param unformattedReplacement String com as posições de substituição dos grupos encontrados por regex */ FormatadorBase( Pattern formatted,