Player 1.1.6: orientamento da rotation + box WebView-obsoleta via Chromium-swap (no GeckoView) + field-kit #2

Merged
Max merged 11 commits from fix/portrait-framebuffer-rotation into main 2026-06-12 11:58:59 +00:00
Owner

Cosa

1. Orientamento rendering guidato da rotation (fix)

Chiarimento sviluppatori firmware: l'orientamento lo detta solo il campo top-level rotation (0=landscape, 1=portrait 90°, 3=portrait 270°). sources.orientation è metadata di grafica → ignorato (può valere "portrait" su un sito landscape rotation:0). resolution = tela px (3=1920×1080).

  • applyScreenOrientation (nuovo): su signage Amlogic con SELinux Permissive (es. Navori StiX) il player riallinea il framebuffer del device scrivendo persist.screen.rotation = rotation e riavviando una volta (sys.powerctl, no root). Una grafica cambiata da remoto si auto-applica. Loop-safe + gated OFF-Dahua (zero regressioni sul parco Dahua).
  • applyContentOrientation (framebuffer-aware): rotazione in-app come fallback per pannelli non riorientabili (TV landscape-locked); ruota solo al mismatch → niente quadrato/bande bianche su pannelli già verticali.
  • Validato su StiX: Tabellone (resolution:3, rotation:0) → device landscape 1920×1080, riempie dritto.

2. Box con WebView di sistema obsoleta (Dahua DS04) → Chromium moderno, NON GeckoView

