📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados na Especialização em Android Nativo. Recomendado revisar antes de iniciar.
v1.0 — Android Jetpack DataStore Preferences, Kotlin Coroutines Flow, Migração do SharedPreferences e Painel Quântico Temporal
Série Prática Android Clássico — Projeto 13 de 21
- P11: Guilda dos Heróis com Navigation & Biometria
- P12: Batcomputer com Injeção Hilt & Sensores
- ➡️ P13 (este): TARDIS Panel com DataStore Preferences
- P14: Portais Dimensionais com Notificações Push
- P15: Jarvis com WorkManager em Segundo Plano
O projeto TARDIS Panel implementa a moderna biblioteca Jetpack DataStore Preferences como substituta oficial e assíncrona do legado SharedPreferences no Android. Inspirado no console de navegação temporal do Doctor Who, o aplicativo gerencia parâmetros críticos da nave (coordenadas do vórtice do tempo, modo de camuflagem camaleônica e nível de energia dos cristais Artron) de forma estritamente reativa através de fluxos imutáveis Flow<Preferences> e Kotlin Coroutines.
Os gerenciadores de DataStore, contratos de preferências e componentes de interface estão centralizados na subpasta canônica mobile-android-kotlin/:
catalogo_projetos/android_p13_tardis_services/
├── assets/
│ ├── mockup_tardis_fluxo.svg
│ ├── screenshot_01_tardis_azul.svg
│ ├── screenshot_02_tardis_neon.svg
│ └── screenshot_03_tardis_salto.svg
├── mobile-android-kotlin/
│ ├── app/
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── java/br/com/curso/tardispanel/
│ │ │ │ ├── datastore/
│ │ │ │ │ └── TardisPreferences.kt
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ └── build.gradle
│ ├── gradle/
│ ├── build.gradle
│ ├── gradlew
│ ├── settings.gradle
│ └── README.md
└── index.md
| ID | Persona | Narrativa da Funcionalidade | Critério de Aceitação Principal | Prioridade |
|---|---|---|---|---|
| US-01 | Lorde do Tempo / Piloto | Quero ajustar as coordenadas de destino no tempo e salvar sem travar a tela da TARDIS. | Gravação assíncrona com dataStore.edit sem bloqueio da UI Thread. |
Alta |
| US-02 | Lorde do Tempo / Piloto | Quero que as configurações salvas persistam mesmo após reiniciar o celular ou fechar o app. | Carregamento imediato no startup via dataStore.data.first(). |
Alta |
| US-03 | Lorde do Tempo / Piloto | Quero alternar o tema do console entre Azul Clássico e Neon Gallifreyano em tempo real. | Atualização instantânea da interface reagindo ao Flow de preferências. |
Alta |
| US-04 | Engenheiro de Software | Quero eliminar todas as chamadas síncronas bloqueantes herdadas do SharedPreferences. |
Adoção integral do Jetpack DataStore com tratamento funcional de exceções de I/O. | Média |
| US-05 | Desenvolvedor Mobile | Quero restaurar as configurações padrão de fábrica da TARDIS com o toque de um botão. | Limpeza atômica das chaves armazenadas no arquivo DataStore. | Baixa |
DataStore<Preferences> utilizando o delegado Kotlin preferencesDataStore(name = "tardis_prefs").stringPreferencesKey, booleanPreferencesKey, intPreferencesKey).Flow<ConfiguracaoTardis> para consumo na camada de apresentação.edit { }.emptyPreferences() como fallback seguro.flowchart TD
Pilot([fa:fa-user Lorde do Tempo])
DS[(fa:fa-database Jetpack DataStore)]
subgraph AppTardis ["🌌 TARDIS Panel (mobile-android-kotlin)"]
UC01["Configurar Coordenadas Temporais"]
UC02["Persistir com dataStore.edit"]
UC03["Consumir Fluxo Reativo (Flow)"]
UC04["Alternar Tema Visual (Azul/Neon)"]
UC05["Restaurar Configurações de Fábrica"]
end
Pilot --> UC01
UC01 --> UC02
UC02 --> DS
DS -.->|Flow| UC03
UC03 --> Pilot
Pilot --> UC04
UC04 --> UC02
Pilot --> UC05
UC05 --> UC02
| ID Requisito | História de Usuário | Artefato de Código | Teste de Aceitação |
|---|---|---|---|
| RF-01 | US-04 | mobile-android-kotlin/app/.../TardisPreferences.kt |
testDataStoreInitialization() |
| RF-02 | US-01, US-03 | mobile-android-kotlin/app/.../TardisPreferences.kt |
testTypedPreferencesKeys() |
| RF-03 | US-02, US-03 | mobile-android-kotlin/app/.../TardisPreferences.kt |
testFlowEmitsSavedPreferences() |
| RF-04 | US-01 | mobile-android-kotlin/app/.../TardisPreferences.kt |
testAsyncEditOperation() |
| RF-05 | US-04 | mobile-android-kotlin/app/.../TardisPreferences.kt |
testIOExceptionFallbackSafety() |
TardisPreferences.kt)ℹ️ O trecho de código que ficava aqui não correspondia ao código do projeto e foi retirado. Consulte os arquivos em
mobile-android-kotlin.
cd catalogo_projetos/android_p13_tardis_services/mobile-android-kotlin
./gradlew test
./gradlew assembleDebug
| Checkpoint | Meta Técnica | Critério de Aceite | Status |
|---|---|---|---|
| CP-01 | Instanciação DataStore | Delegado preferencesDataStore configurado no escopo de Context |
PASS ✅ |
| CP-02 | Chaves Tipadas | Chaves inteiras, booleanas e texto operando sem cast frágil | PASS ✅ |
| CP-03 | Fluxo com Flow | Leitura contínua atualizando a UI reativamente sem polling | PASS ✅ |
| CP-04 | Tratamento de Exceções I/O | Falhas de arquivo tratadas com captura e fallback | PASS ✅ |
| CP-05 | Suíte de Testes Automatizados | Testes de unidade do DataStore aprovados com 100% de sucesso | PASS ✅ |