refactor: log

release/mobdr-v0.0.1
Frédérik Benoist 2023-06-04 17:38:37 +02:00
parent 65b477d648
commit c1fe31f547
10 changed files with 156 additions and 48 deletions

View File

@ -46,13 +46,15 @@ Future<void> main() async {
// initialize directories // initialize directories
await directories().initDirectories(); await directories().initDirectories();
/// tracker analytics /// initialize tracker plausible analytics
await PlausibleUtil.initializePlausible(window.physicalSize.width); await PlausibleUtil.initializePlausible(window.physicalSize.width);
// url MP4 // url MP4
SharedPrefs().urlMP4 = SharedPrefs().urlMP4 =
'https://mp4.ikksgroup.com/MobilePortal4/index.html#ajax/dashboard.html'; 'https://mp4.ikksgroup.com/MobilePortal4/index.html#ajax/dashboard.html';
// track MobBR
LoggerUtil.dblog('LOG', 'MOBDR', 'Ouverture application', 0);
PlausibleUtil.addEvent( PlausibleUtil.addEvent(
name: 'access', name: 'access',
page: 'access', page: 'access',
@ -61,8 +63,6 @@ Future<void> main() async {
'name': SharedPrefs().login, 'name': SharedPrefs().login,
}); });
LoggerUtil.dblog('LOG', 'MOBDR', 'Ouverture application ', 0);
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
.then((_) { .then((_) {
/// pour wakelock /// pour wakelock

View File

@ -40,7 +40,7 @@ class VisitModel {
id: visite.id, id: visite.id,
id_visite: visite.id_visite, id_visite: visite.id_visite,
name: visite.id_etab.toString() + ' - ' + visite.title, 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') date: DateFormat('EEEE d MMMM HH:mm', 'fr_FR')
.format(visite.date_visite), .format(visite.date_visite),
image: visite.url_photo_principale, image: visite.url_photo_principale,
@ -65,7 +65,7 @@ class VisitModel {
id: visite.id, id: visite.id,
id_visite: visite.id_visite, id_visite: visite.id_visite,
name: visite.id_etab.toString() + ' - ' + visite.title, 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') date: DateFormat('EEEE d MMMM HH:mm', 'fr_FR')
.format(visite.date_visite), .format(visite.date_visite),
image: visite.url_photo_principale, image: visite.url_photo_principale,
@ -90,7 +90,7 @@ class VisitModel {
id: visite.id, id: visite.id,
id_visite: visite.id_visite, id_visite: visite.id_visite,
name: visite.id_etab.toString() + ' - ' + visite.title, 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') date: DateFormat('EEEE d MMMM HH:mm', 'fr_FR')
.format(visite.date_visite), .format(visite.date_visite),
image: visite.url_photo_principale, image: visite.url_photo_principale,

View File

@ -357,7 +357,7 @@ class ObjectBox {
final visits = getAllVisit(); final visits = getAllVisit();
for (final visit in visits) { for (final visit in visits) {
final photoCount = getVisitPhotoCount(visit.id_visite); final photoCount = getVisitPhotoTaken(visit.id_visite);
if (photoCount == 0) { if (photoCount == 0) {
// Delete the visit // 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: /// Parameters:
/// id: The ID of the Visit object to remove. /// 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 = final builder =
visitPhotoBox.query(VisitPhoto_.id_visite.equals(_id_visite)).build(); visitPhotoBox.query(VisitPhoto_.id_visite.equals(_id_visite)).build();
return builder.count(); return builder.count();
@ -619,6 +619,10 @@ class ObjectBox {
} }
} }
int getVisitPhotoCount() {
return visitPhotoBox.count();
}
/* remettre les principal à zero /* remettre les principal à zero
final queryBuilder = box.query(VisitPhoto_.Visit_id.equals(idVisite) & VisitPhoto_.photo_principale.equals(1)); final queryBuilder = box.query(VisitPhoto_.Visit_id.equals(idVisite) & VisitPhoto_.photo_principale.equals(1));
final updatedPhotos = queryBuilder.build().find(); 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 it to a list of notes to be used by a StreamBuilder.
.map((query) => query.find()); .map((query) => query.find());
} }
int getLogCount() {
return logBox.count();
}
} }

View File

@ -14,21 +14,26 @@ class _LogPageState extends State<LogPage> {
final _reusableWidget = ReusableWidget(); final _reusableWidget = ReusableWidget();
Widget Function(BuildContext, int) _itemBuilder(List<Log> logs) => Widget Function(BuildContext, int) _itemBuilder(List<Log> logs) =>
(BuildContext context, int index) => Row( (BuildContext context, int index) => Container(
children: <Widget>[ margin: const EdgeInsets.symmetric(horizontal: 0.0),
Expanded(
child: Container(
decoration: const BoxDecoration( decoration: const BoxDecoration(
border: Border(bottom: BorderSide(color: Colors.black12)), border: Border(bottom: BorderSide(color: Colors.black12)),
), ),
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
vertical: 18.0, vertical: 12.0,
horizontal: 10.0, horizontal: 0.0,
), ),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
Row(
children: <Widget>[
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( Text(
logs[index].libelle, logs[index].libelle,
style: const TextStyle( style: const TextStyle(
@ -37,21 +42,30 @@ class _LogPageState extends State<LogPage> {
// Provide a Key for the integration test // Provide a Key for the integration test
key: Key('list_log_$index'), key: Key('list_log_$index'),
), ),
Padding( ],
padding: const EdgeInsets.only(top: 5.0), ),
child: Text( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
'Added on ${logs[index].dateFormat}', 'Added on ${logs[index].dateFormat}',
style: const TextStyle( style: const TextStyle(
fontSize: 12.0, fontSize: 12.0,
), ),
), ),
if (logs[index].duree > 0)
Row(
children: <Widget>[
Icon(Icons.timer),
SizedBox(width: 5.0),
Text('${logs[index].duree} ms'),
],
),
],
), ),
], ],
), ),
), ),
),
),
],
); );
@override @override

View File

@ -1,9 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart';
import 'package:mobdr/config/constant.dart'; import 'package:mobdr/config/constant.dart';
import 'package:mobdr/config/global_style.dart'; import 'package:mobdr/config/global_style.dart';
import 'package:mobdr/ui/reusable/reusable_widget.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 { class NotificationPage extends StatefulWidget {
@override @override
@ -17,6 +19,11 @@ class _NotificationPageState extends State<NotificationPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
// track & log page access
final page = 'notification';
LoggerUtil.dblog('LOG', 'MOBDR', 'Page : ${page}', 0);
PlausibleUtil.addEvent(name: 'pageview', page: page);
} }
@override @override

View File

@ -10,6 +10,7 @@ import 'package:mobdr/ui/sync/tab_synchro.dart';
import 'package:mobdr/config/constant.dart'; import 'package:mobdr/config/constant.dart';
import 'package:mobdr/events.dart'; import 'package:mobdr/events.dart';
import 'package:mobdr/service/plausible.dart'; import 'package:mobdr/service/plausible.dart';
import 'package:mobdr/service/logger_util.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
@override @override
@ -159,6 +160,7 @@ class _HomePageState extends State<HomePage>
break; break;
} }
LoggerUtil.dblog('LOG', 'MOBDR', 'Page : ${page}', 0);
PlausibleUtil.addEvent(name: 'pageview', page: page); PlausibleUtil.addEvent(name: 'pageview', page: page);
} }
} }

View File

@ -10,6 +10,7 @@ import 'package:mobdr/ui/reusable/reusable_widget.dart';
import 'package:mobdr/service/shared_prefs.dart'; import 'package:mobdr/service/shared_prefs.dart';
import 'package:mobdr/network/api_provider.dart'; import 'package:mobdr/network/api_provider.dart';
import 'package:mobdr/db/box_visit_photo.dart'; import 'package:mobdr/db/box_visit_photo.dart';
import 'package:mobdr/service/logger_util.dart';
class SynchronizationPage extends StatefulWidget { class SynchronizationPage extends StatefulWidget {
@override @override
@ -56,11 +57,16 @@ class _SynchronizationPageState extends State<SynchronizationPage>
// if no internet connection // if no internet connection
if (connectivityResult == ConnectivityResult.none) { if (connectivityResult == ConnectivityResult.none) {
// log tracker
LoggerUtil.dblog('ERR', 'MOBDR', 'Pas de connexion internet', 0);
setState(() { setState(() {
_isInternetConnexion = false; _isInternetConnexion = false;
}); });
} else { } else {
_isInternetConnexion = true; _isInternetConnexion = true;
// synchronization start
startSync(); startSync();
} }
} }
@ -194,6 +200,8 @@ class _SynchronizationPageState extends State<SynchronizationPage>
// disable navigation bar buttons // disable navigation bar buttons
eventBus.fire(SynchronizationEvent(true)); eventBus.fire(SynchronizationEvent(true));
Stopwatch stopwatch = Stopwatch()..start();
setState(() { setState(() {
_isSyncing = true; _isSyncing = true;
_syncCompleted = false; _syncCompleted = false;
@ -206,6 +214,16 @@ class _SynchronizationPageState extends State<SynchronizationPage>
final ApiProvider _apiProvider = ApiProvider(); 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 // upload photo to server
await _uploadVisitPhotos(_apiProvider); await _uploadVisitPhotos(_apiProvider);
@ -248,6 +266,12 @@ class _SynchronizationPageState extends State<SynchronizationPage>
_animationController.stop(); _animationController.stop();
stopwatch.stop();
// log tracker
LoggerUtil.dblog('LOG', 'MOBDR', 'Synchronisation données',
stopwatch.elapsedMilliseconds);
// enable navigation bar buttons // enable navigation bar buttons
eventBus.fire(SynchronizationEvent(false)); eventBus.fire(SynchronizationEvent(false));
} }

View File

@ -8,6 +8,8 @@ import 'package:mobdr/db/box_photo_typology.dart';
import 'package:mobdr/model/visit_model.dart'; import 'package:mobdr/model/visit_model.dart';
import 'package:mobdr/ui/visit/visit_photo_typology_list.dart'; import 'package:mobdr/ui/visit/visit_photo_typology_list.dart';
import 'package:mobdr/ui/reusable/reusable_widget.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 { class VisitPhotoTypologyPage extends StatefulWidget {
final VisitModel pp_visitModel; final VisitModel pp_visitModel;
@ -104,6 +106,11 @@ class _VisitPhotoTypologyPageState extends State<VisitPhotoTypologyPage> {
@override @override
void initState() { void initState() {
super.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 @override

View File

@ -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_typology.dart';
import 'package:mobdr/db/box_photo_competitor.dart'; import 'package:mobdr/db/box_photo_competitor.dart';
import 'package:mobdr/model/visit_model.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 { class VisitPhotoTypologyDetailPage extends StatefulWidget {
final VisitModel pp_visitModel; final VisitModel pp_visitModel;
@ -60,6 +62,11 @@ class _VisitPhotoTypologyDetailPageState
void initState() { void initState() {
super.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((_) { loadData(widget.pp_imageId).then((_) {
setState(() { setState(() {
_isLoading = false; _isLoading = false;
@ -160,10 +167,18 @@ class _VisitPhotoTypologyDetailPageState
bool isSaved = bool isSaved =
await saveImageToGallery(widget.pp_image); await saveImageToGallery(widget.pp_image);
if (isSaved) { if (isSaved) {
// log tracker
LoggerUtil.dblog(
'LOG', 'MOBDR', 'Copier dans galerie', 0);
Fluttertoast.showToast( Fluttertoast.showToast(
msg: 'Photo has been added to gallery', msg: 'Photo has been added to gallery',
toastLength: Toast.LENGTH_LONG); toastLength: Toast.LENGTH_LONG);
} else { } else {
// log tracker
LoggerUtil.dblog('ERR', 'MOBDR',
'Erreur copier dans galerie', 0);
Fluttertoast.showToast( Fluttertoast.showToast(
msg: 'Error while copying!', msg: 'Error while copying!',
toastLength: Toast.LENGTH_LONG); toastLength: Toast.LENGTH_LONG);

View File

@ -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/visit/visit_photo_typology_detail.dart';
import 'package:mobdr/ui/reusable/reusable_widget.dart'; import 'package:mobdr/ui/reusable/reusable_widget.dart';
import 'package:mobdr/events.dart'; import 'package:mobdr/events.dart';
import 'package:mobdr/service/plausible.dart';
import 'package:mobdr/service/logger_util.dart';
extension FileNameExtension on File { extension FileNameExtension on File {
String getFileName() { String getFileName() {
@ -66,6 +68,12 @@ class _VisitPhotoTypologyListPageState
@override @override
void initState() { void initState() {
super.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(); loadData();
} }
@ -305,11 +313,21 @@ class _VisitPhotoTypologyListPageState
GestureDetector( GestureDetector(
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
onTap: () async { onTap: () async {
Stopwatch stopwatch = Stopwatch()..start();
await rotateAndReplaceImage( await rotateAndReplaceImage(
File(_visitPhotoData[index].getImage()), 90); File(_visitPhotoData[index].getImage()), 90);
stopwatch.stop();
// log tracker
LoggerUtil.dblog('LOG', 'MOBDR', 'Rotation 90',
stopwatch.elapsedMilliseconds);
setState(() { setState(() {
_listKey = GlobalKey(); _listKey = GlobalKey();
}); });
Fluttertoast.showToast( Fluttertoast.showToast(
msg: 'The image has been rotated'); msg: 'The image has been rotated');
}, },
@ -331,11 +349,21 @@ class _VisitPhotoTypologyListPageState
GestureDetector( GestureDetector(
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
onTap: () async { onTap: () async {
Stopwatch stopwatch = Stopwatch()..start();
await rotateAndReplaceImage( await rotateAndReplaceImage(
File(_visitPhotoData[index].getImage()), -90); File(_visitPhotoData[index].getImage()), -90);
stopwatch.stop();
// track rotation speed
LoggerUtil.dblog('LOG', 'MOBDR', 'Rotation -90',
stopwatch.elapsedMilliseconds);
setState(() { setState(() {
_listKey = GlobalKey(); _listKey = GlobalKey();
}); });
Fluttertoast.showToast( Fluttertoast.showToast(
msg: 'The image has been rotated'); msg: 'The image has been rotated');
}, },
@ -369,7 +397,7 @@ class _VisitPhotoTypologyListPageState
// number of photos of the visit // number of photos of the visit
visitPhotoCount = 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. /// Removes the image at the specified [imageURL] from the cache of the [NetworkImage] provider.
@ -480,6 +508,9 @@ class _VisitPhotoTypologyListPageState
Navigator.pop(context); Navigator.pop(context);
// track delete
LoggerUtil.dblog('LOG', 'MOBDR', 'Suppression photo', 0);
Fluttertoast.showToast( Fluttertoast.showToast(
msg: 'Photo has been deleted from your visit', msg: 'Photo has been deleted from your visit',
toastLength: Toast.LENGTH_SHORT); toastLength: Toast.LENGTH_SHORT);