Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
740e1de
Ajustes nas libs para compilar, e no codigo para usar View Binding já…
thiagoneves1 Sep 23, 2025
4ff243d
organizando os arquivos para a feature users para a pasta correta
thiagoneves1 Sep 23, 2025
bb28b3d
feat: create UsersViewModel for MVVM pattern
thiagoneves1 Sep 23, 2025
db1488c
ajustes no importe do koin
thiagoneves1 Sep 23, 2025
7d2a88a
add User na camada de domain
thiagoneves1 Sep 23, 2025
da7bdc8
adicionando a interface do repositorio na camada domain
thiagoneves1 Sep 23, 2025
824f1c5
criando o UseCase para os Uses
thiagoneves1 Sep 23, 2025
1eb02be
add UserResponse DTO e UserMapper na camada de data
thiagoneves1 Sep 23, 2025
3a4a916
add UserRepositoryImpl e atualizando o PicPayService for users
thiagoneves1 Sep 23, 2025
f5588b5
atualizando o Koin modules para injetar as dependencias do Users, cod…
thiagoneves1 Sep 23, 2025
9167f39
adicionando novo Modelo para a nova feature
thiagoneves1 Sep 23, 2025
523e819
adicionando PostRepository interface na camada domain
thiagoneves1 Sep 23, 2025
6a50777
adicionando GetPostsUseCase interface na camada domain
thiagoneves1 Sep 23, 2025
9b08c5d
adicionando Arquivos na camada data para posts
thiagoneves1 Sep 23, 2025
324fa97
adicionando PostRepositoryImpl
thiagoneves1 Sep 23, 2025
a7209f6
ajuste no Service
thiagoneves1 Sep 23, 2025
188b4f0
adicionando o PostsViewModel
thiagoneves1 Sep 23, 2025
1295124
adicionando o arquivos de UI para a feature de Post e reutilizando al…
thiagoneves1 Sep 23, 2025
1177783
adicionando o arquivos de UI xml e kt para a feature de Posts
thiagoneves1 Sep 23, 2025
c169585
ajuste no appModule do koin para a nova feature
thiagoneves1 Sep 23, 2025
6346c87
adicionando a fragmento de usuários
thiagoneves1 Sep 23, 2025
c4a6795
adicionando a implementação de tabs e ViewPager na MainActivity
thiagoneves1 Sep 23, 2025
a307c4b
refatorando a injeção de dependências com módulos separados para rede…
thiagoneves1 Sep 23, 2025
b6ce6a3
adicionando a implementação da feature de Posts com UI, rede e reposi…
thiagoneves1 Sep 23, 2025
33fb310
adicionando a interface PicPayService na pasta correta (data) e ajust…
thiagoneves1 Sep 23, 2025
192baa6
atualizando dependências do Mockito e adicionando testes para GetPost…
thiagoneves1 Sep 23, 2025
3d3fe4f
Update README.md
thiagoneves1 Sep 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,5 @@
/build
/captures
.externalNativeBuild

.idea/
125 changes: 0 additions & 125 deletions .idea/codeStyles/Project.xml

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/codeStyles/codeStyleConfig.xml

This file was deleted.

7 changes: 0 additions & 7 deletions .idea/dictionaries/mdime.xml

This file was deleted.

4 changes: 0 additions & 4 deletions .idea/encodings.xml

This file was deleted.

18 changes: 0 additions & 18 deletions .idea/gradle.xml

This file was deleted.

14 changes: 0 additions & 14 deletions .idea/misc.xml

This file was deleted.

12 changes: 0 additions & 12 deletions .idea/runConfigurations.xml

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/vcs.xml

This file was deleted.

60 changes: 60 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,63 @@ Com o passar do tempo identificamos alguns problemas que impedem esse aplicativo
Boa sorte! =)

Ps.: Fique à vontade para editar o projeto inteiro, organização de pastas e módulos, bem como as dependências utilizadas


