aves_mio100/CHEATSHEET_google_cast_debug.md
2026-07-06 14:52:45 +02:00

369 lines
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Cheatsheet Debug Plugin `google_cast`
Guida ultra-rapida per capire **subito** dove guardare quando qualcosa non funziona.
---
# 1. Flusso mentale in 10 secondi
```text
UI Flutter
cast_controller.dart
google_cast_controller.dart / custom_cast_controller.dart
MethodChannel('google_cast')
FlutterCastFrameworkPlugin.kt
CastMediaClient / CastQueueManager / CastCustomReceiver / SessionHandler
TV / Chromecast / Custom Receiver
```
---
# 2. Se succede X → apri questi file
## Connessione device non parte
- `lib/widgets/collection/app_bar/cast/cast_icon_button.dart`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/FlutterCastFrameworkPlugin.kt`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastDialogLauncher.kt`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastSessionHandler.kt`
---
## Il device si connette ma non parte nessun media
- `lib/widgets/collection/app_bar/cast/cast_bar_inline.dart`
- `lib/widgets/cast/google_cast_controller.dart`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastQueueManager.kt`
---
## Google Cast fa `Invalid Request` appena scelgo il device
- `lib/widgets/cast/google_cast_controller.dart`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt`
### Controlla subito:
- polling avviato troppo presto in `onCastReady`
- sessione connessa ma queue ancora vuota
---
## `MediaQueue error 2001`
- `lib/widgets/cast/google_cast_controller.dart`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastQueueManager.kt`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt`
### Controlla subito:
- queue non caricata davvero
- startIndex invalido
- callback media attiva senza media reale
---
## Slideshow fa prima e seconda foto poi si ferma
- `lib/widgets/cast/google_cast_controller.dart`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt`
### Segnale tipico:
non arriva più `onQueueIndexChanged`
---
## In slideshow un video viene saltato dopo 5 secondi
- `lib/widgets/cast/google_cast_controller.dart`
- `lib/widgets/cast/custom_cast_controller.dart`
### Regola corretta:
- foto → timer
- video → nessun timer, deve finire da solo
---
## In manuale/fullscreen le foto avanzano da sole
- `lib/widgets/cast/google_cast_controller.dart`
- `lib/widgets/cast/custom_cast_controller.dart`
### Regola corretta:
- foto manuali/fullscreen → ferme finché non premi next/prev
- video → a fine video vanno al successivo
---
## `Invalid startIndex: X`
- `lib/widgets/collection/app_bar/cast/cast_bar_inline.dart`
- `lib/widgets/cast/google_cast_controller.dart`
- `lib/widgets/cast/custom_cast_controller.dart`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastQueueManager.kt`
### Controlla subito:
- `startIndex` più grande di `entries.length - 1`
- indice vecchio riusato su nuova selezione
---
## Seek cambia sulla TV ma non sul telefono
- `lib/widgets/cast/google_cast_controller.dart`
- `lib/widgets/viewer/fullscreen_cast_viewer.dart`
### Controlla subito:
- `seekCast()` aggiorna `positionNotifier`
- `VideoWidget` locale ascolta `positionNotifier` / `isPlayingNotifier`
---
## Il volume compare ma la barra non si aggiorna
- `lib/widgets/cast/google_cast_controller.dart`
- `lib/widgets/collection/app_bar/cast/cast_controls_sheet.dart`
- `lib/widgets/viewer/fullscreen_cast_viewer.dart`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastMediaClient.kt`
### Controlla subito:
- dopo `setVolume` e `setMute` fai `refreshVolumeStatus()`
- nello slider separa `onChanged` e `onChangeEnd`
---
## Scelgo Google ma sembra partire Custom
- `lib/widgets/collection/app_bar/cast/cast_icon_button.dart`
- `lib/widgets/cast/cast_controller.dart`
- `lib/widgets/cast/custom_cast_controller.dart`
- `lib/widgets/cast/google_cast_controller.dart`
### Controlla subito:
- backend attivo (`_backend`) allineato col backend scelto
- icona Cast solo connect-only
- media avviati solo dalla cast bar
---
## In selection mode la app bar “tocca” anche le foto sotto
- `lib/widgets/collection/app_bar/collection_app_bar.dart`
- `lib/widgets/common/identity/aves_app_bar.dart`
- `lib/widgets/collection/collection_page.dart`
### Controlla subito:
- la barra assorbe i tap?
- è presente `AInkResponse` o equivalente?
- `pinned` + altezza header coerenti col body?
---
## Custom receiver: progress bar duplicate / overlay strani sulla TV
- `lib/widgets/cast/custom_cast_controller.dart`
- `plugins/google_cast/android/src/main/kotlin/com/aves/google_cast/cast/CastCustomReceiver.kt`
- `receiver.html`
- eventuale JS del receiver
### Controlla subito:
- il DOM viene pulito prima di ridisegnare?
- stai creando un nuovo overlay a ogni update?
---
## Volume Custom non cambia davvero il video
- `lib/widgets/cast/custom_cast_controller.dart`
- `receiver.html`
- JS del receiver
### Controlla subito:
- il receiver gestisce davvero `SET_VOLUME`?
- aggiorna `video.volume`?
- risponde con `VOLUME_STATUS`?
---
# 3. Comando → dove passa
## `showCastDialog`
```text
CastIconButton
→ cast_controller.dart
→ google/custom controller
→ MethodChannel('google_cast')
→ FlutterCastFrameworkPlugin.kt
→ CastDialogLauncher.kt
```
## `loadQueue`
```text
CastBarInline / slideshow / fullscreen
→ cast_controller.dart
→ google_cast_controller.dart
→ MethodChannel('google_cast')
→ FlutterCastFrameworkPlugin.kt
→ CastQueueManager.kt
```
## `play / pause / seekTo`
```text
UI controlli
→ cast_controller.dart
→ google/custom controller
→ MethodChannel('google_cast')
→ FlutterCastFrameworkPlugin.kt
→ CastMediaClient.kt
```
## `setVolume / setMute`
```text
UI volume slider / mute
→ cast_controller.dart
→ google/custom controller
→ MethodChannel('google_cast')
→ FlutterCastFrameworkPlugin.kt
→ CastMediaClient.kt (Google)
oppure
→ receiver custom via JSON (Custom)
```
---
# 4. Evento → da dove torna
## `onCastReady`
```text
CastSessionHandler.kt
→ FlutterCastFrameworkPlugin.kt
→ MethodChannel callback
→ google_cast_controller.dart / custom controller
```
## `onQueueIndexChanged`
```text
RemoteMediaClient.Callback in CastMediaClient.kt
→ Flutter invokeMethod
→ google_cast_controller.dart
```
## `onVideoFinished`
```text
RemoteMediaClient.Callback in CastMediaClient.kt
→ Flutter invokeMethod
→ google_cast_controller.dart
```
## `MEDIA_STATUS` / `VOLUME_STATUS` (Custom)
```text
receiver web
→ messaggio custom
→ plugin Android
→ custom_cast_controller.dart
```
---
# 5. Google vs Custom: differenza operativa
## Google Cast standard
Usa:
- queue nativa Cast
- volume di sessione Cast
- callback `RemoteMediaClient`
### Se qualcosa non va, guarda prima:
- `google_cast_controller.dart`
- `CastMediaClient.kt`
- `CastQueueManager.kt`
---
## Custom Receiver
Usa:
- messaggi JSON custom
- receiver web / CAF
- player HTML5 lato TV
### Se qualcosa non va, guarda prima:
- `custom_cast_controller.dart`
- `CastCustomReceiver.kt`
- `receiver.html`
- JS del receiver
---
# 6. Regole doro
## Regola 1
Se la **TV fa la cosa giusta ma il telefono no**:
👉 problema quasi sempre lato Flutter/controller/viewer.
Guarda:
- `google_cast_controller.dart`
- `custom_cast_controller.dart`
- `fullscreen_cast_viewer.dart`
---
## Regola 2
Se **Flutter crede di essere corretto ma la TV fa cose strane**:
👉 problema spesso lato plugin Android o receiver.
Guarda:
- `CastMediaClient.kt`
- `CastQueueManager.kt`
- `CastCustomReceiver.kt`
- receiver JS/HTML
---
## Regola 3
Se il problema nasce **subito dopo la connessione device**:
👉 controlla sempre la distinzione tra:
- sessione Cast pronta
- media davvero caricato
Guarda:
- `CastSessionHandler.kt`
- `google_cast_controller.dart`
- `CastMediaClient.kt`
---
## Regola 4
Se il bug riguarda **selection mode / app bar / tocchi**:
👉 il plugin Cast probabilmente non centra.
Guarda:
- `collection_app_bar.dart`
- `aves_app_bar.dart`
- `collection_page.dart`
---
# 7. Checklist rapidissima prima di impazzire
- Hai salvato tutti i file?
- Hai eliminato eventuali backtick markdown rimasti nel file?
- Hai fatto `flutter clean` se i simboli sembrano “mancare” senza senso?
- Il backend attivo è davvero quello giusto?
- Il problema è Flutter-side, Android-side o receiver-side?
---
# 8. Formula finale da ricordare
## **Flutter decide lUX → il plugin Android parla con Cast → il receiver riproduce davvero**
Quindi ogni bug va classificato subito così:
### A. Flutter / UI
- notifier
- app bar
- selection
- cast bar
- fullscreen viewer
### B. Plugin Android
- sessione
- queue
- callback media
- volume nativo
### C. Receiver
- volume custom
- overlay/progress
- player HTML5
- messaggi custom