Skip to content

Releases: lhzin0/auroraplay

AuroraPlay 3.4.3

Choose a tag to compare

@lhzin0 lhzin0 released this 17 Oct 02:49

Continuar do meio (PlayerManager.prefetchOpening com a fração, readResumePoint): na série e no filme, 1,5 s após abrir a página, lidos para o buffer de assistir o começo (4 MiB, cuja resposta dá o tamanho do arquivo), o fim (4 MiB, onde costuma estar o índice do MP4/MKV) e 16 MiB a partir de 4 MiB antes do ponto estimado (resumeReadAheadRanges). A página do filme passa a ler antes também o início (MovieDetailsViewModel.readAheadOpening). Mesmas regras de rede da leitura antecipada (readAheadAllowed) e nada com outro vídeo tocando.

Buffer de assistir mantido 10 min depois de o app ficar parado, fechado ou morto (WatchBufferLifetime, marca em watch_buffer/idle_since); depois WatchBufferCleanupWorker (WorkManager, único, atraso de 10 min) o esvazia. Voltar à tela ou tocar em segundo plano cancela; na abertura só esvazia se a marca passou de 10 min. Antes esvaziava a cada abertura.

Dados móveis com a qualidade em Média ou Baixa: 30 s/60 s de buffer à frente em vez de 50 s/180 s (ContentAwareLoadControl.limitAhead, ligado pelo PlayerViewModel com a rede).

Memória: 20 s para trás em vez de 60 com o buffer de assistir ativo (vodBackBufferMs, 60 s abaixo de 640 MB livres); teto do buffer em 40% do heap, de 32 a 160 MB (playerBufferTargetBytes), respeitado antes dos mínimos de tempo.

Validação: :app:assembleDebug, :app:compileReleaseKotlin, :app:ktlintCheck, :app:verifyRoborazziDebug e :app:lintDebug; testes de unidade (incluindo BufferPolicyTest) e capturas sem falha.

Limitações: o teste de fumaça no emulador não roda nesta máquina; sem instalação no Galaxy S23 nesta versão, então a leitura do ponto do Continuar, a limpeza após 10 min e o buffer nos dados móveis não foram vistos no aparelho.


SHA-256 do APK: b2fc413ea788f33d4b2e70c69300f8ef7084b0a36854ba21d667cb64aaa40fb7

AuroraPlay 3.4.2

Choose a tag to compare

@lhzin0 lhzin0 released this 16 Oct 20:15

Publicada antes como 3.4.1.1 (163), que nenhuma instalação via: o leitor do release.json até a 3.4.1 só aceita X.Y.Z. Agora aceita um quarto número (AppRelease.parse), e build-release.ps1 recusa versões fora de X.Y.Z enquanto houver instalações antigas.

Página da série: Próximo e "Ir para" partem do episódio visto mais adiante (resolveSeriesPlaybackTarget), não do tocado por último. Marcar uma temporada anterior como vista deixava o fim dela como o progresso mais recente e o botão voltava para T2:E1 com a temporada 3 pela metade. O próximo é o primeiro não visto depois dele (especiais fora), e a lista abre na temporada do botão.

Validação: :app:assembleDebug, :app:compileReleaseKotlin, :app:ktlintCheck, :app:verifyRoborazziDebug e :app:lintDebug; testes de unidade e capturas sem falha; debug instalado num Galaxy S23.

Limitações: o teste de fumaça no emulador não roda nesta máquina.


SHA-256 do APK: dee76c47d77249326b44652228e3d3d6da2906a110dde8e18f8314cd60e7517e

AuroraPlay 3.4.1.1

Choose a tag to compare

@lhzin0 lhzin0 released this 16 Oct 19:57

Página da série: Próximo e "Ir para" partem do episódio visto mais adiante (resolveSeriesPlaybackTarget), não do tocado por último. Marcar uma temporada anterior como vista deixava o fim dela como o progresso mais recente e o botão voltava para T2:E1 com a temporada 3 pela metade. O próximo é o primeiro não visto depois dele (especiais fora), e a lista abre na temporada do botão.

Validação: :app:assembleDebug, :app:compileReleaseKotlin, :app:ktlintCheck, :app:verifyRoborazziDebug e :app:lintDebug; testes de unidade e capturas sem falha; debug instalado num Galaxy S23.

Limitações: o teste de fumaça no emulador não roda nesta máquina.


