WT 1.1.25+3 flutter 2.8, activate training plan

This commit is contained in:
bossanyit 2021-12-12 16:17:47 +01:00
parent 72ae1c8f8c
commit 54a61fa585
96 changed files with 944 additions and 655 deletions

View File

@ -551,6 +551,6 @@
"Exception: Please select your goal": "Please select your goal", "Exception: Please select your goal": "Please select your goal",
"Exception: Please select your biologial gender": "Please select your biologial gender", "Exception: Please select your biologial gender": "Please select your biologial gender",
"The found exercises are": "The found exercises are", "The found exercises are": "The found exercises are",
"in red": "in red", "in green": "in green",
"in your calendar": "in your calendar" "in your calendar": "in your calendar"
} }

View File

@ -551,6 +551,6 @@
"Exception: Please select your goal": "Kérlek válaszd ki a célod", "Exception: Please select your goal": "Kérlek válaszd ki a célod",
"Exception: Please select your biologial gender": "Kérlek válaszd ki a biológiai nemed", "Exception: Please select your biologial gender": "Kérlek válaszd ki a biológiai nemed",
"The found exercises are": "A keresett gyakorlatot", "The found exercises are": "A keresett gyakorlatot",
"in red": "pirossal", "in green": "zölddel",
"in your calendar": "jelöltük a naptárban" "in your calendar": "jelöltük a naptárban"
} }

View File

