Política de privacidade do Dish para Android
Vigente desde 2026-05-21. Esta política se aplica à aplicação Dish para Android publicada pela TinkerNorth ("nós", "TinkerNorth", "Dish") e distribuída via GitHub Releases. Se você está lendo isto de dentro do app, também pode encontrar a versão mais recente em https://dish.tinkernorth.com/privacy/dish-android/.
A versão curta
O Dish para Android não coleta nenhuma informação pessoal, identificadores de dispositivo, analytics de uso ou dados de publicidade. Não tem sistema de contas. O único processador operado pela TinkerNorth que ele contata é o Firebase Crashlytics, e apenas quando o app falha. Nunca durante o uso normal.
Os relatos de crash carregam um stack trace, o modelo do aparelho, a versão do Android e um UUID de instalação gerado automaticamente. Eles não carregam a sua entrada de controle, os nomes ou endereços IP dos Satellites com os quais você pareia, seu SSID de Wi-Fi ou qualquer informação de contato. O escopo completo do Crashlytics está na seção 5 abaixo. Você pode optar por sair a qualquer momento pelo ícone de engrenagem na tela principal → Configurações → Diagnósticos → Compartilhar relatos de crash; a escolha persiste através de inicializações e é honrada antes que qualquer crash possa ser carregado na próxima inicialização.
Tudo o mais que o app faz acontece no seu dispositivo ou entre o seu dispositivo e os servidores Satellite com os quais você explicitamente pareou na sua própria LAN. O stream UDP criptografado de controle é tráfego local apenas; não o vemos nem o processamos.
A versão mais longa abaixo explica exatamente o que o app faz no dispositivo, quais permissões ele requisita e por quê, onde os dados vivem e quais são os seus direitos sob a GDPR (UE), UK GDPR, CCPA / CPRA (Califórnia) e LGPD (Brasil).
Quem somos
A TinkerNorth é um projeto de um único desenvolvedor que publica o Dish e a suíte Satellite como software gratuito e de código aberto. Não operamos um serviço comercial vinculado ao Dish para Android. Para perguntas de privacidade, contate privacy@tinkernorth.com.
1. Informações que não coletamos
Para clareza, aqui está o que o Dish para Android não coleta, embora muitos apps nesta categoria coletem:
- Sem nome, endereço de e-mail, número de telefone ou credenciais de conta.
- Sem ID de publicidade (AAID), Android ID, IMEI ou outros IDs de rastreamento de publicidade.
- Sem localização precisa ou aproximada.
- Sem contatos, calendário, fotos, arquivos ou áudio de microfone.
- Sem analytics gerais de uso. Não rodamos Firebase Analytics, Google Analytics ou qualquer outro pipeline de rastreamento de eventos. Os únicos dados fora do dispositivo são o escopo do Crashlytics apenas para crashes descrito na seção 5.
- Sem dados de publicidade e sem publicidade no app.
- Sem metadados sobre os jogos que você joga, os controles que você usa ou os horários em que os usa.
2. Informações processadas localmente no seu dispositivo
As seguintes informações são processadas localmente no seu dispositivo. Elas não saem do seu dispositivo, exceto onde explicitamente notado que vão para um servidor Satellite com o qual você pareou na sua própria LAN:
- Entradas de controle. Botões apertados, posições dos sticks analógicos e pressão dos gatilhos do overlay de toque na tela ou de um controle físico conectado ao seu celular. Estes são criptografados ponta a ponta (ChaCha20-Poly1305) e enviados apenas para os servidores Satellite com os quais você pareou, sobre UDP na sua LAN.
- Leituras de sensor de movimento. Se você ativar o encaminhamento de giroscópio / acelerômetro, a saída da IMU do celular é amostrada a até 250 Hz, criptografada e enviada para o Satellite pareado. Isso está desligado por padrão e é alternado na atividade de overlay do app.
- Estado da bateria. O app lê o nível da bateria do seu celular e o status de carregamento do
BatteryManagerdo Android para que ele possa encaminhar uma capacidade de bateria para o seu Satellite a cada 30 segundos e em transições de estado. Isso é enviado criptografado apenas para o Satellite pareado. - Lista de Satellites pareados. Quando você pareia com um Satellite, o app armazena o endereço IP do satélite, porta, nome de exibição, identificador de dispositivo e a chave simétrica de 256 bits por satélite derivada durante o handshake de pareamento X25519. Isso é mantido nas
SharedPreferencespor app do Android e está sandboxed ao app. - Hosts Bluetooth lembrados. Se você usa o recurso de passthrough Bluetooth HID, o app armazena o endereço MAC e o nome de cada host lembrado em
SharedPreferencespara que você possa reconectar sem reparear. - Servidores LAN descobertos. O endereço IP, porta e nome de qualquer Satellite anunciado na sua rede local via mDNS ou broadcast UDP, mantido em memória pela duração do ciclo de descoberta. Não persistido através de inicializações a menos que você escolha parear.
- Preferências do app. Tipo de controle por slot (Xbox / PlayStation), layouts de overlay de toque por jogo, seleção de idioma. Armazenado em
SharedPreferencesno seu dispositivo. - Logs do Android. Como todo app Android, o Dish escreve mensagens de diagnóstico no log do sistema Android (
logcat). Esses nunca saem do seu dispositivo; eles são visíveis para você (e para qualquer um com acesso de USB debugging ao seu celular), mas não são transmitidos para lugar nenhum.
3. Permissões que o app requisita, e por quê
As permissões que o Dish para Android declara em seu AndroidManifest.xml estão listadas abaixo com a razão exata pela qual cada uma existe.
INTERNET. Necessária para enviar pacotes UDP criptografados de controle para um Satellite na sua LAN e para realizar o handshake HTTPS de pareamento. Não contatamos nenhum servidor que operamos.ACCESS_NETWORK_STATE. Permite que o app perceba quando você não tem Wi-Fi e mostre um banner útil em vez de falhar silenciosamente.ACCESS_WIFI_STATE. Usada para detectar se você está em Wi-Fi, para que o app possa te avisar que o Satellite está inalcançável por dados móveis.CHANGE_WIFI_MULTICAST_STATE. Necessária para descoberta mDNS / Bonjour de servidores Satellite na sua LAN. Sem ela, o único caminho de descoberta é o broadcast UDP legado.WAKE_LOCK. Mantém a tela / CPU acordadas durante uma sessão de streaming ativa para que um botão apertado não seja atrasado pelo Doze.FOREGROUND_SERVICEeFOREGROUND_SERVICE_CONNECTED_DEVICE. O Android exige um serviço de primeiro plano para manter uma sessão de dispositivo conectado de longa duração viva quando o app está em segundo plano. O tipo de serviço connected-device combina com o caso de uso controlador-para-host.POST_NOTIFICATIONS(Android 13+). Posta a notificação de sessão em andamento exigida pelo serviço de primeiro plano, mais banners opcionais para mudanças de estado de conexão. Você pode recusar e o app ainda funciona; a notificação só não fica visível.VIBRATE. Roteia eventos de vibração encaminhados do seu jogo para o(s) vibrador(es) do celular para que você os sinta na sua mão.BLUETOOTH/BLUETOOTH_ADMIN(Android ≤ 11),BLUETOOTH_CONNECTeBLUETOOTH_ADVERTISE(Android 12+). Necessárias apenas se você usa o recurso de passthrough Bluetooth HID para registrar o seu celular como um controle Bluetooth virtual para outro host. Nunca buscamos ou registramos dispositivos com os quais você não escolheu explicitamente parear.
O app não requisita nenhuma destas permissões: localização (precisa ou aproximada), câmera, microfone, contatos, calendário, SMS, registro de chamadas, sensores corporais, arquivos / mídia. Se uma futura versão precisar de alguma delas, esta política será atualizada antes do lançamento.
4. Comportamento de rede
O Dish para Android inicia tráfego de rede em quatro lugares:
- Descoberta de LAN. O app envia e escuta consultas mDNS / Bonjour no endereço multicast
224.0.0.251:5353, e escuta beacons legados de broadcast UDP na porta 9879. Esse tráfego fica na sua rede local. - Handshake de pareamento. Quando você toca em um Satellite descoberto e insere o PIN de 4 dígitos exibido no Satellite, o app faz uma única requisição HTTPS POST ao IP do Satellite na porta TCP 9443. O corpo da requisição contém uma chave pública X25519 de 32 bytes, o PIN, o identificador do dispositivo e o rótulo do dispositivo. O certificado do Satellite é autoassinado e não é validado contra uma CA pública; a confiança é estabelecida pelo PIN, que é consumido uma vez e depois destruído.
- Sessão de streaming. Uma vez pareado, o app envia pacotes UDP autenticados por ChaCha20-Poly1305 para o IP do Satellite na porta 9876 e escuta pacotes de caminho de retorno (vibração, lightbar, eventos de status) no mesmo socket. Heartbeats disparam a cada 2 segundos.
- Relatos de crash. Se (e apenas se) o app falhar ou tiver ANR, o SDK do Firebase Crashlytics incluído faz upload de um relato de crash para o Google. O escopo detalhado e exclusões estão na seção 5. Não há caminho de telemetria de operação normal: sem endpoint de analytics, sem endpoint de "verificar atualizações", sem endpoint de configuração remota. Verificações de atualização são feitas pela Google Play Store ou por você manualmente.
Todo tráfego HTTPS de saída também é restringido por um network_security_config.xml explícito que nega texto puro para todo host, então uma regressão futura não pode silenciosamente degradar uma conexão para HTTP puro.
5. Relato de crash (Firebase Crashlytics)
O Dish para Android usa o Firebase Crashlytics (fornecido pela Google LLC) para coletar relatos de crash e ANR para que possamos diagnosticar bugs que escapam dos testes. O Crashlytics é o único fluxo de dados do seu dispositivo para um processador operado pela TinkerNorth.
Quando o app falha (uma exceção Kotlin não tratada, um sinal fatal na camada nativa JNI ou um evento de Application Not Responding), o Crashlytics faz upload de:
- O stack trace (Kotlin e/ou nativo).
- Modelo do dispositivo, fabricante, versão do Android, idioma, RAM livre e disco livre no momento do crash.
- O código de versão e nome de versão do app.
- Um ID de Instalação do Firebase: um UUID gerado automaticamente que nos permite contar instalações únicas afetadas sem te identificar pessoalmente.
- As últimas linhas de log que explicitamente sinalizamos como relevantes. Não fazemos upload de conteúdo geral de
logcat.
O Crashlytics não recebe:
- Os nomes, IPs ou endereços MAC de Satellites ou hosts Bluetooth com os quais você pareia.
- Seus eventos de entrada de controle, incluindo streams de movimento e touchpad.
- Seu SSID de Wi-Fi, BSSID ou endereço IP.
- Qualquer informação de contato, endereço de e-mail ou nome.
- O conteúdo do fio UDP criptografado de controle.
O Crashlytics retém dados de crash por 90 dias, depois os deleta. Veja a Política de Privacidade e Segurança do Firebase do Google para o papel do Google como processador. A TinkerNorth é a controladora de dados; o Google é o processador.
Optando por sair. Toque no ícone de engrenagem na tela principal, então em Configurações sob Diagnósticos desligue Compartilhar relatos de crash. O interruptor está ligado por padrão. Desligá-lo chama FirebaseCrashlytics.setCrashlyticsCollectionEnabled(false) e persiste a escolha em armazenamento privado do app. A próxima inicialização do app aplica a preferência salva antes de qualquer caminho de código que poderia produzir um relato de crash, e o controlador observa a preferência pelo resto da sessão para que um opt-out no meio da sessão tome efeito imediatamente. A preferência é incluída no backup em nuvem do Android, então sobrevive a transferências de dispositivo. Relatos de crash já coletados antes de você optar por sair permanecem no Firebase até que sua retenção padrão de 90 dias expire, então são deletados.
Variantes de build que vêm sem um google-services.json (por exemplo, qualquer um que construa do código-fonte por conta própria) não têm SDK do Crashlytics inicializado, mesmo se o toggle estiver ligado. O controlador detecta isso via FirebaseApp.getApps e fica inerte.
Não rodamos o Firebase Analytics. Crashlytics e Analytics são produtos Firebase separados e este app faz link apenas com o Crashlytics. Mantivemos deliberadamente a dependência firebase-analytics fora do build, porque incluí-la coletaria automaticamente eventos (first_open, session_start, screen_view, app_remove, etc.) e puxaria com.google.android.gms.permission.AD_ID para o manifesto de produção. Nenhum dos dois é verdade hoje. Se o Analytics for adicionado, esta política será atualizada antes que a mudança seja lançada.
6. Serviços e SDKs de terceiros
Dependências que vêm dentro do APK:
- AndroidX (Google): bibliotecas padrão de suporte do Android.
- Material Components for Android (Google): widgets Material 3 de UI.
- AndroidX GameActivity (Google): ponte nativa de game-loop.
- libsodium (construído do código-fonte via NDK): a biblioteca de primitivas criptográficas, usada para ChaCha20-Poly1305 e X25519. Não inicia nenhum tráfego de rede.
- Firebase Crashlytics + Firebase Installations (Google): apenas relato de crash + ANR, escopo detalhado na seção 5. O SDK é sempre incluído no APK; ele só inicializa quando o build foi montado com um
google-services.jsonválido. Sem esse arquivo (por exemplo, qualquer um que construa do código-fonte sem um projeto Firebase), o Crashlytics fica inerte em runtime e nada sai do dispositivo.
O Firebase Analytics está deliberadamente fora do build. Incluí-lo coletaria automaticamente eventos e puxaria a permissão AD_ID para o manifesto, ambos os quais conflitam com esta política. O arquivo app/build.gradle.kts tem um comentário explicando a escolha para que um futuro contribuidor veja a restrição antes de readicionar a dependência.
A lista completa de dependências está em app/build.gradle.kts no repositório dish-android e no software bill of materials (SPDX + CycloneDX) enviado com toda versão com tag.
Se você obteve o Dish para Android pelo Google Play, a própria Play Store é regida pela política de privacidade do Google. Isso é separado desta política e fora do nosso controle.
7. Dados que compartilhamos
Não vendemos, alugamos ou compartilhamos informações pessoais para publicidade, marketing ou qualquer propósito comercial. Não temos relações com redes de publicidade, fornecedores de analytics, fornecedores de detecção de fraude ou parceiros de marketing. O único terceiro que jamais recebe qualquer dado deste app é o Google LLC, atuando como processador para o Firebase Crashlytics sob o escopo descrito na seção 5.
8. Retenção de dados
Dados no dispositivo vivem até você desinstalar o app ou usar a opção "Limpar armazenamento" do Android em Configurações > Apps > Dish.
Duas peças de dados privados do app interagem com o backup em nuvem do Android de forma diferente:
- Chaves compartilhadas de Satellites pareados e hosts Bluetooth lembrados (arquivo
connection_store.xml) são excluídos do auto-backup e da transferência de dispositivo, para que o material de criptografia nunca saia do seu dispositivo. Reparear é a resposta certa quando você muda para um celular novo. - A preferência de opt-out de relato de crash (arquivo
user_preferences.xml) é incluída no backup em nuvem, para que um "não obrigado" deliberado se carregue para um dispositivo de substituição sem que você precise virar o toggle de novo.
O Crashlytics retém relatos de crash por 90 dias na infraestrutura do Google, depois os deleta.
9. Privacidade infantil
O Dish para Android não é direcionado a crianças menores de 13 anos (ou abaixo da idade equivalente na sua jurisdição: 14 na Coreia do Sul, 16 na maior parte da UE). O escopo do Crashlytics descrito na seção 5 não contém nenhuma informação que pudesse identificar uma criança como criança (sem nome, sem data de nascimento, sem e-mail). Se você acredita que dados de uma criança foram coletados por este app, mande um e-mail para privacy@tinkernorth.com com o ID de Instalação do Firebase ou um timestamp recente de crash e nós purgaremos os relatos associados.
10. Transferências internacionais
Dados no dispositivo não saem do seu dispositivo. O payload do relato de crash do Crashlytics é enviado para o Google LLC e pode ser processado em qualquer país onde o Google opera infraestrutura, incluindo os Estados Unidos. Transferências da EEE / Reino Unido para os EUA se apoiam em Cláusulas Contratuais Padrão; veja os Termos de Processamento e Segurança de Dados do Google para a documentação completa do mecanismo de transferência.
11. Seus direitos
11.1 GDPR (Espaço Econômico Europeu)
Se você está na EEE, o Regulamento Geral de Proteção de Dados (GDPR) te dá os direitos de acesso, retificação, eliminação, restrição de processamento, portabilidade de dados e objeção. Os únicos dados pessoais que processamos para usuários na EEE são o ID de Instalação do Firebase e o payload do relato de crash descrito na seção 5. Para exercer qualquer um desses direitos:
- Parar a coleta (direito a objetar / retirar consentimento): abra o app, toque no ícone de engrenagem na tela principal, então em Configurações sob Diagnósticos desligue Compartilhar relatos de crash. A preferência tem efeito pelo resto da sessão imediatamente e é reaplicada antes que qualquer crash possa ser carregado a cada inicialização subsequente do app. Desinstalar o app ou construir do código-fonte sem um
google-services.jsonsão caminhos equivalentes de parar a coleta. - Acesso, correção, eliminação, portabilidade: mande um e-mail para privacy@tinkernorth.com com a data / hora aproximada do crash e o modelo do seu aparelho. Não mostramos o ID de Instalação do Firebase na UI do app, então identificamos relatos por timestamp + modelo do aparelho em vez de pedir que você cave o ID de logs de debug. Verificaremos se algum relato bate e responderemos em até 30 dias conforme exigido pelo Art. 12(3) da GDPR.
Bases legais. O processamento local no dispositivo (entrada de controle, chaves de pareamento, hosts lembrados) se apoia no seu consentimento, expresso ao instalar o app e conceder permissões, e na execução de um contrato quando você pede para o app parear e transmitir para o seu Satellite. O processamento do Crashlytics se apoia no nosso interesse legítimo (Art. 6(1)(f) da GDPR) em manter um app funcionando, balanceado contra o estrito escopo sem PII descrito na seção 5.
Transferências internacionais. Dados do Crashlytics são processados pelo Google LLC, que pode transferir dados para fora da EEE sob Cláusulas Contratuais Padrão. Veja os Termos de Processamento e Segurança de Dados do Google.
Você tem o direito de registrar uma reclamação na sua autoridade nacional de proteção de dados. Uma lista é mantida pelo Conselho Europeu de Proteção de Dados.
11.2 UK GDPR (Reino Unido)
Se você está no Reino Unido, a UK GDPR espelha os direitos da seção 11.1 acima. Sua autoridade supervisora é o Information Commissioner's Office (ICO). O mesmo escopo do Crashlytics e mecânicas de opt-out se aplicam.
11.3 CCPA / CPRA (Califórnia)
Se você é residente da Califórnia, a California Consumer Privacy Act (conforme alterada pela CPRA) te dá os direitos de saber, deletar, corrigir, optar por sair da venda ou compartilhamento e limitar o uso de informações pessoais sensíveis. Nós não vendemos nem compartilhamos informações pessoais (conforme definido sob CCPA / CPRA), e não o fizemos nos 12 meses anteriores. Nenhum link "Do Not Sell or Share My Personal Information" é necessário porque não há venda ou compartilhamento dos quais optar por sair.
Para exercer um "direito de saber" ou "direito de deletar" contra o escopo de relato de crash na seção 5, mande um e-mail para privacy@tinkernorth.com com seu ID de Instalação do Firebase (ou um timestamp recente de crash e modelo do aparelho). Você também pode designar um agente autorizado para fazer um pedido em seu nome.
11.4 Outros estados dos EUA
Residentes da Virgínia (VCDPA), Colorado (CPA), Connecticut (CTDPA), Utah (UCPA), Texas (TDPSA) e outros estados com leis abrangentes de privacidade têm direitos equivalentes. O mesmo escopo do Crashlytics e mecânicas de opt-out se aplicam.
11.5 LGPD (Brasil)
Se você está no Brasil, a Lei Geral de Proteção de Dados (LGPD) te dá os direitos de confirmação, acesso, correção, anonimização, portabilidade e eliminação. O mesmo escopo do Crashlytics e mecânicas de opt-out se aplicam. Para exercer qualquer direito, mande um e-mail para privacy@tinkernorth.com. Nosso contato de DPO é o mesmo endereço.
12. Segurança
Cada pacote trocado entre Dish e Satellite é selado com ChaCha20-Poly1305 IETF usando uma chave simétrica de 256 bits derivada de uma troca de chaves X25519 semeada por um PIN de pareamento de quatro dígitos. A chave nunca sai do seu dispositivo ou do Satellite pareado, e o PIN é destruído depois do pareamento. Para o modelo de ameaças completo veja /security/ neste site.
Para reportar uma vulnerabilidade, veja o SECURITY.md no repositório do Satellite.
13. Mudanças nesta política
Atualizaremos esta política se o comportamento do app mudar de uma forma que afete o que está descrito aqui. Mudanças materiais serão anunciadas nas notas de lançamento do app e a data "Vigente desde" no topo desta página será atualizada. A versão anterior de cada política é preservada no histórico git deste site.
14. Contato
Privacidade: privacy@tinkernorth.com
Segurança: veja o SECURITY.md no repositório do Satellite
Geral: abra uma issue no GitHub em o repositório dish-android
← Voltar ao índice de privacidade