SHA-256 do APK: 2e1b60ec95c8c9c0978c3a9443eaf607c2caaa23edd2393c3803b4010c819c80

AuroraPlay 3.4.1

Choose a tag to compare

@lhzin0 lhzin0 released this 16 Oct 19:28

Aparência › Luz de fundo em página própria (DetailLightingRoute, Screen.DetailLighting): estilos em cards (Desligada, Original, Luz de cor, Suave, Lateral, Imersiva), cor da capa, do app ou escolhida (8 amostras e HEX), Intensidade, Sumir ao rolar e Ajustes finos (alcance, suavidade, saturação, escurecimento); prévia em dois celulares nas proporções reais (topo e rolado), segurar mostra o salvo; barra de salvar só com alterações e aviso ao sair sem salvar.

Luz desligada por padrão (DetailLightingPreferences.enabled = false): página preta sob a capa, ainda fonte do vidro dos botões. Original desenha o TitleArtBackdrop de antes; escolher um estilo liga a luz.

"Luz de cor" (ColorGlow): a cor da capa como luz do canto superior direito, sem a imagem desfocada.

Fim da luz: a granulação passou para baixo das máscaras (cobria a caixa toda e o pé dela virava uma linha no meio da página) e a cauda termina em 88% da altura, suavizada.

Botão Continuar: o preenchimento termina num degradê de 36 dp centrado no ponto assistido (RESUME_FADE, máscara DstIn em camada própria), no lugar da ponta arredondada com cópias esmaecidas.

Validação: :app:assembleDebug, :app:compileReleaseKotlin, :app:ktlintCheck, :app:verifyRoborazziDebug e :app:lintDebug; testes de unidade e capturas sem falha.

Limitações: o teste de fumaça no emulador não roda nesta máquina; o Galaxy S23 estava fora do alcance do adb, então a luz e o botão Continuar foram conferidos só nas capturas.


SHA-256 do APK: 067279d5ac74dd08fb5a31b2e39c22a0ce983061798da84d52fd1b6b07d3a9c5

AuroraPlay 3.4.0

Choose a tag to compare

@lhzin0 lhzin0 released this 16 Oct 15:25

Temporadas em tela cheia (FullScreenSeasonList) nos detalhes da série (diálogo com a página a 88% de preto) e na galeria de episódios do player, no lugar do cartão; FULL_SCREEN_PICKER traz de volta o card que desce da pílula (5 temporadas fixas, página rolada por BringIntoViewRequester, "Continuar no E5 · faltam 8").

Selo Nova/Novo (EpisodeArrivalStore, user_values episode_arrivals): episódios que um get_series_info traz e a lista guardada não tinha, por 7 dias e enquanto não começados; nada na primeira busca de uma série.

Pular abertura persistido (IntroSkipMemory sobre user_values intro_skip, por perfil, conexão e série); áudio e legenda por série (SeriesTrackStore, series_tracks) por cima dos idiomas do perfil.

Próximo episódio: os primeiros 32 MiB lidos para o buffer de assistir quando o atual termina de carregar; nos dados móveis só com a qualidade em Automática, 4K ou Alta (readAheadAllowed). Detalhes da série: 16 MiB do episódio do Continuar após 1,5 s na página (EpisodeOpeningReader, não ao retomar no meio nem baixado); sinopse e título original do TMDB em paralelo com os episódios.

Buffer de VOD com 60 s para trás; fechar o app para o player e esvazia o buffer de assistir; caches de metadados com limite e esvaziados em onTrimMemory; índices de busca soltos em segundo plano; Cast e serviços pesados no primeiro ócio; coleta de estados só com a tela visível.

Botão Continuar com preenchimento de ponta desfocada, minutos restantes à direita e brilho de 1,6 s com pausa; fixo de 46 dp.

Baixar único na série (DownloadChoiceAction: episódio ou temporada, pausar todos); filme com Baixar na fileira de ações (MovieDownloadAction) e Marcar como visto ao segurar Assistir (AppButton.onLongClick); baixado abre Meus downloads em vez de apagar.

Jogos de hoje com o esporte de cada jogo (Sport, sportOf) e escudos procurados por esporte; placar compacto. Canais com prévia opaca ao conectar. Também em andamento em pôsteres (InProgressPosterCard).

Logo do título: idioma do app, depois pelo nome, neutro, inglês (pickLogo); arte do herói art_v7.

