{"id":21541677,"url":"https://github.com/concretesolutions/canarinho","last_synced_at":"2025-08-20T22:31:57.472Z","repository":{"id":34221817,"uuid":"38085439","full_name":"concretesolutions/canarinho","owner":"concretesolutions","description":"Utilitários Android para padrões Brasileiros","archived":false,"fork":false,"pushed_at":"2022-04-11T20:37:11.000Z","size":427,"stargazers_count":178,"open_issues_count":9,"forks_count":41,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-04-07T22:22:18.709Z","etag":null,"topics":["android","brazilian-standards","validation"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/concretesolutions.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-06-26T02:09:21.000Z","updated_at":"2024-08-26T17:57:00.000Z","dependencies_parsed_at":"2022-09-04T12:20:11.724Z","dependency_job_id":null,"html_url":"https://github.com/concretesolutions/canarinho","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/concretesolutions/canarinho","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concretesolutions%2Fcanarinho","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concretesolutions%2Fcanarinho/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concretesolutions%2Fcanarinho/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concretesolutions%2Fcanarinho/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/concretesolutions","download_url":"https://codeload.github.com/concretesolutions/canarinho/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concretesolutions%2Fcanarinho/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271397957,"owners_count":24752640,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-20T02:00:09.606Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","brazilian-standards","validation"],"created_at":"2024-11-24T05:07:15.286Z","updated_at":"2025-08-20T22:31:57.103Z","avatar_url":"https://github.com/concretesolutions.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Android Canarinho\n\n![Build](https://github.com/concretesolutions/canarinho/actions/workflows/android_master.yml/badge.svg)\n\nEsta biblioteca é um conjunto de utilitários para trabalhar com padrões brasileiros no Android.\nInspirado em: https://github.com/caelum/caelum-stella.\n\nO foco aqui é o Android. Portanto, não é compatível com aplicações Java puras.\n\nEntre os padrões implementados temos:\n\n- Formatador e validador de CPF\n- Formatador e validador de CNPJ\n- Formatador e validador de boleto bancário (e linha digitável)\n- Formatador e validador de CEP\n- Formatador de telefone\n- [Formatador de valores financeiros](#formatador-de-valor-financeiro-no-padrão-real) (vírgula para milhares e ponto para decimais com duas casas)\n\nEstes são utilizados para implementar `TextWatcher`s que formatam e validam a digitação do usuário.\n\n## Exemplo de uso:\n\n### Validar um CPF\n\n```java\nif (Validador.CPF.ehValido(cpf))\n    Toast.makeText(context, \"Válido!\", Toast.LENGTH_SHORT).show();\nelse\n    Toast.makeText(context, \"Inválido!\", Toast.LENGTH_SHORT).show();\n```\n\n### Formatar um CPF\n\n```java\nString cpfFormatado = Formatador.CPF.formata(usuario.getCpf());\n```\n\n### Formatar um EditText para CPF sem validação\n\n```java\ncpfEditText.addTextChangedListener(new MascaraNumericaTextWatcher(\"###.###.###-##\"));\n```\n\n### Formatar um EditText para CPF com validação\n\n```java\ncpfEditText.addTextChangedListener(new MascaraNumericaTextWatcher.Builder()\n                                        .paraMascara(\"###.###.###-##\")\n                                        .comCallbackDeValidacao(new SampleEventoDeValidacao(context))\n                                        .comValidador(Validador.CPF)\n                                        .build());\n```\n\n## Formatador de valor financeiro no padrão Real\n\nPara deixar um usuário digitar valores monetários no padrão Real, basta adicionar um `ValorMonetarioWatcher` e alguns atributos ao `EditText`\n\n```java\n// Padrão sem símbolo de Real\neditText.addTextChangedListener(new ValorMonetarioWatcher());\neditText.append(\"1234567890\");\nassertThat(editText.getText().toString(), is(\"12.345.678,90\"));\n\n// Customizado com símbolo e mantendo zeros ao apagar em lote\neditText.addTextChangedListener(new ValorMonetarioWatcher.Builder()\n        .comSimboloReal()\n        .comMantemZerosAoLimpar()\n        .build());\neditText.append(\"1234567890\");\nassertThat(editText.getText().toString(), is(\"R$ 12.345.678,90\"));\n\neditText.getText().clear();\nassertThat(editText.getText().toString(), is(\"R$ 0,00\"));\n```\n\nExemplo de declaração no layout:\n\n```xml\n\u003c!--\n     O inputType abre o teclado númerico e permite caracteres de \n    formatação. O text inicia com o valor zerado, porém não é \n    obrigatório.\n--\u003e\n\u003candroid.support.design.widget.TextInputEditText\n    android:id=\"@+id/amount\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:hint=\"@string/hint_value\"\n    android:inputType=\"number\"\n    android:maxLength=\"13\"\n    android:text=\"0,00\" /\u003e\n```\n\n## Callback de validação\n\nOs `TextWatcher`s possuem a possibilidade de avisar o usuário conforme ele está digitando sobre algum erro de campo.\nPara isso, usamos um `EventoDeValidacao` que possui os seguintes callbacks:\n\n- `void invalido(String valorAtual, String mensagem)`: chamado quando o valor está inválido\n- `void parcialmenteValido(String valorAtual)`: chamado quando o valor ainda não está completo e também não está inválido\n- `void totalmenteValido(String valorAtual)`: chamado quando o valor está completo e válido\n\nUm exemplo de implementação:\n\n```java\npublic class SampleEventoDeValidacao implements EventoDeValidacao {\n\n    private final TextInputLayout textInputLayout;\n\n    public SampleEventoDeValidacao(TextInputLayout textInputLayout) {\n        this.textInputLayout = textInputLayout;\n    }\n\n    @Override\n    public void invalido(String valorAtual, String mensagem) {\n        textInputLayout.setError(mensagem);\n    }\n\n    @Override\n    public void parcialmenteValido(String valorAtual) {\n        textInputLayout.setErrorEnabled(false);\n        textInputLayout.setError(null);\n    }\n\n    @Override\n    public void totalmenteValido(String valorAtual) {\n        new AlertDialog.Builder(textInputLayout.getContext())\n                .setTitle(\"Campo válido!\")\n                .setMessage(valorAtual)\n                .show();\n    }\n}\n```\n\nVeja exemplos de implementação no sample.\n\n## Changelog\n\nVer [CHANGELOG.md](CHANGELOG.md)\n\n## Arquitetura\n\n- `Formatador`: Formata, desformata e verifica se um valor está formatado e se pode ser formatado. Opera com valores completos.\n- `Validador`: Valida de duas formas: absoluta (true ou false) e atualizando um objeto de validação (`ResultadoParcial`).\n- Watchers: implementações de `TextWatcher`s para formatação e validação contínua (conforme a digitação do usuário).\n\nPara exemplos, verifique os testes na pasta sample.\n\n## Gradle\n\n`allprojects {\n \t\trepositories {\n \t\t\t...\n \t\t\tmaven { url 'https://jitpack.io' }\n \t\t}\n \t}`\n\n`implementation 'br.com.concrete:canarinho:{latest version}'`\n\n## ATENÇÃO\n\nEste projeto é desenvolvido de boa vontade e com o intuito de ajudar. No entanto, todo o desenvolvimento é feito SEM GARANTIAS.\n\n## LICENÇA\n\nEste projeto é disponibilizado sob a licença Apache vesão 2.0. Ver declaração no arquivo LICENSE.txt\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconcretesolutions%2Fcanarinho","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconcretesolutions%2Fcanarinho","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconcretesolutions%2Fcanarinho/lists"}