SavePoint é um gerenciador de biblioteca de jogos offline-first focado em performance e disponibilidade. O aplicativo permite que jogadores organizem suas coleções, acompanhem o progresso de seus títulos e mantenham tudo sincronizado na nuvem, sem nunca perder a fluidez da experiência offline.
Para demonstrar o valor técnico deste projeto, destaquei as principais conquistas de implementação:
- 🛡️ Clean Architecture Rigorosa: Separação total de responsabilidades. A lógica de negócio reside na camada de
Domain, totalmente agnóstica a frameworks externos ou detalhes de UI. - 🧩 Use Cases (Interactors): Cada ação do usuário é encapsulada em um
UseCase(ex:AddGameUseCase,SyncGamesUseCase). Isso garante reuso, facilita testes unitários e mantém os ViewModels magros. - 🌊 Reactive Stream com Flow: Utilização extensiva de Kotlin Flows para propagar mudanças do banco de dados (Room) até a UI em tempo real, garantindo uma interface sempre atualizada e reativa.
- 🔄 Sincronização Delta Eficiente: Redução de ~90% no consumo de dados e custos de infraestrutura. Implementei um algoritmo de Delta Sync utilizando Timestamps e flags no Room para trafegar apenas registros modificados.
- ⚡ Performance Percebida (Zero Lag): 100% de disponibilidade offline com o Room como Single Source of Truth (SSOT).
O projeto utiliza Clean Architecture e princípios SOLID, garantindo um código sustentável.
- Domain: A "jóia da coroa". Contém as
Entities,Repository InterfaceseUseCases. Não depende de nada. - Data: Implementa os repositórios. Gerencia o Room (local) e Firestore (remoto), além de conter os
Mapperspara conversão entre Data Transfer Objects (DTOs) e Domain Models. - UI (Presentation): 100% Jetpack Compose. ViewModels expõem um único
StateFlowrepresentando o estado da tela, seguindo o padrão Unidirectional Data Flow (UDF).
- Observação Reativa: A UI observa um
StateFlowvindo do ViewModel. - Ação (Intent): O usuário clica em um botão, disparando uma função no ViewModel.
- Execução: O ViewModel invoca um
UseCase, que por sua vez chama oRepository. - Atualização: O dado é salvo no Room, que emite um novo valor pelo
Flow, atualizando toda a cadeia automaticamente.
- Autenticação: Login via Google e E-mail/Senha (Firebase Auth).
- UseCases Validados: Lógica de entrada e regras de negócio testadas isoladamente.
- Gerenciamento de Jogos: CRUD completo com persistência local imediata.
- Cloud Backup: Sincronização em background transparente para o usuário.
- Modo Offline: Experiência ininterrupta independente da qualidade da rede.
| Categoria | Tecnologia |
|---|---|
| Arquitetura | Clean Architecture, MVVM, UDF |
| Assincronismo | Kotlin Coroutines & Flows |
| Interface | Jetpack Compose |
| DI | Hilt (Dependency Injection) |
| Persistência | Room (SQLite) & DataStore |
| Cloud | Firebase (Auth & Firestore) |
| Networking | Retrofit & OkHttp |
A arquitetura limpa permite testes altamente eficazes:
- Unit Tests: Testando
UseCaseseViewModelsisolando as dependências com MockK. - Flow Testing: Utilização da biblioteca Turbine para validar emissões de fluxos assíncronos.