Aviso de nova versão em canal próprio com som (app_update_news), notas e ação Atualizar, uma vez por versão e também em Notificações (abre Atualizações); procura a cada 12 h e ao abrir com mais de 6 h. Botão de teste nas ferramentas de debug.

Vibração ao escolher temporada, marcar episódio visto e pular abertura; lista aberta no episódio onde parou ao escolher temporada começada; "1 temporada" com espaço sem quebra; saga sem "Assistir o próximo".

Validação: :app:assembleDebug, :app:compileReleaseKotlin, :app:ktlintCheck, :app:verifyRoborazziDebug e :app:lintDebug; testes de unidade e capturas sem falha; debug instalado num Galaxy S23.

Limitações: o teste de fumaça no emulador não roda nesta máquina; o aviso de nova versão de um build final e o selo Nova com episódios reais não foram vistos no aparelho.


SHA-256 do APK: 5f851be9bf81008afd90c1517fe03f916dd922a2c178e70e3a0b28145dd5489b

AuroraPlay 3.3.4

Choose a tag to compare

@lhzin0 lhzin0 released this 15 Oct 00:42

Dados do usuário num banco próprio (auroraplay_user.db): perfis, playlists, favoritos, listas, progresso, histórico e user_values; auroraplay.db fica só com o catálogo. Migração 33→34 sem apagar nada, cópia linha a linha das tabelas pessoais na primeira abertura; backup versão 6 (1 a 5 continuam restaurando).

Versões do mesmo título por idioma (titleVersions, preferredVersion): dublado, legendado, outros idiomas e playlists num item; troca no player no mesmo minuto; escolha manual que não abre oferece voltar, nunca troca sozinha. Perfil › Idiomas com áudio principal e alternativo, legendas e idioma da interface.

Legendas automáticas (AutoSubtitles): áudio em outro idioma liga a legenda no idioma do app (variante exata primeiro, pob/por/rótulo "Português (Brasil)"), áudio no idioma do app desliga; escolha manual vale até o fim do item e fica no perfil; sem legenda compatível, aviso de 4 s e nenhuma de outro idioma.

Histórico permanente (content_identity, ContentRelinker): sobrevive à exclusão ou troca da playlist e religa pela obra; playlist desativada só esconde. Um card por obra no Histórico, Continuar assistindo, Minha lista e fileiras.

Jogos de hoje em placar com data de cada jogo, escudos (TheSportsDB, nome exato do mesmo esporte), atualizar, busca por time/campeonato/canal, canais repetidos agrupados e time seguido pelo menu do jogo. Widget 4×1 "Jogos do seu time" (TodaysGameWidget, atualizado a cada 15 min só com widget na tela).

Novidades › Em breve: próximo episódio do TMDB (next_episode_to_air) das séries da Minha lista e das vistas nos últimos 60 dias, só o que ainda não está na playlist (DiscoveryRails.upcoming).

Perfil infantil no celular: abas Início, Desenhos, Filmes e Meu Aurora (mainTabsFor) e Início própria (KidsHome) com cartão de continuar e grades de quadrados.

Qualidade por rede: "Qualidade no Wi-Fi" e "Qualidade nos dados móveis" (720p por padrão), com consumo por hora; rede cobrada por uso conta como dados móveis; troca ao vivo pelo trackSelectionParameters, sem recomeçar, com aviso de 4 s.

Permissões: pedido de notificação do Android na primeira entrada; depois, uma folha por abertura com o que falta (alarmes exatos, instalar atualizações, PiP quando ligado no app). Não aparece na TV.

Ouvir com a tela desligada, travar a tela do player, "Anteriormente" nas séries, Gostei e Amei alimentando as recomendações, "Me avise quando chegar" na busca, fileiras Em alta agora e Continue a saga, download de temporada com progresso, pausar e cancelar.

Transições sem pôster duplicado ou preso (chave por lugar na tela), voltar segurado sem a página escura, nomes longos quebrando só entre palavras; esqueleto da Início no tamanho da página real; Personalizar Início espera as trilhas e abre no topo da lista (abria vazio e depois rolado até o fim).

Chave padrão do TMDB cifrada no repositório e no APK (TmdbKey); dependências e targetSdk 37.

Validação: :app:assembleDebug, :app:compileReleaseKotlin, :app:ktlintCheck, :app:verifyRoborazziDebug e :app:lintDebug; testes de unidade e capturas sem falha; debug instalado e aberto num Galaxy S23.

