From c1fe31f547700d022e9fb730806d9d8005c0f9ca Mon Sep 17 00:00:00 2001 From: Frederik Benoist Date: Sun, 4 Jun 2023 17:38:37 +0200 Subject: [PATCH] refactor: log --- lib/main.dart | 6 +- lib/model/visit_model.dart | 6 +- lib/objectbox.dart | 14 ++- lib/ui/account/log.dart | 88 +++++++++++-------- lib/ui/general/notification.dart | 9 +- lib/ui/home.dart | 2 + lib/ui/sync/tab_synchro.dart | 24 +++++ lib/ui/visit/visit_photo_typology.dart | 7 ++ lib/ui/visit/visit_photo_typology_detail.dart | 15 ++++ lib/ui/visit/visit_photo_typology_list.dart | 33 ++++++- 10 files changed, 156 insertions(+), 48 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 4e313b0..958cad1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -46,13 +46,15 @@ Future main() async { // initialize directories await directories().initDirectories(); - /// tracker analytics + /// initialize tracker plausible analytics await PlausibleUtil.initializePlausible(window.physicalSize.width); // url MP4 SharedPrefs().urlMP4 = 'https://mp4.ikksgroup.com/MobilePortal4/index.html#ajax/dashboard.html'; + // track MobBR + LoggerUtil.dblog('LOG', 'MOBDR', 'Ouverture application', 0); PlausibleUtil.addEvent( name: 'access', page: 'access', @@ -61,8 +63,6 @@ Future main() async { 'name': SharedPrefs().login, }); - LoggerUtil.dblog('LOG', 'MOBDR', 'Ouverture application ', 0); - SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) .then((_) { /// pour wakelock diff --git a/lib/model/visit_model.dart b/lib/model/visit_model.dart index cab0cb2..a9bc951 100644 --- a/lib/model/visit_model.dart +++ b/lib/model/visit_model.dart @@ -40,7 +40,7 @@ class VisitModel { id: visite.id, id_visite: visite.id_visite, name: visite.id_etab.toString() + ' - ' + visite.title, - photoCount: objectbox.getVisitPhotoCount(visite.id_visite), + photoCount: objectbox.getVisitPhotoTaken(visite.id_visite), date: DateFormat('EEEE d MMMM HH:mm', 'fr_FR') .format(visite.date_visite), image: visite.url_photo_principale, @@ -65,7 +65,7 @@ class VisitModel { id: visite.id, id_visite: visite.id_visite, name: visite.id_etab.toString() + ' - ' + visite.title, - photoCount: objectbox.getVisitPhotoCount(visite.id_visite), + photoCount: objectbox.getVisitPhotoTaken(visite.id_visite), date: DateFormat('EEEE d MMMM HH:mm', 'fr_FR') .format(visite.date_visite), image: visite.url_photo_principale, @@ -90,7 +90,7 @@ class VisitModel { id: visite.id, id_visite: visite.id_visite, name: visite.id_etab.toString() + ' - ' + visite.title, - photoCount: objectbox.getVisitPhotoCount(visite.id_visite), + photoCount: objectbox.getVisitPhotoTaken(visite.id_visite), date: DateFormat('EEEE d MMMM HH:mm', 'fr_FR') .format(visite.date_visite), image: visite.url_photo_principale, diff --git a/lib/objectbox.dart b/lib/objectbox.dart index 3edd90c..59440c2 100644 --- a/lib/objectbox.dart +++ b/lib/objectbox.dart @@ -357,7 +357,7 @@ class ObjectBox { final visits = getAllVisit(); for (final visit in visits) { - final photoCount = getVisitPhotoCount(visit.id_visite); + final photoCount = getVisitPhotoTaken(visit.id_visite); if (photoCount == 0) { // Delete the visit @@ -366,7 +366,7 @@ class ObjectBox { } } - /// Removes a Visito object from the ObjectBox database with the specified ID. + /// Removes a Visit object from the ObjectBox database with the specified ID. /// /// Parameters: /// id: The ID of the Visit object to remove. @@ -557,7 +557,7 @@ class ObjectBox { } } - int getVisitPhotoCount(int _id_visite) { + int getVisitPhotoTaken(int _id_visite) { final builder = visitPhotoBox.query(VisitPhoto_.id_visite.equals(_id_visite)).build(); return builder.count(); @@ -619,6 +619,10 @@ class ObjectBox { } } + int getVisitPhotoCount() { + return visitPhotoBox.count(); + } + /* remettre les principal à zero final queryBuilder = box.query(VisitPhoto_.Visit_id.equals(idVisite) & VisitPhoto_.photo_principale.equals(1)); final updatedPhotos = queryBuilder.build().find(); @@ -719,4 +723,8 @@ class ObjectBox { // Map it to a list of notes to be used by a StreamBuilder. .map((query) => query.find()); } + + int getLogCount() { + return logBox.count(); + } } diff --git a/lib/ui/account/log.dart b/lib/ui/account/log.dart index 1277c09..d8fa0ee 100644 --- a/lib/ui/account/log.dart +++ b/lib/ui/account/log.dart @@ -14,44 +14,58 @@ class _LogPageState extends State { final _reusableWidget = ReusableWidget(); Widget Function(BuildContext, int) _itemBuilder(List logs) => - (BuildContext context, int index) => Row( - children: [ - Expanded( - child: Container( - decoration: const BoxDecoration( - border: Border(bottom: BorderSide(color: Colors.black12)), - ), - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 18.0, - horizontal: 10.0, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - logs[index].libelle, - style: const TextStyle( - fontSize: 15.0, - ), - // Provide a Key for the integration test - key: Key('list_log_$index'), - ), - Padding( - padding: const EdgeInsets.only(top: 5.0), - child: Text( - 'Added on ${logs[index].dateFormat}', - style: const TextStyle( - fontSize: 12.0, - ), - ), - ), - ], - ), - ), - ), + (BuildContext context, int index) => Container( + margin: const EdgeInsets.symmetric(horizontal: 0.0), + decoration: const BoxDecoration( + border: Border(bottom: BorderSide(color: Colors.black12)), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, + horizontal: 0.0, ), - ], + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + if (logs[index].type == 'LOG') + Icon(Icons.info, color: Colors.blue), + if (logs[index].type == 'ERR') + Icon(Icons.error, color: Colors.red), + SizedBox(width: 10.0), + Text( + logs[index].libelle, + style: const TextStyle( + fontSize: 15.0, + ), + // Provide a Key for the integration test + key: Key('list_log_$index'), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Added on ${logs[index].dateFormat}', + style: const TextStyle( + fontSize: 12.0, + ), + ), + if (logs[index].duree > 0) + Row( + children: [ + Icon(Icons.timer), + SizedBox(width: 5.0), + Text('${logs[index].duree} ms'), + ], + ), + ], + ), + ], + ), + ), ); @override diff --git a/lib/ui/general/notification.dart b/lib/ui/general/notification.dart index 41f6a81..9439b35 100644 --- a/lib/ui/general/notification.dart +++ b/lib/ui/general/notification.dart @@ -1,9 +1,11 @@ import 'dart:async'; +import 'package:flutter/material.dart'; import 'package:mobdr/config/constant.dart'; import 'package:mobdr/config/global_style.dart'; import 'package:mobdr/ui/reusable/reusable_widget.dart'; -import 'package:flutter/material.dart'; +import 'package:mobdr/service/plausible.dart'; +import 'package:mobdr/service/logger_util.dart'; class NotificationPage extends StatefulWidget { @override @@ -17,6 +19,11 @@ class _NotificationPageState extends State { @override void initState() { super.initState(); + + // track & log page access + final page = 'notification'; + LoggerUtil.dblog('LOG', 'MOBDR', 'Page : ${page}', 0); + PlausibleUtil.addEvent(name: 'pageview', page: page); } @override diff --git a/lib/ui/home.dart b/lib/ui/home.dart index 1cb8e37..34d2844 100644 --- a/lib/ui/home.dart +++ b/lib/ui/home.dart @@ -10,6 +10,7 @@ import 'package:mobdr/ui/sync/tab_synchro.dart'; import 'package:mobdr/config/constant.dart'; import 'package:mobdr/events.dart'; import 'package:mobdr/service/plausible.dart'; +import 'package:mobdr/service/logger_util.dart'; class HomePage extends StatefulWidget { @override @@ -159,6 +160,7 @@ class _HomePageState extends State break; } + LoggerUtil.dblog('LOG', 'MOBDR', 'Page : ${page}', 0); PlausibleUtil.addEvent(name: 'pageview', page: page); } } diff --git a/lib/ui/sync/tab_synchro.dart b/lib/ui/sync/tab_synchro.dart index 85be5b1..8200b7b 100644 --- a/lib/ui/sync/tab_synchro.dart +++ b/lib/ui/sync/tab_synchro.dart @@ -10,6 +10,7 @@ import 'package:mobdr/ui/reusable/reusable_widget.dart'; import 'package:mobdr/service/shared_prefs.dart'; import 'package:mobdr/network/api_provider.dart'; import 'package:mobdr/db/box_visit_photo.dart'; +import 'package:mobdr/service/logger_util.dart'; class SynchronizationPage extends StatefulWidget { @override @@ -56,11 +57,16 @@ class _SynchronizationPageState extends State // if no internet connection if (connectivityResult == ConnectivityResult.none) { + // log tracker + LoggerUtil.dblog('ERR', 'MOBDR', 'Pas de connexion internet', 0); + setState(() { _isInternetConnexion = false; }); } else { _isInternetConnexion = true; + + // synchronization start startSync(); } } @@ -194,6 +200,8 @@ class _SynchronizationPageState extends State // disable navigation bar buttons eventBus.fire(SynchronizationEvent(true)); + Stopwatch stopwatch = Stopwatch()..start(); + setState(() { _isSyncing = true; _syncCompleted = false; @@ -206,6 +214,16 @@ class _SynchronizationPageState extends State final ApiProvider _apiProvider = ApiProvider(); + // log tracker + LoggerUtil.dblog('LOG', 'MOBDR', + 'Nombre Photo(s): ' + objectbox.getVisitPhotoCount().toString(), 0); + + if (_syncLog) { + // log tracker + LoggerUtil.dblog('LOG', 'MOBDR', + 'Nombre Log(s): ' + objectbox.getLogCount().toString(), 0); + } + // upload photo to server await _uploadVisitPhotos(_apiProvider); @@ -248,6 +266,12 @@ class _SynchronizationPageState extends State _animationController.stop(); + stopwatch.stop(); + + // log tracker + LoggerUtil.dblog('LOG', 'MOBDR', 'Synchronisation données', + stopwatch.elapsedMilliseconds); + // enable navigation bar buttons eventBus.fire(SynchronizationEvent(false)); } diff --git a/lib/ui/visit/visit_photo_typology.dart b/lib/ui/visit/visit_photo_typology.dart index 57a29e3..64e95e5 100644 --- a/lib/ui/visit/visit_photo_typology.dart +++ b/lib/ui/visit/visit_photo_typology.dart @@ -8,6 +8,8 @@ import 'package:mobdr/db/box_photo_typology.dart'; import 'package:mobdr/model/visit_model.dart'; import 'package:mobdr/ui/visit/visit_photo_typology_list.dart'; import 'package:mobdr/ui/reusable/reusable_widget.dart'; +import 'package:mobdr/service/plausible.dart'; +import 'package:mobdr/service/logger_util.dart'; class VisitPhotoTypologyPage extends StatefulWidget { final VisitModel pp_visitModel; @@ -104,6 +106,11 @@ class _VisitPhotoTypologyPageState extends State { @override void initState() { super.initState(); + + // track & log page access + final page = 'visit_photo_typology'; + LoggerUtil.dblog('LOG', 'MOBDR', 'Page : ${page}', 0); + PlausibleUtil.addEvent(name: 'pageview', page: page); } @override diff --git a/lib/ui/visit/visit_photo_typology_detail.dart b/lib/ui/visit/visit_photo_typology_detail.dart index c16f0bc..14c1dfb 100644 --- a/lib/ui/visit/visit_photo_typology_detail.dart +++ b/lib/ui/visit/visit_photo_typology_detail.dart @@ -15,6 +15,8 @@ import 'package:mobdr/db/box_visit_photo.dart'; import 'package:mobdr/db/box_photo_typology.dart'; import 'package:mobdr/db/box_photo_competitor.dart'; import 'package:mobdr/model/visit_model.dart'; +import 'package:mobdr/service/plausible.dart'; +import 'package:mobdr/service/logger_util.dart'; class VisitPhotoTypologyDetailPage extends StatefulWidget { final VisitModel pp_visitModel; @@ -60,6 +62,11 @@ class _VisitPhotoTypologyDetailPageState void initState() { super.initState(); + // track & log page access + final page = 'visit_photo_typology_detail'; + LoggerUtil.dblog('LOG', 'MOBDR', 'Page : ${page}', 0); + PlausibleUtil.addEvent(name: 'pageview', page: page); + loadData(widget.pp_imageId).then((_) { setState(() { _isLoading = false; @@ -160,10 +167,18 @@ class _VisitPhotoTypologyDetailPageState bool isSaved = await saveImageToGallery(widget.pp_image); if (isSaved) { + // log tracker + LoggerUtil.dblog( + 'LOG', 'MOBDR', 'Copier dans galerie', 0); + Fluttertoast.showToast( msg: 'Photo has been added to gallery', toastLength: Toast.LENGTH_LONG); } else { + // log tracker + LoggerUtil.dblog('ERR', 'MOBDR', + 'Erreur copier dans galerie', 0); + Fluttertoast.showToast( msg: 'Error while copying!', toastLength: Toast.LENGTH_LONG); diff --git a/lib/ui/visit/visit_photo_typology_list.dart b/lib/ui/visit/visit_photo_typology_list.dart index f5948b7..e93fbe7 100644 --- a/lib/ui/visit/visit_photo_typology_list.dart +++ b/lib/ui/visit/visit_photo_typology_list.dart @@ -23,6 +23,8 @@ import 'package:mobdr/ui/visit/photo_camera.dart'; import 'package:mobdr/ui/visit/visit_photo_typology_detail.dart'; import 'package:mobdr/ui/reusable/reusable_widget.dart'; import 'package:mobdr/events.dart'; +import 'package:mobdr/service/plausible.dart'; +import 'package:mobdr/service/logger_util.dart'; extension FileNameExtension on File { String getFileName() { @@ -66,6 +68,12 @@ class _VisitPhotoTypologyListPageState @override void initState() { super.initState(); + + // track & log page access + final page = 'visit_photo_typology_list'; + LoggerUtil.dblog('LOG', 'MOBDR', 'Page : ${page}', 0); + PlausibleUtil.addEvent(name: 'pageview', page: page); + loadData(); } @@ -305,11 +313,21 @@ class _VisitPhotoTypologyListPageState GestureDetector( behavior: HitTestBehavior.translucent, onTap: () async { + Stopwatch stopwatch = Stopwatch()..start(); + await rotateAndReplaceImage( File(_visitPhotoData[index].getImage()), 90); + + stopwatch.stop(); + + // log tracker + LoggerUtil.dblog('LOG', 'MOBDR', 'Rotation 90', + stopwatch.elapsedMilliseconds); + setState(() { _listKey = GlobalKey(); }); + Fluttertoast.showToast( msg: 'The image has been rotated'); }, @@ -331,11 +349,21 @@ class _VisitPhotoTypologyListPageState GestureDetector( behavior: HitTestBehavior.translucent, onTap: () async { + Stopwatch stopwatch = Stopwatch()..start(); + await rotateAndReplaceImage( File(_visitPhotoData[index].getImage()), -90); + + stopwatch.stop(); + + // track rotation speed + LoggerUtil.dblog('LOG', 'MOBDR', 'Rotation -90', + stopwatch.elapsedMilliseconds); + setState(() { _listKey = GlobalKey(); }); + Fluttertoast.showToast( msg: 'The image has been rotated'); }, @@ -369,7 +397,7 @@ class _VisitPhotoTypologyListPageState // number of photos of the visit visitPhotoCount = - objectbox.getVisitPhotoCount(widget.pp_visitModel.id_visite); + objectbox.getVisitPhotoTaken(widget.pp_visitModel.id_visite); } /// Removes the image at the specified [imageURL] from the cache of the [NetworkImage] provider. @@ -480,6 +508,9 @@ class _VisitPhotoTypologyListPageState Navigator.pop(context); + // track delete + LoggerUtil.dblog('LOG', 'MOBDR', 'Suppression photo', 0); + Fluttertoast.showToast( msg: 'Photo has been deleted from your visit', toastLength: Toast.LENGTH_SHORT);