@ -8,23 +8,14 @@ PODS:
- Flutter - Flutter
- devicelocale (0.0.1): - devicelocale (0.0.1):
- Flutter - Flutter
- FBAEMKit (11.2.1): - FBAEMKit (12.1.0):
- FBAEMKit/AEM (= 11.2.1) - FBSDKCoreKit_Basics (= 12.1.0)
- FBAEMKit/AEM (11.2.1): - FBSDKCoreKit (12.1.0):
- FBSDKCoreKit_Basics (~> 11.2.1) - FBAEMKit (= 12.1.0)
- FBSDKCoreKit (11.2.1): - FBSDKCoreKit_Basics (= 12.1.0)
- FBSDKCoreKit/Core (= 11.2.1) - FBSDKCoreKit_Basics (12.1.0)
- FBSDKCoreKit/Core (11.2.1): - FBSDKLoginKit (12.1.0):
- FBAEMKit (~> 11.2.1) - FBSDKCoreKit (= 12.1.0)
- FBSDKCoreKit_Basics (~> 11.2.1)
- FBSDKCoreKit_Basics (11.2.1):
- FBSDKCoreKit_Basics/Basics (= 11.2.1)
- FBSDKCoreKit_Basics/Basics (11.2.1)
- FBSDKLoginKit (11.2.1):
- FBSDKLoginKit/Login (= 11.2.1)
- FBSDKLoginKit/Login (11.2.1):
- FBSDKCoreKit (~> 11.2.1)
- FBSDKCoreKit_Basics (~> 11.2.1)
- Firebase/Analytics (8.9.0): - Firebase/Analytics (8.9.0):
- Firebase/Core - Firebase/Core
- Firebase/Auth (8.9.0): - Firebase/Auth (8.9.0):
@ -47,30 +38,30 @@ PODS:
- Firebase/RemoteConfig (8.9.0): - Firebase/RemoteConfig (8.9.0):
- Firebase/CoreOnly - Firebase/CoreOnly
- FirebaseRemoteConfig (~> 8.9.0) - FirebaseRemoteConfig (~> 8.9.0)
- firebase_analytics (8.3.3): - firebase_analytics (9.0.3):
- Firebase/Analytics (= 8.9.0) - Firebase/Analytics (= 8.9.0)
- firebase_core - firebase_core
- Flutter - Flutter
- firebase_auth (3.1.2): - firebase_auth (3.3.3):
- Firebase/Auth (= 8.9.0) - Firebase/Auth (= 8.9.0)
- firebase_core - firebase_core
- Flutter - Flutter
- firebase_core (1.10.0): - firebase_core (1.10.5):
- Firebase/CoreOnly (= 8.9.0) - Firebase/CoreOnly (= 8.9.0)
- Flutter - Flutter
- firebase_dynamic_links (2.0.10): - firebase_dynamic_links (4.0.2):
- Firebase/DynamicLinks (= 8.9.0) - Firebase/DynamicLinks (= 8.9.0)
- firebase_core - firebase_core
- Flutter - Flutter
- firebase_in_app_messaging (0.5.0-13): - firebase_in_app_messaging (0.6.0-4):
- Firebase/InAppMessaging (= 8.9.0) - Firebase/InAppMessaging (= 8.9.0)
- firebase_core - firebase_core
- Flutter - Flutter
- firebase_messaging (10.0.8): - firebase_messaging (11.2.3):
- Firebase/Messaging (= 8.9.0) - Firebase/Messaging (= 8.9.0)
- firebase_core - firebase_core
- Flutter - Flutter
- firebase_remote_config (0.10.0-5): - firebase_remote_config (1.0.2):
- Firebase/RemoteConfig (= 8.9.0) - Firebase/RemoteConfig (= 8.9.0)
- firebase_core - firebase_core
- Flutter - Flutter
@ -139,12 +130,14 @@ PODS:
- Flutter (1.0.0) - Flutter (1.0.0)
- flutter_app_badger (0.0.1): - flutter_app_badger (0.0.1):
- Flutter - Flutter
- flutter_facebook_auth (3.5.1): - flutter_facebook_auth (3.5.3):
- FBSDKCoreKit (~> 11.2.0) - FBSDKCoreKit (~> 12.1.0)
- FBSDKLoginKit (~> 11.2.0) - FBSDKLoginKit (~> 12.1.0)
- Flutter - Flutter
- flutter_secure_storage (3.3.1): - flutter_secure_storage (3.3.1):
- Flutter - Flutter
- flutter_smartlook (0.0.5):
- Flutter
- flutter_uxcam (2.0.1): - flutter_uxcam (2.0.1):
- Flutter - Flutter
- UXCam (~> 3.3.6) - UXCam (~> 3.3.6)
@ -219,14 +212,14 @@ PODS:
- path_provider (0.0.1): - path_provider (0.0.1):
- Flutter - Flutter
- PromisesObjC (2.0.0) - PromisesObjC (2.0.0)
- Purchases (3.11.1): - Purchases (3.13.1):
- PurchasesCoreSwift (= 3.11.1) - PurchasesCoreSwift (= 3.13.1)
- purchases_flutter (3.2.2): - purchases_flutter (3.8.0):
- Flutter - Flutter
- PurchasesHybridCommon (= 1.6.3) - PurchasesHybridCommon (= 1.11.1)
- PurchasesCoreSwift (3.11.1) - PurchasesCoreSwift (3.13.1)
- PurchasesHybridCommon (1.6.3): - PurchasesHybridCommon (1.11.1):
- Purchases (= 3.11.1) - Purchases (= 3.13.1)
- Sentry (7.1.4): - Sentry (7.1.4):
- Sentry/Core (= 7.1.4) - Sentry/Core (= 7.1.4)
- Sentry/Core (7.1.4) - Sentry/Core (7.1.4)
@ -240,8 +233,6 @@ PODS:
- Flutter - Flutter
- sign_in_with_apple (0.0.1): - sign_in_with_apple (0.0.1):
- Flutter - Flutter
- smartlook (0.0.5):
- Flutter
- sqflite (0.0.2): - sqflite (0.0.2):
- Flutter - Flutter
- FMDB (>= 2.7.5) - FMDB (>= 2.7.5)
@ -269,6 +260,7 @@ DEPENDENCIES:
- flutter_app_badger (from `.symlinks/plugins/flutter_app_badger/ios`) - flutter_app_badger (from `.symlinks/plugins/flutter_app_badger/ios`)
- flutter_facebook_auth (from `.symlinks/plugins/flutter_facebook_auth/ios`) - flutter_facebook_auth (from `.symlinks/plugins/flutter_facebook_auth/ios`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
- flutter_smartlook (from `.symlinks/plugins/flutter_smartlook/ios`)
- flutter_uxcam (from `.symlinks/plugins/flutter_uxcam/ios`) - flutter_uxcam (from `.symlinks/plugins/flutter_uxcam/ios`)
- google_sign_in (from `.symlinks/plugins/google_sign_in/ios`) - google_sign_in (from `.symlinks/plugins/google_sign_in/ios`)
- modal_progress_hud_nsn (from `.symlinks/plugins/modal_progress_hud_nsn/ios`) - modal_progress_hud_nsn (from `.symlinks/plugins/modal_progress_hud_nsn/ios`)
@ -280,7 +272,6 @@ DEPENDENCIES:
- share (from `.symlinks/plugins/share/ios`) - share (from `.symlinks/plugins/share/ios`)
- shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
- sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`) - sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
- smartlook (from `.symlinks/plugins/smartlook/ios`)
- sqflite (from `.symlinks/plugins/sqflite/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`)
- url_launcher (from `.symlinks/plugins/url_launcher/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`)
- video_player (from `.symlinks/plugins/video_player/ios`) - video_player (from `.symlinks/plugins/video_player/ios`)
@ -347,6 +338,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_facebook_auth/ios" :path: ".symlinks/plugins/flutter_facebook_auth/ios"
flutter_secure_storage: flutter_secure_storage:
:path: ".symlinks/plugins/flutter_secure_storage/ios" :path: ".symlinks/plugins/flutter_secure_storage/ios"
flutter_smartlook:
:path: ".symlinks/plugins/flutter_smartlook/ios"
flutter_uxcam: flutter_uxcam:
:path: ".symlinks/plugins/flutter_uxcam/ios" :path: ".symlinks/plugins/flutter_uxcam/ios"
google_sign_in: google_sign_in:
@ -369,8 +362,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/shared_preferences/ios" :path: ".symlinks/plugins/shared_preferences/ios"
sign_in_with_apple: sign_in_with_apple:
:path: ".symlinks/plugins/sign_in_with_apple/ios" :path: ".symlinks/plugins/sign_in_with_apple/ios"
smartlook:
:path: ".symlinks/plugins/smartlook/ios"
sqflite: sqflite:
:path: ".symlinks/plugins/sqflite/ios" :path: ".symlinks/plugins/sqflite/ios"
url_launcher: url_launcher:
@ -386,18 +377,18 @@ SPEC CHECKSUMS:
AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7
device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 device_info: d7d233b645a32c40dfdc212de5cf646ca482f175
devicelocale: b22617f40038496deffba44747101255cee005b0 devicelocale: b22617f40038496deffba44747101255cee005b0
FBAEMKit: 5de0a7aaa854eec69bb5be20795952a63d38a5f6 FBAEMKit: 56c0bb9b42e3747cd82b67934f0c2b19325382ea
FBSDKCoreKit: bf655f808b040ed66a72b9922911b39d703e64f4 FBSDKCoreKit: 75368765d9c2303073145a7925dfaa9d60bcd77b
FBSDKCoreKit_Basics: 73ebe3a27eb688ac5b5aa7e99f68992993042115 FBSDKCoreKit_Basics: 39865aff97e5f6951a78fb3e89dc4460e35e1895
FBSDKLoginKit: 2e76831ef08d356b8f9150ea51cce865074ea304 FBSDKLoginKit: e993f97c7cc794c5da4056d8aec3c3d66033a727
Firebase: 13d8d96499e2635428d5bf0ec675df21f95d9a95 Firebase: 13d8d96499e2635428d5bf0ec675df21f95d9a95
firebase_analytics: b4b760056b69bcb2bf0ebbbb8cf6f969921a86fe firebase_analytics: 022be8bd68c73ddaa23b77895e9098afa7069cfb
firebase_auth: 45e41687f7d88ce8016c1f411320911b842245d7 firebase_auth: fe3a1deb12ebd850295344234abc15588d086baf
firebase_core: f770e033e790657b3505f04be4cb24c482912f11 firebase_core: dfcae4c150a5e24436a0b7677c470478a234d5bf
firebase_dynamic_links: db82b85aee9c6066de135cdb4bee41e5b9e281ac firebase_dynamic_links: 89300b4c80fa30b03487e56b2926d3261ae47af8
firebase_in_app_messaging: 180fcaea83c2c0555c5c0243bc9dc2c3b3358b2a firebase_in_app_messaging: 2a9226ba7eda70506a8ddf49ce1930d21fad3b5a
firebase_messaging: 51b1029537c74503e935e4ccb221da8be8cbf26e firebase_messaging: c4696ded2f44fb5c2bf6e94f9a575105793e58fa
firebase_remote_config: 2a43c3a6d3430fedb4f9f7360acc757d4d962bff firebase_remote_config: b6c8f06b74e803e9d03f9aa9adc58f0720feb3f7
FirebaseABTesting: 9de50b34bf9eb4a07d4edb7af82c14152fd905aa FirebaseABTesting: 9de50b34bf9eb4a07d4edb7af82c14152fd905aa
FirebaseAnalytics: 4ab446ce08a3fe52e8a4303dd997cf26276bf968 FirebaseAnalytics: 4ab446ce08a3fe52e8a4303dd997cf26276bf968
FirebaseAuth: 2b78b2a32c07b3ecfa4970bdf1d3632b8304099b FirebaseAuth: 2b78b2a32c07b3ecfa4970bdf1d3632b8304099b
@ -410,11 +401,12 @@ SPEC CHECKSUMS:
FirebaseRemoteConfig: a75c1bd44ebd3ed4ad3fa1ff09414a8b133be405 FirebaseRemoteConfig: a75c1bd44ebd3ed4ad3fa1ff09414a8b133be405
Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
flutter_app_badger: 65de4d6f0c34a891df49e6cfb8a1c0496426fa68 flutter_app_badger: 65de4d6f0c34a891df49e6cfb8a1c0496426fa68
flutter_facebook_auth: 870a465b1afff3ace7a592bd44665d921991726c flutter_facebook_auth: dfd6b2563406c538098e2127512d385c9ffd70ad
flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec
flutter_smartlook: 2aa304f6a38fc22b741ca750e0078606582525ae
flutter_uxcam: 32e4e8b4355be6bf9d512ad36aed6d86c98a5cdf flutter_uxcam: 32e4e8b4355be6bf9d512ad36aed6d86c98a5cdf
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
google_sign_in: de494e5e993986afae63e22a32441e30c35c9823 google_sign_in: c5cecea71f3be43282263550556e311c4cc03582
GoogleAppMeasurement: 837649ad3987936c232f6717c5680216f6243d24 GoogleAppMeasurement: 837649ad3987936c232f6717c5680216f6243d24
GoogleDataTransport: 629c20a4d363167143f30ea78320d5a7eb8bd940 GoogleDataTransport: 629c20a4d363167143f30ea78320d5a7eb8bd940
GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213
@ -427,21 +419,20 @@ SPEC CHECKSUMS:
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58
Purchases: 6351f9ff6bd514e5ec5aa0f989ea181effa94bf5 Purchases: 2693d6444609de044ab25fcda9561bef038f24da
purchases_flutter: 627527b070d80cdaf486fabe8b3d1dbe8d5cad92 purchases_flutter: 214d452aaf860496aeee822487eafcdd962fab33
PurchasesCoreSwift: ee857e4c21e6254b09d7e303a756fcf2b9164408 PurchasesCoreSwift: ca55f9ef671f89abed133775dd9e53f55007828d
PurchasesHybridCommon: d65a799a61d688588534b80338edbcbf604ca93d PurchasesHybridCommon: a0313de4f31fbaf137518b2686ccdca4c91dd2b4
Sentry: 1d3eb1a25f8c5333c88dd5603904a6d461cd9fcf Sentry: 1d3eb1a25f8c5333c88dd5603904a6d461cd9fcf
sentry_flutter: f20d4f199442900fbdab2b8496f1d2091d8b94d9 sentry_flutter: f20d4f199442900fbdab2b8496f1d2091d8b94d9
share: 0b2c3e82132f5888bccca3351c504d0003b3b410 share: 0b2c3e82132f5888bccca3351c504d0003b3b410
shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440 sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440
smartlook: bbc5c73a85c752a31dabf100c8930838c646342e
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
UXCam: fb294bf954e708fc308a645ae65bb967cac0760e UXCam: fb294bf954e708fc308a645ae65bb967cac0760e
video_player: 9cc823b1d9da7e8427ee591e8438bfbcde500e6e video_player: 9cc823b1d9da7e8427ee591e8438bfbcde500e6e
wakelock: b0843b2479edbf6504d8d262c2959446f35373aa wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f
webview_flutter: 9f491a9b5a66f2573946a389b2677987b0ff8c0b webview_flutter: 9f491a9b5a66f2573946a389b2677987b0ff8c0b
PODFILE CHECKSUM: f10c0438b63bc24e6bbc207956dc27d16c4408f2 PODFILE CHECKSUM: f10c0438b63bc24e6bbc207956dc27d16c4408f2

View File

@ -177,7 +177,7 @@
97C146E61CF9000F007C117D /* Project object */ = { 97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 1210; LastUpgradeCheck = 1300;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
97C146ED1CF9000F007C117D = { 97C146ED1CF9000F007C117D = {
@ -388,7 +388,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 2; CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = SFJJBDCU6Z; DEVELOPMENT_TEAM = SFJJBDCU6Z;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@ -531,7 +531,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 2; CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = SFJJBDCU6Z; DEVELOPMENT_TEAM = SFJJBDCU6Z;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@ -566,7 +566,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 2; CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = SFJJBDCU6Z; DEVELOPMENT_TEAM = SFJJBDCU6Z;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (

View File

@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class TestProgress extends AnimatedWidget { class TestProgress extends AnimatedWidget {

View File

@ -17,7 +17,6 @@ import 'package:intl/intl.dart';
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/fl_chart.dart';
part 'development_by_muscle_event.dart'; part 'development_by_muscle_event.dart';

View File

@ -14,9 +14,7 @@ import 'package:aitrainer_app/util/enums.dart';
import 'package:aitrainer_app/util/track.dart'; import 'package:aitrainer_app/util/track.dart';
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter/animation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
import 'package:stop_watch_timer/stop_watch_timer.dart'; import 'package:stop_watch_timer/stop_watch_timer.dart';
part 'exercise_new_event.dart'; part 'exercise_new_event.dart';

View File

@ -18,7 +18,6 @@ import 'package:aitrainer_app/util/trans.dart';
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:meta/meta.dart';
import 'package:aitrainer_app/library/image_cache.dart' as wt; import 'package:aitrainer_app/library/image_cache.dart' as wt;
part 'menu_event.dart'; part 'menu_event.dart';

View File

@ -172,7 +172,7 @@ class SalesBloc extends Bloc<SalesEvent, SalesState> with Logging {
try { try {
productSet = int.parse(productSetString); productSet = int.parse(productSetString);
} on Exception catch (e) { } on Exception catch (e) {
log("Define the right productset!"); log("Define the right productset! $e");
productSet = 2; productSet = 2;
} }

View File

@ -9,8 +9,6 @@ import 'package:aitrainer_app/util/track.dart';
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
//import 'package:health/health.dart';
import 'package:meta/meta.dart';
part 'settings_event.dart'; part 'settings_event.dart';
part 'settings_state.dart'; part 'settings_state.dart';
@ -20,71 +18,31 @@ class SettingsBloc extends Bloc<SettingsEvent, SettingsState> with Logging {
Locale? _locale; Locale? _locale;
BuildContext? context; BuildContext? context;
SettingsBloc({this.context}) : super(SettingsInitial()); SettingsBloc({this.context}) : super(SettingsInitial()) {
on<SettingsChangeLanguage>(_onChangeLanguage);
void setLocale(Locale locale) { on<SettingsGetLanguage>(_onGetLanguage);
_locale = locale; on<SettingsSetServer>(_onSetServer);
} }
Locale? getLocale() { void setLocale(Locale locale) => _locale = locale;
return _locale; Locale? getLocale() => _locale;
}
@override void _onChangeLanguage(SettingsChangeLanguage event, Emitter<SettingsState> emit) async {
Stream<SettingsState> mapEventToState( emit(SettingsLoading());
SettingsEvent event,
) async* {
if (event is SettingsChangeLanguage) {
yield SettingsLoading();
await _changeLang(event.language); await _changeLang(event.language);
yield SettingsReady(); emit(SettingsReady());
} else if (event is SettingsGetLanguage) { }
void _onGetLanguage(SettingsGetLanguage event, Emitter<SettingsState> emit) async {
await AppLanguage().fetchLocale(); await AppLanguage().fetchLocale();
_locale = AppLanguage().appLocal; _locale = AppLanguage().appLocal;
yield SettingsReady(); emit(SettingsReady());
} else if (event is SettingsSetServer) { }
//yield SettingsLoading();
void _onSetServer(SettingsSetServer event, Emitter<SettingsState> emit) async {
final bool live = event.live; final bool live = event.live;
Cache().setServer(live); Cache().setServer(live);
Track().track(TrackingEvent.settings_server, eventValue: live.toString()); Track().track(TrackingEvent.settings_server, eventValue: live.toString());
//yield SettingsReady(_locale);
} else if (event is SettingsSetHardware) {
yield SettingsLoading();
bool selectedHardwareBefore = await Cache().selectedHardwareBefore();
log("selectedBefore " + selectedHardwareBefore.toString());
final bool hasHardware = event.hasHardware;
await Cache().setHardware(hasHardware);
if (hasHardware == true) {
await _accessHealthData();
}
Cache().initBadges();
yield SettingsReady();
} else if (event is SettingsActivateTutorial) {
yield SettingsLoading();
Cache().activitiesDone[event.activity.toStr()] = false;
print(" ----------------- Setting ${event.activity} to false");
yield SettingsReady();
}
}
Future<void> _accessHealthData() async {
/* final List<HealthDataType> types = [
HealthDataType.ACTIVE_ENERGY_BURNED,
HealthDataType.WATER,
HealthDataType.STEPS,
HealthDataType.HEART_RATE,
HealthDataType.BASAL_ENERGY_BURNED,
HealthDataType.BODY_TEMPERATURE,
HealthDataType.HIGH_HEART_RATE_EVENT,
HealthDataType.LOW_HEART_RATE_EVENT,
HealthDataType.RESTING_HEART_RATE
];
final HealthFactory health = HealthFactory(); */
//DateTime now = DateTime.now();
//List<HealthDataPoint> _healthDataList = await health.getHealthDataFromTypes(now.subtract(Duration(minutes: 5)), now, types);
//log(_healthDataList.toString());
} }
Future<void> _changeLang(String lang) async { Future<void> _changeLang(String lang) async {

View File

@ -1,4 +1,3 @@
import 'dart:async';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart'; import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart';
import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/cache.dart';
@ -16,7 +15,9 @@ part 'training_evaluation_state.dart';
class TrainingEvaluationBloc extends Bloc<TrainingEvaluationEvent, TrainingEvaluationState> { class TrainingEvaluationBloc extends Bloc<TrainingEvaluationEvent, TrainingEvaluationState> {
final TrainingPlanBloc trainingPlanBloc; final TrainingPlanBloc trainingPlanBloc;
final String day; final String day;
TrainingEvaluationBloc({required this.trainingPlanBloc, required this.day}) : super(TrainingEvaluationInitial()); TrainingEvaluationBloc({required this.trainingPlanBloc, required this.day}) : super(TrainingEvaluationInitial()) {
on<TrainingEvaluationLoad>(_onLoad);
}
String duration = "-"; String duration = "-";
String totalLift = "0"; String totalLift = "0";
@ -27,6 +28,21 @@ class TrainingEvaluationBloc extends Bloc<TrainingEvaluationEvent, TrainingEvalu
List<TrainingEvaluationExercise> evaluationList = []; List<TrainingEvaluationExercise> evaluationList = [];
void _onLoad(TrainingEvaluationLoad event, Emitter<TrainingEvaluationState> emit) async {
getDuration();
getTotalLift();
getMaxRepeats();
getTotalRepeats();
createEvaluationData();
getMaxLift();
if (end == null || DateTime.now().difference(end!).inMinutes > 5) {
emit(TrainingEvaluationReady());
} else {
emit(TrainingEvaluationVictoryReady());
}
}
/*
@override @override
Stream<TrainingEvaluationState> mapEventToState( Stream<TrainingEvaluationState> mapEventToState(
TrainingEvaluationEvent event, TrainingEvaluationEvent event,
@ -50,9 +66,7 @@ class TrainingEvaluationBloc extends Bloc<TrainingEvaluationEvent, TrainingEvalu
} on Exception catch (e) { } on Exception catch (e) {
yield TrainingEvaluationError(message: e.toString()); yield TrainingEvaluationError(message: e.toString());
} }
} } */
Future<void> saveResult() async {}
void createEvaluationData() { void createEvaluationData() {
if (trainingPlanBloc.getMyPlan() == null || trainingPlanBloc.getMyPlan()!.days[day] == null) { if (trainingPlanBloc.getMyPlan() == null || trainingPlanBloc.getMyPlan()!.days[day] == null) {
@ -118,11 +132,11 @@ class TrainingEvaluationBloc extends Bloc<TrainingEvaluationEvent, TrainingEvalu
} }
String getTrendText(double rate) { String getTrendText(double rate) {
if (rate > 1.10) { if (rate > 1.20) {
return "Strongly Growing"; return "Strongly Growing";
} else if (rate > 1.05) { } else if (rate > 1.05) {
return "Growing"; return "Growing";
} else if (rate < 0.90) { } else if (rate < 0.80) {
return "Strongly Sinking"; return "Strongly Sinking";
} else if (rate < 0.95) { } else if (rate < 0.95) {
return "Sinking"; return "Sinking";
@ -132,11 +146,11 @@ class TrainingEvaluationBloc extends Bloc<TrainingEvaluationEvent, TrainingEvalu
} }
Color getTrendColor(double rate) { Color getTrendColor(double rate) {
if (rate > 1.10) { if (rate > 1.20) {
return Colors.green[900]!; return Colors.green[900]!;
} else if (rate > 1.05) { } else if (rate > 1.05) {
return Colors.green[300]!; return Colors.green[300]!;
} else if (rate < 0.90) { } else if (rate < 0.80) {
return Colors.red[900]!; return Colors.red[900]!;
} else if (rate < 0.95) { } else if (rate < 0.95) {
return Colors.red[400]!; return Colors.red[400]!;

View File

@ -18,6 +18,7 @@ part 'training_log_state.dart';
class TrainingLogBloc extends Bloc<TrainingLogEvent, TrainingLogState> { class TrainingLogBloc extends Bloc<TrainingLogEvent, TrainingLogState> {
final ExerciseRepository exerciseRepository = ExerciseRepository(); final ExerciseRepository exerciseRepository = ExerciseRepository();
TrainingLogBloc() : super(TrainingLogInitial()) { TrainingLogBloc() : super(TrainingLogInitial()) {
on<TrainingLogLoad>(_onLoad); on<TrainingLogLoad>(_onLoad);
on<TrainingLogDelete>(_onDelete); on<TrainingLogDelete>(_onDelete);
@ -49,6 +50,11 @@ class TrainingLogBloc extends Bloc<TrainingLogEvent, TrainingLogState> {
emit(TrainingLogLoading()); emit(TrainingLogLoading());
exerciseRepository.exerciseList!.remove(event.exercise); exerciseRepository.exerciseList!.remove(event.exercise);
await exerciseRepository.deleteExercise(event.exercise); await exerciseRepository.deleteExercise(event.exercise);
if (Cache().getExercises() != null) {
Cache().getExercises()!.remove(event.exercise);
}
_results.clear();
_results.addAll(getTrainingResults());
Track().track(TrackingEvent.exercise_log_delete); Track().track(TrackingEvent.exercise_log_delete);
emit(TrainingLogReady()); emit(TrainingLogReady());
} }
@ -119,7 +125,7 @@ class TrainingLogBloc extends Bloc<TrainingLogEvent, TrainingLogState> {
Color color = exercise.trainingPlanDetailsId == null ? Colors.blue : Colors.orange; Color color = exercise.trainingPlanDetailsId == null ? Colors.blue : Colors.orange;
if (exerciseTypeIdSearched == exercise.exerciseTypeId) { if (exerciseTypeIdSearched == exercise.exerciseTypeId) {
color = Colors.redAccent; color = Color(0xffb4f500);
} }
trainings.add(TrainingResult( trainings.add(TrainingResult(

View File

@ -1,4 +1,3 @@
import 'dart:async';
import 'package:aitrainer_app/main.dart'; import 'package:aitrainer_app/main.dart';
import 'package:aitrainer_app/bloc/menu/menu_bloc.dart'; import 'package:aitrainer_app/bloc/menu/menu_bloc.dart';
import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/cache.dart';
@ -29,7 +28,25 @@ part 'training_plan_state.dart';
class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> { class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
final TrainingPlanRepository trainingPlanRepository; final TrainingPlanRepository trainingPlanRepository;
final MenuBloc menuBloc; final MenuBloc menuBloc;
TrainingPlanBloc({required this.trainingPlanRepository, required this.menuBloc}) : super(TrainingPlanInitial()); TrainingPlanBloc({required this.trainingPlanRepository, required this.menuBloc}) : super(TrainingPlanInitial()) {
on<TrainingPlanActivate>(_onActivate);
on<TrainingPlanWeightChangeRecalculate>(_onWeightChangeRecalculate);
on<TrainingPlanSaveExercise>(_onSaveExercise);
on<TrainingPlanSkipExercise>(_onSkipExercise);
on<TrainingPlanSkipEntireExercise>(_onSkipEntireExercise);
on<TrainingPlanFinishDropset>(_onFinishDropSet);
on<TrainingPlanFinishDay>(_onFinishDay);
on<TrainingPlanChangeCancel>(_onChangeCancel);
on<TrainingPlanAddLoad>(_onCustomLoad);
on<TrainingPlanDeleteExerciseType>(_onDeleteExerciseType);
on<TrainingPlanWeightChange>(_onCustomWeightChange);
on<TrainingPlanSetChange>(_onCustomPlanSetChange);
on<TrainingPlanRepeatsChange>(_onCustomPlanRepeatChange);
on<TrainingPlanAddExerciseType>(_onCustomPlanAddExerciseType);
// on<TrainingPlanError>(_onTrainingPlanError);
}
CustomerTrainingPlan? _myPlan; CustomerTrainingPlan? _myPlan;
CustomerTrainingPlanDetails? _myDetail; CustomerTrainingPlanDetails? _myDetail;
@ -55,11 +72,13 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
CustomerTrainingPlanDetails? getMyDetail() => this._myDetail; CustomerTrainingPlanDetails? getMyDetail() => this._myDetail;
setMyDetail(CustomerTrainingPlanDetails? value) => this._myDetail = value; setMyDetail(CustomerTrainingPlanDetails? value) => this._myDetail = value;
@override /// _onActivate
Stream<TrainingPlanState> mapEventToState(TrainingPlanEvent event) async* { /// activating the training plan, calculating the weights to the given repeats
try { /// from previous exercises
if (event is TrainingPlanActivate) { ///
yield TrainingPlanLoading(); /// event: TrainingPlanActivate
void _onActivate(TrainingPlanActivate event, Emitter<TrainingPlanState> emit) async {
emit(TrainingPlanLoading());
_myPlan = trainingPlanRepository.activateTrainingPlan(event.trainingPlanId); _myPlan = trainingPlanRepository.activateTrainingPlan(event.trainingPlanId);
_myPlan!.type = CustomerTrainingPlanType.template; _myPlan!.type = CustomerTrainingPlanType.template;
@ -73,50 +92,18 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
Cache().myTrainingPlan = _myPlan; Cache().myTrainingPlan = _myPlan;
await Cache().saveMyTrainingPlan(); await Cache().saveMyTrainingPlan();
Track().track(TrackingEvent.training_plan_start, eventValue: event.trainingPlanId.toString()); Track().track(TrackingEvent.training_plan_start, eventValue: event.trainingPlanId.toString());
yield TrainingPlanFinished(); emit(TrainingPlanFinished());
} else if (event is TrainingPlanWeightChange) {
yield TrainingPlanExerciseLoading();
print("New weight: ${event.weight}");
event.detail.weight = event.weight;
yield TrainingPlanExerciseReady();
yield TrainingPlanReady();
} else if (event is TrainingPlanWeightChangeUp) {
yield TrainingPlanExerciseLoading();
if (event.detail.weight != null) {
event.detail.repeats =
Common.reCalculateRepeatsByChangedWeight(event.detail.weight!, event.detail.repeats!.toDouble(), event.detail.weight! + 1);
event.detail.weight = event.detail.weight! + 1;
ExerciseSaveStream().weight = event.detail.weight!;
ExerciseSaveStream().repeats = event.detail.repeats!;
ExerciseSaveStream().getStreamController().add(true);
} }
yield TrainingPlanExerciseReady(); void _onWeightChangeRecalculate(TrainingPlanWeightChangeRecalculate event, Emitter<TrainingPlanState> emit) async {
yield TrainingPlanReady(); emit(TrainingPlanExerciseLoading());
} else if (event is TrainingPlanWeightChangeDown) {
yield TrainingPlanExerciseLoading();
if (event.detail.weight != null) {
event.detail.repeats =
Common.reCalculateRepeatsByChangedWeight(event.detail.weight!, event.detail.repeats!.toDouble(), event.detail.weight! - 1);
event.detail.weight = event.detail.weight! - 1;
ExerciseSaveStream().weight = event.detail.weight!;
ExerciseSaveStream().repeats = event.detail.repeats!;
ExerciseSaveStream().getStreamController().add(true);
}
yield TrainingPlanExerciseReady();
yield TrainingPlanReady();
} else if (event is TrainingPlanWeightChangeRecalculate) {
yield TrainingPlanExerciseLoading();
if (event.detail.baseOneRepMax > 0 && event.detail.repeats != -1) { if (event.detail.baseOneRepMax > 0 && event.detail.repeats != -1) {
if (_myTrainingPlan == null) { if (_myTrainingPlan == null) {
setTrainingPlanFromCache(); setTrainingPlanFromCache();
} }
final int originalRepeats = trainingPlanRepository.getOriginalRepeats(_myTrainingPlan!.trainingPlanId, event.detail); final int originalRepeats = trainingPlanRepository.getOriginalRepeats(_myTrainingPlan!.trainingPlanId, event.detail);
event.detail.repeats = event.detail.repeats = Common.calculateQuantityByChangedWeight(event.detail.baseOneRepMax, event.weight, originalRepeats.toDouble());
Common.calculateQuantityByChangedWeight(event.detail.baseOneRepMax, event.weight, originalRepeats.toDouble());
print("Base1RM ${event.detail.baseOneRepMax} repeats: ${event.detail.repeats}"); print("Base1RM ${event.detail.baseOneRepMax} repeats: ${event.detail.repeats}");
if (event.detail.repeats! < 1) { if (event.detail.repeats! < 1) {
@ -127,31 +114,30 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
ExerciseSaveStream().getStreamController().add(true); ExerciseSaveStream().getStreamController().add(true);
} }
event.detail.weight = event.weight; event.detail.weight = event.weight;
yield TrainingPlanExerciseReady();
yield TrainingPlanReady();
} else if (event is TrainingPlanRepeatsChange) {
yield TrainingPlanExerciseLoading();
event.detail.repeats = event.repeats; ///yield TrainingPlanExerciseReady();
yield TrainingPlanExerciseReady(); emit(TrainingPlanReady());
yield TrainingPlanReady(); }
} else if (event is TrainingPlanSetChange) {
yield TrainingPlanLoading();
event.detail.set = event.set; /// _onSaveExercise
/// - save the executed exercise to the DB
yield TrainingPlanReady(); /// - recalculate, if necessary the next weight to the give repeats
} else if (event is TrainingPlanSaveExercise) { /// - track this event
yield TrainingPlanLoading(); /// - send the data to Mautic
/// if [DropSet], the just set the state of the detail to finish
///
/// event: TrainingPlanWeightChange
void _onSaveExercise(TrainingPlanSaveExercise event, Emitter<TrainingPlanState> emit) async {
emit(TrainingPlanLoading());
if (event.detail.repeats == -1) { if (event.detail.repeats == -1) {
yield TrainingPlanReady(); emit(TrainingPlanReady());
throw Exception("Please type your repeats!"); throw Exception("Please type your repeats!");
} }
print("SAVE for ExerciseTypeID: ${event.detail.exerciseTypeId} weight: ${event.detail.weight}"); print("SAVE for ExerciseTypeID: ${event.detail.exerciseTypeId} weight: ${event.detail.weight}");
if (event.detail.weight == -3) { if (event.detail.weight == -3) {
print("DropSet"); print("DropSet");
event.detail.state = ExercisePlanDetailState.finished; event.detail.state = ExercisePlanDetailState.finished;
yield TrainingPlanReady(); emit(TrainingPlanReady());
} else { } else {
final Exercise exercise = Exercise(); final Exercise exercise = Exercise();
exercise.customerId = Cache().userLoggedIn!.customerId!; exercise.customerId = Cache().userLoggedIn!.customerId!;
@ -164,33 +150,37 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
if (this.isAllDetailsSameExerciseFinished(event.detail)) { if (this.isAllDetailsSameExerciseFinished(event.detail)) {
event.detail.state = ExercisePlanDetailState.finished; event.detail.state = ExercisePlanDetailState.finished;
} }
// recalculate the weight to the original planned repeats for the next details // recalculate the weight to the original planned repeats for the next details
int id = 0;
if (exercise.unitQuantity != null && exercise.unitQuantity! > 0) { if (exercise.unitQuantity != null && exercise.unitQuantity! > 0) {
for (var nextDetail in _myPlan!.details) { for (var nextDetail in _myPlan!.details) {
if (nextDetail.exerciseTypeId == event.detail.exerciseTypeId) {
if (id == 0 && nextDetail.customerTrainingPlanDetailsId == event.detail.customerTrainingPlanDetailsId) {
id = nextDetail.customerTrainingPlanDetailsId!;
}
double weightFromPlan = trainingPlanRepository.getOriginalWeight(this.getMyPlan()!.trainingPlanId!, nextDetail); double weightFromPlan = trainingPlanRepository.getOriginalWeight(this.getMyPlan()!.trainingPlanId!, nextDetail);
print("NextDetail detail: $nextDetail *** PlanWeight: $weightFromPlan"); print("NextDetail detail: $nextDetail *** PlanWeight: $weightFromPlan");
if (nextDetail.exerciseTypeId == event.detail.exerciseTypeId && if (nextDetail.weight == -2 && nextDetail.customerTrainingPlanDetailsId != event.detail.customerTrainingPlanDetailsId) {
nextDetail.weight == -2 && print("Nr 1. - recalculating -2 ${event.detail.customerTrainingPlanDetailsId}");
nextDetail.customerTrainingPlanDetailsId != event.detail.customerTrainingPlanDetailsId) {
print("recalculating -2 ${event.detail.customerTrainingPlanDetailsId}");
trainingPlanRepository.recalculateDetail(_myPlan!.trainingPlanId!, event.detail, nextDetail); trainingPlanRepository.recalculateDetail(_myPlan!.trainingPlanId!, event.detail, nextDetail);
nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble());
} else if (nextDetail.exerciseTypeId == event.detail.exerciseTypeId && weightFromPlan == -1 && nextDetail.set! > 1) { } else if (weightFromPlan == -1 && nextDetail.set! > 1 && nextDetail.exercises.length == 1) {
print("recalculating -1 ${event.detail.customerTrainingPlanDetailsId}"); print("Nr 2. recalculating -1 ${event.detail.customerTrainingPlanDetailsId}");
nextDetail = trainingPlanRepository.recalculateDetailFixRepeats(_myPlan!.trainingPlanId!, nextDetail); nextDetail = trainingPlanRepository.recalculateDetailFixRepeats(_myPlan!.trainingPlanId!, nextDetail);
nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble());
} else if (nextDetail.exerciseTypeId == event.detail.exerciseTypeId && nextDetail.weight == -1 && nextDetail.set! == 1) { } else if (nextDetail.weight == -1 && nextDetail.set! == 1) {
print("recalculating -1, set 1 ${event.detail.customerTrainingPlanDetailsId}"); print("Nr 3. recalculating -1, set 1 ${event.detail.customerTrainingPlanDetailsId}");
nextDetail = trainingPlanRepository.recalculateDetailFixRepeatsSet1(_myPlan!.trainingPlanId!, nextDetail, event.detail); nextDetail = trainingPlanRepository.recalculateDetailFixRepeatsSet1(_myPlan!.trainingPlanId!, nextDetail, event.detail);
nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble());
} /* else if (nextDetail.exerciseTypeId == event.detail.exerciseTypeId && } else if (event.detail.set! == 1 &&
weightFromPlan == -2 && (weightFromPlan == -2 || weightFromPlan == -1) &&
nextDetail.set! == 1 && nextDetail.customerTrainingPlanDetailsId! > id) {
nextDetail.exercises.length == 0) { print("Nr 4. recalculating after the first exercise ${event.detail.customerTrainingPlanDetailsId}");
print("recalculating -1/ no exercise, set 1 ${event.detail.customerTrainingPlanDetailsId}");
nextDetail = trainingPlanRepository.recalculateDetailFixRepeatsSet1(_myPlan!.trainingPlanId!, nextDetail, event.detail); nextDetail = trainingPlanRepository.recalculateDetailFixRepeatsSet1(_myPlan!.trainingPlanId!, nextDetail, event.detail);
nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble());
}*/ }
}
} }
} }
@ -214,20 +204,24 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
if (isDayDone()) { if (isDayDone()) {
this.add(TrainingPlanFinishDay()); this.add(TrainingPlanFinishDay());
} else { } else {
yield TrainingPlanReady(); emit(TrainingPlanReady());
} }
} else if (event is TrainingPlanSkipExercise) { }
yield TrainingPlanLoading();
void _onSkipExercise(TrainingPlanSkipExercise event, Emitter<TrainingPlanState> emit) async {
emit(TrainingPlanLoading());
event.detail.state = ExercisePlanDetailState.skipped; event.detail.state = ExercisePlanDetailState.skipped;
Cache().myTrainingPlan = _myPlan; Cache().myTrainingPlan = _myPlan;
await Cache().saveMyTrainingPlan(); await Cache().saveMyTrainingPlan();
if (isDayDone()) { if (isDayDone()) {
this.add(TrainingPlanFinishDay()); this.add(TrainingPlanFinishDay());
} else { } else {
yield TrainingPlanReady(); emit(TrainingPlanReady());
} }
} else if (event is TrainingPlanSkipEntireExercise) { }
yield TrainingPlanLoading();
void _onSkipEntireExercise(TrainingPlanSkipEntireExercise event, Emitter<TrainingPlanState> emit) async {
emit(TrainingPlanLoading());
List<CustomerTrainingPlanDetails> list = getAllDetailsSameExercise(event.detail); List<CustomerTrainingPlanDetails> list = getAllDetailsSameExercise(event.detail);
list.forEach((element) { list.forEach((element) {
if (!element.state.equalsTo(ExercisePlanDetailState.finished)) { if (!element.state.equalsTo(ExercisePlanDetailState.finished)) {
@ -239,44 +233,35 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
if (isDayDone()) { if (isDayDone()) {
this.add(TrainingPlanFinishDay()); this.add(TrainingPlanFinishDay());
} else { } else {
yield TrainingPlanReady(); emit(TrainingPlanReady());
} }
} else if (event is TrainingPlanFinishDay) { }
yield TrainingPlanLoading();
void _onFinishDropSet(TrainingPlanFinishDropset event, Emitter<TrainingPlanState> emit) async {
emit(TrainingPlanLoading());
event.detail.state = ExercisePlanDetailState.finished;
emit(TrainingPlanReady());
}
void _onFinishDay(TrainingPlanFinishDay event, Emitter<TrainingPlanState> emit) async {
emit(TrainingPlanLoading());
celebrating = true; celebrating = true;
Track().track(TrackingEvent.training_plan_finished); Track().track(TrackingEvent.training_plan_finished);
yield TrainingPlanDayFinished(); emit(TrainingPlanDayFinished());
} else if (event is TrainingPlanGoToRestart) {
yield TrainingPlanLoading();
restarting = true;
yield TrainingPlanDayReadyToRestart();
} else if (event is TrainingPlanAddExerciseType) {
if (_myDetail == null) {
throw Exception("Create new Detail");
} }
yield TrainingPlanLoading();
_myDetail!.exerciseType!.trainingPlanState = ExerciseTypeTrainingPlanState.added; void _onChangeCancel(TrainingPlanChangeCancel event, Emitter<TrainingPlanState> emit) async {
_myPlan!.details.add(this._myDetail!); emit(TrainingPlanLoading());
yield TrainingPlanReady(); print("Backup $_backupDetail");
} else if (event is TrainingPlanDeleteExerciseType) { if (_backupDetail != null) {
if (_myPlan == null || _myPlan!.details.isEmpty) { event.detail.repeats = _backupDetail!.repeats;
throw Exception("No MyPlan"); event.detail.weight = _backupDetail!.weight;
} }
yield TrainingPlanLoading(); emit(TrainingPlanReady());
CustomerTrainingPlanDetails? remove;
for (var detail in _myPlan!.details) {
if (event.exerciseType.exerciseTypeId == detail.exerciseTypeId) {
remove = detail;
break;
} }
}
if (remove != null) { void _onCustomLoad(TrainingPlanAddLoad event, Emitter<TrainingPlanState> emit) async {
_myPlan!.details.remove(remove); emit(TrainingPlanLoading());
}
event.exerciseType.trainingPlanState = ExerciseTypeTrainingPlanState.none;
yield TrainingPlanReady();
} else if (event is TrainingPlanCustomAddLoad) {
yield TrainingPlanLoading();
addNewPlan(); addNewPlan();
_myDetail = CustomerTrainingPlanDetails(); _myDetail = CustomerTrainingPlanDetails();
@ -296,23 +281,142 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
_myDetail!.weight = 0; _myDetail!.weight = 0;
} }
Track().track(TrackingEvent.training_plan_custom, eventValue: event.exerciseType.name); Track().track(TrackingEvent.training_plan_custom, eventValue: event.exerciseType.name);
yield TrainingPlanReady(); emit(TrainingPlanReady());
} else if (event is TrainingPlanChangeCancel) {
yield TrainingPlanLoading();
print("Backup $_backupDetail");
if (_backupDetail != null) {
event.detail.repeats = _backupDetail!.repeats;
event.detail.weight = _backupDetail!.weight;
} }
yield TrainingPlanReady();
} else if (event is TrainingPlanFinishDropset) { void _onDeleteExerciseType(TrainingPlanDeleteExerciseType event, Emitter<TrainingPlanState> emit) async {
if (_myPlan == null || _myPlan!.details.isEmpty) {
throw Exception("No MyPlan");
}
emit(TrainingPlanLoading());
CustomerTrainingPlanDetails? remove;
for (var detail in _myPlan!.details) {
if (event.exerciseType.exerciseTypeId == detail.exerciseTypeId) {
remove = detail;
break;
}
}
if (remove != null) {
_myPlan!.details.remove(remove);
}
event.exerciseType.trainingPlanState = ExerciseTypeTrainingPlanState.none;
emit(TrainingPlanReady());
}
/// _onWeightChange
/// change the weight of the actual [CustomerTrainingPlanDetails] from the UI
///
/// event: TrainingPlanWeightChange
void _onCustomWeightChange(TrainingPlanWeightChange event, Emitter<TrainingPlanState> emit) async {
emit(TrainingPlanExerciseLoading());
event.detail.weight = event.weight;
emit(TrainingPlanExerciseReady());
emit(TrainingPlanReady());
}
void _onCustomPlanSetChange(TrainingPlanSetChange event, Emitter<TrainingPlanState> emit) async {
emit(TrainingPlanLoading());
event.detail.set = event.set;
emit(TrainingPlanReady());
}
void _onCustomPlanRepeatChange(TrainingPlanRepeatsChange event, Emitter<TrainingPlanState> emit) async {
emit(TrainingPlanLoading());
event.detail.repeats = event.repeats;
emit(TrainingPlanReady());
}
void _onCustomPlanAddExerciseType(TrainingPlanAddExerciseType event, Emitter<TrainingPlanState> emit) async {
if (_myDetail == null) {
throw Exception("Create new Detail");
}
emit(TrainingPlanLoading());
_myDetail!.exerciseType!.trainingPlanState = ExerciseTypeTrainingPlanState.added;
_myPlan!.details.add(this._myDetail!);
emit(TrainingPlanReady());
}
/*
@override
Stream<TrainingPlanState> mapEventToState(TrainingPlanEvent event) async* {
try {
if (event is TrainingPlanActivate) {
} else if (event is TrainingPlanWeightChange) {
} else if (event is TrainingPlanWeightChangeRecalculate) {
} else if (event is TrainingPlanRepeatsChange) {
} else if (event is TrainingPlanSetChange) {
} else if (event is TrainingPlanSaveExercise) {
} else if (event is TrainingPlanSkipExercise) {
} else if (event is TrainingPlanSkipEntireExercise) {
} else if (event is TrainingPlanFinishDay) {
} else if (event is TrainingPlanGoToRestart) {
yield TrainingPlanLoading(); yield TrainingPlanLoading();
event.detail.state = ExercisePlanDetailState.finished; restarting = true;
yield TrainingPlanReady(); yield TrainingPlanDayReadyToRestart();
} else if (event is TrainingPlanAddExerciseType) {
} else if (event is TrainingPlanDeleteExerciseType) {
} else if (event is TrainingPlanCustomAddLoad) {
} else if (event is TrainingPlanChangeCancel) {
} else if (event is TrainingPlanFinishDropset) {
} }
} on Exception catch (e) { } on Exception catch (e) {
yield TrainingPlanError(message: e.toString()); yield TrainingPlanError(message: e.toString());
} }
} */
CustomerTrainingPlanDetails? createDetailFromExerciseType(ExerciseType exerciseType, CustomerTrainingPlanDetails origDetail) {
List<CustomerTrainingPlanDetails> list = [];
int index = 0;
TrainingPlanDetail? trainingPlanDetail;
if (_myTrainingPlan == null) {
setTrainingPlanFromCache();
}
for (var planDetail in _myTrainingPlan!.details!) {
if (planDetail.exerciseTypeId == origDetail.exerciseTypeId!) {
trainingPlanDetail = planDetail;
break;
}
index++;
}
if (trainingPlanDetail != null) {
list =
trainingPlanRepository.createDetail(_myPlan!, trainingPlanDetail, exerciseType.exerciseTypeId, index, changeExerciseType: true);
List<int> deleteIndicies = [];
index = 0;
_myPlan!.details.forEach((element) {
if (element.exerciseTypeId == origDetail.exerciseTypeId) {
deleteIndicies.add(index);
}
index++;
});
index = 0;
deleteIndicies.forEach((i) {
_myPlan!.details.removeAt(i - index);
index++;
});
_myPlan!.details.insertAll(deleteIndicies[0], list);
}
if (list.length > 0) {
return list[0];
} else {
return null;
}
} }
void backupDetail(CustomerTrainingPlanDetails detail) { void backupDetail(CustomerTrainingPlanDetails detail) {
@ -380,7 +484,8 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
} }
if (isDone100Percent()) { if (isDone100Percent()) {
this.add(TrainingPlanGoToRestart()); //this.add(TrainingPlanGoToRestart());
print("---------------- TrainingPlanGoToRestart");
} }
dayNames.clear(); dayNames.clear();
_myPlan!.days.clear(); _myPlan!.days.clear();
@ -556,20 +661,29 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
int getStep(CustomerTrainingPlanDetails detail) { int getStep(CustomerTrainingPlanDetails detail) {
List<CustomerTrainingPlanDetails> details = getAllDetailsSameExercise(detail); List<CustomerTrainingPlanDetails> details = getAllDetailsSameExercise(detail);
int step = 0; int step = 0;
int indexElement = 0;
details.forEach((element) { details.forEach((element) {
if (indexElement == 0) { if (element.exercises.length < element.set! && element.exercises.length > 0) {
step = element.exercises.length; step = element.exercises.length;
} else {
step += element.exercises.length;
} }
indexElement++;
}); });
step++;
//print("STEP: $step "); //print("STEP: $step ");
return step; return step;
} }
int getHighlightStep(CustomerTrainingPlanDetails detail) {
List<CustomerTrainingPlanDetails> details = getAllDetailsSameExercise(detail);
int step = 0;
details.forEach((element) {
//print("Highlight element $element");
if (element.exercises.length >= element.set!) {
step++;
}
});
//print("Highlight step: $step ");
return step;
}
CustomerTrainingPlanDetails? getNext() { CustomerTrainingPlanDetails? getNext() {
if (_myPlan == null || _myPlan!.details.isEmpty) { if (_myPlan == null || _myPlan!.details.isEmpty) {
return null; return null;
@ -655,8 +769,8 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
} }
prev = detail; prev = detail;
} }
int index = indexInStart > indexInProgress ? indexInStart : indexInProgress; double index = indexInStart > indexInProgress ? indexInStart.toDouble() : indexInProgress.toDouble();
offset = (index) * 300; offset = 325 * index;
print("Offset: $offset day: $day ($indexInStart, $indexInProgress)"); print("Offset: $offset day: $day ($indexInStart, $indexInProgress)");
return offset; return offset;
} }
@ -706,7 +820,8 @@ class TrainingPlanBloc extends Bloc<TrainingPlanEvent, TrainingPlanState> {
if (activeDayIndex >= dayNames.length) { if (activeDayIndex >= dayNames.length) {
activeDayIndex = 0; activeDayIndex = 0;
this.add(TrainingPlanGoToRestart()); //this.add(TrainingPlanGoToRestart());
print("---------------- TrainingPlanGoToRestart");
} }
print("ActiveDayIndex $activeDayIndex"); print("ActiveDayIndex $activeDayIndex");
return activeDayIndex; return activeDayIndex;

View File

@ -119,20 +119,13 @@ class TrainingPlanChangeCancel extends TrainingPlanEvent {
List<Object> get props => [detail]; List<Object> get props => [detail];
} }
class TrainingPlanDeleteExerciseType extends TrainingPlanEvent { class TrainingPlanAlternateChange extends TrainingPlanEvent {
final int index;
final ExerciseType exerciseType; final ExerciseType exerciseType;
const TrainingPlanDeleteExerciseType({required this.exerciseType}); const TrainingPlanAlternateChange({required this.index, required this.exerciseType});
@override @override
List<Object> get props => [exerciseType]; List<Object> get props => [index, exerciseType];
}
class TrainingPlanCustomAddLoad extends TrainingPlanEvent {
final ExerciseType exerciseType;
const TrainingPlanCustomAddLoad({required this.exerciseType});
@override
List<Object> get props => [exerciseType];
} }
class TrainingPlanFinishDropset extends TrainingPlanEvent { class TrainingPlanFinishDropset extends TrainingPlanEvent {
@ -142,3 +135,19 @@ class TrainingPlanFinishDropset extends TrainingPlanEvent {
@override @override
List<Object> get props => [detail]; List<Object> get props => [detail];
} }
class TrainingPlanAddLoad extends TrainingPlanEvent {
final ExerciseType exerciseType;
const TrainingPlanAddLoad({required this.exerciseType});
@override
List<Object> get props => [exerciseType];
}
class TrainingPlanDeleteExerciseType extends TrainingPlanEvent {
final ExerciseType exerciseType;
const TrainingPlanDeleteExerciseType({required this.exerciseType});
@override
List<Object> get props => [exerciseType];
}

View File

@ -2,9 +2,7 @@ library dropdown_search;
import 'dart:async'; import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'popup_menu.dart'; import 'popup_menu.dart';
import 'select_dialog.dart'; import 'select_dialog.dart';

View File

@ -3,7 +3,6 @@ import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
const Duration _kMenuDuration = Duration(milliseconds: 300); const Duration _kMenuDuration = Duration(milliseconds: 300);
const double _kMenuCloseIntervalEnd = 2.0 / 3.0; const double _kMenuCloseIntervalEnd = 2.0 / 3.0;

View File

@ -8,7 +8,6 @@ import 'dart:collection' show Queue;
import 'dart:math' as math; import 'dart:math' as math;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:vector_math/vector_math_64.dart' show Vector3; import 'package:vector_math/vector_math_64.dart' show Vector3;
const double _kActiveFontSize = 14.0; const double _kActiveFontSize = 14.0;

View File

@ -1,6 +1,5 @@
library flutter_radar_chart; library flutter_radar_chart;
import 'dart:ui';
import 'dart:math' as math; import 'dart:math' as math;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';

View File

@ -2,7 +2,6 @@ import 'dart:math';
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
enum TooltipDirection { up, down, left, right } enum TooltipDirection { up, down, left, right }
enum ShowCloseButton { inside, outside, none } enum ShowCloseButton { inside, outside, none }

View File

@ -1,3 +1,5 @@
// ignore_for_file: must_be_immutable
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:aitrainer_app/bloc/test_set_execute/test_set_execute_bloc.dart'; import 'package:aitrainer_app/bloc/test_set_execute/test_set_execute_bloc.dart';
@ -46,18 +48,16 @@ import 'package:aitrainer_app/view/training_plan_exercise.dart';
import 'package:aitrainer_app/widgets/home.dart'; import 'package:aitrainer_app/widgets/home.dart';
import 'package:aitrainer_app/library/facebook_app_events/facebook_app_events.dart'; import 'package:aitrainer_app/library/facebook_app_events/facebook_app_events.dart';
import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_analytics/observer.dart';
//import 'package:flurry_data/flurry_data.dart'; //import 'package:flurry_data/flurry_data.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:aitrainer_app/util/app_localization.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:google_fonts/google_fonts.dart';
import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:smartlook/smartlook.dart'; import 'package:flutter_smartlook/flutter_smartlook.dart';
import 'package:upgrader/upgrader.dart'; import 'package:upgrader/upgrader.dart';
import 'bloc/account/account_bloc.dart'; import 'bloc/account/account_bloc.dart';
import 'bloc/body_development/body_development_bloc.dart'; import 'bloc/body_development/body_development_bloc.dart';
@ -144,6 +144,13 @@ Future<Null> main() async {
}, },
); );
} }
Future<void> initThirdParty() async {
if (!isInDebugMode) {
//await FlurryData.initialize(androidKey: "JNYCTCWBT34FM3J8TV36", iosKey: "3QBG7BSMGPDH24S8TRQP", enableLog: true);
FlutterUxcam.optIntoSchematicRecordings();
}
await FirebaseApi().initializeFlutterFire();
}
final WorkoutTreeRepository menuTreeRepository = WorkoutTreeRepository(); final WorkoutTreeRepository menuTreeRepository = WorkoutTreeRepository();
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
@ -152,7 +159,11 @@ Future<Null> main() async {
SetupOptions options = (new SetupOptionsBuilder('682883e5cd71a46160c4f6ed070530ee593f49c6')).build(); SetupOptions options = (new SetupOptionsBuilder('682883e5cd71a46160c4f6ed070530ee593f49c6')).build();
Smartlook.setupAndStartRecording(options); Smartlook.setupAndStartRecording(options);
Smartlook.setEventTrackingMode(EventTrackingMode.FULL_TRACKING);
} }
await initThirdParty();
final FirebaseAnalytics analytics = FirebaseAnalytics.instance;
;
print(" -- FireBase init.."); print(" -- FireBase init..");
@ -192,27 +203,22 @@ Future<Null> main() async {
return TrainingPlanBloc(menuBloc: menuBloc, trainingPlanRepository: TrainingPlanRepository()); return TrainingPlanBloc(menuBloc: menuBloc, trainingPlanRepository: TrainingPlanRepository());
}), }),
], ],
child: WorkoutTestApp(), child: WorkoutTestApp(analytics: analytics),
)); ));
}, (error, stackTrace) async { }, (error, stackTrace) async {
await _reportError(error, stackTrace); await _reportError(error, stackTrace);
}); });
} }
Future<void> initThirdParty() async {
if (!isInDebugMode) {
//await FlurryData.initialize(androidKey: "JNYCTCWBT34FM3J8TV36", iosKey: "3QBG7BSMGPDH24S8TRQP", enableLog: true);
FlutterUxcam.optIntoSchematicRecordings();
}
await FirebaseApi().initializeFlutterFire();
}
class WorkoutTestApp extends StatelessWidget { class WorkoutTestApp extends StatelessWidget {
final FirebaseAnalytics analytics;
const WorkoutTestApp({required this.analytics});
static final facebookAppEvents = FacebookAppEvents(); static final facebookAppEvents = FacebookAppEvents();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
final FirebaseAnalytics analytics = FirebaseAnalytics();
// Only call clearSavedSettings() during testing to reset internal values. // Only call clearSavedSettings() during testing to reset internal values.
Upgrader().clearSavedSettings(); // REMOVE this for release builds Upgrader().clearSavedSettings(); // REMOVE this for release builds
@ -225,7 +231,6 @@ class WorkoutTestApp extends StatelessWidget {
// valid identifier already in the App Store. // valid identifier already in the App Store.
//facebookAppEvents.setAdvertiserTracking(enabled: true); //facebookAppEvents.setAdvertiserTracking(enabled: true);
initThirdParty();
return MaterialApp( return MaterialApp(
localizationsDelegates: [ localizationsDelegates: [

View File

@ -38,7 +38,7 @@ import 'package:package_info/package_info.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:aitrainer_app/model/exercise_type.dart'; import 'package:aitrainer_app/model/exercise_type.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:smartlook/smartlook.dart'; import 'package:flutter_smartlook/flutter_smartlook.dart';
import 'customer_exercise_device.dart'; import 'customer_exercise_device.dart';
import 'exercise_device.dart'; import 'exercise_device.dart';

View File

@ -150,5 +150,13 @@ class CustomerTrainingPlanDetails {
this.day = from.day; this.day = from.day;
this.dayId = from.dayId; this.dayId = from.dayId;
this.baseOneRepMax = from.baseOneRepMax; this.baseOneRepMax = from.baseOneRepMax;
if (from.exercises.length == 0) {
this.exercises = [];
}
if (from.alternatives.length > 0) {
from.alternatives.forEach((alternative) {
this.alternatives.add(alternative);
});
}
} }
} }

View File

@ -257,6 +257,12 @@ class CustomerRepository with Logging {
Future<void> saveCustomer() async { Future<void> saveCustomer() async {
if (this.customer == null) throw Exception("Initialize the customer object"); if (this.customer == null) throw Exception("Initialize the customer object");
final Customer modelCustomer = customer!; final Customer modelCustomer = customer!;
if (modelCustomer.sex == null) {
modelCustomer.sex = "m";
}
if (modelCustomer.fitnessLevel == null) {
modelCustomer.fitnessLevel = "beginner";
}
await CustomerApi().saveCustomer(modelCustomer); await CustomerApi().saveCustomer(modelCustomer);
await this.saveProperties(modelCustomer.properties); await this.saveProperties(modelCustomer.properties);
} }

View File

@ -4,7 +4,6 @@ import 'package:aitrainer_app/model/evaluation.dart';
import 'package:aitrainer_app/model/evaluation_attribute.dart'; import 'package:aitrainer_app/model/evaluation_attribute.dart';
import 'package:aitrainer_app/util/enums.dart'; import 'package:aitrainer_app/util/enums.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class EvaluationRepository { class EvaluationRepository {
List<Evaluation>? evaluations; List<Evaluation>? evaluations;

View File

@ -166,7 +166,7 @@ class ExercisePlanRepository {
if (exercisePlan == null) { if (exercisePlan == null) {
this.createNewPlan(); this.createNewPlan();
} }
;
Cache().setMyExercisePlan(exercisePlan!); Cache().setMyExercisePlan(exercisePlan!);
return exercisePlan; return exercisePlan;
} }

View File

@ -6,6 +6,7 @@ import 'package:aitrainer_app/model/exercise_plan_detail.dart';
import 'package:aitrainer_app/model/exercise_tree.dart'; import 'package:aitrainer_app/model/exercise_tree.dart';
import 'package:aitrainer_app/model/fitness_state.dart'; import 'package:aitrainer_app/model/fitness_state.dart';
import 'package:aitrainer_app/model/training_plan.dart'; import 'package:aitrainer_app/model/training_plan.dart';
import 'package:aitrainer_app/model/training_plan_detail.dart';
import 'package:aitrainer_app/repository/training_plan_day_repository.dart'; import 'package:aitrainer_app/repository/training_plan_day_repository.dart';
import 'package:aitrainer_app/util/app_language.dart'; import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/util/common.dart'; import 'package:aitrainer_app/util/common.dart';
@ -69,9 +70,13 @@ class TrainingPlanRepository {
// 3 calculate weights // 3 calculate weights
int index = 0; int index = 0;
int exerciseTypeIdOrig = 0;
trainingPlan.details!.forEach((elem) { trainingPlan.details!.forEach((elem) {
CustomerTrainingPlanDetails detail = CustomerTrainingPlanDetails(); List<CustomerTrainingPlanDetails> list = createDetail(plan, elem, exerciseTypeIdOrig, index);
list.forEach((element) {
plan.details.add(element);
});
/* CustomerTrainingPlanDetails detail = CustomerTrainingPlanDetails();
detail.customerTrainingPlanDetailsId = ++index; detail.customerTrainingPlanDetailsId = ++index;
detail.trainingPlanDetailsId = elem.trainingPlanDetailId; detail.trainingPlanDetailsId = elem.trainingPlanDetailId;
detail.exerciseTypeId = elem.exerciseTypeId; detail.exerciseTypeId = elem.exerciseTypeId;
@ -107,7 +112,25 @@ class TrainingPlanRepository {
detail.baseOneRepMax = Common.calculate1RM(detail.weight!, detail.repeats!.toDouble()); detail.baseOneRepMax = Common.calculate1RM(detail.weight!, detail.repeats!.toDouble());
} }
detail.alternatives = Common.getExerciseTypeAlternatives(detail.exerciseTypeId); detail.alternatives = Common.getExerciseTypeAlternatives(detail.exerciseTypeId);
// first repeat: 50% more
if (detail.weight != null && detail.weight! > 0 && exerciseTypeIdOrig != detail.exerciseTypeId && detail.repeats! > 0) {
CustomerTrainingPlanDetails firstDetail = CustomerTrainingPlanDetails();
firstDetail.copy(detail);
firstDetail.repeats = (detail.repeats! * 1.5).round();
firstDetail.set = 1;
detail.set = detail.set! - 1;
if (detail.set! > 0) {
index++;
}
detail.customerTrainingPlanDetailsId = index;
plan.details.add(firstDetail);
exerciseTypeIdOrig = detail.exerciseTypeId!;
}
if (detail.set! > 0) {
plan.details.add(detail); plan.details.add(detail);
} */
}); });
Cache().myTrainingPlan = plan; Cache().myTrainingPlan = plan;
@ -116,6 +139,68 @@ class TrainingPlanRepository {
return plan; return plan;
} }
List<CustomerTrainingPlanDetails> createDetail(CustomerTrainingPlan plan, TrainingPlanDetail elem, int exerciseTypeIdOrig, int index,
{bool changeExerciseType = false}) {
List<CustomerTrainingPlanDetails> list = [];
CustomerTrainingPlanDetails detail = CustomerTrainingPlanDetails();
detail.customerTrainingPlanDetailsId = ++index;
detail.trainingPlanDetailsId = elem.trainingPlanDetailId;
detail.exerciseTypeId = changeExerciseType ? exerciseTypeIdOrig : elem.exerciseTypeId;
detail.repeats = elem.repeats;
detail.set = elem.set;
detail.dayId = elem.dayId;
TrainingPlanDayRepository trainingPlanDayRepository = TrainingPlanDayRepository();
detail.day = trainingPlanDayRepository.getNameById(elem.dayId);
detail.parallel = elem.parallel;
detail.restingTime = elem.restingTime;
detail.exerciseType = Cache().getExerciseTypeById(detail.exerciseTypeId!);
detail.alternatives = Common.getExerciseTypeAlternatives(detail.exerciseTypeId);
if (elem.weight == -1) {
if (detail.exerciseType!.unitQuantityUnit != null) {
detail = getCalculatedWeightRepeats(elem.exerciseTypeId, detail);
} else {
detail.weight = 0;
}
} else if (elem.weight == -2) {
final CustomerTrainingPlanDetails calculated = this.isWeightCalculatedByExerciseType(elem.exerciseTypeId, detail, plan);
if (calculated.weight != -1) {
detail.weight = calculated.weight;
} else {
detail.weight = -2;
}
} else {
detail.weight = elem.weight;
}
print("Detail $detail exerciseType: ${detail.exerciseType!.exerciseTypeId}");
detail.state = ExercisePlanDetailState.start;
if (detail.weight != null && detail.weight! > 0) {
detail.baseOneRepMax = Common.calculate1RM(detail.weight!, detail.repeats!.toDouble());
}
// first repeat: 50% more
if (detail.weight != null && detail.weight! > 0 && exerciseTypeIdOrig != detail.exerciseTypeId && detail.repeats! > 0) {
CustomerTrainingPlanDetails firstDetail = CustomerTrainingPlanDetails();
firstDetail.copy(detail);
firstDetail.repeats = (detail.repeats! * 1.5).round();
firstDetail.set = 1;
detail.set = detail.set! - 1;
if (detail.set! > 0) {
index++;
}
detail.customerTrainingPlanDetailsId = index;
//plan.details.add(firstDetail);
list.add(firstDetail);
exerciseTypeIdOrig = detail.exerciseTypeId!;
}
if (detail.set! > 0) {
//plan.details.add(detail);
list.add(detail);
}
return list;
}
CustomerTrainingPlanDetails isWeightCalculatedByExerciseType( CustomerTrainingPlanDetails isWeightCalculatedByExerciseType(
int exerciseTypeId, CustomerTrainingPlanDetails detail, CustomerTrainingPlan plan) { int exerciseTypeId, CustomerTrainingPlanDetails detail, CustomerTrainingPlan plan) {
CustomerTrainingPlanDetails calculated = detail; CustomerTrainingPlanDetails calculated = detail;
@ -172,10 +257,16 @@ class TrainingPlanRepository {
Exercise? lastExercise1RM; Exercise? lastExercise1RM;
DateTime dt = DateTime.now().subtract(Duration(days: 30)); DateTime dt = DateTime.now().subtract(Duration(days: 30));
Cache().getExercises()!.forEach((exercise) { List<Exercise> exercises = Cache().getExercises()!;
exercises.sort((a, b) {
// reverse
return a.dateAdd!.compareTo(b.dateAdd!);
});
exercises.forEach((exercise) {
if (exercise.exerciseTypeId == exerciseTypeId && exercise.dateAdd!.compareTo(dt) >= 0) { if (exercise.exerciseTypeId == exerciseTypeId && exercise.dateAdd!.compareTo(dt) >= 0) {
detail.weight = weight; detail.weight = weight;
lastExercise1RM = exercise; lastExercise1RM = exercise;
print("last exercise: $exercise");
} }
}); });
@ -185,7 +276,8 @@ class TrainingPlanRepository {
return detail; return detail;
} }
double oneRepMax = Common.calculate1RM(lastExercise1RM!.unitQuantity!, lastExercise1RM!.quantity!); double oneRepMax = calculateMax1RMSameDay(lastExercise1RM!);
// Common.calculate1RM(lastExercise1RM!.unitQuantity!, lastExercise1RM!.quantity!);
print("Exercise $exerciseTypeId - 1RM : $oneRepMax"); print("Exercise $exerciseTypeId - 1RM : $oneRepMax");
weight = oneRepMax * Common.get1RMPercent(detail.repeats!); weight = oneRepMax * Common.get1RMPercent(detail.repeats!);
print("Exercise $exerciseTypeId - weight : $weight"); print("Exercise $exerciseTypeId - weight : $weight");
@ -201,6 +293,25 @@ class TrainingPlanRepository {
return detail; return detail;
} }
double calculateMax1RMSameDay(Exercise actual) {
List<Exercise> exercises = Cache().getExercises()!;
double max1RM = 0.0;
exercises.forEach((exercise) {
if (actual.exerciseTypeId == exercise.exerciseTypeId &&
actual.dateAdd!.year == exercise.dateAdd!.year &&
actual.dateAdd!.month == exercise.dateAdd!.month &&
actual.dateAdd!.day == exercise.dateAdd!.day) {
double oneRepMax = Common.calculate1RM(exercise.unitQuantity!, exercise.quantity!);
if (max1RM < oneRepMax) {
max1RM = oneRepMax;
}
}
});
return max1RM;
}
int getOriginalRepeats(int trainingPlanId, CustomerTrainingPlanDetails detail) { int getOriginalRepeats(int trainingPlanId, CustomerTrainingPlanDetails detail) {
TrainingPlan? plan = getTrainingPlanById(trainingPlanId); TrainingPlan? plan = getTrainingPlanById(trainingPlanId);
if (plan == null) { if (plan == null) {

View File

@ -7,13 +7,28 @@ import 'package:flutter/services.dart';
import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/cache.dart';
class APIClient with Common, Logging { class APIClient with Common, Logging {
static final APIClient _singleton = APIClient._internal();
late bool cert;
factory APIClient() {
return _singleton;
}
APIClient._internal() {
cert = false;
}
dynamic authenticateUser(String email, String password) async { dynamic authenticateUser(String email, String password) async {
var url = Cache().getBaseUrl() + "authenticate"; var url = Cache().getBaseUrl() + "authenticate";
try { try {
ByteData data = await rootBundle.load('asset/data/aitrainer_server.crt.pem'); ByteData data = await rootBundle.load('asset/data/aitrainer_server.crt.pem');
SecurityContext context = SecurityContext.defaultContext; SecurityContext context = SecurityContext.defaultContext;
if (cert == false) {
print("Set CERT $cert");
context.setTrustedCertificatesBytes(data.buffer.asUint8List(), password: "[xxxx]"); context.setTrustedCertificatesBytes(data.buffer.asUint8List(), password: "[xxxx]");
cert = true;
}
HttpClient client = new HttpClient(); //context: context Todo provide the right certificate HttpClient client = new HttpClient(); //context: context Todo provide the right certificate
client.badCertificateCallback = ((X509Certificate cert, String host, int port) { client.badCertificateCallback = ((X509Certificate cert, String host, int port) {
@ -52,7 +67,9 @@ class APIClient with Common, Logging {
} }
var uri = Uri.parse(url); var uri = Uri.parse(url);
HttpClient client = new HttpClient(); HttpClient client = new HttpClient();
client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true); client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
final HttpClientRequest request = await client.postUrl(uri); final HttpClientRequest request = await client.postUrl(uri);
request.headers.contentType = new ContentType("application", "json", charset: "utf-8"); request.headers.contentType = new ContentType("application", "json", charset: "utf-8");
request.headers.set('Authorization', 'Bearer $authToken'); request.headers.set('Authorization', 'Bearer $authToken');
@ -87,7 +104,9 @@ class APIClient with Common, Logging {
var uri = Uri.parse(url); var uri = Uri.parse(url);
HttpClient client = new HttpClient(); HttpClient client = new HttpClient();
client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true); client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
final HttpClientRequest request = await client.getUrl(uri); final HttpClientRequest request = await client.getUrl(uri);
request.headers.set('Content-Type', 'application/json'); request.headers.set('Content-Type', 'application/json');
request.headers.set('Authorization', 'Bearer $authToken'); request.headers.set('Authorization', 'Bearer $authToken');

View File

@ -6,7 +6,7 @@ import 'dart:convert';
import 'api.dart'; import 'api.dart';
class CustomerExerciseDeviceApi with Logging { class CustomerExerciseDeviceApi with Logging {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<List<CustomerExerciseDevice>> getDevices(int customerId) async { Future<List<CustomerExerciseDevice>> getDevices(int customerId) async {
List<CustomerExerciseDevice> devices = []; List<CustomerExerciseDevice> devices = [];

View File

@ -10,7 +10,7 @@ import 'package:aitrainer_app/service/logging.dart';
import 'package:aitrainer_app/util/not_found_exception.dart'; import 'package:aitrainer_app/util/not_found_exception.dart';
class CustomerApi with Logging { class CustomerApi with Logging {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<List<Customer>> getRealCustomers(String param) async { Future<List<Customer>> getRealCustomers(String param) async {
final body = await _client.get("customers/", param); final body = await _client.get("customers/", param);

View File

@ -5,7 +5,7 @@ import 'package:aitrainer_app/model/exercise_device.dart';
import 'api.dart'; import 'api.dart';
class ExerciseDeviceApi { class ExerciseDeviceApi {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<List<ExerciseDevice>> getDevices() async { Future<List<ExerciseDevice>> getDevices() async {
final body = await _client.get("exercise_device/", ""); final body = await _client.get("exercise_device/", "");

View File

@ -6,7 +6,7 @@ import 'dart:convert';
import 'api.dart'; import 'api.dart';
class ExercisePlanApi with Logging { class ExercisePlanApi with Logging {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<ExercisePlan> saveExercisePlan(ExercisePlan exercisePlan) async { Future<ExercisePlan> saveExercisePlan(ExercisePlan exercisePlan) async {
String body = JsonEncoder().convert(exercisePlan.toJson()); String body = JsonEncoder().convert(exercisePlan.toJson());

View File

@ -6,7 +6,7 @@ import 'package:aitrainer_app/service/logging.dart';
import 'api.dart'; import 'api.dart';
class ExerciseResultApi with Logging { class ExerciseResultApi with Logging {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<void> saveExerciseResult(ExerciseResult exerciseResult) async { Future<void> saveExerciseResult(ExerciseResult exerciseResult) async {
String body = JsonEncoder().convert(exerciseResult.toJson()); String body = JsonEncoder().convert(exerciseResult.toJson());

View File

@ -4,7 +4,7 @@ import 'package:aitrainer_app/service/api.dart';
import 'package:aitrainer_app/service/logging.dart'; import 'package:aitrainer_app/service/logging.dart';
class ExerciseApi with Logging { class ExerciseApi with Logging {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<void> saveExercise(Exercise exercise) async { Future<void> saveExercise(Exercise exercise) async {
String body = JsonEncoder().convert(exercise.toJson()); String body = JsonEncoder().convert(exercise.toJson());

View File

@ -8,7 +8,7 @@ import 'package:flutter/services.dart';
import 'api.dart'; import 'api.dart';
class ExerciseTreeApi with Logging { class ExerciseTreeApi with Logging {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<List<ExerciseTree>> getExerciseTree() async { Future<List<ExerciseTree>> getExerciseTree() async {
final String body = await _client.get("exercise_tree", ""); final String body = await _client.get("exercise_tree", "");

View File

@ -6,7 +6,7 @@ import 'package:aitrainer_app/service/logging.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
class ExerciseTypeApi with Logging { class ExerciseTypeApi with Logging {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<List<ExerciseType>> getExerciseTypes() async { Future<List<ExerciseType>> getExerciseTypes() async {
final body = await _client.get("exercise_type", ""); final body = await _client.get("exercise_type", "");

View File

@ -31,7 +31,7 @@ import 'customer_service.dart';
import 'exercise_tree_service.dart'; import 'exercise_tree_service.dart';
class PackageApi { class PackageApi {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<void> getPackage() async { Future<void> getPackage() async {
late List<ExerciseTree> exerciseTree; late List<ExerciseTree> exerciseTree;

View File

@ -5,7 +5,7 @@ import 'package:aitrainer_app/model/product.dart';
import 'package:aitrainer_app/service/api.dart'; import 'package:aitrainer_app/service/api.dart';
class ProductApi { class ProductApi {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<List<Product>> getProducts() async { Future<List<Product>> getProducts() async {
final body = await _client.get("product/", ""); final body = await _client.get("product/", "");

View File

@ -6,7 +6,7 @@ import 'package:aitrainer_app/service/api.dart';
import '../model/property.dart'; import '../model/property.dart';
class PropertyApi { class PropertyApi {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<List<Property>> getProperties() async { Future<List<Property>> getProperties() async {
final body = await _client.get("property/", ""); final body = await _client.get("property/", "");

View File

@ -6,7 +6,7 @@ import 'dart:convert';
import 'api.dart'; import 'api.dart';
class PurchaseApi with Logging { class PurchaseApi with Logging {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<List<Purchase>> getPurchasesByCustomer(int customerId) async { Future<List<Purchase>> getPurchasesByCustomer(int customerId) async {
List<Purchase> purchases = []; List<Purchase> purchases = [];

View File

@ -6,7 +6,7 @@ import 'package:aitrainer_app/service/api.dart';
import '../model/sport.dart'; import '../model/sport.dart';
class SportApi { class SportApi {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<List<Sport>> getSports() async { Future<List<Sport>> getSports() async {
final body = await _client.get("sports/", ""); final body = await _client.get("sports/", "");

View File

@ -4,7 +4,7 @@ import 'dart:convert';
import 'api.dart'; import 'api.dart';
class TrackingApi with Logging { class TrackingApi with Logging {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<void> saveTracking(Tracking tracking) async { Future<void> saveTracking(Tracking tracking) async {
try { try {

View File

@ -6,7 +6,7 @@ import 'package:aitrainer_app/service/api.dart';
import 'package:aitrainer_app/service/logging.dart'; import 'package:aitrainer_app/service/logging.dart';
class TrainingPlanApi with Logging { class TrainingPlanApi with Logging {
final APIClient _client = new APIClient(); final APIClient _client = APIClient();
Future<CustomerTrainingPlan> saveCustomerTrainingPlan(CustomerTrainingPlan plan) async { Future<CustomerTrainingPlan> saveCustomerTrainingPlan(CustomerTrainingPlan plan) async {
String body = JsonEncoder().convert(plan.toJson()); String body = JsonEncoder().convert(plan.toJson());

View File

@ -1,5 +1,4 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:ui';
import 'package:aitrainer_app/service/logging.dart'; import 'package:aitrainer_app/service/logging.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';

View File

@ -4,7 +4,6 @@ import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/model/exercise_type.dart'; import 'package:aitrainer_app/model/exercise_type.dart';
import 'package:aitrainer_app/repository/user_repository.dart'; import 'package:aitrainer_app/repository/user_repository.dart';
import 'package:badges/badges.dart'; import 'package:badges/badges.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';

View File

@ -8,11 +8,11 @@ import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
//import 'package:flurry_data/flurry_data.dart'; //import 'package:flurry_data/flurry_data.dart';
import 'package:flutter_uxcam/flutter_uxcam.dart'; import 'package:flutter_uxcam/flutter_uxcam.dart';
import 'package:smartlook/smartlook.dart'; import 'package:flutter_smartlook/flutter_smartlook.dart';
class Track with Logging { class Track with Logging {
static final Track _singleton = Track._internal(); static final Track _singleton = Track._internal();
static FirebaseAnalytics analytics = FirebaseAnalytics(); static FirebaseAnalytics analytics = FirebaseAnalytics.instance;
factory Track() { factory Track() {
return _singleton; return _singleton;

View File

@ -183,7 +183,7 @@ class AccountPage extends StatelessWidget with Trans {
} }
ListTile messaging() { ListTile messaging() {
FirebaseInAppMessaging fiam = FirebaseInAppMessaging(); FirebaseInAppMessaging fiam = FirebaseInAppMessaging.instance;
ListTile element = ListTile( ListTile element = ListTile(
leading: Icon(Icons.message), leading: Icon(Icons.message),
title: TextButton( title: TextButton(

View File

@ -1,12 +1,10 @@
import 'dart:collection'; import 'dart:collection';
import 'dart:ui';
import 'package:aitrainer_app/bloc/body_type/bodytype_bloc.dart'; import 'package:aitrainer_app/bloc/body_type/bodytype_bloc.dart';
import 'package:aitrainer_app/util/app_localization.dart'; import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/repository/customer_repository.dart'; import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/util/enums.dart'; import 'package:aitrainer_app/util/enums.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/dialog_html.dart'; import 'package:aitrainer_app/widgets/dialog_html.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';

View File

@ -6,7 +6,6 @@ import 'package:aitrainer_app/repository/customer_exercise_device_repository.dar
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar.dart'; import 'package:aitrainer_app/widgets/app_bar.dart';
import 'package:aitrainer_app/widgets/image_button.dart'; import 'package:aitrainer_app/widgets/image_button.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';

View File

@ -8,9 +8,7 @@ import 'package:aitrainer_app/model/fitness_state.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/app_bar_progress.dart'; import 'package:aitrainer_app/widgets/app_bar_progress.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
@ -52,7 +50,6 @@ class _CustomerFitnessPageState extends State<CustomerFitnessPage> with Trans {
if (!fulldata) { if (!fulldata) {
_bar = AppBarProgress(max: 30, min: 15); _bar = AppBarProgress(max: 30, min: 15);
} }
final double h = 27;
return Scaffold( return Scaffold(
appBar: _bar, appBar: _bar,
body: Container( body: Container(

View File

@ -6,7 +6,6 @@ import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/app_bar_progress.dart'; import 'package:aitrainer_app/widgets/app_bar_progress.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';

View File

@ -5,9 +5,7 @@ import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/app_bar_progress.dart'; import 'package:aitrainer_app/widgets/app_bar_progress.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';

View File

@ -13,8 +13,6 @@ import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/app_bar_progress.dart'; import 'package:aitrainer_app/widgets/app_bar_progress.dart';
import 'package:aitrainer_app/widgets/number_picker.dart'; import 'package:aitrainer_app/widgets/number_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';

View File

@ -6,9 +6,7 @@ import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/app_bar_progress.dart'; import 'package:aitrainer_app/widgets/app_bar_progress.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';

View File

@ -6,9 +6,7 @@ import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/app_bar_progress.dart'; import 'package:aitrainer_app/widgets/app_bar_progress.dart';
import 'package:aitrainer_app/widgets/number_picker.dart'; import 'package:aitrainer_app/widgets/number_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';

View File

@ -1,5 +1,4 @@
import 'dart:collection'; import 'dart:collection';
import 'dart:ui';
import 'package:aitrainer_app/bloc/tutorial/tutorial_bloc.dart'; import 'package:aitrainer_app/bloc/tutorial/tutorial_bloc.dart';
import 'package:aitrainer_app/widgets/tutorial_widget.dart'; import 'package:aitrainer_app/widgets/tutorial_widget.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';

View File

@ -12,7 +12,6 @@ import 'package:aitrainer_app/widgets/dialog_html.dart';
import 'package:aitrainer_app/widgets/number_picker.dart'; import 'package:aitrainer_app/widgets/number_picker.dart';
import 'package:aitrainer_app/widgets/timer_widget.dart'; import 'package:aitrainer_app/widgets/timer_widget.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';

View File

@ -8,7 +8,6 @@ import 'package:aitrainer_app/widgets/treeview_parent_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html/style.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
// ignore: must_be_immutable // ignore: must_be_immutable

View File

@ -8,7 +8,6 @@ import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/dialog_common.dart'; import 'package:aitrainer_app/widgets/dialog_common.dart';
import 'package:aitrainer_app/widgets/dialog_web_browser.dart'; import 'package:aitrainer_app/widgets/dialog_web_browser.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';

View File

@ -3,7 +3,6 @@ import 'package:aitrainer_app/bloc/menu/menu_bloc.dart';
import 'package:aitrainer_app/widgets/app_bar.dart'; import 'package:aitrainer_app/widgets/app_bar.dart';
import 'package:aitrainer_app/widgets/bottom_nav.dart'; import 'package:aitrainer_app/widgets/bottom_nav.dart';
import 'package:aitrainer_app/widgets/menu_page_widget.dart'; import 'package:aitrainer_app/widgets/menu_page_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -99,7 +99,7 @@ class MyDevelopmentLog extends StatelessWidget with Trans, Common {
view: CalendarView.month, view: CalendarView.month,
monthViewSettings: MonthViewSettings( monthViewSettings: MonthViewSettings(
showAgenda: true, showAgenda: true,
appointmentDisplayMode: MonthAppointmentDisplayMode.appointment, appointmentDisplayMode: MonthAppointmentDisplayMode.indicator,
showTrailingAndLeadingDates: true, showTrailingAndLeadingDates: true,
), ),
appointmentTimeTextFormat: 'HH:mm', appointmentTimeTextFormat: 'HH:mm',
@ -307,11 +307,11 @@ class MyDevelopmentLog extends StatelessWidget with Trans, Common {
TextSpan(text: t("The found exercises are")), TextSpan(text: t("The found exercises are")),
TextSpan(text: " "), TextSpan(text: " "),
TextSpan( TextSpan(
text: t("in red"), text: t("in green"),
style: GoogleFonts.inter( style: GoogleFonts.inter(
fontSize: 14, fontSize: 14,
fontWeight: FontWeight.normal, fontWeight: FontWeight.normal,
color: Colors.redAccent, color: Color(0xffb4f500),
), ),
), ),
TextSpan(text: " "), TextSpan(text: " "),

View File

@ -11,9 +11,7 @@ import 'package:aitrainer_app/bloc/development_by_muscle/development_by_muscle_b
import 'package:aitrainer_app/model/workout_menu_tree.dart'; import 'package:aitrainer_app/model/workout_menu_tree.dart';
import 'package:aitrainer_app/library/tree_view.dart'; import 'package:aitrainer_app/library/tree_view.dart';
import 'package:aitrainer_app/widgets/bottom_nav.dart'; import 'package:aitrainer_app/widgets/bottom_nav.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -14,7 +14,6 @@ import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar.dart'; import 'package:aitrainer_app/widgets/app_bar.dart';
import 'package:aitrainer_app/widgets/bottom_nav.dart'; import 'package:aitrainer_app/widgets/bottom_nav.dart';
import 'package:aitrainer_app/widgets/image_button.dart'; import 'package:aitrainer_app/widgets/image_button.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class MyDevelopmentPage extends StatefulWidget { class MyDevelopmentPage extends StatefulWidget {

View File

@ -2,9 +2,7 @@ import 'package:aitrainer_app/bloc/development_sizes/development_sizes_bloc.dart
import 'package:aitrainer_app/model/property.dart'; import 'package:aitrainer_app/model/property.dart';
import 'package:aitrainer_app/repository/customer_repository.dart'; import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';

View File

@ -10,7 +10,6 @@ import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/dialog_common.dart'; import 'package:aitrainer_app/widgets/dialog_common.dart';
import 'package:aitrainer_app/widgets/dialog_web_browser.dart'; import 'package:aitrainer_app/widgets/dialog_web_browser.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';

View File

@ -3,7 +3,6 @@ import 'package:aitrainer_app/repository/user_repository.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';

View File

@ -4,11 +4,9 @@ import 'package:aitrainer_app/service/logging.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/dialog_common.dart'; import 'package:aitrainer_app/widgets/dialog_common.dart';
import 'package:aitrainer_app/widgets/sales_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html/style.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';

View File

@ -12,7 +12,6 @@ import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/bottom_nav.dart'; import 'package:aitrainer_app/widgets/bottom_nav.dart';
import 'package:aitrainer_app/widgets/dialog_web_browser.dart'; import 'package:aitrainer_app/widgets/dialog_web_browser.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';

View File

@ -20,7 +20,6 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html/style.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart';

View File

@ -1,5 +1,3 @@
import 'dart:collection';
import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart'; import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart';
import 'package:aitrainer_app/library/custom_icon_icons.dart'; import 'package:aitrainer_app/library/custom_icon_icons.dart';
import 'package:aitrainer_app/model/customer_training_plan.dart'; import 'package:aitrainer_app/model/customer_training_plan.dart';
@ -185,7 +183,7 @@ class _ExerciseTileState extends State<ExerciseTile> with Trans {
} }
void activateCustomPlan() { void activateCustomPlan() {
widget.bloc.add(TrainingPlanCustomAddLoad(exerciseType: widget.exerciseType)); widget.bloc.add(TrainingPlanAddLoad(exerciseType: widget.exerciseType));
Navigator.of(context).popAndPushNamed("myTrainingPlanCustomAdd"); Navigator.of(context).popAndPushNamed("myTrainingPlanCustomAdd");
} }

View File

@ -3,12 +3,9 @@ import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:keyboard_actions/keyboard_actions.dart'; import 'package:keyboard_actions/keyboard_actions.dart';
import 'package:keyboard_actions/keyboard_actions_config.dart';
import 'package:keyboard_actions/keyboard_actions_item.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
class TrainingPlanCustomAddPage extends StatefulWidget { class TrainingPlanCustomAddPage extends StatefulWidget {

View File

@ -5,6 +5,7 @@ import 'package:aitrainer_app/library/custom_icon_icons.dart';
import 'package:aitrainer_app/model/customer_training_plan_details.dart'; import 'package:aitrainer_app/model/customer_training_plan_details.dart';
import 'package:aitrainer_app/model/exercise_plan_detail.dart'; import 'package:aitrainer_app/model/exercise_plan_detail.dart';
import 'package:aitrainer_app/util/app_localization.dart'; import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/util/common.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar.dart'; import 'package:aitrainer_app/widgets/app_bar.dart';
import 'package:aitrainer_app/widgets/dialog_common.dart'; import 'package:aitrainer_app/widgets/dialog_common.dart';
@ -12,6 +13,7 @@ import 'package:aitrainer_app/widgets/dialog_html.dart';
import 'package:aitrainer_app/widgets/menu_image.dart'; import 'package:aitrainer_app/widgets/menu_image.dart';
import 'package:badges/badges.dart'; import 'package:badges/badges.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:extended_tabs/extended_tabs.dart'; import 'package:extended_tabs/extended_tabs.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -312,7 +314,6 @@ class _ExerciseListState extends State<ExerciseList> with Trans {
void animate() { void animate() {
offset = widget.bloc.getOffset(); offset = widget.bloc.getOffset();
//print("Offset: $offset");
if (scrollController.hasClients) { if (scrollController.hasClients) {
scrollController.animateTo(offset, duration: Duration(milliseconds: 300), curve: Curves.easeIn); scrollController.animateTo(offset, duration: Duration(milliseconds: 300), curve: Curves.easeIn);
} }
@ -390,7 +391,10 @@ class _ExerciseListState extends State<ExerciseList> with Trans {
tiles.add(GestureDetector( tiles.add(GestureDetector(
onTap: () => onTap: () =>
bloc.getNext() != null ? executeExercise(bloc, bloc.getNext()!, context) : Navigator.of(context).pushNamed('home'), bloc.getNext() != null ? executeExercise(bloc, bloc.getNext()!, context) : Navigator.of(context).pushNamed('home'),
child: ExerciseTile(bloc: bloc, detail: element))); child: ExerciseTile(
bloc: bloc,
detail: element,
)));
} }
prev = element; prev = element;
}); });
@ -407,10 +411,9 @@ class ExerciseTile extends StatelessWidget with Trans {
ExerciseTile({required this.bloc, required this.detail}); ExerciseTile({required this.bloc, required this.detail});
Widget getExerciseQuantities(CustomerTrainingPlanDetails detail, int step, bool noFilter) { Widget getExerciseQuantities(CustomerTrainingPlanDetails detail, int step, bool noFilter, int highlightStep) {
bool skipped = detail.state == ExercisePlanDetailState.skipped; bool skipped = detail.state == ExercisePlanDetailState.skipped;
String quantities = ""; String quantities = "";
String set = "";
List<TextSpan> spans = []; List<TextSpan> spans = [];
if (detail.exerciseType!.name == "Warming Up") { if (detail.exerciseType!.name == "Warming Up") {
quantities = t("Min. 10 minutes"); quantities = t("Min. 10 minutes");
@ -423,47 +426,50 @@ class ExerciseTile extends StatelessWidget with Trans {
TextSpan(text: quantities), TextSpan(text: quantities),
); );
} else { } else {
set = detail.set! > 1 ? "${detail.set} " + t("set") : "";
List<CustomerTrainingPlanDetails> details = bloc.getAllDetailsSameExercise(detail); List<CustomerTrainingPlanDetails> details = bloc.getAllDetailsSameExercise(detail);
int index = 0; int index = 0;
bool isWeight = true; bool isWeight = true;
details.forEach((element) {
quantities = "";
if (set.length > 0) { if (index > 0) {
spans.add(
TextSpan(text: ", "),
);
}
//print("STEP $step highlight: $highlightStep index: $index");
if (element.set! > 1) {
spans.add( spans.add(
TextSpan( TextSpan(
text: step.toString() + " ", text: (element.exercises.length + 1).toString(),
style: GoogleFonts.archivoBlack( style: GoogleFonts.archivoBlack(
color: Colors.orange[600], color: highlightStep == index && noFilter ? Colors.orange[600] : Colors.white,
)), )),
); );
spans.add( spans.add(
TextSpan(text: "/ " + set), TextSpan(text: "/${element.set} x "),
); );
} }
details.forEach((element) {
quantities = "";
String delimiter = ",";
if (index == 0) {
delimiter = "";
}
if (element.repeats == -1) { if (element.repeats == -1) {
quantities += delimiter + " MAX "; quantities += " MAX ";
} else { } else {
quantities += delimiter + " ${element.repeats}"; quantities += "${element.repeats}";
} }
if (element.exerciseType!.unitQuantityUnit != null) {
if (element.exerciseType!.unitQuantityUnit != null && element.weight != null) {
quantities += "x"; quantities += "x";
if (element.weight == -1 || element.weight == -2 || element.weight == -3) { if (element.weight == -1 || element.weight == -2 || element.weight == -3) {
quantities += "? kg"; quantities += "? kg";
} else { } else {
num weight = element.weight! % element.weight!.round() == 0 ? element.weight!.round() : element.weight!; num weight = element.weight! % element.weight!.round() == 0 ? element.weight!.round() : element.weight!;
quantities += "$weight kg"; quantities += "$weight kg";
} }
} else { } else {
isWeight = false; isWeight = false;
} }
if (step == index && noFilter) { if (highlightStep == index && noFilter) {
spans.add( spans.add(
TextSpan( TextSpan(
text: quantities, text: quantities,
@ -509,14 +515,54 @@ class ExerciseTile extends StatelessWidget with Trans {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
setContext(context); setContext(context);
//bloc.setTileKey(tileKey);
return CarouselSlider(
options: CarouselOptions(
viewportFraction: 1,
reverse: false,
enableInfiniteScroll: false,
autoPlay: false,
aspectRatio: 1.3,
enlargeCenterPage: true,
onPageChanged: (index, reason) => {print("index changed $index")},
enlargeStrategy: CenterPageEnlargeStrategy.scale),
items: getExerciseTiles(detail),
);
}
List<Widget> getExerciseTiles(CustomerTrainingPlanDetails detail) {
final List<Widget> list = [];
list.add(getTile(detail));
/* if (detail.alternatives.length == 0) {
detail.alternatives = Common.getExerciseTypeAlternatives(detail.exerciseTypeId);
}
if (detail.alternatives.length > 0) {
detail.alternatives.forEach((element) {
CustomerTrainingPlanDetails? alternative = bloc.createDetailFromExerciseType(element, detail);
if (alternative != null) {
final Widget widget = getTile(alternative);
print("Alternatives for ${detail.exerciseTypeId}: $alternative");
list.add(widget);
}
});
} */
return list;
}
Widget getTile(CustomerTrainingPlanDetails detail) {
final CustomerTrainingPlanDetails? next = bloc.getNext(); final CustomerTrainingPlanDetails? next = bloc.getNext();
final bool noFilter = next != null && next.exerciseTypeId == detail.exerciseTypeId; final bool noFilter = next != null && next.exerciseTypeId == detail.exerciseTypeId;
final bool done = bloc.isAllDetailsSameExerciseFinished(detail); //detail.state == ExercisePlanDetailState.finished; final bool done = bloc.isAllDetailsSameExerciseFinished(detail);
final int step = bloc.getStep(detail); //detail.exercises.length;
final bool buddyWarning = detail.exerciseType == null ? false : detail.exerciseType!.buddyWarning; final bool buddyWarning = detail.exerciseType == null ? false : detail.exerciseType!.buddyWarning;
final bool hasAlternative = false; //detail.alternatives.length > 0; final int step = bloc.getStep(detail);
final int highlightStep = bloc.getHighlightStep(detail);
final bool hasAlternative = detail.alternatives.length > 0;
return Container( return Container(
//key: this.tileKey,
child: ClipRect(
child: Stack(alignment: Alignment.centerRight, children: [ child: Stack(alignment: Alignment.centerRight, children: [
Stack(alignment: Alignment.centerLeft, children: [ Stack(alignment: Alignment.centerLeft, children: [
Stack(alignment: Alignment.bottomLeft, children: [ Stack(alignment: Alignment.bottomLeft, children: [
@ -529,7 +575,7 @@ class ExerciseTile extends StatelessWidget with Trans {
badgeColor: Colors.transparent, badgeColor: Colors.transparent,
showBadge: noFilter || done, showBadge: noFilter || done,
badgeContent: IconButton( badgeContent: IconButton(
iconSize: 40, iconSize: 36,
onPressed: () => !done ? skip() : {}, onPressed: () => !done ? skip() : {},
icon: Icon( icon: Icon(
done ? CustomIcon.ok_circled : Icons.cancel, done ? CustomIcon.ok_circled : Icons.cancel,
@ -559,13 +605,13 @@ class ExerciseTile extends StatelessWidget with Trans {
child: Badge( child: Badge(
elevation: 0, elevation: 0,
padding: EdgeInsets.all(0), padding: EdgeInsets.all(0),
position: BadgePosition.topEnd(top: 65, end: 1), position: BadgePosition.topEnd(top: 5, end: 60),
animationDuration: Duration(milliseconds: 500), animationDuration: Duration(milliseconds: 500),
animationType: BadgeAnimationType.fade, animationType: BadgeAnimationType.fade,
badgeColor: Colors.transparent, badgeColor: Colors.transparent,
showBadge: buddyWarning, showBadge: buddyWarning,
badgeContent: IconButton( badgeContent: IconButton(
iconSize: 50, iconSize: 36,
onPressed: () => showDialog( onPressed: () => showDialog(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
@ -608,7 +654,7 @@ class ExerciseTile extends StatelessWidget with Trans {
: null, : null,
height: 80, height: 80,
width: double.infinity, width: double.infinity,
child: getExerciseQuantities(detail, step, noFilter), child: getExerciseQuantities(detail, step, noFilter, highlightStep),
) )
])))), ])))),
Container( Container(
@ -639,25 +685,31 @@ class ExerciseTile extends StatelessWidget with Trans {
), ),
]), ]),
hasAlternative hasAlternative
? Image.asset( ? Positioned(
top: 50,
child: Image.asset(
'asset/image/alternatives_arrow.png', 'asset/image/alternatives_arrow.png',
height: 100, height: 100,
width: 100, width: 100,
) color: noFilter ? Color(0xffb4f500) : Colors.grey,
))
: Offstage(), : Offstage(),
]), ]),
hasAlternative hasAlternative
? Transform.rotate( ? Positioned(
top: 50,
child: Transform.rotate(
angle: pi, angle: pi,
alignment: Alignment.center, alignment: Alignment.center,
child: Image.asset( child: Image.asset(
'asset/image/alternatives_arrow.png', 'asset/image/alternatives_arrow.png',
height: 100, height: 100,
width: 100, width: 100,
), color: noFilter ? Color(0xffb4f500) : Colors.grey,
)),
) )
: Offstage(), : Offstage(),
])); ])));
} }
void skip() { void skip() {

View File

@ -112,8 +112,8 @@ class TrainingPlanExercise extends StatelessWidget with Trans {
set: detail.set, set: detail.set,
exerciseNr: detail.exercises.length + 1, exerciseNr: detail.exercises.length + 1,
onUnitQuantityChanged: (value) => bloc.add(TrainingPlanWeightChangeRecalculate(weight: value, detail: detail)), onUnitQuantityChanged: (value) => bloc.add(TrainingPlanWeightChangeRecalculate(weight: value, detail: detail)),
onUnitQuantityChangeUp: () => bloc.add(TrainingPlanWeightChangeUp(detail: detail)), //onUnitQuantityChangeUp: () => bloc.add(TrainingPlanWeightChangeUp(detail: detail)),
onUnitQuantityChangeDown: () => bloc.add(TrainingPlanWeightChangeDown(detail: detail)), //onUnitQuantityChangeDown: () => bloc.add(TrainingPlanWeightChangeDown(detail: detail)),
onQuantityChanged: (value) => bloc.add(TrainingPlanRepeatsChange(repeats: value.toInt(), detail: detail)), onQuantityChanged: (value) => bloc.add(TrainingPlanRepeatsChange(repeats: value.toInt(), detail: detail)),
exerciseTypeId: detail.exerciseType!.exerciseTypeId, exerciseTypeId: detail.exerciseType!.exerciseTypeId,
originalQuantity: originalQuantity, originalQuantity: originalQuantity,

View File

@ -10,7 +10,6 @@ import 'package:aitrainer_app/widgets/app_bar.dart';
import 'package:aitrainer_app/widgets/bottom_nav.dart'; import 'package:aitrainer_app/widgets/bottom_nav.dart';
import 'package:aitrainer_app/widgets/dialog_common.dart'; import 'package:aitrainer_app/widgets/dialog_common.dart';
import 'package:aitrainer_app/widgets/image_button.dart'; import 'package:aitrainer_app/widgets/image_button.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';

View File

@ -6,7 +6,6 @@ import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/repository/exercise_repository.dart'; import 'package:aitrainer_app/repository/exercise_repository.dart';
import 'package:aitrainer_app/util/common.dart'; import 'package:aitrainer_app/util/common.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';

View File

@ -1,7 +1,6 @@
import 'package:aitrainer_app/bloc/timer/timer_bloc.dart'; import 'package:aitrainer_app/bloc/timer/timer_bloc.dart';
import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/util/common.dart'; import 'package:aitrainer_app/util/common.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';

View File

@ -1,6 +1,5 @@
import 'package:aitrainer_app/bloc/timer/timer_bloc.dart'; import 'package:aitrainer_app/bloc/timer/timer_bloc.dart';
import 'package:aitrainer_app/util/common.dart'; import 'package:aitrainer_app/util/common.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:aitrainer_app/library/liquid_progress_indicator/liquid_linear_progress_indicator.dart'; import 'package:aitrainer_app/library/liquid_progress_indicator/liquid_linear_progress_indicator.dart';

View File

@ -1,9 +1,7 @@
import 'package:aitrainer_app/bloc/exercise_new/exercise_new_bloc.dart'; import 'package:aitrainer_app/bloc/exercise_new/exercise_new_bloc.dart';
import 'package:aitrainer_app/util/app_localization.dart'; import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:syncfusion_flutter_gauges/gauges.dart'; import 'package:syncfusion_flutter_gauges/gauges.dart';
import 'app_bar.dart'; import 'app_bar.dart';

View File

@ -3,9 +3,7 @@ import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/model/fitness_state.dart'; import 'package:aitrainer_app/model/fitness_state.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/library/dropdown_search/dropdown_search.dart'; import 'package:aitrainer_app/library/dropdown_search/dropdown_search.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'app_bar.dart'; import 'app_bar.dart';
import 'package:keyboard_actions/keyboard_actions.dart'; import 'package:keyboard_actions/keyboard_actions.dart';

View File

@ -1,5 +1,3 @@
import 'dart:ui';
import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/service/logging.dart'; import 'package:aitrainer_app/service/logging.dart';
import 'package:aitrainer_app/util/common.dart'; import 'package:aitrainer_app/util/common.dart';

View File

@ -1,7 +1,6 @@
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html/style.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
// ignore: must_be_immutable // ignore: must_be_immutable

View File

@ -11,7 +11,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:keyboard_actions/keyboard_actions.dart'; import 'package:keyboard_actions/keyboard_actions.dart';
import 'package:keyboard_actions/keyboard_actions_config.dart';
import 'package:stop_watch_timer/stop_watch_timer.dart'; import 'package:stop_watch_timer/stop_watch_timer.dart';
import 'package:wakelock/wakelock.dart'; import 'package:wakelock/wakelock.dart';
import 'dialog_html.dart'; import 'dialog_html.dart';

View File

@ -9,10 +9,8 @@ import 'package:aitrainer_app/view/login.dart';
import 'package:aitrainer_app/view/menu_page.dart'; import 'package:aitrainer_app/view/menu_page.dart';
import 'package:aitrainer_app/widgets/dialog_common.dart'; import 'package:aitrainer_app/widgets/dialog_common.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:upgrader/upgrader.dart'; import 'package:upgrader/upgrader.dart';
import 'loading.dart'; import 'loading.dart';

View File

@ -1,7 +1,6 @@
import 'dart:ui'; import 'dart:ui';
import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/cache.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';

View File

@ -1,5 +1,4 @@
import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class LoadingScreenMain extends StatelessWidget { class LoadingScreenMain extends StatelessWidget {

View File

@ -3,7 +3,6 @@ import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:aitrainer_app/library/image_cache.dart' as wt; import 'package:aitrainer_app/library/image_cache.dart' as wt;
import 'package:aitrainer_app/library/transparent_image.dart'; import 'package:aitrainer_app/library/transparent_image.dart';
import 'package:flutter_html/shims/dart_ui_real.dart';
// ignore: must_be_immutable // ignore: must_be_immutable
class MenuImage extends StatelessWidget { class MenuImage extends StatelessWidget {

View File

@ -1,5 +1,4 @@
import 'dart:collection'; import 'dart:collection';
import 'dart:ui';
import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart'; import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart';
import 'package:aitrainer_app/model/exercise_ability.dart'; import 'package:aitrainer_app/model/exercise_ability.dart';
import 'package:aitrainer_app/bloc/menu/menu_bloc.dart'; import 'package:aitrainer_app/bloc/menu/menu_bloc.dart';
@ -19,9 +18,7 @@ import 'package:aitrainer_app/widgets/dialog_common.dart';
import 'package:badges/badges.dart'; import 'package:badges/badges.dart';
import 'package:ezanimation/ezanimation.dart'; import 'package:ezanimation/ezanimation.dart';
import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
@ -108,15 +105,12 @@ class _MenuPageWidgetState extends State<MenuPageWidget> with Trans, Logging {
} }
Future<void> initDynamicLinks() async { Future<void> initDynamicLinks() async {
FirebaseDynamicLinks.instance.onLink(onSuccess: (PendingDynamicLinkData? dynamicLink) async { FirebaseDynamicLinks.instance.onLink.listen((dynamicLink) {
final Uri? deepLink = dynamicLink?.link; final Uri deepLink = dynamicLink.link;
print("DeepLink: $deepLink"); print("DeepLink: $deepLink");
if (deepLink != null) {
// ignore: unawaited_futures
final String deepLinkPath = deepLink.path.replaceFirst("/", ""); final String deepLinkPath = deepLink.path.replaceFirst("/", "");
Navigator.pushNamed(context, deepLinkPath); Navigator.pushNamed(context, deepLinkPath);
} }, onError: (e) async {
}, onError: (OnLinkErrorException e) async {
print('onLinkError'); print('onLinkError');
print(e.message); print(e.message);
}); });

View File

@ -2,9 +2,7 @@ import 'package:aitrainer_app/bloc/exercise_new/exercise_new_bloc.dart';
import 'package:aitrainer_app/library/custom_icon_icons.dart'; import 'package:aitrainer_app/library/custom_icon_icons.dart';
import 'package:aitrainer_app/model/property.dart'; import 'package:aitrainer_app/model/property.dart';
import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/util/trans.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'app_bar.dart'; import 'app_bar.dart';
import 'input_dialog_widget.dart'; import 'input_dialog_widget.dart';

View File

@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';

View File

@ -7,7 +7,6 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html/style.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:aitrainer_app/library/super_tooltip.dart'; import 'package:aitrainer_app/library/super_tooltip.dart';
@ -41,8 +40,11 @@ class TutorialWidget with Trans, Logging {
} }
void explanation(BuildContext context, Widget widget) { void explanation(BuildContext context, Widget widget) {
final height = MediaQuery.of(context).size.height;
print("Height $height");
tooltip = SuperTooltip( tooltip = SuperTooltip(
top: 120, top: height < 800 ? 60 : 120,
left: 20, left: 20,
right: 20, right: 20,
backgroundColor: Colors.black87, backgroundColor: Colors.black87,

View File

@ -42,7 +42,7 @@ packages:
name: async name: async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.8.1" version: "2.8.2"
badges: badges:
dependency: "direct main" dependency: "direct main"
description: description:
@ -140,7 +140,7 @@ packages:
name: characters name: characters
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.2.0"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
@ -161,7 +161,7 @@ packages:
name: chewie name: chewie
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.1.0"
chewie_audio: chewie_audio:
dependency: transitive dependency: transitive
description: description:
@ -330,125 +330,139 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.1.0" version: "6.1.0"
firebase:
dependency: transitive
description:
name: firebase
url: "https://pub.dartlang.org"
source: hosted
version: "9.0.1"
firebase_analytics: firebase_analytics:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_analytics name: firebase_analytics
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "8.3.3" version: "9.0.3"
firebase_analytics_platform_interface: firebase_analytics_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_analytics_platform_interface name: firebase_analytics_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "3.0.2"
firebase_analytics_web: firebase_analytics_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_analytics_web name: firebase_analytics_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.0+1" version: "0.4.0+3"
firebase_auth: firebase_auth:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_auth name: firebase_auth
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.2" version: "3.3.3"
firebase_auth_platform_interface: firebase_auth_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_auth_platform_interface name: firebase_auth_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.1.1" version: "6.1.8"
firebase_auth_web: firebase_auth_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_auth_web name: firebase_auth_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.1" version: "3.3.4"
firebase_core: firebase_core:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_core name: firebase_core
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.10.0" version: "1.10.5"
firebase_core_platform_interface: firebase_core_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_core_platform_interface name: firebase_core_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.1.0" version: "4.2.2"
firebase_core_web: firebase_core_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_core_web name: firebase_core_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.5.2"
firebase_dynamic_links: firebase_dynamic_links:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_dynamic_links name: firebase_dynamic_links
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.10" version: "4.0.2"
firebase_dynamic_links_platform_interface:
dependency: transitive
description:
name: firebase_dynamic_links_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0+2"
firebase_in_app_messaging: firebase_in_app_messaging:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_in_app_messaging name: firebase_in_app_messaging
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.5.0+13" version: "0.6.0+4"
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.0+4"
firebase_messaging: firebase_messaging:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_messaging name: firebase_messaging
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "10.0.8" version: "11.2.3"
firebase_messaging_platform_interface: firebase_messaging_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_messaging_platform_interface name: firebase_messaging_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.6" version: "3.1.3"
firebase_messaging_web: firebase_messaging_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_messaging_web name: firebase_messaging_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.6" version: "2.2.4"
firebase_remote_config: firebase_remote_config:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_remote_config name: firebase_remote_config
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.10.0+5" version: "1.0.2"
firebase_remote_config_platform_interface: firebase_remote_config_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_remote_config_platform_interface name: firebase_remote_config_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.0+6" version: "1.0.2"
firebase_remote_config_web:
dependency: transitive
description:
name: firebase_remote_config_web
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@ -488,14 +502,14 @@ packages:
name: flutter_facebook_auth name: flutter_facebook_auth
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.5.2" version: "3.5.7"
flutter_facebook_auth_platform_interface: flutter_facebook_auth_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: flutter_facebook_auth_platform_interface name: flutter_facebook_auth_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.7.0" version: "2.7.1"
flutter_facebook_auth_web: flutter_facebook_auth_web:
dependency: transitive dependency: transitive
description: description:
@ -549,7 +563,49 @@ packages:
name: flutter_secure_storage name: flutter_secure_storage
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.2.1" version: "5.0.2"
flutter_secure_storage_linux:
dependency: transitive
description:
name: flutter_secure_storage_linux
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
flutter_secure_storage_macos:
dependency: transitive
description:
name: flutter_secure_storage_macos
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
flutter_secure_storage_platform_interface:
dependency: transitive
description:
name: flutter_secure_storage_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
flutter_secure_storage_web:
dependency: transitive
description:
name: flutter_secure_storage_web
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
flutter_secure_storage_windows:
dependency: transitive
description:
name: flutter_secure_storage_windows
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.4"
flutter_svg: flutter_svg:
dependency: transitive dependency: transitive
description: description:
@ -601,14 +657,14 @@ packages:
name: google_sign_in name: google_sign_in
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.1.0" version: "5.2.1"
google_sign_in_platform_interface: google_sign_in_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: google_sign_in_platform_interface name: google_sign_in_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.1.0"
google_sign_in_web: google_sign_in_web:
dependency: transitive dependency: transitive
description: description:
@ -727,7 +783,7 @@ packages:
name: matcher name: matcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.10" version: "0.12.11"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@ -797,42 +853,42 @@ packages:
name: package_info_plus name: package_info_plus
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.3.0"
package_info_plus_linux: package_info_plus_linux:
dependency: transitive dependency: transitive
description: description:
name: package_info_plus_linux name: package_info_plus_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.3"
package_info_plus_macos: package_info_plus_macos:
dependency: transitive dependency: transitive
description: description:
name: package_info_plus_macos name: package_info_plus_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.3.0"
package_info_plus_platform_interface: package_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: package_info_plus_platform_interface name: package_info_plus_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.2"
package_info_plus_web: package_info_plus_web:
dependency: transitive dependency: transitive
description: description:
name: package_info_plus_web name: package_info_plus_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.4"
package_info_plus_windows: package_info_plus_windows:
dependency: transitive dependency: transitive
description: description:
name: package_info_plus_windows name: package_info_plus_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.4"
path: path:
dependency: transitive dependency: transitive
description: description:
@ -923,7 +979,7 @@ packages:
name: plugin_platform_interface name: plugin_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.2"
pool: pool:
dependency: transitive dependency: transitive
description: description:
@ -972,7 +1028,7 @@ packages:
name: purchases_flutter name: purchases_flutter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.2.2" version: "3.8.0"
quiver: quiver:
dependency: transitive dependency: transitive
description: description:
@ -1007,7 +1063,7 @@ packages:
name: rxdart name: rxdart
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.27.0" version: "0.27.3"
sentry: sentry:
dependency: transitive dependency: transitive
description: description:
@ -1105,19 +1161,26 @@ packages:
name: sign_in_with_apple name: sign_in_with_apple
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.2.0" version: "3.3.0"
sign_in_with_apple_platform_interface:
dependency: transitive
description:
name: sign_in_with_apple_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
sign_in_with_apple_web:
dependency: transitive
description:
name: sign_in_with_apple_web
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.99" version: "0.0.99"
smartlook:
dependency: "direct main"
description:
name: smartlook
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
source_gen: source_gen:
dependency: transitive dependency: transitive
description: description:
@ -1180,7 +1243,7 @@ packages:
name: stop_watch_timer name: stop_watch_timer
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0+1" version: "1.3.1"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
@ -1271,21 +1334,21 @@ packages:
name: test name: test
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.17.10" version: "1.17.12"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.2" version: "0.4.3"
test_core: test_core:
dependency: transitive dependency: transitive
description: description:
name: test_core name: test_core
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.0" version: "0.4.2"
timeline_tile: timeline_tile:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1348,7 +1411,7 @@ packages:
name: upgrader name: upgrader
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.5.1" version: "3.11.0"
url_launcher: url_launcher:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1404,7 +1467,7 @@ packages:
name: vector_math name: vector_math
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
version: version:
dependency: transitive dependency: transitive
description: description:
@ -1446,28 +1509,35 @@ packages:
name: wakelock name: wakelock
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.0" version: "0.5.6"
wakelock_macos: wakelock_macos:
dependency: transitive dependency: transitive
description: description:
name: wakelock_macos name: wakelock_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.0+3" version: "0.4.0"
wakelock_platform_interface: wakelock_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: wakelock_platform_interface name: wakelock_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.1+3" version: "0.3.0"
wakelock_web: wakelock_web:
dependency: transitive dependency: transitive
description: description:
name: wakelock_web name: wakelock_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.0+3" version: "0.4.0"
wakelock_windows:
dependency: transitive
description:
name: wakelock_windows
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0"
watcher: watcher:
dependency: transitive dependency: transitive
description: description:
@ -1540,4 +1610,4 @@ packages:
version: "3.1.0" version: "3.1.0"
sdks: sdks:
dart: ">=2.14.0 <3.0.0" dart: ">=2.14.0 <3.0.0"
flutter: ">=2.0.0" flutter: ">=2.5.0"

View File

@ -40,13 +40,13 @@ dependencies:
keyboard_actions: ^3.4.0 keyboard_actions: ^3.4.0
badges: ^2.0.1 badges: ^2.0.1
#health: ^3.0.0 #health: ^3.0.0
stop_watch_timer: ^1.2.0+1 stop_watch_timer: ^1.3.1
#location: ^3.2.4 #location: ^3.2.4
modal_progress_hud_nsn: ^0.1.0-nullsafety-1 modal_progress_hud_nsn: ^0.1.0-nullsafety-1
flutter_html: ^2.0.0 flutter_html: ^2.0.0
wakelock: ^ 0.4.0 wakelock: ^ 0.5.6
timeline_tile: ^2.0.0 timeline_tile: ^2.0.0
purchases_flutter: ^3.2.2 purchases_flutter: ^3.8.0
package_info: ^2.0.0 package_info: ^2.0.0
ezanimation: ^0.5.0 ezanimation: ^0.5.0
confetti: ^0.6.0-nullsafety confetti: ^0.6.0-nullsafety
@ -55,19 +55,19 @@ dependencies:
convex_bottom_bar: ^3.0.0 convex_bottom_bar: ^3.0.0
flutter_app_badger: ^1.2.0 flutter_app_badger: ^1.2.0
extended_tabs: ^2.2.0 extended_tabs: ^2.2.0
upgrader: ^3.5.1 upgrader: ^3.11.0
web_browser: ^0.5.0 web_browser: ^0.5.0
flutter_fadein: ^2.0.0 flutter_fadein: ^2.0.0
mailto: ^2.0.0 mailto: ^2.0.0
url_launcher: ^6.0.9 url_launcher: ^6.0.9
firebase_core: ^1.5.0 firebase_core: ^1.10.5
firebase_analytics: ^8.1.0 firebase_analytics: ^9.0.3
firebase_messaging: ^10.0.0 firebase_messaging: ^11.2.3
firebase_auth: ^3.0.2 firebase_auth: ^3.3.3
firebase_remote_config: ^0.10.0+4 firebase_remote_config: ^1.0.2
firebase_dynamic_links: ^2.0.8 firebase_dynamic_links: ^4.0.2
firebase_in_app_messaging: ^0.5.0+13 firebase_in_app_messaging: ^0.6.0+4
syncfusion_flutter_gauges: ^19.3.48 syncfusion_flutter_gauges: ^19.3.48
syncfusion_flutter_datagrid: ^19.1.63 syncfusion_flutter_datagrid: ^19.1.63
@ -75,11 +75,11 @@ dependencies:
syncfusion_flutter_calendar: ^19.3.53 syncfusion_flutter_calendar: ^19.3.53
syncfusion_localizations: ^19.3.54 syncfusion_localizations: ^19.3.54
flutter_facebook_auth: ^3.5.1 flutter_facebook_auth: ^3.5.7
google_sign_in: ^5.0.3 google_sign_in: ^5.2.1
sign_in_with_apple: ^3.0.0 sign_in_with_apple: ^3.3.0
smartlook: ^2.0.1 flutter_smartlook: ^3.0.4
#flurry_data: ^0.0.1 #flurry_data: ^0.0.1
flutter_uxcam: ^2.0.1 flutter_uxcam: ^2.0.1
@ -87,7 +87,7 @@ dependencies:
mockito: ^5.0.3 mockito: ^5.0.3
sqflite: ^2.0.0+3 sqflite: ^2.0.0+3
flutter_secure_storage: ^4.2.0 flutter_secure_storage: ^5.0.2
#social_share: ^2.1.1 #social_share: ^2.1.1
flutter_localizations: flutter_localizations:

View File

@ -6,7 +6,7 @@
// tree, read text, and verify that the values of widget properties are correct. // tree, read text, and verify that the values of widget properties are correct.
//import 'package:aitrainer_app/bloc/login_form_bloc.dart'; //import 'package:aitrainer_app/bloc/login_form_bloc.dart';
import 'package:aitrainer_app/helper/database.dart'; /*
import 'package:aitrainer_app/library_keys.dart'; import 'package:aitrainer_app/library_keys.dart';
import 'package:aitrainer_app/util/app_localization.dart'; import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/model/user.dart'; import 'package:aitrainer_app/model/user.dart';
@ -16,9 +16,10 @@ import 'package:aitrainer_app/view/login.dart';
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; */
import 'package:aitrainer_app/helper/database.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart'; //import 'package:mockito/mockito.dart';
void main() { void main() {
group('SQFLite', () { group('SQFLite', () {

View File

@ -6,7 +6,6 @@
// tree, read text, and verify that the values of widget properties are correct. // tree, read text, and verify that the values of widget properties are correct.
//import 'package:aitrainer_app/bloc/login_form_bloc.dart'; //import 'package:aitrainer_app/bloc/login_form_bloc.dart';
import 'package:aitrainer_app/bloc/login/login_bloc.dart';
import 'package:aitrainer_app/helper/database.dart'; import 'package:aitrainer_app/helper/database.dart';
import 'package:aitrainer_app/library_keys.dart'; import 'package:aitrainer_app/library_keys.dart';
import 'package:aitrainer_app/util/app_localization.dart'; import 'package:aitrainer_app/util/app_localization.dart';
@ -14,7 +13,7 @@ import 'package:aitrainer_app/model/user.dart';
import 'package:aitrainer_app/repository/user_repository.dart'; import 'package:aitrainer_app/repository/user_repository.dart';
import 'package:aitrainer_app/util/common.dart'; import 'package:aitrainer_app/util/common.dart';
import 'package:aitrainer_app/view/login.dart'; import 'package:aitrainer_app/view/login.dart';
import 'package:bloc_test/bloc_test.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';

View File

@ -1,5 +1,5 @@
//import 'package:flutter_driver/driver_extension.dart'; //import 'package:flutter_driver/driver_extension.dart';
import 'package:aitrainer_app/main.dart' as app; //import 'package:aitrainer_app/main.dart' as app;
/* void main() { /* void main() {
// This line enables the extension. // This line enables the extension.

View File

@ -1,8 +1,8 @@
// Imports the Flutter Driver API. // Imports the Flutter Driver API.
//import 'package:flutter_driver/flutter_driver.dart'; //import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart'; //import 'package:test/test.dart';
import '../lib/helper/database.dart'; //import '../lib/helper/database.dart';
/* /*
void main() { void main() {
FlutterDriver driver; FlutterDriver driver;

View File

@ -1,5 +1,4 @@
import 'package:aitrainer_app/model/customer.dart'; import 'package:aitrainer_app/model/customer.dart';
import 'package:flutter/material.dart';
import '../../lib/helper/database.dart'; import '../../lib/helper/database.dart';
class CustomerApi { class CustomerApi {