Limitações: o teste de fumaça no emulador não roda nesta máquina; o pedido de notificação da primeira entrada, o widget e a troca de rede durante um vídeo não foram testados no aparelho.


SHA-256 do APK: b2835c2bd4f220ee6f099e760024ad8c1662c44cde133c01cdd5e92e1be3fb0e

AuroraPlay 3.3.3

Choose a tag to compare

@lhzin0 lhzin0 released this 12 Oct 19:26

Seleção em gota líquida nas fileiras de escolha única (LiquidTabs, LiquidTabsState: progresso contínuo, fantasma de âncora e início pela borda para opções distantes) e interruptor em gota com brilho suave (LiquidSwitch, LiquidHalo.Soft); toques com vibração leve (AuroraHaptics).

Busca na barra (ExpandingSearchBar): a lupa num disco cresce e vira o campo, cobrindo título e ícones (o que fica sob o campo some antes de a borda chegar nele); microfone só aberto; Voltar fecha antes de sair; aberta, fecha ao sair da página (só a rotação a mantém). Em Configurações, Canais, Filmes, Séries, categorias, Guia e revisão Kids.

Buscar e Canais: painel colado ao campo (SearchPanelOverlay, SearchPanel) com recentes (seta para o campo, ✕, "Limpar tudo" em cascata) e resultados ao digitar; o painel só desce depois que a barra abre e se revela de cima para baixo; escondido pelo botão de relógio, fica escondido (rememberSearchPanelShown); etiqueta "Busca: … ✕" (SearchTag); carregamento em linhas enquanto a busca responde (SearchLoading). Ao abrir, as recomendações carregam no desenho delas (SuggestionsLoading) em vez de "Busque o que quer assistir" por um instante; as mensagens vazias ficam centradas abaixo do cabeçalho (a ilustração era cortada sob a barra). Canais: busca por número, recentes no perfil, troca de abas sem reclassificar a lista na thread principal; ordem dos canais em Configurações.

Início: chips no desenho da Netflix (HomeChipStyle: 48 dp, cantos contínuos de 7 dp, um fio branco 6%), Categorias em tela cheia; Personalizar Início em Configurações › Aparência (HomeCustomizeRequest); destaque com sombra e aro fino.

Página Novidades (NewsPage): Filmes novos, Séries novas e os dois Top 10 em chips que seguem o feed; cards com cena 16:9 do TMDB, logo (branco quando escuro), linha de chegada ou posição, sinopse, Assistir e Minha lista; cenas e logos buscados só para o que entra na tela (HomeViewModel.ensureArt, cache de artes 60 → 160); cabeçalho de vidro como o dos detalhes (ShadedHeaderPage(glass)).

Busca nas páginas de categoria (CategoryViewModel.updateQuery, nomes dobrados uma vez) em grade.

Bordas contínuas (SmoothCornerShape, suavização 0,6) e tokens AuroraRadius/AuroraShape em cartões, botões, painéis e foco concêntrico.

Detalhes: Minha lista, Visto e Não tenho interesse otimistas (PendingToggle) com inchaço e anel ao ligar; menu do download em andamento (DownloadMenuBox: pausar todos, cancelar, abrir downloads); download quadrado da altura do Assistir (DetailDownloadButton); Assistir preso embaixo em pílula compacta no tom do botão da página, com sombra longa sem corte; ScrolledPast decide pela metade da tela quando o botão sai da lista (sumia numa rolagem rápida).

Barra de navegação com sombra suave e aro fino sobre o vidro.

Barra de status sem pulos: o espaço dela fica reservado no conteúdo das listas (statusBarsRoom), as barras sobrepostas sobem suavemente para ele (statusBarsRise) e as páginas em coluna deslizam junto (statusBarsFollow) — rolar rápido para baixo e para cima fazia os cards tremerem.

Filmes e Séries: sem o filtro "Mais recentes"; a grade some num degradê de 28 dp sob o cabeçalho quando rolada. Downloads vazio centralizado; "Verificar agora" no cartão de atualização.


SHA-256 do APK: fbe90b56a2b78b513c99e191e59e98d520b7c4224a9dce937287ba53087aaa7a

AuroraPlay 3.3.2

Choose a tag to compare

@lhzin0 lhzin0 released this 09 Oct 22:33

O episódio em andamento ganhou um cartão mais proporcional à lista, mantendo o progresso e a retomada em destaque.

