# 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 d’oro

## 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 c’entra.

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 l’UX → 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
