Pular para conteúdo

Aula 20 - Projeto Capstone: App Android Nativo Completo Autônomo 🚀

Objetivo Pedagógico

Objetivo: Conceber e integrar um aplicativo Android nativo completo de nível comercial: interface declarativa com Compose, arquitetura limpa em camadas (Clean Architecture), persistência reativa com Room, injeção Hilt e sincronização assíncrona em background com WorkManager.


📑 1. Fundamentos Teóricos & Análise Técnica

O Projeto Capstone consolida a maturidade profissional em desenvolvimento Android nativo moderno: 1. Arquitetura Limpa em Três Camadas (Clean Architecture): - Camada de Apresentação (Presentation Layer): Composables, ViewModels MVI e contratos de estado de tela. - Camada de Domínio (Domain Layer): Casos de uso atômicos (Use Cases / Interactors) contendo regras puras de negócio, completamente desacoplados do framework Android. - Camada de Dados (Data Layer): Repositórios, DAOs do Room, clientes HTTP (Retrofit/Ktor) e fontes de dados remotas e locais. 2. Sincronização em Background com WorkManager: - Garantia de execução de tarefas mesmo se o aplicativo for encerrado ou o dispositivo for reiniciado. - Restrições declarativas de hardware (Constraints): executar tarefas pesadas de upload/download somente quando o aparelho estiver conectado ao Wi-Fi e carregando a bateria. 3. Resiliência e Qualidade: - Testes unitários de Use Cases com MockK e testes de UI de componentes Compose utilizando createComposeRule.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    UI["Compose Presentation (Screens & ViewModels)"] --> UseCase["Domain Layer (Use Cases Puros)"]
    UseCase --> Repo["Data Layer (Repository Pattern)"]
    Repo --> Local["Room Database (Single Source of Truth)"]
    Repo --> Remote["API REST / GraphQL (Retrofit / Ktor)"]
    WM["WorkManager (Sync em Background)"] --> Repo
    style UI fill:#e1f5fe,stroke:#01579b
    style UseCase fill:#fff3e0,stroke:#e65100
    style Repo fill:#f3e5f5,stroke:#7b1fa2
    style Local fill:#e8f5e9,stroke:#2e7d32
    style WM fill:#ffebee,stroke:#c62828

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Independência de Framework no Domínio: A camada de negócios não importa pacotes do SDK do Android, permitindo execução instantânea de testes na JVM. - Garantia de Execução com WorkManager: Persistência de tarefas em SQLite gerenciado pelo SO com tolerância a quedas de processo. - Repositório como Mediador Único: Encapsulamento das regras de prioridade entre cache local e chamadas de rede. - Build Rápido com Gradle Modularizado: Separação do projeto em submódulos Gradle (:core:database, :core:network, :feature:orders).


🛠️ 2. Implementação Prática em Engenharia Android Nativa, Compose, Hilt, Room e WorkManager

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// SyncOrdersWorker.kt (WorkManager com Restrições de Hardware e Injeção Hilt)
package com.portal.android.sync

import android.content.Context
import androidx.hilt.work.HiltWorker
import androidx.work.*
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import java.util.concurrent.TimeUnit

@HiltWorker
class SyncOrdersWorker @AssistedInject constructor(
    @Assisted appContext: Context,
    @Assisted workerParams: WorkerParameters,
    private val ordersRepository: OrdersRepository
) : CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        return try {
            ordersRepository.syncWithRemoteServer()
            Result.success()
        } catch (e: Exception) {
            if (runAttemptCount < 3) Result.retry() else Result.failure()
        }
    }

    companion object {
        fun buildPeriodicSyncRequest(): PeriodicWorkRequest {
            val constraints = Constraints.Builder()
                .setRequiredNetworkType(NetworkType.UNMETERED) // Somente Wi-Fi
                .setRequiresBatteryNotLow(true)
                .build()

            return PeriodicWorkRequestBuilder<SyncOrdersWorker>(6, TimeUnit.HOURS)
                .setConstraints(constraints)
                .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 15, TimeUnit.MINUTES)
                .build()
        }
    }
}

💡 Análise Passo a Passo do Código

  1. Anotação @HiltWorker: Permite injeção de dependências assistida com Hilt diretamente no construtor do Worker.
  2. Restrições Inteligentes de Hardware: Poupa dados do usuário e vida útil da bateria exigindo rede Wi-Fi e bateria saudável.
  3. Backoff Exponencial: Garante que tentativas consecutivas de retry não sobrecarreguem o servidor em situações de queda de infraestrutura.

🎯 3. Próximos Passos & Sequência Didática