O anel do botão de voltar ao topo acompanha a posição real da rolagem e anima até o estado correto.

Corrigida a orientação ao abrir e fechar o player rapidamente: a navegação aguarda o retorno ao modo vertical antes de revelar a página anterior. O comportamento foi confirmado pelo usuário no S23.

Testes de regressão cobrem a saída rápida do player e a atualização tardia do tamanho do vídeo.


SHA-256 do APK: fbb54657564b17bc10f70387d5d34f0643b1b765940d685ddb6a77a6e5868267

AuroraPlay 3.3.1

Choose a tag to compare

@lhzin0 lhzin0 released this 09 Oct 03:51

Revisão visual em rodadas, cada mudança escolhida entre três versões renderizadas nas telas reais (ScreenCaptureBase, Roborazzi). Contraste AA dos cinzas (AuroraColors.TextSecondary/TextTertiary, novo TextDisabled); foco do controle remoto como anel branco externo com vão escuro (focusRing, focusRowMark); avisos tipados em pílula (NoticeKind, showNotice); trilho da TV estreito com marcador (AuroraTvNavRail).

Foco na TV: o anel era desenhado fora dos limites e cortado por um clip anterior em 47 lugares (Voltar das páginas, engrenagem do Meu Aurora, guia, player, perfis, configurações); tvFocusable agora vem antes do clip.

Topo dos detalhes: arte vertical de novo antes de qualquer cena, como na 3.2.0 (pickHeaderArt); a cena cortada às pessoas só entra sem arte vertical. Antes, uma capa vertical não "limpa" perdia para uma cena 6:5 (chapéus cortados, logo sobre os queixos). Escolhas guardadas refeitas (header_art_choice_v3). Na TV/tablet, o cabeçalho de filme (WideDetailHeader) usa o enquadramento do palco (DetailHeaderArt). Desfeita uma mudança local que mantinha o letreiro da capa das séries e escondia o logo.

Detalhes no celular: Continuar e baixar lado a lado, atalhos antes da descrição (DetailActions); descrição de filme aberta com "Ler menos"; semelhantes depois da primeira tela. Episódios em lista plana.

Guia: channelDisplayName tira marcadores de qualidade sem baixar as maiúsculas; títulos longos em uma linha. Player: margem mínima dos tempos (TIMELINE_MIN_SIDE). Canais ao vivo: ordem ao lado do Guia, filtros fixos com a lista por baixo.

Adicionar playlist: campos AuroraTextField com rótulo interno, erro com "Tentar novamente"/"Revisar dados" e formulário preservado (ConnectionFormState).

Meu Aurora na TV com a foto ao lado (ResumeHero(sideBySide)); aviso novo sem arte em linha (FreshNoticeRow); Downloads vazio sem o cartão "0 B usados"; páginas de ajustes numa coluna de 640dp na TV (readingColumn).

Texto grande: FitText/FitTextGroup — rótulos em caixas fixas encolhem só o necessário, sem quebrar palavra nem ficar abaixo do tamanho normal; vizinhos com o mesmo tamanho (TextAutoSize, sem subcomposição).

Backup: seleção do que entra (BackupSelection), arquivo ZIP com fotos de perfil opcionais (BackupArchive); o automático semanal passa a ser ZIP sem senha (sem chave de recuperação). JSON e .aurorabackup antigos continuam restaurando.

Textos: "Ir para o Início", "Última atualização: nunca", toRelativeTimeLabel em meses e anos, "Nada baixado ainda" no lugar de "0 item". Movimento reduzido também no brilho da primeira sincronização. Skeleton da Início no desenho da tela pronta.

Testes: capturas de todas as rotas em celular e TV, 200% de texto, logos de teste; RelativeTimeLabelTest, HeaderRegionTest (escolha da arte), BackupSelectionTest.


SHA-256 do APK: 1abfa8b7cac33a29a219320db7c00af94c7284c43fd1e894d39d6776674493c5

AuroraPlay 3.3.0

Choose a tag to compare

@lhzin0 lhzin0 released this 06 Oct 00:30

