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 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.