diff --git a/.github/workflows/somente-android.yml b/.github/workflows/somente-android.yml new file mode 100644 index 0000000..1a6d8de --- /dev/null +++ b/.github/workflows/somente-android.yml @@ -0,0 +1,33 @@ +name: SOMENTE Android + +on: + push: + paths: ["SomenteAndroid/**", ".github/workflows/somente-android.yml"] + pull_request: + paths: ["SomenteAndroid/**", ".github/workflows/somente-android.yml"] + +permissions: + contents: read + +concurrency: + group: somente-android-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 20 + defaults: + run: + working-directory: SomenteAndroid + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + - uses: gradle/actions/setup-gradle@v4 + with: + gradle-version: "8.14.3" + - name: Test, lint and assemble debug APK + run: gradle --no-daemon testDebugUnitTest lintDebug assembleDebug --stacktrace diff --git a/SomenteAndroid/PLAY_STORE.md b/SomenteAndroid/PLAY_STORE.md new file mode 100644 index 0000000..4317404 --- /dev/null +++ b/SomenteAndroid/PLAY_STORE.md @@ -0,0 +1,26 @@ +# Preparação para Google Play + +## Nome + +SOMENTE — ouvir, ler e criar música + +## Descrição curta + +Treino auditivo, pauta sincronizada e criação de exercícios musicais. + +## Descrição completa + +SOMENTE une som e mente em três experiências simples para iniciantes de qualquer idade. Ouça uma nota e tente reconhecê-la; acompanhe pequenas sequências na pauta enquanto elas tocam; ou crie um exercício de até 16 notas para estudar e usar em aula. + +Não é necessário saber ler partitura nem possuir instrumento. O aplicativo funciona offline, sem conta e sem anúncios. O progresso e o exercício criado ficam somente no aparelho. + +## Checklist antes de enviar + +- [ ] confirmar disponibilidade do nome e do pacote; +- [ ] gerar chave de upload e AAB assinado; +- [ ] identificar o responsável e publicar a política de privacidade; +- [ ] declarar corretamente público-alvo e segurança de dados; +- [ ] criar ícone 512 × 512, feature graphic 1024 × 500 e capturas; +- [ ] testar em telefone e tablet, com TalkBack e tamanhos de fonte maiores; +- [ ] concluir classificação indicativa e teste fechado; +- [ ] corrigir o relatório de pré-lançamento. diff --git a/SomenteAndroid/PRIVACY.md b/SomenteAndroid/PRIVACY.md new file mode 100644 index 0000000..310e67f --- /dev/null +++ b/SomenteAndroid/PRIVACY.md @@ -0,0 +1,9 @@ +# Política de Privacidade — SOMENTE v0.1 + +Última atualização: 26 de agosto de 2026. + +O SOMENTE v0.1 funciona sem conta e sem conexão com a internet. Não contém publicidade nem ferramentas de análise e não solicita acesso ao microfone, câmera, contatos, localização, identificador de anúncios ou arquivos pessoais. + +O aplicativo armazena no próprio aparelho apenas a contagem de respostas corretas e uma sequência musical criada pelo usuário. Esses dados não são enviados ao desenvolvedor e podem ser apagados ao limpar os dados do aplicativo ou desinstalá-lo. + +Antes de publicação pública, esta política deverá incluir a identificação e o contato do responsável pelo aplicativo e corresponder exatamente ao pacote distribuído. diff --git a/SomenteAndroid/README.md b/SomenteAndroid/README.md new file mode 100644 index 0000000..940611e --- /dev/null +++ b/SomenteAndroid/README.md @@ -0,0 +1,36 @@ +# SOMENTE Android + +**SOMENTE** (som + mente) é um laboratório pedagógico gratuito para iniciantes de qualquer idade. A experiência reúne escuta, leitura e criação sem exigir conta, internet, anúncios, microfone ou conhecimento prévio de partitura. + +## Três modos de aula + +1. **Escutar e reconhecer** — o estudante ouve uma nota, escolhe seu nome e vê a resposta na pauta. +2. **Ler e ouvir** — uma sequência curta é reproduzida enquanto a nota atual é destacada. +3. **Criar exercício** — professor ou estudante monta até 16 notas, ouve o resultado e salva a atividade localmente. + +O desenho se inspira na clareza de aplicativos de partitura para Android, mas segue uma progressão própria: ouvir → reconhecer → visualizar → criar. Os exemplos são originais e não incluem repertório protegido. + +## Executar + +Abra a pasta `SomenteAndroid` no Android Studio, aguarde a sincronização do Gradle e execute o módulo `app` em Android 8.0 ou superior. Na linha de comando, com Gradle 8.14.3 instalado: + +```bash +gradle testDebugUnitTest lintDebug assembleDebug +``` + +O pacote é `br.com.sidineyr.somente`, com alvo Android 16/API 36 e versão `0.1.0`. + +## Uso responsável + +- use volume confortável, especialmente com fones; +- o nome das notas segue a nomenclatura em português; +- o exercício salvo permanece apenas neste aparelho; +- valide contraste, tamanhos de toque e TalkBack em aparelho real antes de publicar. + +## Limites da v0.1 + +O MVP usa ondas senoidais e valores rítmicos iguais. Compassos, figuras rítmicas, claves adicionais, transposição e exportação ficam para versões posteriores. Antes da Google Play ainda são necessários ícone, capturas, AAB assinado e teste fechado. + +## Próximo passo de revisão + +Use [`RELEASE_CHECKLIST.md`](RELEASE_CHECKLIST.md) para validar primeiro o PR em CI, telefone, tablet, TalkBack e fonte ampliada. Os itens de Play Console e identidade visual estão separados porque não bloqueiam a revisão do código e não devem ser tratados como autorização para publicar. diff --git a/SomenteAndroid/RELEASE_CHECKLIST.md b/SomenteAndroid/RELEASE_CHECKLIST.md new file mode 100644 index 0000000..0cf3503 --- /dev/null +++ b/SomenteAndroid/RELEASE_CHECKLIST.md @@ -0,0 +1,33 @@ +# Checklist de revisão — SOMENTE Android v0.1 + +Este checklist separa o que bloqueia a revisão do código do que será necessário apenas antes de uma futura publicação. Marque um item somente quando houver evidência reproduzível. + +## 1. Pronto para solicitar revisão do PR + +- [ ] O workflow **SOMENTE Android** conclui em verde no commit mais recente. +- [ ] `testDebugUnitTest`, `lintDebug` e `assembleDebug` passam no GitHub Actions. +- [ ] O APK de depuração instala e abre em um telefone Android 8.0 ou superior. +- [ ] Os três fluxos funcionam no telefone: reconhecer, ler/acompanhar e criar/salvar exercício. +- [ ] O mesmo roteiro é concluído em um tablet, sem conteúdo cortado ou controles inacessíveis. +- [ ] Com TalkBack, todos os controles têm nome compreensível e a ordem de foco permite concluir os três fluxos. +- [ ] Com o maior tamanho de fonte do sistema, o texto permanece legível e os botões continuam utilizáveis. +- [ ] Resultados, aparelho/versão do Android e problemas encontrados estão registrados no PR. + +Quando todos os itens desta seção estiverem concluídos, o PR pode sair de rascunho e receber revisão. Isso ainda não autoriza merge nem publicação. + +## 2. Somente antes de um teste fechado futuro + +- [ ] Confirmar o nome **SOMENTE** e o pacote `br.com.sidineyr.somente`. +- [ ] Definir responsável e contato público na política de privacidade. +- [ ] Criar o ícone 512 × 512, a imagem de destaque 1024 × 500 e capturas de telefone/tablet. +- [ ] Criar e guardar com segurança a chave de upload. +- [ ] Gerar o AAB assinado e testá-lo localmente. +- [ ] Preencher público-alvo, segurança de dados, classificação indicativa e demais campos do Play Console. +- [ ] Executar um teste fechado e corrigir o relatório de pré-lançamento. + +## Registro mínimo dos testes manuais + +| Ambiente | Versão Android | Tela/fonte | TalkBack | Três fluxos | Resultado/observações | +|---|---|---|---|---|---| +| Telefone | | Padrão e máxima | Ligado/desligado | | | +| Tablet | | Padrão e máxima | Ligado/desligado | | | diff --git a/SomenteAndroid/app/build.gradle.kts b/SomenteAndroid/app/build.gradle.kts new file mode 100644 index 0000000..dfe9917 --- /dev/null +++ b/SomenteAndroid/app/build.gradle.kts @@ -0,0 +1,37 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") +} + +android { + namespace = "br.com.sidineyr.somente" + compileSdk = 36 + + defaultConfig { + applicationId = "br.com.sidineyr.somente" + minSdk = 26 + targetSdk = 36 + versionCode = 1 + versionName = "0.1.0" + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { jvmTarget = "17" } +} + +dependencies { + implementation("androidx.core:core-ktx:1.16.0") + implementation("androidx.appcompat:appcompat:1.7.1") + implementation("com.google.android.material:material:1.12.0") + testImplementation("junit:junit:4.13.2") +} diff --git a/SomenteAndroid/app/proguard-rules.pro b/SomenteAndroid/app/proguard-rules.pro new file mode 100644 index 0000000..547d2eb --- /dev/null +++ b/SomenteAndroid/app/proguard-rules.pro @@ -0,0 +1 @@ +# Rules are intentionally minimal; Google Mobile Ads publishes consumer rules. diff --git a/SomenteAndroid/app/src/main/AndroidManifest.xml b/SomenteAndroid/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9f5de96 --- /dev/null +++ b/SomenteAndroid/app/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/SomenteAndroid/app/src/main/java/br/com/sidineyr/somente/MainActivity.kt b/SomenteAndroid/app/src/main/java/br/com/sidineyr/somente/MainActivity.kt new file mode 100644 index 0000000..a19be76 --- /dev/null +++ b/SomenteAndroid/app/src/main/java/br/com/sidineyr/somente/MainActivity.kt @@ -0,0 +1,155 @@ +package br.com.sidineyr.somente + +import android.graphics.Color +import android.os.Bundle +import android.view.Gravity +import android.view.View +import android.widget.Button +import android.widget.LinearLayout +import android.widget.ScrollView +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import kotlin.random.Random + +class MainActivity : AppCompatActivity() { + private val player = TonePlayer() + private lateinit var root: LinearLayout + private val prefs by lazy { getSharedPreferences("somente", MODE_PRIVATE) } + private var answerButtons = mutableListOf