Topo dos detalhes (TitleArtBackdrop, FullBleedDetailBanner): arte larga de ponta a ponta; sem arte vertical, o topo guarda as 6 melhores cenas sem letreiro (rankedTextlessArt, art_v5) e enquadra as pessoas inteiras (sceneRegion, sharperScene, header_art_choice_v2). Ao rolar, a arte sobe a 55% do ritmo da página e a barra vira vidro (Haze) só com o nome. A fonte do vidro dos botões (artModifier) cobre a tela inteira, sobre BackgroundBase: antes terminava em 62% da altura e o botão que a cruzava mostrava um degrau de brilho (a "linha"); buttonGlass sem ruído (noiseFactor = 0f).

Botão principal fixo (StickyPrimaryAction): posição guardada junto com a rolagem (ScrolledPast com wasPast salvável), então não some mais ao voltar da página de outro título; botão redondo de voltar ao topo ao lado, com anel que se enche (scrollFraction) e rolagem contínua e suave (smoothScrollToTop, que relê a distância a cada quadro). O progresso de retomada só é desenhado a partir de 3% (MIN_VISIBLE_PROGRESS). A aba Semelhantes foi tentada e descartada: a lista continua no fim da página e o par Capa/Trailer fica como era.

"Ler mais" dos detalhes: sinopse, elenco com personagens e, nas séries, o roteiro (aggregate_credits do TMDB, por número de episódios, criadores fora). Temporadas: pílula que abre para baixo, com progresso e "Marcar temporada como vista" no mesmo cartão; menu com seis itens visíveis e rolagem.

Início e navegação: o hero voa e pousa arredondado (posterKey nos componentes; flightRoutes inclui Busca, Filmes, Séries e categorias); voltar preditivo ligado na MainActivity (leavingCorners); abas trocam com esmaecimento e crescimento de 98%; primeira carga em cascata; pílula do card enche até a troca; fileiras depois da sexta voltam a aparecer depois da cascata; logo escura (isDarkLogo exige também pouca tinta clara, BRIGHT_INK_SHARE) deixa de virar mancha branca.

Toques que confirmam (popSwap, confirmRing): Minha lista, Visto, Não tenho interesse, Baixar e o download de cada episódio.

Transição do player e dos detalhes: abertura do player coordenada com a rotação; detalhes em molas do AuroraMotion, como o resto do app.

Design (mesmos ícones de antes): Meu Aurora, folha de Perfil, Gerenciar perfis, Histórico por dia, Backup (LastBackup), Notificações, Downloads, Minhas playlists e Atualizações; SectionLabel e GroupedCard; estados vazios com ação; três arredondamentos (AuroraRadius: 10 miniaturas, 14 cartões e botões, 18 painéis, menus, folhas e diálogos, player incluído); setas de voltar redondas; vidro fosco nos botões e chips sobre a arte (buttonGlass) e barras de vidro.

Configurações: de volta a uma página só, com busca e seções (SettingsSection); Sobre e Privacidade em cards, e o toque no Sobre mostra a contagem para o Avançado (AboutTapsNotice, cinco pontos, acima do card); sai "Conteúdos assistidos" (o histórico fica em Meu Aurora).

Guia de programação: sai a gravação de programas (aba, botão, ícone, ProgramRecordingScheduler e textos; as gravações já baixadas seguem em Armazenamento); busca logo abaixo do título, só em Programação; cabeçalho com desfoque (ShadedHeaderPage); dias só Ontem, Hoje e Amanhã.

Busca: pesquisas recentes só com o campo em foco (onSearchFocusChange); resultados mudam no lugar (itemMotion).

Sincronização: playlist Xtream atualizada seção por seção, só as desatualizadas, sem recomeçar depois do limite de dez minutos; login recusado, sem credenciais ou plano vencido não tenta de novo a cada poucos minutos; notificação de progresso opcional no CatalogSyncWorker (o Android 12+ recusa o serviço em primeiro plano em segundo plano) e uma sincronização por playlist de cada vez (ConnectionSyncLocks).

Revisão da 3.2.0: aviso de episódio novo passa pela escolha de perfil e PIN (sem deep link); legenda lembrada devolve a permissão de leitura ao esquecer ou trocar o arquivo; esconder o histórico não derruba o app com falha de gravação (contentScopedKey); filtro de período do histórico com corte fixo; alertas leem cada série uma vez por atualização.

Build: variante r8Debug (debug que passa pelo R8 como a release, sufixo -r8).

Testes: 855 → 880+; lint sem erros (142 → 139 avisos).


SHA-256 do APK: 59509dca9b509400029b8f38d7afbc8588cece830ab0cea3b76b96bfb48bb9d2