I Dahua DHI-DS04-AI400 (RK3288, Android 8.1) hanno la system WebView a Chromium 61: troppo vecchia per il CSS moderno delle grafiche (:has() ecc.) → card vuote.

  • Detour GeckoView, poi rimosso. È stato introdotto e poi scartato un flavor gecko (GeckoView bundled): la sua WebRender corrompe la rasterizzazione GPU sul Mali-T764 (morsi rossi random agli angoli, che si spostano a ogni refresh). Mappato a terra: irrisolvibile via pref (crash o blank), via --setpref (ignorato), via versione (128/142/149 = whack-a-mole). Il flavor gecko è stato rimosso → il player torna a variante singola (l'app normale).
  • Soluzione: sostituire la system WebView con un Chromium moderno. Chromium (≠ WebRender) ha gestione GPU matura sui chip vecchi → render pulito. Si usa l'app normale (zero modifiche al codice player). Verificato funzionante sul DS04: grafica complessa resa perfetta, niente artefatti.
  • tools/dahua-ds04-webview.sh (nuovo, ripetibile): builda una WebView Chromium 108 ripacchettizzata come com.android.webview (patch binario same-length; firma platform test-key AOSP) e la inietta via root (swap del /system/app/webview/webview.apk + estrazione lib native + reboot), poi installa l'app. Tutto via adb-rete col bypass watchdog (getprop …;). Include rollback.

3. Tool field-kit (tools/)

  • stix-reclaim: riconversione Navori StiX 3700 (Amlogic S922X) a Kipanga no-touch (SD + tasto + rete): build-sd/provision/recover.
  • dahua-ds04-reclaim.sh: riconversione Dahua DS04 (RK3288) a Kipanga DO via adb-rete (bypass watchdog getprop).
  • dahua-ds04-webview.sh: vedi §2.

4. launcher: lancio HOME su BOOT_COMPLETED

Su alcuni firmware (es. StiX) la HOME preferita del DO non è onorata al boot → stallo sul chooser di sistema. Il launcher ora lancia MainActivity su BOOT_COMPLETED (solo, non su MY_PACKAGE_REPLACED).

5. Release 1.1.6 (versionCode 9) — APK in dist/kipanga-field-kit/apks/

Player (variante singola, minSdk 26) + launcher (con fix BootReceiver), release-signed, versionate nel field-kit per gli script di deploy.

Test

  • Build release OK, test unit verdi (variante singola).
  • StiX: orientamento landscape/portrait verificato a video (riorienta + riempie dritto), no reboot-loop, persist.screen.rotation persiste.
  • Dahua DS04: WebView swap a Chromium 108 → grafiche complesse rese senza glitch, deterministico a ogni refresh.

Note deploy

  • Canary obbligatorio per il parco esistente (incl. Dahua — feature orientamento gated off, nessuna regressione attesa).
  • DS04 nuovi via field-kit/reclaim = install pulito (non OTA).
  • minSdk 28→26 (Android 8.0+) per coprire i box vecchi con la system WebView.
## Cosa ### 1. Orientamento rendering guidato da `rotation` (fix) Chiarimento sviluppatori firmware: l'orientamento lo detta **solo** il campo top-level `rotation` (`0`=landscape, `1`=portrait 90°, `3`=portrait 270°). `sources.orientation` è metadata di grafica → **ignorato** (può valere `"portrait"` su un sito landscape `rotation:0`). `resolution` = tela px (3=1920×1080). - **`applyScreenOrientation`** (nuovo): su signage Amlogic con SELinux Permissive (es. Navori StiX) il player riallinea il **framebuffer del device** scrivendo `persist.screen.rotation = rotation` e riavviando una volta (`sys.powerctl`, no root). Una grafica cambiata da remoto si auto-applica. Loop-safe + **gated OFF-Dahua** (zero regressioni sul parco Dahua). - **`applyContentOrientation`** (framebuffer-aware): rotazione in-app come fallback per pannelli non riorientabili (TV landscape-locked); ruota solo al mismatch → niente quadrato/bande bianche su pannelli già verticali. - Validato su StiX: Tabellone (`resolution:3`, `rotation:0`) → device landscape 1920×1080, riempie dritto. ### 2. Box con WebView di sistema obsoleta (Dahua DS04) → **Chromium moderno, NON GeckoView** I Dahua DHI-DS04-AI400 (RK3288, Android 8.1) hanno la system WebView a **Chromium 61**: troppo vecchia per il CSS moderno delle grafiche (`:has()` ecc.) → card vuote. - **Detour GeckoView, poi rimosso.** È stato introdotto e poi **scartato** un flavor `gecko` (GeckoView bundled): la sua **WebRender corrompe la rasterizzazione GPU sul Mali-T764** (morsi rossi random agli angoli, che si spostano a ogni refresh). Mappato a terra: irrisolvibile via pref (crash o blank), via `--setpref` (ignorato), via versione (128/142/149 = whack-a-mole). Il flavor gecko è stato **rimosso** → il player torna a **variante singola** (l'app normale). - **Soluzione: sostituire la system WebView con un Chromium moderno.** Chromium (≠ WebRender) ha gestione GPU matura sui chip vecchi → render pulito. Si usa l'app normale (zero modifiche al codice player). **Verificato funzionante** sul DS04: grafica complessa resa perfetta, niente artefatti. - **`tools/dahua-ds04-webview.sh`** (nuovo, ripetibile): builda una WebView Chromium 108 ripacchettizzata come `com.android.webview` (patch binario same-length; firma platform test-key AOSP) e la inietta via root (swap del `/system/app/webview/webview.apk` + estrazione lib native + reboot), poi installa l'app. Tutto via adb-rete col bypass watchdog (`getprop …;`). Include rollback. ### 3. Tool field-kit (`tools/`) - **`stix-reclaim`**: riconversione Navori StiX 3700 (Amlogic S922X) a Kipanga no-touch (SD + tasto + rete): `build-sd`/`provision`/`recover`. - **`dahua-ds04-reclaim.sh`**: riconversione Dahua DS04 (RK3288) a Kipanga DO via adb-rete (bypass watchdog `getprop`). - **`dahua-ds04-webview.sh`**: vedi §2. ### 4. launcher: lancio HOME su `BOOT_COMPLETED` Su alcuni firmware (es. StiX) la HOME preferita del DO non è onorata al boot → stallo sul chooser di sistema. Il launcher ora lancia `MainActivity` su `BOOT_COMPLETED` (solo, non su `MY_PACKAGE_REPLACED`). ### 5. Release 1.1.6 (versionCode 9) — APK in `dist/kipanga-field-kit/apks/` Player (variante singola, minSdk 26) + launcher (con fix BootReceiver), release-signed, versionate nel field-kit per gli script di deploy. ## Test - Build release OK, test unit verdi (variante singola). - StiX: orientamento landscape/portrait verificato a video (riorienta + riempie dritto), no reboot-loop, `persist.screen.rotation` persiste. - Dahua DS04: WebView swap a Chromium 108 → grafiche complesse rese **senza glitch**, deterministico a ogni refresh. ## Note deploy - **Canary obbligatorio** per il parco esistente (incl. Dahua — feature orientamento gated off, nessuna regressione attesa). - DS04 nuovi via field-kit/reclaim = install pulito (non OTA). - `minSdk` 28→26 (Android 8.0+) per coprire i box vecchi con la system WebView.
Il player ruotava il contenuto in-app solo sul campo top-level rotation
(1/3), ignorando sources.orientation. La console esprime un sito verticale
via orientation:portrait con rotation:0 → il player non ruotava.

Inoltre la rotazione era incondizionata per i portrait, assumendo un
pannello landscape-locked. Sullo StiX 3700 il framebuffer è GIA' portrait
(1080x1920): ruotare lì clippava il contenuto a un quadrato centrato con
bande bianche.

Ora applyContentOrientation ruota in-app SOLO quando l'orientamento del
sito differisce da quello nativo del pannello (mismatch): portrait su TV
landscape -> ruota; portrait su pannello portrait -> riempie diretto.
appliedRotation() incapsula la regola; screenshot coerente (raddrizza solo
se il framebuffer e' uscito landscape).
Script ripetibile per il parco: build-sd (prepara la microSD riutilizzabile
con boot.img custom che abilita adb-tcp + inietta la chiave adb), provision
(install Kipanga + dpm set-device-owner + home persistente), recover (sblocca
un pezzo fermo sul chooser via edit di /data in chiaro).

Asset binari (kernel/dtb/busybox dump del device) tenuti fuori da git, vedi
README. Metodo: memory project_canzone_amlogic_secureboot.
Chiarimento sviluppatori firmware: l'orientamento del rendering lo detta SOLO
il campo top-level rotation (0=landscape, 1=portrait 90, 3=portrait 270);
sources.orientation e' metadata di grafica e va IGNORATO (puo' valere
"portrait" su un sito landscape rotation:0). Rimosso l'uso di sources.orientation
introdotto per errore.

Nuovo applyScreenOrientation: su signage Amlogic (SELinux Permissive, es. Navori
StiX) il device riallinea il proprio framebuffer all'orientamento del JSON
scrivendo persist.screen.rotation = rotation e riavviando una volta (sys.powerctl,
niente root). Cosi' una grafica cambiata da remoto si applica da sola. Loop-safe
(early-return quando combacia + guardia 10min) e gated OFF-Dahua (il Dahua tiene
il suo path: rotazione in-app + SDK). applyContentOrientation resta come fallback
in-app framebuffer-aware per i pannelli non riorientabili (TV landscape-locked).

Validato su StiX: sito Tabellone (resolution 3=1920x1080, rotation 0) ->
device a landscape 1920x1080, riempie dritto.
Nuovo product flavor (dimension engine):
- standard → WebView di sistema, default flotta (APK ~7.7M)
- gecko → GeckoView 128 ESR bundled, armeabi-v7a (APK ~136M), per box
  con WebView troppo vecchia es. Dahua DS04-AI400 RK3288/Android 8.1/Chromium 61

Render gecko = FULL-PAGE: una sola GeckoView (surface opaca = sfondo pagina
+ un iframe per source), perche le surface GeckoView non sono trasparenti e il
layering per-blocco del firmware sbiancherebbe lo sfondo.

LocalMediaServer serve in-server cio che shouldInterceptRequest dava solo alla
WebView (JSON sintetici, stub AndroidBridge, proxy gallery remota) + nuovo
endpoint /__bridge per il cycle-ended nativo (stub fa keepalive fetch, source
auto-ricavata da source-name; route a CycleListener.onCycleEnded). Path WebView
invariato (shouldInterceptRequest e il native JS interface vincono ancora).

minSdk 28->26 (app/launcher/protocol) per Android 8.1.
release.sh builda assembleStandardRelease di default; gecko a parte.
tools/dahua-ds04-reclaim.sh: riconversione DS04 via adb-rete (bypass watchdog).
Su alcuni firmware (es. Navori StiX) la HOME preferita persistente del DO non
viene onorata al boot e il device resta sul chooser di sistema (ResolverActivity)
finche qualcuno non richiede esplicitamente la nostra activity. Lanciamo noi
MainActivity su BOOT_COMPLETED. Solo BOOT_COMPLETED, non MY_PACKAGE_REPLACED
(non strappiamo il foreground a quello che l'utente sta facendo).
GeckoView/WebRender corrompe la rasterizzazione GPU sul Mali-T764 del Dahua
DS04 (morsi random agli angoli, irrisolvibile via pref/versione). La strada
giusta e' Chromium moderno come system WebView + l'app normale (flavor
standard): Chromium ha gestione GPU matura sui chip vecchi, niente glitch, e
non serve NESSUNA modifica al player.

Rimosso: product flavors standard/gecko, dipendenza GeckoView, repo Mozilla,
src/{gecko,standard}/EngineHooks, hook in PageRenderer, serving gecko-only in
LocalMediaServer (bridge/synthetic-json), render-context in PlayerActivity,
build per-flavor in release.sh. Tenuto: minSdk 26 (serve al DS04 Android 8.1
con la system WebView), tools/dahua-ds04-reclaim.sh.

Lo swap del system WebView a Chromium moderno e' una procedura device-side
(vedi tools/dahua-ds04-webview.sh).
Procedura device-side per portare un Chromium moderno (Bromite SystemWebView
108) come system WebView sui Dahua DS04 (RK3288/Android 8.1), cosi' l'app
normale (variante singola) rende le grafiche senza i glitch WebRender/Mali di
GeckoView. Due fasi:
  A) build (host, una volta): scarica Bromite (sha256 verificato), rinomina il
     package org.bromite.webview -> com.android.webview con patch BINARIO
     same-length (apktool non regge il resource-package custom di Chromium),
     firma con la platform test-key AOSP pubblica.
  B) deploy (root via su): backup + sostituzione /system/app/webview/webview.apk,
     estrazione manuale della lib nativa (extractNativeLibs=true), reboot,
     verifica provider, install dell'app.
