From b5e387ee2aba3b6d237ef08698f8816257a33f82 Mon Sep 17 00:00:00 2001 From: bossanyit Date: Tue, 18 Oct 2022 18:48:18 +0200 Subject: [PATCH] v1.26.3 --- android/app/src/main/AndroidManifest.xml | 19 ++-- android/app/src/main/res/values/strings.xml | 11 +-- lib/bloc/sales/sales_bloc.dart | 2 +- lib/main.dart | 12 ++- lib/model/cache.dart | 15 +++- lib/service/package_service.dart | 96 +++++++-------------- lib/util/track.dart | 2 + pubspec.lock | 52 ++++++++--- pubspec.yaml | 11 +-- 9 files changed, 113 insertions(+), 107 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a801715..a9a560b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,18 +5,10 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> - - + + + + - 584181112271127 + + 584181112271127 + 60d565f451ce32de3d7eeb26274bbddd - - fb584181112271127 + fb584181112271127 \ No newline at end of file diff --git a/lib/bloc/sales/sales_bloc.dart b/lib/bloc/sales/sales_bloc.dart index 2044e67..96a351b 100644 --- a/lib/bloc/sales/sales_bloc.dart +++ b/lib/bloc/sales/sales_bloc.dart @@ -161,7 +161,7 @@ class SalesBloc extends Bloc with Logging { return; } - String productSetString = splitTestRepository.getSplitTestValue("product_set_2"); + String productSetString = splitTestRepository.getSplitTestValue("product_set_5"); log("ProductSetString: $productSetString"); try { productSet = int.parse(productSetString); diff --git a/lib/main.dart b/lib/main.dart index 30eb527..ff66693 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -56,6 +56,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:aitrainer_app/util/app_localization.dart'; import 'package:flutter_uxcam/flutter_uxcam.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:matomo_tracker/matomo_tracker.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:flutter_smartlook/flutter_smartlook.dart'; import 'package:upgrader/upgrader.dart'; @@ -104,7 +105,8 @@ Future _reportError(dynamic error, dynamic stackTrace) async { ); final String platform = Platform.isAndroid ? "Android" : "iOS"; final String version = Cache().packageInfo != null ? Cache().packageInfo!.version + "+" + Cache().packageInfo!.buildNumber : ""; - final sentryId = await Sentry.captureException(error, stackTrace: stackTrace, hint: "Platform: $platform, Version: $version, User: $customerId"); + final sentryId = + await Sentry.captureException(error, stackTrace: stackTrace, hint: "Platform: $platform, Version: $version, User: $customerId"); print('Capture exception result : SentryId : $sentryId'); } @@ -146,6 +148,11 @@ Future main() async { Future initThirdParty() async { if (!isInDebugMode) { //await FlurryData.initialize(androidKey: "JNYCTCWBT34FM3J8TV36", iosKey: "3QBG7BSMGPDH24S8TRQP", enableLog: true); + await MatomoTracker.instance.initialize( + siteId: 3, + url: 'https://matomo.workouttest.com/matomo.php', + //visitorId: 'customer_1', + ); FlutterUxcam.optIntoSchematicRecordings(); } await FirebaseApi().initializeFlutterFire(); @@ -194,7 +201,8 @@ Future main() async { BlocProvider( create: (BuildContext context) => TestSetExecuteBloc(), ), - BlocProvider(create: (BuildContext context) => TutorialBloc(tutorialName: ActivityDone.tutorialExecuteFirstTest.toStr())), + BlocProvider( + create: (BuildContext context) => TutorialBloc(tutorialName: ActivityDone.tutorialExecuteFirstTest.toStr())), BlocProvider(create: (context) { final MenuBloc menuBloc = BlocProvider.of(context); return TrainingPlanBloc(menuBloc: menuBloc, trainingPlanRepository: TrainingPlanRepository()); diff --git a/lib/model/cache.dart b/lib/model/cache.dart index dc27681..f7cb6ee 100644 --- a/lib/model/cache.dart +++ b/lib/model/cache.dart @@ -35,6 +35,7 @@ import 'package:firebase_remote_config/firebase_remote_config.dart'; //import 'package:flurry_data/flurry_data.dart'; import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; import 'package:flutter_uxcam/flutter_uxcam.dart'; +import 'package:matomo_tracker/matomo_tracker.dart'; import 'package:package_info/package_info.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:aitrainer_app/model/exercise_type.dart'; @@ -544,7 +545,8 @@ class Cache with Logging { ExercisePlan? getMyExercisePlan() => _myExercisePlan; - void setMyExercisePlanDetails(LinkedHashMap listExercisePlanDetail) => _myExercisesPlanDetails = listExercisePlanDetail; + void setMyExercisePlanDetails(LinkedHashMap listExercisePlanDetail) => + _myExercisesPlanDetails = listExercisePlanDetail; void addToMyExercisePlanDetails(ExercisePlanDetail detail) => _myExercisesPlanDetails[detail.exerciseTypeId] = detail; @@ -558,7 +560,8 @@ class Cache with Logging { void deleteMyExercisePlanDetail(ExercisePlanDetail detail) => this.deleteMyExercisePlanDetailByExerciseTypeId(detail.exerciseTypeId); - void deletedMyExercisePlanDetail(ExercisePlanDetail detail) => this._myExercisesPlanDetails[detail.exerciseTypeId]!.change = ModelChange.deleted; + void deletedMyExercisePlanDetail(ExercisePlanDetail detail) => + this._myExercisesPlanDetails[detail.exerciseTypeId]!.change = ModelChange.deleted; void deleteMyExercisePlanDetailByExerciseTypeId(int exerciseTypeId) { this._myExercisesPlanDetails[exerciseTypeId]!.change = ModelChange.delete; @@ -686,7 +689,11 @@ class Cache with Logging { Future initCustomer(int customerId) async { log(" *** initCustomer"); - await PackageApi().getCustomerPackage(customerId); + try { + await PackageApi().getCustomerPackage(customerId); + } on Exception catch (_) { + return; + } if (!isInDebugMode) { //FlurryData.setUserId(customerId.toString()); @@ -694,6 +701,8 @@ class Cache with Logging { FlutterUxcam.setUserIdentity(customerId.toString()); Smartlook.setUserIdentifier(customerId.toString()); Track().track(TrackingEvent.enter); + MatomoTracker.instance + .trackEvent(name: TrackingEvent.enter.enumToString(), action: TrackingEvent.enter.enumToString(), eventValue: customerId); } await Future.forEach(ActivityDone.values, (element) async { diff --git a/lib/service/package_service.dart b/lib/service/package_service.dart index c9718d7..ae5c105 100644 --- a/lib/service/package_service.dart +++ b/lib/service/package_service.dart @@ -44,62 +44,44 @@ class PackageApi { final List headRecord = element.split("***"); final Iterable json = jsonDecode(headRecord[1]); if (headRecord[0] == "ExerciseDevice") { - final List devices = - json.map((device) => ExerciseDevice.fromJson(device)).toList(); + final List devices = json.map((device) => ExerciseDevice.fromJson(device)).toList(); Cache().setDevices(devices); } else if (headRecord[0] == "Product") { - final List products = - json.map((product) => Product.fromJson(product)).toList(); + final List products = json.map((product) => Product.fromJson(product)).toList(); Cache().setProducts(products); } else if (headRecord[0] == "Property") { - final List properties = - json.map((property) => Property.fromJson(property)).toList(); + final List properties = json.map((property) => Property.fromJson(property)).toList(); Cache().setProperties(properties); } else if (headRecord[0] == "ExerciseTree") { - exerciseTree = json - .map((exerciseTree) => ExerciseTree.fromJson(exerciseTree)) - .toList(); + exerciseTree = json.map((exerciseTree) => ExerciseTree.fromJson(exerciseTree)).toList(); } else if (headRecord[0] == "ExerciseType") { - final List exerciseTypes = json - .map((exerciseType) => ExerciseType.fromJson(exerciseType)) - .toList(); + final List exerciseTypes = json.map((exerciseType) => ExerciseType.fromJson(exerciseType)).toList(); await Future.forEach(exerciseTypes, (elem) async { final ExerciseType exerciseType = elem as ExerciseType; - exerciseType.imageUrl = await ExerciseTypeApi() - .buildImage(exerciseType.imageUrl, exerciseType.exerciseTypeId); + exerciseType.imageUrl = await ExerciseTypeApi().buildImage(exerciseType.imageUrl, exerciseType.exerciseTypeId); }); Cache().setExerciseTypes(exerciseTypes); } else if (headRecord[0] == "ExerciseAbility") { } else if (headRecord[0] == "ExercisePlanTemplate") { - final List exercisePlanTemplates = json - .map((exercisePlanTemplate) => - ExercisePlanTemplate.fromJson(exercisePlanTemplate)) - .toList(); + final List exercisePlanTemplates = + json.map((exercisePlanTemplate) => ExercisePlanTemplate.fromJson(exercisePlanTemplate)).toList(); Cache().setExercisePlanTemplates(exercisePlanTemplates); } else if (headRecord[0] == "ExerciseTreeParents") { - exerciseTreeParents = json - .map((exerciseTreeParent) => - ExerciseTreeParents.fromJson(exerciseTreeParent)) - .toList(); + exerciseTreeParents = json.map((exerciseTreeParent) => ExerciseTreeParents.fromJson(exerciseTreeParent)).toList(); } else if (headRecord[0] == "Evaluation") { - final List evaluations = - json.map((evaluation) => Evaluation.fromJson(evaluation)).toList(); + final List evaluations = json.map((evaluation) => Evaluation.fromJson(evaluation)).toList(); Cache().evaluations = evaluations; } else if (headRecord[0] == "Sport") { - final List sports = - json.map((sport) => Sport.fromJson(sport)).toList(); + final List sports = json.map((sport) => Sport.fromJson(sport)).toList(); Cache().setSports(sports); } else if (headRecord[0] == "Tutorial") { final Iterable json = jsonDecode(headRecord[1]); - final List tutorials = - json.map((tutorial) => Tutorial.fromJson(tutorial)).toList(); + final List tutorials = json.map((tutorial) => Tutorial.fromJson(tutorial)).toList(); Cache().setTutorials(tutorials); } else if (headRecord[0] == "Description") { final Iterable json = jsonDecode(headRecord[1]); - final List? descriptions = json - .map((description) => Description.fromJson(description)) - .toList(); + final List? descriptions = json.map((description) => Description.fromJson(description)).toList(); //print("Description: $descriptions"); Cache().setDescriptions(descriptions); } else if (headRecord[0] == "Faq") { @@ -109,8 +91,7 @@ class PackageApi { Cache().setFaqs(faqs); } else if (headRecord[0] == "TrainingPlan") { final Iterable json = jsonDecode(headRecord[1]); - final List? plans = - json.map((plan) => TrainingPlan.fromJson(plan)).toList(); + final List? plans = json.map((plan) => TrainingPlan.fromJson(plan)).toList(); List activePlans = []; if (plans != null) { @@ -123,38 +104,31 @@ class PackageApi { Cache().setTrainingPlans(activePlans); } else if (headRecord[0] == "SplitTests") { final Iterable json = jsonDecode(headRecord[1]); - final List? tests = - json.map((test) => SplitTest.fromJson(test)).toList(); + final List? tests = json.map((test) => SplitTest.fromJson(test)).toList(); //print("A/B tests: $tests"); Cache().setSplitTests(tests); } else if (headRecord[0] == "TrainingPlanDay") { final Iterable json = jsonDecode(headRecord[1]); - final List? days = - json.map((day) => TrainingPlanDay.fromJson(day)).toList(); + final List? days = json.map((day) => TrainingPlanDay.fromJson(day)).toList(); Cache().setTrainingPlanDays(days); } }); - exerciseTree = - this.getExerciseTreeParents(exerciseTree, exerciseTreeParents); + exerciseTree = this.getExerciseTreeParents(exerciseTree, exerciseTreeParents); await Future.forEach(exerciseTree, (element) async { ExerciseTree tree = element as ExerciseTree; - tree.imageUrl = - await ExerciseTreeApi().buildImage(tree.imageUrl, tree.treeId); + tree.imageUrl = await ExerciseTreeApi().buildImage(tree.imageUrl, tree.treeId); }); Cache().setExerciseTree(exerciseTree); - TrainingPlanDayRepository trainingPlanDayRepository = - TrainingPlanDayRepository(); + TrainingPlanDayRepository trainingPlanDayRepository = TrainingPlanDayRepository(); trainingPlanDayRepository.assignTrainingPlanDays(); return; } - List getExerciseTreeParents( - final List exerciseTree, - final List exerciseTreeParents) { + List getExerciseTreeParents(final List exerciseTree, final List exerciseTreeParents) { List copyList = ExerciseTreeApi().copyList(exerciseTree); int treeIndex = 0; @@ -184,8 +158,7 @@ class PackageApi { Future getCustomerPackage(int customerId) async { try { - final body = await _client.get( - "app_customer_package/" + customerId.toString(), ""); + final body = await _client.get("app_customer_package/" + customerId.toString(), ""); final List models = body.split("|||"); await Future.forEach(models, (elem) async { @@ -197,33 +170,24 @@ class PackageApi { Cache().userLoggedIn = customer; } else if (headRecord[0] == "CustomerExerciseDevice") { final Iterable json = jsonDecode(headRecord[1]); - final List devices = json - .map((device) => CustomerExerciseDevice.fromJson(device)) - .toList(); + final List devices = json.map((device) => CustomerExerciseDevice.fromJson(device)).toList(); Cache().setCustomerDevices(devices); // ToDo } else if (headRecord[0] == "Exercises") { final Iterable json = jsonDecode(headRecord[1]); - final List exercises = json - .map((exerciseType) => Exercise.fromJson(exerciseType)) - .toList(); + final List exercises = json.map((exerciseType) => Exercise.fromJson(exerciseType)).toList(); Cache().setExercises(exercises); } else if (headRecord[0] == "Purchase") { final Iterable json = jsonDecode(headRecord[1]); - final List purchases = - json.map((purchase) => Purchase.fromJson(purchase)).toList(); + final List purchases = json.map((purchase) => Purchase.fromJson(purchase)).toList(); Cache().setPurchases(purchases); } else if (headRecord[0] == "CustomerProperty") { final Iterable json = jsonDecode(headRecord[1]); - final List customerProperties = json - .map((property) => CustomerProperty.fromJson(property)) - .toList(); + final List customerProperties = json.map((property) => CustomerProperty.fromJson(property)).toList(); CustomerApi().initProperties(customerProperties); } else if (headRecord[0] == "CustomerPropertyAll") { final Iterable json = jsonDecode(headRecord[1]); - final List allCustomerProperties = json - .map((property) => CustomerProperty.fromJson(property)) - .toList(); + final List allCustomerProperties = json.map((property) => CustomerProperty.fromJson(property)).toList(); print(" All Properties ---- $allCustomerProperties"); Cache().setCustomerPropertyAll(allCustomerProperties); } else if (headRecord[0] == "ExerciseResult") { @@ -235,14 +199,12 @@ class PackageApi { // ToDo */ } else if (headRecord[0] == "CustomerActivity") { final Iterable json = jsonDecode(headRecord[1]); - final List customerActivities = json - .map((activity) => CustomerActivity.fromJson(activity)) - .toList(); + final List customerActivities = json.map((activity) => CustomerActivity.fromJson(activity)).toList(); Cache().setCustomerActivities(customerActivities); } }); - } on NotFoundException catch (_) { - throw Exception("Please log in"); + } on NotFoundException catch (e) { + throw Exception("Please log in $e"); } } } diff --git a/lib/util/track.dart b/lib/util/track.dart index fa3799a..151c8d5 100644 --- a/lib/util/track.dart +++ b/lib/util/track.dart @@ -9,6 +9,7 @@ import 'package:firebase_messaging/firebase_messaging.dart'; //import 'package:flurry_data/flurry_data.dart'; import 'package:flutter_uxcam/flutter_uxcam.dart'; import 'package:flutter_smartlook/flutter_smartlook.dart'; +import 'package:matomo_tracker/matomo_tracker.dart'; class Track with Logging { static final Track _singleton = Track._internal(); @@ -37,6 +38,7 @@ class Track with Logging { FirebaseMessaging.instance.subscribeToTopic(event.enumToString()); analytics.logEvent(name: event.enumToString(), parameters: {"value": eventValue}); + MatomoTracker.instance.trackEvent(name: event.enumToString(), action: eventValue, eventValue: tracking.customerId); } } } diff --git a/pubspec.lock b/pubspec.lock index c8264f5..fe9b846 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -266,7 +266,7 @@ packages: name: device_info_plus url: "https://pub.dartlang.org" source: hosted - version: "3.2.2" + version: "3.2.4" device_info_plus_linux: dependency: transitive description: @@ -280,7 +280,7 @@ packages: name: device_info_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "2.2.3" device_info_plus_platform_interface: dependency: transitive description: @@ -530,7 +530,7 @@ packages: name: flutter_facebook_auth url: "https://pub.dartlang.org" source: hosted - version: "4.3.4" + version: "4.3.4+2" flutter_facebook_auth_platform_interface: dependency: transitive description: @@ -647,7 +647,7 @@ packages: name: flutter_smartlook url: "https://pub.dartlang.org" source: hosted - version: "3.0.9" + version: "3.0.10" flutter_svg: dependency: transitive description: @@ -666,7 +666,7 @@ packages: name: flutter_uxcam url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.1" flutter_web_plugins: dependency: transitive description: flutter @@ -706,7 +706,21 @@ packages: name: google_sign_in url: "https://pub.dartlang.org" source: hosted - version: "5.2.4" + version: "5.3.3" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + url: "https://pub.dartlang.org" + source: hosted + version: "5.2.8" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + url: "https://pub.dartlang.org" + source: hosted + version: "5.3.1" google_sign_in_platform_interface: dependency: transitive description: @@ -840,6 +854,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.3" + matomo_tracker: + dependency: "direct main" + description: + name: matomo_tracker + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" meta: dependency: transitive description: @@ -923,14 +944,14 @@ packages: name: package_info_plus url: "https://pub.dartlang.org" source: hosted - version: "1.4.0" + version: "1.4.2" package_info_plus_linux: dependency: transitive description: name: package_info_plus_linux url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.0.5" package_info_plus_macos: dependency: transitive description: @@ -951,14 +972,14 @@ packages: name: package_info_plus_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.5" package_info_plus_windows: dependency: transitive description: name: package_info_plus_windows url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.5" path: dependency: transitive description: @@ -1161,7 +1182,7 @@ packages: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "2.0.13" + version: "2.0.15" shared_preferences_android: dependency: transitive description: @@ -1245,7 +1266,7 @@ packages: name: sign_in_with_apple url: "https://pub.dartlang.org" source: hosted - version: "3.3.0" + version: "4.0.0" sign_in_with_apple_platform_interface: dependency: transitive description: @@ -1482,6 +1503,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" + universal_platform: + dependency: transitive + description: + name: universal_platform + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0+1" upgrader: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 5d044fb..77f7bff 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -74,13 +74,14 @@ dependencies: syncfusion_flutter_calendar: ^20.1.47 syncfusion_localizations: ^20.1.47 - flutter_facebook_auth: ^4.1.2 - google_sign_in: ^5.2.4 - sign_in_with_apple: ^3.3.0 + flutter_facebook_auth: ^4.3.4+2 + google_sign_in: ^5.3.3 + sign_in_with_apple: ^4.0.0 - flutter_smartlook: ^3.0.9 + flutter_smartlook: ^3.0.10 #flurry_data: ^0.0.1 - flutter_uxcam: ^2.0.1 + matomo_tracker: ^1.1.2 + flutter_uxcam: ^2.1.1 animated_widgets: ^1.0.6 flutter_fancy_tree_view: ^0.5.1+1