# Refatoração
O app foi completamente refatorado para seguir a arquitetura Clean Architecture + MVVM conforme as recomendações oficiais do time do Android (https://developer.android.com/topic/architecture), implementando as melhores práticas de desenvolvimento Android moderno.
Arquitetura Implementada

# MVVM (Model-View-ViewModel)
View: Activities/Fragments responsáveis apenas pela UI
ViewModel: Gerencia estado da UI, expõe LiveData para observers
Model: Dados e lógica de negócio (Domain + Data layers)

# Clean Architecture - 3 Camadas
## Domain Layer
Regras de negócio, interfaces dos repositórios e entidades do domínio
Model: User, Post - entidades puras do domínio
Repository Interfaces: UserRepository, PostRepository - contratos para acesso a dados
Use Cases: GetUsersUseCase, GetPostsUseCase - encapsulam lógica de negócio

## Data Layer
Implementações concretas de acesso a dados e mapeamento
Models: UserResponse, PostResponse - DTOs da API
Mappers: UserMapper, PostMapper - conversão DTO ↔ Domain
Repositories: UserRepositoryImpl, PostRepositoryImpl - implementações dos repositórios
Services: PicPayService, PostsService - clientes HTTP especializados

## Presentation Layer
UI e gerenciamento de estado visual
Activities/Fragments: MainActivity, UsersFragment, PostsFragment
ViewModels: UsersViewModel, PostsViewModel - estados (Loading/Success/Error)
Adapters/ViewHolders: UserListAdapter, PostListAdapter - exibição de listas
UI Components: RecyclerView com DiffUtil para performance

# Funcionalidades Implementadas
## Multi-API Architecture
PicPay API: https://609a908e0f5a13001721b74e.mockapi.io/picpay/api/
JSONPlaceholder API: https://jsonplaceholder.typicode.com/
Separação clara com módulos Koin dedicados para isolamento

# Interface Moderna
Tabbed Navigation: ViewPager2 + TabLayout (Usuários + Posts)
Progressive UI: Loading states, error handling, empty states
Material Design: Tema consistente e responsivo

# Testes Unitários Completos (usando IA para criar)
PostsViewModelTest: Estados Loading/Success/Error
GetPostsUseCaseTest: Lógica de negócio
PostRepositoryImplTest: Acesso a dados + mapeamento
PostMapperTest: Conversões DTO ↔ Domain
Cobertura: 11 testes passando (100% sucesso)

# Injeção de Dependência
Koin: Módulos organizados por camada
Qualifiers: Separação de instâncias Retrofit (picpay, jsonplaceholder)
Scopes: ViewModels, factories, singletons apropriados

# Performance & Qualidade
Coroutines + LiveData (poderia usar Flow): Programação assíncrona
View Binding: Substituição de findViewById
DiffUtil: Atualizações eficientes de listas
Error Handling: Tratamento robusto de exceções
20 changes: 12 additions & 8 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,28 @@ apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-parcelize'

apply plugin: 'kotlin-kapt'

android {
compileSdkVersion 29
namespace 'com.picpay.desafio.android'
compileSdkVersion 35
defaultConfig {
applicationId "com.picpay.desafio.android"
minSdkVersion 21
targetSdkVersion 29
targetSdkVersion 35
versionCode 1
versionName "1.0"

vectorDrawables.useSupportLibrary = true

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildFeatures {
viewBinding true
}
buildTypes {
debug {}

Expand Down Expand Up @@ -51,9 +56,8 @@ dependencies {

implementation "com.google.android.material:material:$material_version"

implementation "org.koin:koin-core:$koin_version"
implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
implementation "io.insert-koin:koin-core:$koin_version"
implementation "io.insert-koin:koin-android:$koin_version"

implementation "com.google.dagger:dagger:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
Expand Down Expand Up @@ -82,9 +86,9 @@ dependencies {

testImplementation "junit:junit:$junit_version"
testImplementation "org.mockito:mockito-core:$mockito_version"
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:$mockito_kotlin_version"
testImplementation "org.mockito:mockito-inline:$mockito_inline_version"
testImplementation "androidx.arch.core:core-testing:$core_testing_version"
implementation "org.koin:koin-test:$koin_version"
// implementation "org.koin:koin-test:$koin_version"

androidTestImplementation "androidx.test:runner:$test_runner_version"
androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version"
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".PicPayApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
Expand All @@ -14,7 +15,8 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="AllowBackup,GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<activity android:name=".presentation.users.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
Loading