This commit is contained in:
bossanyit 2022-10-18 18:48:18 +02:00
parent fb01016494
commit b5e387ee2a
9 changed files with 113 additions and 107 deletions

View File

@ -5,18 +5,10 @@
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="${applicationName}"
android:label="WorkoutTest"
android:icon="@mipmap/launcher_icon">
<activity android:name="io.flutter.embedding.android.FlutterActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
android:allowBackup="false"
android:fullBackupContent="false">
<application android:name="${applicationName}" android:label="WorkoutTest" android:icon="@mipmap/launcher_icon">
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" />
<meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>
<activity android:name="io.flutter.embedding.android.FlutterActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:allowBackup="false" android:fullBackupContent="false">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
@ -65,4 +57,7 @@
</intent-filter>
</activity>
</application>
<queries>
<provider android:authorities="com.facebook.katana.provider.PlatformProvider" />
</queries>
</manifest>

View File

@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">WorkoutTest</string>
<string name="app_name">WorkoutTest</string>
<!-- Replace "000000000000" with your Facebook App ID here. -->
<string name="facebook_app_id">584181112271127</string>
<!-- Replace "000000000000" with your Facebook App ID here. -->
<string name="facebook_app_id">584181112271127</string>
<string name="facebook_client_token">60d565f451ce32de3d7eeb26274bbddd</string>
<!--
<!--
Replace "000000000000" with your Facebook App ID here.
**NOTE**: The scheme needs to start with `fb` and then your ID.
-->
<string name="fb_login_protocol_scheme">fb584181112271127</string>
<string name="fb_login_protocol_scheme">fb584181112271127</string>
</resources>

View File

@ -161,7 +161,7 @@ class SalesBloc extends Bloc<SalesEvent, SalesState> 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);

View File

