Uma Pokédex Android nativa construída em Kotlin, seguindo os padrões mais modernos de arquitetura, injeção de dependências, persistência local e testes automatizados. O objetivo principal do app é demonstrar qualidade de código, cobertura de testes unitários e de UI e resiliência offline.
- Splash Screen: Tela de abertura com animação vetorial do giro da Pokebola desenvolvida nativamente em Jetpack Compose.
- Lista de Pokémons com Paginação: Grid infinito consumindo a PokéAPI com carregamento sob demanda conforme o usuário desce o scroll.
- Busca em Tempo Real: Campo de busca funcional integrado que filtra por nome completo ou parcial e exibe os estados adequados da UI.
- Estados visuais da UI: Tratamento robusto e amigável para os estados de Loading (indicador circular), Success (grid de cards com imagens), Error (mensagem de falha com botão de tentar novamente) e Empty (quando uma busca não encontra resultados).
- Detalhes do Pokémon: Exibição detalhada de cada Pokémon incluindo ID formatado (
#001), imagem, tipos, peso, altura e estatísticas básicas com barras de progresso lineares animadas. - Modo Offline: Persistência automática em banco de dados local com Room. Ao abrir o app sem conexão com a internet, o banco local serve como fallback imediato, mantendo a experiência do usuário funcional.
| Categoria | Tecnologia | Uso Principal |
|---|---|---|
| Linguagem | Kotlin | Desenvolvimento nativo moderno. |
| UI Framework | Jetpack Compose | Design declarativo com Material 3. |
| Arquitetura | Clean Architecture + MVVM | Separação rígida de responsabilidades e alta manutenibilidade. |
| DI | Hilt (Dagger) | Injeção de dependências limpa. |
| Network | Retrofit + OkHttp | Consumo seguro da PokéAPI e interceptação de logs HTTP. |
| Cache Local | Room Database | Cache offline e persistência de dados localmente. |
| Assincronismo | Coroutines + Flow | Programação assíncrona orientada a fluxos de dados reativos. |
| Imagens | Coil Compose | Carregamento assíncrono e cache local de sprites de imagens. |
| Testes | JUnit 4, Mockito Kotlin, Google Truth, Espresso | Testes unitários de ViewModel/Repository/Mappers e testes instrumentados de UI. |
| Cobertura | JaCoCo | Geração de relatórios analíticos de cobertura de código. |
O app implementa os conceitos de Clean Architecture dividindo o projeto em três camadas principais:
- Domain (Domínio): Contém os modelos puros do negócio (
Pokemon), as interfaces de repositórios (PokemonRepository) e os Casos de Uso (GetPokemonsUseCase,GetPokemonDetailUseCase). É uma camada puramente Kotlin, sem dependência de frameworks do Android. - Data (Dados): Responsável pelo fornecimento dos dados. Implementa as interfaces do domínio coordenando chamadas de rede da PokéAPI (
Retrofit) e cache local (Room). Faz a tradução de DTOs de rede e entidades locais para modelos de domínio por meio de Mappers. - Presentation (Apresentação): Composta por Views declarativas em
Jetpack Composee ViewModels Hilt. As ViewModels transformam fluxos de dados assíncronos em estados reativos legíveis pela UI (StateFlow).
O projeto prioriza a qualidade do código com testes unitários (cobrando lógica de ViewModel, Repository e Mapeamentos) e testes de UI.
Execute o comando abaixo para compilar e rodar os testes unitários locais de forma determinística:
.\gradlew.bat testDebugUnitTestCom um emulador ativo ou dispositivo conectado, execute os testes de interface:
.\gradlew.bat connectedDebugAndroidTestPara medir a cobertura do código, execute:
.\gradlew.bat jacocoTestReportO relatório HTML detalhado será gerado em:
app/build/reports/jacoco/jacocoTestReport/html/index.html
Você pode abrir o arquivo index.html em qualquer navegador para auditar a cobertura por arquivos e métodos.
- Clone o repositório.
git clone https://github.com/dierlisson/PokedexApp.git
cd PokedexApp- Abra o projeto no Android Studio.
- Execute a sincronização do Gradle.
- Compile e execute o app no seu dispositivo ou emulador.
Dierlisson Justiniano