Tutto via adb-over-rete col prefisso watchdog getprop in g() (NON serve -x:
verificato, non esiste come flag adb/pm; il vero requisito e' il prefisso).
Uso: ./tools/dahua-ds04-webview.sh [IP]  |  ... build  (solo build). Include
comando di rollback. Vedi memory project-kipanga-render-engine-strategy.
Build release-signed (CN=OkOne/Kipanga, non-debug) committate con --force
scavalcando il .gitignore *.apk/dist (richiesta esplicita) per averle versionate
nel field-kit, pronte per gli script di deploy (dahua-ds04-webview.sh /
dahua-ds04-reclaim.sh).
- Kipanga-player.apk: variante singola (post-rimozione flavor gecko), versionCode 9, minSdk 26.
- Kipanga-launcher.apk: include il fix BootReceiver (lancio HOME su BOOT_COMPLETED).
NB: convenzione repo = APK fuori da git/generati da release.sh; questo commit
e' un'eccezione voluta.
Max changed title from Player: orientamento da rotation + tool StiX reclaim (1.1.6) to Player 1.1.6: orientamento da rotation + box WebView-obsoleta via Chromium-swap (no GeckoView) + field-kit 2026-06-12 11:28:15 +00:00
- size-check lib nativa: wc -c invece di 'busybox stat' (applet assente su questo busybox)
- trap EXIT: ${HPID:-} per non triggerare set -u (unbound variable a fine script)
- verifica provider: grep Current (il pattern con spazi si rompeva nel quoting di g())
Deploy completo riuscito: WebView Chromium 108 + app, grafica complessa resa pulita.
- docs/ops/DAHUA_DS04_WEBVIEW.md (nuovo): perche'/prerequisiti/come/verifica/
  rollback/note-parco per lo swap della system WebView a Chromium 108 via
  tools/dahua-ds04-webview.sh.
- docs/ops/README.md: linkata nell'indice + riga nella tabella emergenze.
- dist/kipanga-field-kit/README.txt: bump 1.1.6 + sezione 'caso speciale DS04'
  con puntatore alla procedura (force-add, dist/ e' gitignored).
Max merged commit 5b052c2005 into main 2026-06-12 11:58:59 +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!2
No description provided.