@ -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<Null> _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<Null> main() async {
Future<void> 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<Null> main() async {
BlocProvider<TestSetExecuteBloc>(
create: (BuildContext context) => TestSetExecuteBloc(),
),
BlocProvider<TutorialBloc>(create: (BuildContext context) => TutorialBloc(tutorialName: ActivityDone.tutorialExecuteFirstTest.toStr())),
BlocProvider<TutorialBloc>(
create: (BuildContext context) => TutorialBloc(tutorialName: ActivityDone.tutorialExecuteFirstTest.toStr())),
BlocProvider<TrainingPlanBloc>(create: (context) {
final MenuBloc menuBloc = BlocProvider.of<MenuBloc>(context);
return TrainingPlanBloc(menuBloc: menuBloc, trainingPlanRepository: TrainingPlanRepository());

View File

@ -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<int, ExercisePlanDetail> listExercisePlanDetail) => _myExercisesPlanDetails = listExercisePlanDetail;
void setMyExercisePlanDetails(LinkedHashMap<int, ExercisePlanDetail> 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<void> 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 {

View File

@ -44,62 +44,44 @@ class PackageApi {
final List<String> headRecord = element.split("***");
final Iterable json = jsonDecode(headRecord[1]);
if (headRecord[0] == "ExerciseDevice") {
final List<ExerciseDevice> devices =
json.map((device) => ExerciseDevice.fromJson(device)).toList();
final List<ExerciseDevice> devices = json.map((device) => ExerciseDevice.fromJson(device)).toList();
Cache().setDevices(devices);
} else if (headRecord[0] == "Product") {
final List<Product> products =
json.map((product) => Product.fromJson(product)).toList();
final List<Product> products = json.map((product) => Product.fromJson(product)).toList();
Cache().setProducts(products);
} else if (headRecord[0] == "Property") {
final List<Property> properties =
json.map((property) => Property.fromJson(property)).toList();
final List<Property> 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<ExerciseType> exerciseTypes = json
.map((exerciseType) => ExerciseType.fromJson(exerciseType))
.toList();
final List<ExerciseType> 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<ExercisePlanTemplate> exercisePlanTemplates = json
.map((exercisePlanTemplate) =>
ExercisePlanTemplate.fromJson(exercisePlanTemplate))
.toList();
final List<ExercisePlanTemplate> 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<Evaluation> evaluations =
json.map((evaluation) => Evaluation.fromJson(evaluation)).toList();
final List<Evaluation> evaluations = json.map((evaluation) => Evaluation.fromJson(evaluation)).toList();
Cache().evaluations = evaluations;
} else if (headRecord[0] == "Sport") {
final List<Sport> sports =
json.map((sport) => Sport.fromJson(sport)).toList();
final List<Sport> sports = json.map((sport) => Sport.fromJson(sport)).toList();
Cache().setSports(sports);
} else if (headRecord[0] == "Tutorial") {
final Iterable json = jsonDecode(headRecord[1]);
final List<Tutorial> tutorials =
json.map((tutorial) => Tutorial.fromJson(tutorial)).toList();
final List<Tutorial> tutorials = json.map((tutorial) => Tutorial.fromJson(tutorial)).toList();
Cache().setTutorials(tutorials);
} else if (headRecord[0] == "Description") {
final Iterable json = jsonDecode(headRecord[1]);
final List<Description>? descriptions = json
.map((description) => Description.fromJson(description))
.toList();
final List<Description>? 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<TrainingPlan>? plans =
json.map((plan) => TrainingPlan.fromJson(plan)).toList();
final List<TrainingPlan>? plans = json.map((plan) => TrainingPlan.fromJson(plan)).toList();
List<TrainingPlan> 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<SplitTest>? tests =
json.map((test) => SplitTest.fromJson(test)).toList();
final List<SplitTest>? 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<TrainingPlanDay>? days =
json.map((day) => TrainingPlanDay.fromJson(day)).toList();
final List<TrainingPlanDay>? 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<ExerciseTree> getExerciseTreeParents(
final List<ExerciseTree> exerciseTree,
final List<ExerciseTreeParents> exerciseTreeParents) {
List<ExerciseTree> getExerciseTreeParents(final List<ExerciseTree> exerciseTree, final List<ExerciseTreeParents> exerciseTreeParents) {
List<ExerciseTree> copyList = ExerciseTreeApi().copyList(exerciseTree);
int treeIndex = 0;
@ -184,8 +158,7 @@ class PackageApi {
Future<void> 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<String> 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<CustomerExerciseDevice> devices = json
.map((device) => CustomerExerciseDevice.fromJson(device))
.toList();
final List<CustomerExerciseDevice> 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<Exercise> exercises = json
.map((exerciseType) => Exercise.fromJson(exerciseType))
.toList();
final List<Exercise> exercises = json.map((exerciseType) => Exercise.fromJson(exerciseType)).toList();
Cache().setExercises(exercises);
} else if (headRecord[0] == "Purchase") {
final Iterable json = jsonDecode(headRecord[1]);
final List<Purchase> purchases =
json.map((purchase) => Purchase.fromJson(purchase)).toList();
final List<Purchase> purchases = json.map((purchase) => Purchase.fromJson(purchase)).toList();
Cache().setPurchases(purchases);
} else if (headRecord[0] == "CustomerProperty") {
final Iterable json = jsonDecode(headRecord[1]);
final List<CustomerProperty> customerProperties = json
.map((property) => CustomerProperty.fromJson(property))
.toList();
final List<CustomerProperty> customerProperties = json.map((property) => CustomerProperty.fromJson(property)).toList();
CustomerApi().initProperties(customerProperties);
} else if (headRecord[0] == "CustomerPropertyAll") {
final Iterable json = jsonDecode(headRecord[1]);
final List<CustomerProperty> allCustomerProperties = json
.map((property) => CustomerProperty.fromJson(property))
.toList();
final List<CustomerProperty> 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<CustomerActivity> customerActivities = json
.map((activity) => CustomerActivity.fromJson(activity))
.toList();
final List<CustomerActivity> 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");
}
}
}

View File

@ -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);
}
}
}

View File

@ -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:

View File

@ -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