Commit 2ab2e929 authored by Clouard Regis's avatar Clouard Regis
Browse files

Released 3.1.2

parent b604aaaf
......@@ -5,11 +5,11 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## 98 [Unreleased]
## 98 [3.1.2] - 2021-08-10
### Fixed
### Added
- Android setting for reading HTML files (info boxes)
### Changed
- Turning up to Android 11
......
......@@ -51,7 +51,7 @@
"without_chronometer": "Non-timed, no statistics",
"without_gps": "Without GPS assistance",
"with_gps": "With GPS assistance",
"vikazimut_presentation_ensicaen": "The mobile application is a project of computer science students from ENSICAEN\n(École nationale supérieure d'ingénieurs de Caen, Normandy).",
"vikazimut_presentation_ensicaen": "The mobile application is a project of computer science students from ENSICAEN\n(National Graduate School of Engineering Caen, Normandy).",
"vikazimut_presentation_unicaen": "and of computer science students from university of Caen, Normandy.",
"vikazimut_student": "The Student Team",
"vikazimut_supervisors": "The Supervisors",
......
......@@ -2,7 +2,7 @@
"continue_route": "Continua il percorso",
"sport_course": "Modalità gara di orientamento",
"walk_course": "Modalità passeggiata",
"course_type": "Typo della gara",
"course_type": "Formato della gara",
"ok": "OK",
"validation_mode": "Modalità di convalida",
"preset_order": "Ordine imposto",
......@@ -16,10 +16,10 @@
"deny_gps_service": "Vietare",
"enable_gps_service": "Attivare",
"disable_gps_service": "Disattivare",
"nfc_unavailable_message": "Non puo convalidare i posti con il NFC perché l'NFC non è attivato o il suo dispositivo non ha un lettore NFC",
"nfc_unavailable_message": "Non può convalidare i posti con il NFC perché l'NFC non è attivato o il suo dispositivo non ha un lettore NFC",
"gps_disabled_message": "La funzione di localizzazione del suo dispositivo è disabilitata.\nVuole abilitarla\u00A0?",
"gps_denied_message": "L'app non dispone dell'autorizzazione per utilizzare il GPS..\nVuole consentirlo\u00A0?",
"no_network_and_no_stored_map_error_message": "Nessuna connessione di rete e nessuna scheda registrata in precedenza.\nImpossible continuare.",
"no_network_and_no_stored_map_error_message": "Nessuna connessione di rete e nessuna scheda registrata in precedenza.\nImpossibile continuare.",
"qr_code_menu_item": "Flash il codice QR",
"qrcode_scanner_title": "Lettore di Codici QR",
"course_state_message": "Stato dello percorso",
......@@ -34,26 +34,26 @@
"quit_course": "Abbandonare il percorso",
"validate_missing_control_point": "Segnalare il checkpoint mancante",
"skip_missing_control_point": "Convalida forzata del checkpoint",
"send_result_title": "Pubilcare la traccia GPS sul sito per confrontarla",
"send_result_title": "Pubblicare la traccia GPS sul sito per confrontarla",
"enter_nickname": "Entrare un nickname",
"error_no_nickname": "Per favore inserisci un nickname",
"history_activity_title": "Gare precedenti",
"user_map_name": "Mappa\u00A0:",
"course_date": "Percorso del",
"walk_date": "Passegiato del",
"walk_date": "Passeggiato del",
"course_time": "Tempo\u00A0:",
"with_chronometer": "Con cronometro e statistiche",
"without_chronometer": "Senza cronometro ne statistiche",
"without_gps": "Senza assistenza GPS",
"with_gps": "Con assistenza GPS",
"vikazimut_presentation_ensicaen": "L'app mobile è un projeto degli studienti in informatico dell' ENSICAEN\n(Scuola Nationale Superieure dIngenieri di Caen, Normandie)",
"vikazimut_presentation_unicaen": "e studienti in informatica dell'università di Caen, Normandie",
"vikazimut_student": "Gli studienti",
"vikazimut_presentation_ensicaen": "L'app mobile è un progetto degli studenti in informatico della scuola di specializzazione nazionale di Ingegneria di Caen (Normandie)",
"vikazimut_presentation_unicaen": "e studenti in informatica dell'università di Caen, Normandie",
"vikazimut_student": "Gli studenti",
"vikazimut_supervisors": "I mentori",
"sport_mode": "Modo sport",
"walk_mode": "Modo passeggiata",
"map_downloading_error_message": "Impossible di caricare la mappa. Nessuna connessione di rete.",
"error_download_map": "Erreure durante il caricamento della mappa\u00A0:",
"map_downloading_error_message": "Impossibile di caricare la mappa. Nessuna connessione di rete.",
"error_download_map": "Errore durante il caricamento della mappa\u00A0:",
"cp_start": "Partenza",
"cp_finish": "Arrivo",
"history_help_message": "Trascina il risultato per eliminarlo",
......@@ -67,13 +67,13 @@
"tester_team": "Il team di test",
"send_results_to_server": "Confrontare",
"already_scanned_control_point_message": "Il checkpoint %s è già validato.",
"course_already_started_message": "Il percorso è già comenciato.",
"course_already_started_message": "Il percorso è già cominciato.",
"quit_course_confirmation_title": "Cancellare il percorso\u00A0?",
"stop_course_confirmation_title": "Fermare il percorso prima della fine\u00A0?",
"quit_course_confirmation_message": "Confermare disegnando una Z con i quattro punti",
"aid_dialog_title": "Bisogno di aiuto\u00A0?",
"aid_dialog_message": "Un avatar apparirà per 15 secondi dove si trove sulla mappa.\nMa, serà penalizzato da 5 minuti.",
"yes_aid": "Si, aiutame",
"aid_dialog_message": "Un avatar apparirà per 15 secondi dove ti trovi sulla mappa.\nMa, sarai penalizzato da 5 minuti.",
"yes_aid": "Si,aiutami",
"no_aid": "No, non ho bisogno",
"send": "Mandare",
"yes": "Sì",
......@@ -82,11 +82,11 @@
"force_validation_cp_simple": "Convalida forzata del checkpoint n°%s\u00A0?",
"missing_cp_notification_plus_report": "Segnala e convalida il checkpoint mancante n°%s (%s)\u00A0?",
"missing_cp_error_no_location": "Impossibile individuare la sua posizione per verificare di essere vicino allo checkpoint.",
"missing_cp_error_distance": "Per forzare la convalida di un checkpoint mancante, deve essere entro %1$dm dalla sua posizione.\nCerca encora\u00A0!",
"missing_cp_error_distance": "Per forzare la convalida di un checkpoint mancante, deve essere entro %1$dm dalla sua posizione.\nCerca ancora\u00A0!",
"missing_cp_error_title": "Azione negata",
"validating_cp_error_title": "Forzare la convalidazione",
"validating_cp_error_no_location": "Impossibile individuare la sua posizione per determinare il checkpoint da convalidare.",
"success_validating_control_point": "Convalidation del checkpoint %s confirmato",
"success_validating_control_point": "Convalidation del checkpoint %s confermato\n\n",
"server_connection_error_use_memorized_map": "Nessuna connessione di rete.\nUtilizzo delle mappa in memoria.",
"error_title": "Errore",
"error_prefix": "Errore :",
......@@ -103,9 +103,9 @@
"general_conditions_of_use_item": "Termini di servizio",
"memory_map_usage": "Memoria utilizzata\u00A0: %.1f %s (vuoto: %.1f %s)",
"qrcode_start_button_message": "Premere il pulsante per scannerizzare il codice QR del checkpoint di partenza o usa il lettore NFC",
"auto_start_button_message_sport_mode": "Preme il pulsante.\n\nLo parcorso inizierà quando attraversera il checkpoint di partenza.",
"auto_start_button_message_sport_mode": "Preme il pulsante.\n\nLo percorso inizierà quando attraverserà il checkpoint di partenza.",
"auto_start_button_message_walk_mode": "Premere il pulsante per iniziare il percorso.",
"penalty_message": "inclusi penaliti\u00A0:",
"penalty_message": "inclusi penalità\u00A0:",
"panic": "Sono perso\u00A0!",
"map_list_downloading_message": "Trova l'elenco delle mappe disponibili sul server",
"control_point_index": "Numero\ncheckpoint",
......@@ -115,7 +115,7 @@
"cumulative_time": "Tempo\ncumulativo",
"really_exit": "Uscire della pagina dei risultati",
"result_exit_message": "Vuole uscire della pagina di risultati\u00A0?",
"missing_map_message": "Non è possible visualizzare i resultati perché la mappa è stata cancellata dal suo cellulare. È necessario scaricare nuovamente la mappa prima di poter visualizzare nuovamente i risultati.",
"missing_map_message": "Non è possible visualizzare i risultati perché la mappa è stata cancellata dal suo cellulare. È necessario scaricare nuovamente la mappa prima di poter visualizzare nuovamente i risultati.",
"data_protection": "PRIVACY E PROTEZIONE DEI DATI: Nessun dato privato altre allo nickname e la traccia GPS (riportata al 1 gennaio 1970) sarà inviato al server.",
"yes_bypass": "Sì, Vuol evitare questo checkpoint",
"no_continue": "No, continuo a cercare",
......@@ -127,10 +127,10 @@
"scanned_start_control_point": "Inizio del percorso",
"scanned_end_control_point": "Fino del percorso",
"wait_validation_for_start": "Dove passare per il checkpoint di partenza per attivare il segnale di inizio.",
"send_result_error_no_connection": "Erreur\u00A0: Impossible per connettersi a internet... Controle la sua connessione",
"send_result_error_no_connection": "Errore\u00A0: Impossibile per connettersi a internet... Controle la sua connessione",
"last_punched_display_with_name": "Convalidato : %1d (%2s)",
"last_punched_display": "Convalidata : %1d",
"location_required_tile": "Impossible andare oltre",
"location_required_tile": "Impossibile andare oltre",
"average_speed_message": "Velocità media",
"Total": "Somma",
"assistance_message_one": "(assistenza\u00A0: %1$d)",
......@@ -141,11 +141,11 @@
"general_conditions_of_use_title": "Termini di servizio",
"manual_title": "Manuale d'uso",
"history_menu_item": "Percorsi salvati",
"no_web_navigator": "Impossible d'aprire un browser web sul suo dispositivo",
"no_web_navigator": "Impossibile d'aprire un browser web sul suo dispositivo",
"quit_result": "Sì, lascia la pagina",
"dont_quit_result": "No, rimanere",
"control_point_title": "Posto",
"visited_time_title": "Tempo di\npassaggioX",
"visited_time_title": "Tempo di\npassaggio",
"out_of_bounds": "È fuori mappa",
"confirm_title": "Conferma",
"walk_started": "Andiamo !",
......
......@@ -25,7 +25,7 @@ class MapChoiceViewState extends State<MapChoiceView> {
bool _isSearching = false;
String searchQuery = "";
MapChoiceViewState(CourseMode mode) : _presenter = MapChoicePresenter(mode);
MapChoiceViewState(CourseMode mode): _presenter = MapChoicePresenter(mode);
@override
Widget build(BuildContext context) {
......@@ -57,10 +57,7 @@ class MapChoiceViewState extends State<MapChoiceView> {
})),
),
),
body: Semantics(
label: "Liste des cartes disponibles",
child: MapListView(searchQuery: searchQuery, presenter: _presenter),
),
body: MapListView(searchQuery: searchQuery, presenter: _presenter),
),
);
}
......
......@@ -60,8 +60,7 @@ class _MapListViewState extends State<MapListView> {
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
});
// TODO
return Semantics(label: "Liste des cartes disponibles", child: MapProxyListView(presenter: widget.presenter, mapProxies: snapshot.data!, searchQuery: widget.searchQuery),);
return MapProxyListView(presenter: widget.presenter, mapProxies: snapshot.data!, searchQuery: widget.searchQuery);
} else {
return _WaitingWidget();
}
......
......@@ -54,16 +54,13 @@ class _SplashScreenState extends State<SplashScreen> with TickerProviderStateMix
@override
Widget build(BuildContext context) {
return Semantics(
label: "Powered by ENSICAEN", // TODO
child: Center(
child: Transform.scale(
scale: _scale,
child: Image.asset(
'assets/images/splash.webp',
isAntiAlias: true,
scale: 2.5,
),
return Center(
child: Transform.scale(
scale: _scale,
child: Image.asset(
'assets/images/splash.webp',
isAntiAlias: true,
scale: 2.5,
),
),
);
......
......@@ -131,130 +131,122 @@ Future<void> _buildAndShowDialog({
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16.0)),
elevation: 0.0,
backgroundColor: Colors.transparent,
child: Semantics(
scopesRoute: true,
explicitChildNodes: true,
namesRoute: true,
label: '$title: $message',
child: Stack(
children: <Widget>[
Container(
width: screenWidth >= 600 ? 500 : screenWidth,
padding: const EdgeInsets.only(
top: 45.0 + 16.0,
bottom: 16.0,
left: 16.0,
right: 16.0,
),
margin: const EdgeInsets.only(top: 55.0),
decoration: BoxDecoration(
color: Theme.of(context).dialogBackgroundColor,
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(16.0),
boxShadow: [
const BoxShadow(
color: Colors.black26,
blurRadius: 10.0,
offset: const Offset(0.0, 10.0),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
if (title.isNotEmpty)
Text(
title,
style: TextStyle(
color: color,
fontSize: 20.0,
fontWeight: FontWeight.w700,
),
child: Stack(
children: <Widget>[
Container(
width: screenWidth >= 600 ? 500 : screenWidth,
padding: const EdgeInsets.only(
top: 45.0 + 16.0,
bottom: 16.0,
left: 16.0,
right: 16.0,
),
margin: const EdgeInsets.only(top: 55.0),
decoration: BoxDecoration(
color: Theme.of(context).dialogBackgroundColor,
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(16.0),
boxShadow: [
const BoxShadow(
color: Colors.black26,
blurRadius: 10.0,
offset: const Offset(0.0, 10.0),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
if (title.isNotEmpty)
Text(
title,
style: TextStyle(
color: color,
fontSize: 20.0,
fontWeight: FontWeight.w700,
),
const SizedBox(height: 16.0),
Flexible(
fit: FlexFit.loose,
child: SingleChildScrollView(
child: Text(
message,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 16.0,
),
),
const SizedBox(height: 16.0),
Flexible(
fit: FlexFit.loose,
child: SingleChildScrollView(
child: Text(
message,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 16.0,
),
),
),
if (usePattern)
PatternLock(
secretCode: [0, 1, 2, 3],
onSuccess: () {
Navigator.of(context).pop();
if (positiveButtonAction != null) {
positiveButtonAction();
}
},
),
const SizedBox(height: 16.0),
if (checkboxMessage != null && checkboxMessage.isNotEmpty)
CheckBoxContainer(
checkboxValue: remember,
checkboxMessage: checkboxMessage,
color: color,
),
Align(
alignment: Alignment.bottomRight,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
if (!usePattern)
TextButton(
child: Text(
positiveButtonText,
style: TextStyle(color: color),
),
onPressed: () {
if (remember[0] && checkboxAction != null) {
checkboxAction();
}
Navigator.of(context).pop();
if (positiveButtonAction != null) {
positiveButtonAction();
}
},
),
if (usePattern)
PatternLock(
secretCode: [0, 1, 2, 3],
onSuccess: () {
Navigator.of(context).pop();
if (positiveButtonAction != null) {
positiveButtonAction();
}
},
),
const SizedBox(height: 16.0),
if (checkboxMessage != null && checkboxMessage.isNotEmpty)
CheckBoxContainer(
checkboxValue: remember,
checkboxMessage: checkboxMessage,
color: color,
),
Align(
alignment: Alignment.bottomRight,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
if (!usePattern)
TextButton(
child: Text(
positiveButtonText,
style: TextStyle(color: color),
),
const SizedBox(
width: 40.0,
onPressed: () {
if (remember[0] && checkboxAction != null) {
checkboxAction();
}
Navigator.of(context).pop();
if (positiveButtonAction != null) {
positiveButtonAction();
}
},
),
if (negativeButtonText != null)
TextButton(
child: Text(
negativeButtonText,
style: TextStyle(color: color),
),
onPressed: () {
Navigator.of(context).pop();
if (negativeButtonAction != null) {
negativeButtonAction();
}
},
const SizedBox(width: 40.0,),
if (negativeButtonText != null)
TextButton(
child: Text(
negativeButtonText,
style: TextStyle(color: color),
),
],
),
onPressed: () {
Navigator.of(context).pop();
if (negativeButtonAction != null) {
negativeButtonAction();
}
},
),
],
),
],
),
),
],
),
Positioned(
left: 16.0,
right: 16.0,
child: CircleAvatar(
backgroundColor: color,
radius: 45.0,
child: dialogIcon,
),
),
Positioned(
left: 16.0,
right: 16.0,
child: CircleAvatar(
backgroundColor: color,
radius: 45.0,
child: dialogIcon,
),
],
),
),
],
),
);
}
......
......@@ -34,7 +34,7 @@ dependencies:
sprintf: ^6.0.0
intl: ^0.17.0
webview_flutter: ^2.0.10
webview_flutter: ^2.0.12
xml: ^5.1.1
http: ^0.13.3
url_launcher: ^6.0.9
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment