player: heartbeat indipendente + gallery sync non-bloccante + indicatore sync (box lenti / DS04) #3

Merged
Max merged 2 commits from fix/heartbeat-gallery-decouple into main 2026-06-12 13:17:15 +00:00
Owner

Problema

Su box lenti (RK3288 / Dahua DS04) con gallery pesante (4K + video) la piattaforma vedeva il player disconnesso e i cambi grafica richiedevano un riavvio manuale.

Causa (diagnosticata a terra sul DS04):

  • L'heartbeat al server stava dentro il loop di poll, dopo la sync gallery.
  • syncGallery ri-calcolava l'MD5 dell'intera gallery DUE volte a ogni chiamata (~2 min su 4K/video) — e veniva chiamata anche a ogni tick del metronomo (~60s).
  • Risultato: loop saturato → heartbeat mai inviato → "offline"; config-poll bloccato → cambi grafica solo dopo restart.

Fix

  • PlayerActivity: heartbeat su coroutine dedicata (startHeartbeat, ogni 60s), decouplata dal loop di sync. Rimosso l'heartbeat dal poll loop.
  • applyConfig: nuovo flag syncGalleryOnApply (default true); i re-render (metronomo / page-navigation / cycle-ended) passano false → niente re-sync gallery a ogni cambio pagina.
  • GalleryRepository: tryLock invece di withLock (skip se una sync è già in corso, niente accodamento); cache MD5 per size+mtime (no re-hash dei file invariati); salta la 2ª passata di hashing se nulla è cambiato.

Test (verificato a terra sul DS04)

sendHeartbeat POST .../get-player-heartbeat/1338-5144-2387  → response: 200   (ogni 60s)
syncGallery skipped: another sync already in progress       (tryLock)
getPlayerConfig GET ...                                      (poll loop gira, ~60s)

Heartbeat 200 ogni 60s anche durante la sync gallery → piattaforma vede il player online; cambi grafica applicati senza restart. Build + test unit verdi.

Migliora tutta la flotta su hardware lento, non solo il DS04.

Piccola pill discreta in basso a destra (spinner + "Sincronizzazione…"), mostrata SOLO mentre la gallery scarica file davvero. Verificato su TV T982 (Android 11) e DS04 (Android 8.1).

## Problema Su box lenti (RK3288 / Dahua DS04) con gallery pesante (4K + video) la piattaforma vedeva il player **disconnesso** e i cambi grafica richiedevano un **riavvio manuale**. **Causa (diagnosticata a terra sul DS04):** - L'heartbeat al server stava **dentro** il loop di poll, **dopo** la sync gallery. - `syncGallery` ri-calcolava l'MD5 dell'**intera gallery DUE volte a ogni chiamata** (~2 min su 4K/video) — e veniva chiamata anche a **ogni tick del metronomo** (~60s). - Risultato: loop saturato → heartbeat mai inviato → "offline"; config-poll bloccato → cambi grafica solo dopo restart. ## Fix - **`PlayerActivity`**: heartbeat su **coroutine dedicata** (`startHeartbeat`, ogni 60s), decouplata dal loop di sync. Rimosso l'heartbeat dal poll loop. - **`applyConfig`**: nuovo flag `syncGalleryOnApply` (default `true`); i **re-render** (metronomo / page-navigation / cycle-ended) passano `false` → niente re-sync gallery a ogni cambio pagina. - **`GalleryRepository`**: `tryLock` invece di `withLock` (skip se una sync è già in corso, niente accodamento); **cache MD5 per size+mtime** (no re-hash dei file invariati); salta la 2ª passata di hashing se nulla è cambiato. ## Test (verificato a terra sul DS04) ``` sendHeartbeat POST .../get-player-heartbeat/1338-5144-2387 → response: 200 (ogni 60s) syncGallery skipped: another sync already in progress (tryLock) getPlayerConfig GET ... (poll loop gira, ~60s) ``` Heartbeat 200 ogni 60s **anche durante** la sync gallery → piattaforma vede il player online; cambi grafica applicati senza restart. Build + test unit verdi. Migliora tutta la flotta su hardware lento, non solo il DS04. ## Aggiunta: indicatore sync gallery Piccola pill discreta in basso a destra (spinner + "Sincronizzazione…"), mostrata SOLO mentre la gallery scarica file davvero. Verificato su TV T982 (Android 11) e DS04 (Android 8.1).
Su box lenti (RK3288/Dahua DS04) con gallery pesante (4K/video) la piattaforma
vedeva il player 'disconnesso' e i cambi grafica richiedevano un riavvio.
Causa: l'heartbeat al server stava DENTRO il loop di poll, DOPO la sync gallery;
e syncGallery re-MD5-ava l'intera gallery DUE volte a ogni chiamata (~2 min),
chiamata anche a ogni tick del metronomo → loop saturato, heartbeat affamato.

Fix (verificata a terra sul DS04: sendHeartbeat 200 ogni 60s anche durante la sync):
- PlayerActivity: heartbeat su coroutine dedicata (startHeartbeat, ogni 60s),
  decouplata dal loop di sync; rimosso l'heartbeat dal poll loop.
- applyConfig: nuovo flag syncGalleryOnApply (default true); i re-render
  (metronomo / page-navigation / cycle-ended) passano false → niente re-sync
  gallery a ogni cambio pagina.
- GalleryRepository: tryLock invece di withLock (skip se una sync e' gia' in
  corso, niente accodamento); cache MD5 per size+mtime (no re-hash dei file
  invariati); salta la 2a passata di hashing se nulla e' cambiato.

Migliora tutta la flotta su hardware lento, non solo il DS04.
Piccola pill discreta (spinner + 'Sincronizzazione…') in basso a destra,
mostrata SOLO mentre la gallery sta effettivamente scaricando file
(GalleryRepository.onDownloadingChanged, non per le sync no-op). Cosi'
operatore/cliente vede che l'oggetto sta ancora scaricando i contenuti.
Verificato: player 1.1.6 gira su TV T982 (Android 11/arm64) e DS04 (Android 8.1).
Max changed title from player: heartbeat indipendente + gallery sync non-bloccante (box lenti / DS04) to player: heartbeat indipendente + gallery sync non-bloccante + indicatore sync (box lenti / DS04) 2026-06-12 13:15:14 +00:00
Max merged commit 898105f4de into main 2026-06-12 13:17:15 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Max/Kipanga_APPS!3
No description provided.