App Android de controle parental que troca o "bloqueio puro" por aprendizado. Depois de um tempo de uso, o celular bloqueia, e a criança só libera respondendo atividades de alfabetização e matemática. O nível das atividades se ajusta ao desempenho dela.
Stack: Kotlin · Android SDK (Views) · Foreground Service · SYSTEM_ALERT_WINDOW · LLM via API do Groq · JUnit · Gradle KTS
- Bloqueio por janela sobreposta (
LockOverlay.kt): o bloqueio fica por cima de qualquer app. Antes ele usava uma Activity, que o Android 10+ impede de abrir em segundo plano. - Serviço em primeiro plano (
TimeTrackerService.kt): conta só o tempo com a tela ligada e destravada, e volta a funcionar depois de reiniciar o aparelho (BootReceiver). - PIN dos pais com PBKDF2 e limite de tentativas: o PIN nunca fica salvo em texto puro.
- Perguntas geradas por código (
LocalQuestions.kt,WordBank.kt): o gabarito é calculado, então nunca vem errado. - IA com verificação (
GroqClient.kt): cada pergunta gerada pela IA passa por uma segunda chamada "às cegas", com temperatura 0, e só fica se as respostas baterem. Sem internet, o app usa as perguntas locais. - Correção tolerante (
AnswerMatcher.kt): ignora acentos, maiúsculas e artigos, e aceita números por extenso. Tem testes unitários (AnswerMatcherTest,LocalQuestionsTest). - Nível adaptativo e detecção de chute (
Progress.kt,GuessDetector.kt): o nível sobe com 80% ou mais de acerto e desce abaixo de 50%. Os pais veem um relatório por habilidade. - Atualização automática (
UpdateChecker.kt): o app busca a versão mais nova no GitHub Releases, valida o pacote e o número da versão, e abre o instalador. - Segredos fora do código: a chave da API e o certificado de assinatura ficam no
local.properties, que está no.gitignore.
Ciclo: 60 min de tela → bloqueio de 30 min → só libera com atividade feita E pausa terminada. A pausa conta a partir do momento do bloqueio. Tudo configurável na tela dos pais.
- Geradas no próprio app (
LocalQuestions.kt+WordBank.kt): letra inicial/final/que falta, sílabas, juntar sílabas, contar letras/vogais, escrever palavra, alfabeto, contagem, soma, subtração, sequência, maior/menor. O gabarito é calculado pelo código — nunca vem errado. - IA do Groq só para conhecimentos gerais (animais, natureza, corpo…). Cada pergunta passa por uma conferência às cegas (2ª chamada, temperatura 0); só fica o que bate. Erro em pergunta da IA não dá castigo.
- Comparação tolerante (
AnswerMatcher.kt): ignora acento, maiúscula, pontuação, hífen, artigo ("o gato"), aceita número por extenso ("quatro" = 4) e plural simples. Ortografia continua contando. - Errou? Aparece a resposta certa com explicação, a criança digita a resposta certa para seguir, e a pergunta volta para revisão 2–3 perguntas depois.
- Nível adaptativo por habilidade (
Progress.kt): ≥ 80% de acerto sobe, < 50% desce (níveis 1 a 3). - 🔊 Ouvir: lê a pergunta em voz alta (pt-BR).
- Área dos pais na tela de bloqueio → 🚩 Pergunta errada: descarta a pergunta e devolve o castigo.
- Relatório na tela dos pais: acertos por habilidade, nível, sinais de chute (
GuessDetector.kt) e últimos erros.
Ao abrir a Área dos pais, o app procura uma versão nova no repositório UPDATE_REPO (no local.properties,
ex.: UPDATE_REPO=seu-usuario/tempo-de-tela) e mostra "Atualizar agora": baixa o APK e abre o instalador.
- Publicar: rode
.\publicar.ps1(aumenta a versão e geradist\tempo-de-tela-vN.apk) e crie a release no GitHub com a tagvN(N = VERSION_CODE), o título = versão e o APK anexado. O repositório precisa ser público. - Chave de assinatura:
keystore/tempo-de-tela.jks+ senha nolocal.properties. Faça backup dos dois — sem eles, nenhuma versão nova instala por cima da antiga.
- Bloqueio agora é uma janela sobreposta (
LockOverlay.kt): fica por cima de qualquer app, mesmo com Home/Recentes. (Antes era uma Activity aberta em segundo plano — o Android 10+ bloqueia isso, o bloqueio nunca apareceria.) - Tempo só conta com tela ligada e destravada.
- Atividades de múltipla escolha (3 botões, sem teclado), botão 🔊 Ouvir (voz em pt-BR) e vários acertos (padrão 3).
- IA do Groq (
GroqClient.kt): gera perguntas de letras, palavras, animais, cores etc. A fila fica salva no aparelho (funciona offline). Sem internet/chave -> continhas locais. - PIN dos pais: protege a tela de configuração e libera o celular na tela de bloqueio ("Área dos pais").
- Limites configuráveis (acabou o "1 minuto de teste" fixo no código) + botões "Testar bloqueio" e "Liberar agora".
- Serviço religa no boot e após atualizar o app.
- Crie a chave grátis em https://console.groq.com/keys
- No
local.properties(raiz do projeto) adicione:GROQ_API_KEY=gsk_xxxxxxxx - Gere o APK de novo. (A chave fica embutida no APK — ok para uso pessoal, não publique o APK nem o local.properties.)
Build > Build APK(s) -> app/build/outputs/apk/debug/app-debug.apk
ou no PowerShell: .\gradlew.bat assembleDebug
- Instale o APK (permita "instalar apps desconhecidos"; se o Play Protect avisar, escolha "instalar mesmo assim").
- Abra o app -> crie o PIN.
- Botão 1: permitir exibir sobre outros apps (obrigatório).
- Botão 2: bateria sem restrição. Em Xiaomi/Samsung/Motorola também ative "Início automático"/"Sem restrições" nas configurações do app.
- Botão 3: notificações. Botão 4: iniciar controle.
- Toque em Gerar atividades com IA e depois em Testar bloqueio agora para validar.
- Ajuste as regras (60/30/3) e salve. Teste o ciclo real antes de entregar o celular.
- É bloqueio "soft": uma criança de 6 anos não burla, mas alguém que saiba abrir Configurações pode forçar a parada do app ou revogar a permissão, ou desinstalar. Para blindar de verdade: Device Owner/Lock Task (ou Google Family Link como segunda camada).
- Mudar a data/hora do aparelho pode encurtar a pausa.
- Código novo não foi compilado/testado em aparelho real — rode o checklist do passo 6/7.
