Aves_mio0.88/activity1.md
2026-10-03 12:51:15 +02:00

333 lines
6.4 KiB
Markdown

Sì Fabio, corretto: **quelli fanno parte della feature Activity**, ma sono in cartelle diverse perché non sono tutti widget.
La struttura completa oggi va vista divisa per livelli:
```text
1. Parser / utils
2. Modello dati
3. DB / bootstrap / scan
4. UI Activity
5. Preview / componenti UI
6. Dialog / formatter
```
***
## Struttura Activity attuale completa
### Parser e utility file attività
```text
lib/utils/activity_file_parser.dart
lib/utils/fit_activity_parser.dart
lib/utils/gpx_activity_parser.dart
lib/utils/tcx_activity_parser.dart
```
Questi gestiscono:
```text
- riconoscere file GPX / TCX / FIT
- leggere bytes file
- estrarre tracce GPS
- estrarre sport, distanza, quote, durata, metadata
- produrre ActivityTrack
```
***
### Modelli Activity
```text
lib/model/activity/activity_track.dart
lib/model/activity/activity_entry.dart
lib/model/activity/activity_preview_point.dart
```
Oggi dovresti avere anche:
```text
lib/model/activity/activity_scan_service.dart
lib/model/activity/activity_library_bootstrap.dart
```
Quindi la parte model Activity completa è circa:
```text
lib/model/activity/
├── activity_entry.dart
├── activity_library_bootstrap.dart
├── activity_preview_point.dart
├── activity_scan_service.dart
└── activity_track.dart
```
Ruoli:
```text
activity_track.dart
modello in memoria quando apro/parso un file attività
activity_entry.dart
modello persistito nel DB
activity_preview_point.dart
punti semplificati per thumbnail attività
activity_scan_service.dart
scansione cartella SAF, parsing, inserimento/aggiornamento DB
activity_library_bootstrap.dart
inizializzazione/bootstrap libreria attività
```
***
### UI Activity principale
```text
lib/widgets/activity/activity_files_page.dart
lib/widgets/activity/activity_map_page.dart
lib/widgets/activity/activity_auto_sync_controller.dart
```
Ruoli:
```text
activity_files_page.dart
pagina principale Activity, ora gestisce lista, sport, album, preferiti
activity_map_page.dart
mappa della singola attività
activity_auto_sync_controller.dart
scheduling scan automatico
```
***
### Componenti UI estratti
```text
lib/widgets/activity/activity_list_tile.dart
lib/widgets/activity/activity_sport_groups_view.dart
lib/widgets/activity/activity_album_groups_view.dart
```
Ruoli:
```text
activity_list_tile.dart
righe lista attività DB e attività aperte manualmente
activity_sport_groups_view.dart
griglia/card Sport tipo Album
activity_album_groups_view.dart
griglia/card Album attività
```
***
### Preview thumbnail Activity
```text
lib/widgets/activity/preview/activity_entry_preview.dart
lib/widgets/activity/preview/activity_track_preview.dart
```
Ruoli:
```text
activity_entry_preview.dart
disegna thumbnail da ActivityPreviewPoint salvati nel DB
activity_track_preview.dart
disegna thumbnail da ActivityTrack aperto manualmente
```
***
### Utility UI Activity
```text
lib/widgets/activity/utils/activity_formatters.dart
```
Ruolo:
```text
- format distanza
- format quota
- format data
- format durata
- delta distanza
- delta quota
- calcolo distanza traccia
- lettura diagnostics
- path validation Activity root
```
***
## Quindi la mappa completa consigliata ora è questa
```text
lib/
├── utils/
│ ├── activity_file_parser.dart
│ ├── fit_activity_parser.dart
│ ├── gpx_activity_parser.dart
│ └── tcx_activity_parser.dart
│
├── model/
│ └── activity/
│ ├── activity_entry.dart
│ ├── activity_library_bootstrap.dart
│ ├── activity_preview_point.dart
│ ├── activity_scan_service.dart
│ └── activity_track.dart
│
└── widgets/
└── activity/
├── activity_auto_sync_controller.dart
├── activity_files_page.dart
├── activity_list_tile.dart
├── activity_map_page.dart
├── activity_sport_groups_view.dart
├── activity_album_groups_view.dart
│
├── preview/
│ ├── activity_entry_preview.dart
│ └── activity_track_preview.dart
│
└── utils/
└── activity_formatters.dart
```
***
## Prossimi file che conviene creare
Per ridurre ancora `activity_files_page.dart`, io creerei questi:
```text
lib/widgets/activity/dialogs/activity_recalculate_dialog.dart
lib/widgets/activity/dialogs/activity_db_fields_dialog.dart
```
E magari dopo:
```text
lib/widgets/activity/controllers/activity_groups_loader.dart
```
oppure:
```text
lib/model/activity/activity_grouping.dart
```
per togliere da `activity_files_page.dart` la logica di:
```text
_loadSportGroups
_loadAlbumGroups
```
***
## Refactor consigliato prossimo
Io farei questo ordine:
### Step 4 — Spostare dialog ricalcolo
Nuovo file:
```text
lib/widgets/activity/dialogs/activity_recalculate_dialog.dart
```
Dentro spostiamo:
```dart
_showRecalculateDialog
_CompareLine
```
Trasformandolo in funzione pubblica:
```dart
void showActivityRecalculateDialog({
required BuildContext context,
required ActivityTrack activity,
});
```
***
### Step 5 — Spostare dialog dettagli DB
Nuovo file:
```text
lib/widgets/activity/dialogs/activity_db_fields_dialog.dart
```
Dentro spostiamo:
```dart
_showActivityDbFieldsDialog
_activityEntryDbRows
_DbFieldLine
```
Trasformandolo in funzione pubblica:
```dart
Future<void> showActivityDbFieldsDialog({
required BuildContext context,
required ActivityEntry entry,
});
```
***
### Step 6 — Spostare grouping Sport/Album
Nuovo file possibile:
```text
lib/model/activity/activity_groups.dart
```
Con:
```dart
ActivitySportGroup buildSportGroups(...)
ActivityAlbumGroup buildAlbumGroups(...)
```
Oppure lasciamo i model group vicino ai widget per ora.
***
## In pratica
Sì, hai ragione: nella lista Activity vanno considerati anche questi file:
```text
lib/utils/activity_file_parser.dart
lib/utils/fit_activity_parser.dart
lib/utils/tcx_activity_parser.dart
lib/utils/gpx_activity_parser.dart
lib/model/activity/activity_track.dart
lib/widgets/activity/activity_map_page.dart
lib/widgets/activity/activity_files_page.dart
lib/model/activity/activity_library_bootstrap.dart
```
E adesso anche tutti quelli nuovi che abbiamo creato.
Il prossimo miglior passo è spostare i **dialog** fuori da `activity_files_page.dart`, perché sono ancora uno dei blocchi più grossi rimasti.