Stonks é um projeto mobile desenvolvido para a plataforma Android, utilizado para aplicar meus conhecimentos mais recentes sobre a plataforma, abordando estratégias de arquitetura, componentes e ferramentas mais atuais como Jetpack Compose.
Para o processo de instalação e execução do projeto, instale a versão mais recente do Android Studio e ao carregar o projeto, siga os passos abaixo:
- Certifique-se que o arquivo gerando na pasta
.gradle/config.properties
contém o mesmo caminho presente na variável de ambienteJAVA_HOME
configurado em seu usuário; - Acesse o arquivo
build.gradle
do módulo network e informe a chave de autorização do GitHub no AUTHORIZATION_KEY (saiba mais); - Execute o script de setup do projeto para instalação do hook de pre-commit responsável pela execução do detekt:
sh ./tools/setup.sh
Caution
Caso esteja executando o projeto em um ambiente com restrições de rede com proxy, certifique-se que as dependências utilizadas no gerenciador de dependências possui as versões utilizadas por este projeto (saiba mais).
- Módularização: distribuição funcional entre os módulos;
- Home: feature responsável pela exibição da carteira de ativos e histórico transacional;
- Stock alert: feature responsável pela gestão de alerta de ativos;
- Comparador de preços: feature responsável pela comparação de preços do ativo x alerta;
- Push: motor responsável pelo disparo de push's para o cliente;
Tip
Para que o comparador de preços funcione, ao cadastrar novo alerta utilize alguma das ações parametrizadas no mock de stock-alert.
- Aplicação desenvolvida em Kotlin
- Build system utilizando Gradle com Conventional Plugins e Version Catalog
- Componentes visuais inteiramente desenvolvidos com Jetpack Compose
- Requisições assíncronas desenvolvidas com Coroutines
- Injeção de dependência com Koin
- Armazenamento interno com Room
Tip
Para executar o analisador de código estático, na raiz do projeto execute o seguinte comando:
./gradlew detekt
Para geração do relatório de cobertura de testes, foi aplicado o uso da biblioteca Kover.
Tip
Para executar o relatório de cobertura de todos os módulos, na raiz do projeto execute o seguinte comando:
./gradlew koverHtmlReportDebug
A arquitetura do projeto foi baseada nas práticas recomendadas pelo Android Guide Arch abordando padrões como SOLID, MVVM, Single source of truth (SSOT), Unidirectional Data Flow (UDF) e práticas de modularização funcional.
:app
: módulo principal do aplicativo responsável por conter toda lógica de inicialização do app;gradle-build
: módulo responsável pela configuração de build system do projeto provendo plugins reutilizáveis em qualquer novo módulokotlin-library
ouandroid-library
eliminando duplicações de scripts de build;:testing
: módulo responsável pelas lógicas comuns para desenvolvimento de testes, deve ser utilizado somente comtestImplementation
ouandroidTestImplementation
;:common
: módulo responsável pelas lógicas comuns entre os módulos, como abstrações genéricas, formatadores, utilitários, etc;:design-system
: módulo responsável por contér design tokens e componentes reutilizáveis entre as features;:infrastructure:network
: módulo responsável por conter lógicas estruturais do projeto, atualmente contendo apenas lógicas relacionadas a camada de serviço;:feature:home
: módulo responsável por contér lógicas da home principal do app;:feature:stocks
: módulo responsável por contér lógicas da feature de alerta de ativos/produtos;
A modularização funcional dos módulos no Gradle é essencial para a organização, reutilização e manutenção eficiente do código. Por este motivo este projeto utiliza a biblioteca Module Graph Assert que auxilia neste processo.
Tip
Para executar a análise do grafo ou relatório de distribuição dos módulos, na raiz do projeto execute os seguintes comandos:
# analyzing dependency graph
./gradlew assertModuleGraph
# generating dependency graph
./gradlew generateModulesGraphvizText
Com o objetivo de automatizar o processo de contribuição neste projeto, foi incluído um workflow via GitHub Actions responsável por executar todos os gates de qualidade e build dos artefatos.