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