diff --git a/android/app/build.gradle b/android/app/build.gradle index 22e3294..4ea19e5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -52,6 +52,11 @@ android { multiDexEnabled true } + android { + compileSdkVersion 33 + + } + signingConfigs { release { keyAlias keystoreProperties['keyAlias'] 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/login/login_bloc.dart b/lib/bloc/login/login_bloc.dart index e08437b..a0dfa7d 100644 --- a/lib/bloc/login/login_bloc.dart +++ b/lib/bloc/login/login_bloc.dart @@ -88,40 +88,59 @@ class LoginBloc extends Bloc with Trans { void _onSubmit(LoginSubmit event, Emitter emit) async { emit(LoginLoading()); - await userRepository.getUser(); - accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); - Track().track(TrackingEvent.login, eventValue: "email"); - Cache().setLoginType(LoginType.email); - - emit(LoginSuccess()); + try { + await userRepository.getUser(); + accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); + Track().track(TrackingEvent.login, eventValue: "email"); + Cache().setLoginType(LoginType.email); + } on Exception catch(e) { + emit(LoginError(message: e.toString())); + } finally { + emit(LoginSuccess()); + } } void _onLoginFB(LoginFB event, Emitter emit) async { emit(LoginLoading()); - Cache().setLoginType(LoginType.fb); - await userRepository.getUserByFB(); - accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); - Track().track(TrackingEvent.login, eventValue: "FB"); - emit(LoginSuccess()); + try { + Cache().setLoginType(LoginType.fb); + await userRepository.getUserByFB(); + accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); + Track().track(TrackingEvent.login, eventValue: "FB"); + } on Exception catch(e) { + emit(LoginError(message: e.toString())); + } finally { + emit(LoginSuccess()); + } } void _onLoginGoogle(LoginGoogle event, Emitter emit) async { emit(LoginLoading()); - Cache().setLoginType(LoginType.google); - await userRepository.getUserByGoogle(); - accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); - Track().track(TrackingEvent.login, eventValue: "Google"); + try { + Cache().setLoginType(LoginType.google); + await userRepository.getUserByGoogle(); + accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); + Track().track(TrackingEvent.login, eventValue: "Google"); - emit(LoginSuccess()); + } on Exception catch(e) { + emit(LoginError(message: e.toString())); + } finally { + emit(LoginSuccess()); + } } void _onLoginApple(LoginApple event, Emitter emit) async { emit(LoginLoading()); - Cache().setLoginType(LoginType.apple); - await userRepository.getUserByApple(); - accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); - Track().track(TrackingEvent.login, eventValue: "Apple"); - emit(LoginSuccess()); + try { + Cache().setLoginType(LoginType.apple); + await userRepository.getUserByApple(); + accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); + Track().track(TrackingEvent.login, eventValue: "Apple"); + } on Exception catch(e) { + emit(LoginError(message: e.toString())); + } finally { + emit(LoginSuccess()); + } } void _onRegistrationSubmit(RegistrationSubmit event, Emitter emit) async { 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/library/dropdown_search/dropdown_search.dart b/lib/library/dropdown_search/dropdown_search.dart index cc5f6dd..55fe4f5 100644 --- a/lib/library/dropdown_search/dropdown_search.dart +++ b/lib/library/dropdown_search/dropdown_search.dart @@ -296,7 +296,7 @@ class DropdownSearchState extends State> { initialValue: widget.selectedItem, builder: (FormFieldState state) { if (state.value != value) { - WidgetsBinding.instance!.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((_) { state.didChange(value); }); } diff --git a/lib/library/dropdown_search/select_dialog.dart b/lib/library/dropdown_search/select_dialog.dart index 45ccf36..898be82 100644 --- a/lib/library/dropdown_search/select_dialog.dart +++ b/lib/library/dropdown_search/select_dialog.dart @@ -182,7 +182,7 @@ class _SelectDialogState extends State> { content: _errorWidget(error), actions: [ TextButton( - child: new Text("OK"), + child: const Text("OK"), onPressed: () { Navigator.of(context).pop(false); }, diff --git a/lib/library/super_tooltip.dart b/lib/library/super_tooltip.dart index 859adae..4317311 100644 --- a/lib/library/super_tooltip.dart +++ b/lib/library/super_tooltip.dart @@ -1127,7 +1127,7 @@ class _AnimationWrapperState extends State<_AnimationWrapper> { @override void initState() { super.initState(); - WidgetsBinding.instance!.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { setState(() { opacity = 1.0; diff --git a/lib/main.dart b/lib/main.dart index 30eb527..b74d63c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -54,10 +54,11 @@ import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:aitrainer_app/util/app_localization.dart'; -import 'package:flutter_uxcam/flutter_uxcam.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:flutter_smartlook/flutter_smartlook.dart'; import 'package:upgrader/upgrader.dart'; import 'bloc/account/account_bloc.dart'; import 'bloc/body_development/body_development_bloc.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,7 +148,12 @@ Future main() async { Future initThirdParty() async { if (!isInDebugMode) { //await FlurryData.initialize(androidKey: "JNYCTCWBT34FM3J8TV36", iosKey: "3QBG7BSMGPDH24S8TRQP", enableLog: true); - FlutterUxcam.optIntoSchematicRecordings(); + await MatomoTracker.instance.initialize( + siteId: 3, + url: 'https://matomo.workouttest.com/matomo.php', + //visitorId: 'customer_1', + ); + //FlutterUxcam.optIntoSchematicRecordings(); } await FirebaseApi().initializeFlutterFire(); } @@ -154,11 +161,11 @@ Future main() async { final WorkoutTreeRepository menuTreeRepository = WorkoutTreeRepository(); WidgetsFlutterBinding.ensureInitialized(); if (!isInDebugMode) { - FlutterUxcam.startWithKey("wvdstyoml4tiwfd"); + //FlutterUxcam.startWithKey("wvdstyoml4tiwfd"); - SetupOptions options = (new SetupOptionsBuilder('682883e5cd71a46160c4f6ed070530ee593f49c6')).build(); - Smartlook.setupAndStartRecording(options); - Smartlook.setEventTrackingMode(EventTrackingMode.FULL_TRACKING); + //SetupOptions options = (new SetupOptionsBuilder('682883e5cd71a46160c4f6ed070530ee593f49c6')).build(); + //Smartlook.setupAndStartRecording(options); + //Smartlook.setEventTrackingMode(EventTrackingMode.FULL_TRACKING); } await initThirdParty(); final FirebaseAnalytics analytics = FirebaseAnalytics.instance; @@ -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()); @@ -216,9 +224,6 @@ class WorkoutTestApp extends StatelessWidget { @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - - // Only call clearSavedSettings() during testing to reset internal values. - Upgrader().clearSavedSettings(); // REMOVE this for release builds Upgrader().installAppStoreListingURL(Platform.isAndroid ? "https://play.google.com/store/apps/details?id=com.aitrainer.aitrainer_app" : "https://apps.apple.com/hu/app/workouttest/id1515271425"); diff --git a/lib/model/cache.dart b/lib/model/cache.dart index dc27681..d96f467 100644 --- a/lib/model/cache.dart +++ b/lib/model/cache.dart @@ -34,12 +34,13 @@ import 'package:aitrainer_app/util/track.dart'; 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: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'; import 'package:intl/intl.dart'; -import 'package:flutter_smartlook/flutter_smartlook.dart'; +//import 'package:flutter_smartlook/flutter_smartlook.dart'; import 'customer_exercise_device.dart'; import 'exercise_device.dart'; @@ -175,7 +176,7 @@ class Cache with Logging { List? _exercisesTrainee; ExercisePlan? _traineeExercisePlan; - RemoteConfig? remoteConfig; + FirebaseRemoteConfig? remoteConfig; LinkedHashMap _badges = LinkedHashMap(); @@ -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,14 +689,21 @@ 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()); - FlutterUxcam.setUserProperty("username", customerId.toString()); - FlutterUxcam.setUserIdentity(customerId.toString()); - Smartlook.setUserIdentifier(customerId.toString()); + //FlutterUxcam.setUserProperty("username", customerId.toString()); + //FlutterUxcam.setUserIdentity(customerId.toString()); + //Smartlook.setUserIdentifier(customerId.toString()); + //Smartlook.instance. Track().track(TrackingEvent.enter); + MatomoTracker.instance + .trackEvent(eventName: TrackingEvent.enter.enumToString(), eventCategory: "", action: TrackingEvent.enter.enumToString(), eventValue: customerId); } await Future.forEach(ActivityDone.values, (element) async { @@ -751,8 +761,8 @@ class Cache with Logging { List? get tutorials => this._tutorials; setTutorials(List? value) => this._tutorials = value; - RemoteConfig? getRemoteConfig() => this.remoteConfig; - setRemoteConfig(RemoteConfig? remoteConfig) => this.remoteConfig = remoteConfig; + FirebaseRemoteConfig? getRemoteConfig() => this.remoteConfig; + setRemoteConfig(FirebaseRemoteConfig? remoteConfig) => this.remoteConfig = remoteConfig; List? getDescriptions() => this._descriptions; setDescriptions(List? value) => this._descriptions = value; diff --git a/lib/repository/remote_config_repository.dart b/lib/repository/remote_config_repository.dart index a5b1121..829fb7b 100644 --- a/lib/repository/remote_config_repository.dart +++ b/lib/repository/remote_config_repository.dart @@ -2,8 +2,9 @@ import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/service/logging.dart'; import 'package:firebase_remote_config/firebase_remote_config.dart'; + class RemoteConfigRepository with Logging { - RemoteConfig? remoteConfig; + FirebaseRemoteConfig? remoteConfig; String getConfigValue(String configKey, String baseValue) { String value = ""; diff --git a/lib/repository/split_test_respository.dart b/lib/repository/split_test_respository.dart index 43d7a38..82b871b 100644 --- a/lib/repository/split_test_respository.dart +++ b/lib/repository/split_test_respository.dart @@ -3,8 +3,9 @@ import 'package:aitrainer_app/repository/description_repository.dart'; import 'package:aitrainer_app/service/logging.dart'; import 'package:firebase_remote_config/firebase_remote_config.dart'; + class SplitTestRepository with Logging { - final RemoteConfig? _remoteConfig = Cache().remoteConfig; + final FirebaseRemoteConfig? _remoteConfig = Cache().remoteConfig; final DescriptionRepository descriptionRepository = DescriptionRepository(); String getSplitTestValue(String remoteConfigKey) { diff --git a/lib/service/firebase_api.dart b/lib/service/firebase_api.dart index d5aa84d..9b88bab 100644 --- a/lib/service/firebase_api.dart +++ b/lib/service/firebase_api.dart @@ -384,13 +384,14 @@ class FirebaseApi with logging.Logging { RemoteConfig? remoteConfig; try { remoteConfig = RemoteConfig.instance; - await remoteConfig.setConfigSettings(RemoteConfigSettings( + await remoteConfig.setConfigSettings( + RemoteConfigSettings( fetchTimeout: const Duration(seconds: 10), minimumFetchInterval: const Duration(seconds: 1), )); - RemoteConfigValue(null, ValueSource.valueStatic); - Cache().setRemoteConfig(remoteConfig); + //RemoteConfigValue(null, ValueSource.valueStatic); + //Cache().setRemoteConfig(remoteConfig); } on Exception catch (e) { print('Unable to fetch remote config. Cached or default values will be used: $e'); if (remoteConfig != null) { 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..2e263ec 100644 --- a/lib/util/track.dart +++ b/lib/util/track.dart @@ -7,8 +7,9 @@ import 'package:aitrainer_app/model/tracking.dart' as model; import 'package:firebase_analytics/firebase_analytics.dart'; 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: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(); @@ -23,8 +24,8 @@ class Track with Logging { void track(TrackingEvent event, {String eventValue = ""}) { if (!isInDebugMode) { //FlurryData.logEvent(event.enumToString()); - Smartlook.setGlobalEventProperty(event.toString(), eventValue, false); - FlutterUxcam.logEventWithProperties(event.enumToString(), {"value": eventValue}); + //Smartlook.setGlobalEventProperty(event.toString(), eventValue, false); + //FlutterUxcam.logEventWithProperties(event.enumToString(), {"value": eventValue}); model.Tracking tracking = model.Tracking(); tracking.customerId = Cache().userLoggedIn == null ? 0 : Cache().userLoggedIn!.customerId!; tracking.event = event.enumToString(); @@ -37,6 +38,7 @@ class Track with Logging { FirebaseMessaging.instance.subscribeToTopic(event.enumToString()); analytics.logEvent(name: event.enumToString(), parameters: {"value": eventValue}); + MatomoTracker.instance.trackEvent(eventName: event.enumToString(), eventCategory: "", action: eventValue, eventValue: tracking.customerId); } } } diff --git a/lib/widgets/home.dart b/lib/widgets/home.dart index d83c12a..f24cb66 100644 --- a/lib/widgets/home.dart +++ b/lib/widgets/home.dart @@ -70,17 +70,7 @@ class _HomePageState extends State with Logging, Trans { return Scaffold( key: _scaffoldKey, body: UpgradeAlert( - appcastConfig: cfg, - dialogStyle: UpgradeDialogStyle.cupertino, - countryCode: AppLanguage().appLocal.languageCode, - showIgnore: false, - showLater: false, - showReleaseNotes: false, - debugLogging: true, - //debugAlwaysUpgrade: true, - //debugDisplayOnce: true, - //minAppVersion: Cache().packageInfo != null ? Cache().packageInfo!.version : "99.99.99", - messages: MyLocalizedUpgraderMessages(context: context), + upgrader: Upgrader(appcastConfig: cfg, messages: MyLocalizedUpgraderMessages(context: context)), child: BlocConsumer(listener: (context, state) { if (state is SessionFailure) { showDialog( @@ -148,6 +138,8 @@ class MyLocalizedUpgraderMessages extends UpgraderMessages with Trans { return t('Want to update?'); case UpgraderMessage.title: return t('Update App?'); + case UpgraderMessage.releaseNotes: + return ""; } // Messages that are not provided above can still use the default values. diff --git a/pubspec.lock b/pubspec.lock index c8264f5..0d9ae12 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,14 +7,21 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "31.0.0" + version: "47.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "2.8.0" + version: "4.7.0" animated_widgets: dependency: "direct main" description: @@ -42,7 +49,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" badges: dependency: "direct main" description: @@ -56,14 +63,14 @@ packages: name: bloc url: "https://pub.dartlang.org" source: hosted - version: "8.0.3" + version: "8.1.0" bloc_test: dependency: "direct dev" description: name: bloc_test url: "https://pub.dartlang.org" source: hosted - version: "9.0.3" + version: "9.1.0" boolean_selector: dependency: transitive description: @@ -77,7 +84,7 @@ packages: name: build url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "2.3.1" build_config: dependency: transitive description: @@ -91,21 +98,21 @@ packages: name: build_daemon url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.1.0" build_resolvers: dependency: transitive description: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.0.10" build_runner: dependency: "direct dev" description: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "2.1.8" + version: "2.1.11" build_runner_core: dependency: transitive description: @@ -140,7 +147,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -169,34 +176,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "5.8.1" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" code_builder: dependency: transitive description: name: code_builder url: "https://pub.dartlang.org" source: hosted - version: "4.1.0" + version: "4.3.0" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" confetti: dependency: "direct main" description: @@ -259,56 +273,56 @@ packages: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "2.2.4" device_info_plus: dependency: transitive description: name: device_info_plus url: "https://pub.dartlang.org" source: hosted - version: "3.2.2" + version: "4.1.3" device_info_plus_linux: dependency: transitive description: name: device_info_plus_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "3.0.0" device_info_plus_macos: dependency: transitive description: name: device_info_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "3.0.0" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.3.0+1" + version: "3.0.0" device_info_plus_web: dependency: transitive description: name: device_info_plus_web url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.0" device_info_plus_windows: dependency: transitive description: name: device_info_plus_windows url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "4.1.0" devicelocale: dependency: "direct main" description: name: devicelocale url: "https://pub.dartlang.org" source: hosted - version: "0.5.0" + version: "0.5.5" diff_match_patch: dependency: transitive description: @@ -322,14 +336,14 @@ packages: name: equatable url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.5" extended_tabs: dependency: "direct main" description: name: extended_tabs url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "4.0.1" ezanimation: dependency: "direct main" description: @@ -343,14 +357,14 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" ffi: dependency: transitive description: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "2.0.1" file: dependency: transitive description: @@ -364,133 +378,133 @@ packages: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "9.1.2" + version: "10.0.1" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.1.1" + version: "3.3.9" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.4.0+8" + version: "0.5.1" firebase_auth: dependency: "direct main" description: name: firebase_auth url: "https://pub.dartlang.org" source: hosted - version: "3.3.11" + version: "4.0.1" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "6.2.1" + version: "6.10.3" firebase_auth_web: dependency: transitive description: name: firebase_auth_web url: "https://pub.dartlang.org" source: hosted - version: "3.3.9" + version: "5.0.1" firebase_core: dependency: "direct main" description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.13.1" + version: "2.0.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.5" + version: "4.5.1" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.1" + version: "2.0.0" firebase_dynamic_links: dependency: "direct main" description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "4.1.1" + version: "5.0.1" firebase_dynamic_links_platform_interface: dependency: transitive description: name: firebase_dynamic_links_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "0.2.2+1" + version: "0.2.3+17" firebase_in_app_messaging: dependency: "direct main" description: name: firebase_in_app_messaging url: "https://pub.dartlang.org" source: hosted - version: "0.6.0+9" + version: "0.7.0+1" firebase_in_app_messaging_platform_interface: dependency: transitive description: name: firebase_in_app_messaging_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "0.2.1+1" + version: "0.2.1+21" firebase_messaging: dependency: "direct main" description: name: firebase_messaging url: "https://pub.dartlang.org" source: hosted - version: "11.2.11" + version: "14.0.1" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.2.1" + version: "4.2.2" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web url: "https://pub.dartlang.org" source: hosted - version: "2.2.9" + version: "3.2.2" firebase_remote_config: dependency: "direct main" description: name: firebase_remote_config url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.1" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.1" + version: "1.1.21" firebase_remote_config_web: dependency: transitive description: name: firebase_remote_config_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.7" + version: "1.1.10" fixnum: dependency: transitive description: @@ -498,13 +512,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - fl_chart: - dependency: "direct main" - description: - name: fl_chart - url: "https://pub.dartlang.org" - source: hosted - version: "0.50.0" flutter: dependency: "direct main" description: flutter @@ -523,28 +530,28 @@ packages: name: flutter_bloc url: "https://pub.dartlang.org" source: hosted - version: "8.0.1" + version: "8.1.1" flutter_facebook_auth: dependency: "direct main" description: name: flutter_facebook_auth url: "https://pub.dartlang.org" source: hosted - version: "4.3.4" + version: "4.4.1+1" flutter_facebook_auth_platform_interface: dependency: transitive description: name: flutter_facebook_auth_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.1.2" + version: "3.2.0" flutter_facebook_auth_web: dependency: transitive description: name: flutter_facebook_auth_web url: "https://pub.dartlang.org" source: hosted - version: "3.1.2" + version: "3.2.0" flutter_fadein: dependency: "direct main" description: @@ -580,6 +587,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.6" + flutter_lints: + dependency: "direct main" + description: + name: flutter_lints + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" flutter_localizations: dependency: "direct main" description: flutter @@ -641,13 +655,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.2" - flutter_smartlook: - dependency: "direct main" - description: - name: flutter_smartlook - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.9" flutter_svg: dependency: transitive description: @@ -660,13 +667,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_uxcam: - dependency: "direct main" - description: - name: flutter_uxcam - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" flutter_web_plugins: dependency: transitive description: flutter @@ -706,14 +706,28 @@ packages: name: google_sign_in url: "https://pub.dartlang.org" source: hosted - version: "5.2.4" + version: "5.4.2" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.1" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + url: "https://pub.dartlang.org" + source: hosted + version: "5.5.0" google_sign_in_platform_interface: dependency: transitive description: name: google_sign_in_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" + version: "2.3.0" google_sign_in_web: dependency: transitive description: @@ -741,7 +755,7 @@ packages: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.13.4" + version: "0.13.5" http_multi_server: dependency: transitive description: @@ -790,7 +804,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: @@ -812,6 +826,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.5.2" + lints: + dependency: transitive + description: + name: lints + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" logging: dependency: transitive description: @@ -832,21 +853,28 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.5" + matomo_tracker: + dependency: "direct main" + description: + name: matomo_tracker + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.0" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: @@ -860,7 +888,7 @@ packages: name: mockito url: "https://pub.dartlang.org" source: hosted - version: "5.1.0" + version: "5.3.2" mocktail: dependency: transitive description: @@ -874,7 +902,7 @@ packages: name: modal_progress_hud_nsn url: "https://pub.dartlang.org" source: hosted - version: "0.1.0-nullsafety-1" + version: "0.3.0" nested: dependency: transitive description: @@ -923,14 +951,14 @@ packages: name: package_info_plus url: "https://pub.dartlang.org" source: hosted - version: "1.4.0" + version: "1.4.3+1" 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,21 +979,21 @@ 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: "2.1.0" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" path_drawing: dependency: transitive description: @@ -1007,7 +1035,7 @@ packages: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.5" + version: "2.1.7" path_provider_macos: dependency: transitive description: @@ -1028,7 +1056,7 @@ packages: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.1.3" percent_indicator: dependency: "direct main" description: @@ -1133,21 +1161,21 @@ packages: name: rxdart url: "https://pub.dartlang.org" source: hosted - version: "0.27.3" + version: "0.27.5" sentry: dependency: transitive description: name: sentry url: "https://pub.dartlang.org" source: hosted - version: "6.4.0" + version: "6.13.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter url: "https://pub.dartlang.org" source: hosted - version: "6.4.0" + version: "6.13.0" share: dependency: transitive description: @@ -1161,7 +1189,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 +1273,7 @@ packages: name: sign_in_with_apple url: "https://pub.dartlang.org" source: hosted - version: "3.3.0" + version: "4.1.0" sign_in_with_apple_platform_interface: dependency: transitive description: @@ -1271,7 +1299,7 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "1.2.1" + version: "1.2.6" source_map_stack_trace: dependency: transitive description: @@ -1292,21 +1320,21 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" sqflite: dependency: "direct main" description: name: sqflite url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.0+1" sqflite_common: dependency: transitive description: name: sqflite_common url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "2.3.0" stack_trace: dependency: transitive description: @@ -1320,7 +1348,7 @@ packages: name: stop_watch_timer url: "https://pub.dartlang.org" source: hosted - version: "1.3.1" + version: "2.0.0" stream_channel: dependency: transitive description: @@ -1341,56 +1369,63 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_scroll_library: + dependency: transitive + description: + name: sync_scroll_library + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" syncfusion_flutter_calendar: dependency: "direct main" description: name: syncfusion_flutter_calendar url: "https://pub.dartlang.org" source: hosted - version: "20.1.47" + version: "20.3.50" syncfusion_flutter_charts: dependency: "direct main" description: name: syncfusion_flutter_charts url: "https://pub.dartlang.org" source: hosted - version: "20.1.47+1" + version: "20.3.50" syncfusion_flutter_core: dependency: transitive description: name: syncfusion_flutter_core url: "https://pub.dartlang.org" source: hosted - version: "20.1.47" + version: "20.3.50" syncfusion_flutter_datagrid: dependency: "direct main" description: name: syncfusion_flutter_datagrid url: "https://pub.dartlang.org" source: hosted - version: "20.1.47" + version: "20.3.50" syncfusion_flutter_datepicker: dependency: transitive description: name: syncfusion_flutter_datepicker url: "https://pub.dartlang.org" source: hosted - version: "20.1.47" + version: "20.3.50" syncfusion_flutter_gauges: dependency: "direct main" description: name: syncfusion_flutter_gauges url: "https://pub.dartlang.org" source: hosted - version: "20.1.47" + version: "20.3.50" syncfusion_localizations: dependency: "direct main" description: name: syncfusion_localizations url: "https://pub.dartlang.org" source: hosted - version: "20.1.47" + version: "20.3.50" synchronized: dependency: transitive description: @@ -1404,28 +1439,28 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test: dependency: "direct dev" description: name: test url: "https://pub.dartlang.org" source: hosted - version: "1.19.5" + version: "1.21.4" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.12" test_core: dependency: transitive description: name: test_core url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.16" timeline_tile: dependency: "direct main" description: @@ -1439,7 +1474,7 @@ packages: name: timezone url: "https://pub.dartlang.org" source: hosted - version: "0.8.0" + version: "0.9.0" timing: dependency: transitive description: @@ -1453,7 +1488,7 @@ packages: name: toggle_switch url: "https://pub.dartlang.org" source: hosted - version: "1.4.0" + version: "2.0.1" tuple: dependency: transitive description: @@ -1482,20 +1517,27 @@ 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: name: upgrader url: "https://pub.dartlang.org" source: hosted - version: "3.13.0" + version: "4.8.1" url_launcher: dependency: "direct main" description: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.20" + version: "6.1.6" url_launcher_android: dependency: transitive description: @@ -1530,7 +1572,7 @@ packages: name: url_launcher_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.1.1" url_launcher_web: dependency: transitive description: @@ -1558,7 +1600,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" version: dependency: transitive description: @@ -1621,7 +1663,7 @@ packages: name: wakelock url: "https://pub.dartlang.org" source: hosted - version: "0.6.1+2" + version: "0.6.2" wakelock_macos: dependency: transitive description: @@ -1719,7 +1761,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.4.4" + version: "2.7.0" xdg_directories: dependency: transitive description: @@ -1742,5 +1784,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.16.0 <3.0.0" - flutter: ">=2.10.0" + dart: ">=2.18.0-0 <3.0.0" + flutter: ">=3.3.0-0" diff --git a/pubspec.yaml b/pubspec.yaml index 9181f14..c6220bb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,77 +18,92 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.1.26+107 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.12.0 <3.9.0" dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.0 - google_fonts: ^2.1.0 - devicelocale: ^0.5.0 - sentry_flutter: ^6.4.0 - flutter_bloc: ^8.0.1 - equatable: ^2.0.3 - - flutter_radar_chart: ^0.2.1 - rainbow_color: ^2.0.1 - percent_indicator: ^4.0.0 - fl_chart: ^0.50.0 - infinite_listview: ^1.1.0 - toggle_switch: ^1.4.0 - keyboard_actions: ^3.4.0 - badges: ^2.0.1 - stop_watch_timer: ^1.3.1 - #location: ^3.2.4 - modal_progress_hud_nsn: ^0.1.0-nullsafety-1 - flutter_html: ^2.0.0 - wakelock: ^0.6.1+2 - timeline_tile: ^2.0.0 - purchases_flutter: ^3.9.5 - package_info: ^2.0.0 - ezanimation: ^0.6.0 - confetti: ^0.6.0 - crypto: ^3.0.0 - carousel_slider: ^4.0.0 - convex_bottom_bar: ^3.0.0 - flutter_app_badger: ^1.2.0 - extended_tabs: ^2.2.0 - upgrader: ^3.11.0 - web_browser: ^0.5.0 - flutter_fadein: ^2.0.0 - mailto: ^2.0.0 - url_launcher: ^6.0.9 - - firebase_core: ^1.10.5 - firebase_analytics: ^9.1.2 - firebase_messaging: ^11.2.11 - firebase_auth: ^3.3.3 - firebase_remote_config: ^2.0.2 - firebase_dynamic_links: ^4.1.1 - firebase_in_app_messaging: ^0.6.0+4 - - syncfusion_flutter_gauges: ^20.1.47 - syncfusion_flutter_datagrid: ^20.1.47 - syncfusion_flutter_charts: ^20.1.47 - syncfusion_flutter_calendar: ^20.1.47 - syncfusion_localizations: ^20.1.47 - - flutter_facebook_auth: ^4.3.4 - google_sign_in: ^5.2.4 - sign_in_with_apple: ^3.3.0 - - flutter_smartlook: ^3.0.9 - #flurry_data: ^0.0.1 - flutter_uxcam: ^2.0.1 - animated_widgets: ^1.0.6 - flutter_fancy_tree_view: ^0.5.1+1 - mockito: ^5.0.3 - sqflite: ^2.0.0+3 + badges: ^2.0.1 + + carousel_slider: ^4.0.0 + confetti: ^0.6.0 + convex_bottom_bar: ^3.0.0 + crypto: ^3.0.0 + cupertino_icons: ^1.0.0 + + equatable: ^2.0.5 + extended_tabs: ^4.0.1 + ezanimation: ^0.6.0 + + devicelocale: ^0.5.5 + + firebase_core: ^2.0.0 + firebase_analytics: ^10.0.1 + firebase_messaging: ^14.0.1 + firebase_auth: ^4.0.1 + firebase_remote_config: ^3.0.1 + firebase_dynamic_links: ^5.0.1 + firebase_in_app_messaging: ^0.7.0+1 + + flutter_app_badger: ^1.2.0 + flutter_bloc: ^8.1.1 + flutter_html: ^2.0.0 + flutter_fancy_tree_view: ^0.5.1+1 + flutter_facebook_auth: ^4.4.1+1 + flutter_fadein: ^2.0.0 + flutter_lints: ^2.0.1 + flutter_radar_chart: ^0.2.1 flutter_secure_storage: ^5.0.2 + #flutter_smartlook: ^4.0.1 + + google_fonts: ^2.1.0 + google_sign_in: ^5.4.2 + + infinite_listview: ^1.1.0 + + keyboard_actions: ^3.4.0 + + mailto: ^2.0.0 + matomo_tracker: ^1.5.0 + mockito: ^5.3.2 + modal_progress_hud_nsn: ^0.3.0 + + package_info: ^2.0.2 + percent_indicator: ^4.0.0 + purchases_flutter: ^3.9.5 + + rainbow_color: ^2.0.1 + + sentry_flutter: ^6.13.0 + sign_in_with_apple: ^4.1.0 + sqflite: ^2.1.0+1 + stop_watch_timer: ^2.0.0 + + syncfusion_flutter_gauges: ^20.3.50 + syncfusion_flutter_datagrid: ^20.3.50 + syncfusion_flutter_charts: ^20.3.50 + syncfusion_flutter_calendar: ^20.3.50 + syncfusion_localizations: ^20.3.50 + + timeline_tile: ^2.0.0 + toggle_switch: ^2.0.1 + + upgrader: ^4.8.1 + url_launcher: ^6.0.9 + + wakelock: ^0.6.2 + web_browser: ^0.5.0 + + + #fl_chart: ^0.50.0 + #location: ^3.2.4 + #flurry_data: ^0.0.1 + #flutter_uxcam: ^2.1.5 #social_share: ^2.1.1 + flutter_localizations: sdk: flutter @@ -100,7 +115,7 @@ dev_dependencies: test: '>=1.0.0 <2.0.0' flutter_test: sdk: flutter - bloc_test: ^9.0.3 + bloc_test: ^9.1.0 build_runner: