diff --git a/assets/audio/count_finish.mp3 b/assets/audio/count_finish.mp3 index c2c5b59..c8302d5 100644 Binary files a/assets/audio/count_finish.mp3 and b/assets/audio/count_finish.mp3 differ diff --git a/assets/audio/count_tone.mp3 b/assets/audio/count_tone.mp3 new file mode 100644 index 0000000..04721d9 Binary files /dev/null and b/assets/audio/count_tone.mp3 differ diff --git a/assets/audio/count_tone.wav b/assets/audio/count_tone.wav deleted file mode 100644 index 69c8eae..0000000 Binary files a/assets/audio/count_tone.wav and /dev/null differ diff --git a/lib/database/seed.dart b/lib/database/seed.dart index 1fb3f83..73f5089 100644 --- a/lib/database/seed.dart +++ b/lib/database/seed.dart @@ -53,7 +53,7 @@ Future seedDb(AppDatabase database) async { // final int totalActions = 5; final int totalMedia = 5; final random = Random(); - + final whitespaceRE = RegExp(r"(?! )\s+| \s+"); // we gotta build all the activities! final jsondata = await root_bundle.rootBundle.loadString('assets/exercises.json'); @@ -72,9 +72,12 @@ Future seedDb(AppDatabase database) async { } Map payload = { - Symbol('title'): Value(exercise['name']), - Symbol('description'): - Value(json.encode(exercise['instructions'])), + Symbol('title'): Value( + exercise['name'].toString().trim().replaceAll(whitespaceRE, " ")), + Symbol('description'): Value(json.encode(exercise['instructions'] + .toString() + .trim() + .replaceAll(whitespaceRE, " "))), Symbol('force'): Value(exercise['force'] ?? "") }; diff --git a/lib/providers/action_timer.dart b/lib/providers/action_timer.dart index 81d3b67..d0bfbb1 100644 --- a/lib/providers/action_timer.dart +++ b/lib/providers/action_timer.dart @@ -3,11 +3,11 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_sound/public/flutter_sound_player.dart'; import 'package:flutter_sound/flutter_sound.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/models/action_model.dart'; +import 'package:vibration/vibration.dart'; class ActionTimer with ChangeNotifier { ActionModel? actionModel; @@ -56,6 +56,7 @@ class ActionTimer with ChangeNotifier { void setup(ActionModel actionModel, ItemScrollController scrollController, [bool resetOnLoad = true]) async { + _scrollControllers.clear(); _scrollControllers.add(scrollController); if (resetOnLoad) { @@ -85,7 +86,7 @@ class ActionTimer with ChangeNotifier { Uint8List? countTone; Uint8List? finishTone; await rootBundle - .load('assets/audio/count_tone.wav') + .load('assets/audio/count_tone.mp3') .then((data) => countTone = data.buffer.asUint8List()); await rootBundle .load('assets/audio/count_finish.mp3') @@ -102,14 +103,25 @@ class ActionTimer with ChangeNotifier { _currentTime--; if (_currentTime <= 3 && _currentTime != 0) { - await _mPlayer.startPlayer( - fromDataBuffer: countTone, codec: Codec.pcm16WAV); + await _mPlayer + .startPlayer(fromDataBuffer: countTone, codec: Codec.mp3) + .then((duration) async { + if (await Vibration.hasVibrator()) { + Vibration.vibrate(duration: 250); + } + }); } if (_currentTime == 0) { // move to next action - await _mPlayer.startPlayer( - fromDataBuffer: finishTone, codec: Codec.mp3); + await _mPlayer + .startPlayer(fromDataBuffer: finishTone, codec: Codec.mp3) + .then((duration) async { + if (await Vibration.hasVibrator()) { + Vibration.vibrate(duration: 250); + } + }); + await setAction(state['currentAction'] + 1); } diff --git a/lib/widgets/activities/activity_action_editor.dart b/lib/widgets/activities/activity_action_editor.dart index 61954ae..8f8387e 100644 --- a/lib/widgets/activities/activity_action_editor.dart +++ b/lib/widgets/activities/activity_action_editor.dart @@ -254,8 +254,8 @@ class _ActivityActionEditorState extends State { // create action await ActionsDao(db) .createOrUpdate(ActionsCompanion( - title: Value('title'), - description: Value('description'), + title: Value('rep'), + description: Value('exercise action'), totalSets: Value(int.parse( actionEditController['sets']! .text)), diff --git a/lib/widgets/activities/activity_view.dart b/lib/widgets/activities/activity_view.dart index f32a2d7..fb5dfe3 100644 --- a/lib/widgets/activities/activity_view.dart +++ b/lib/widgets/activities/activity_view.dart @@ -80,7 +80,7 @@ class _ActivityViewState extends State { distance: 70, type: ExpandableFabType.up, overlayStyle: ExpandableFabOverlayStyle( - color: Colors.black.withOpacity(0.5), + color: Colors.black.withValues(alpha: 0.5), blur: 10, ), onOpen: () { diff --git a/lib/widgets/builders/dialogs.dart b/lib/widgets/builders/dialogs.dart index a8078a1..7bd3261 100644 --- a/lib/widgets/builders/dialogs.dart +++ b/lib/widgets/builders/dialogs.dart @@ -4,7 +4,7 @@ import 'package:sendtrain/providers/action_timer.dart'; Future showGenericDialog(dynamic object, BuildContext parentContext) { return showGeneralDialog( - barrierColor: Colors.black.withOpacity(0.5), + barrierColor: Colors.black.withValues(alpha: 0.5), transitionDuration: const Duration(milliseconds: 220), transitionBuilder: (BuildContext context, Animation animation, Animation secondaryAnimation, Widget child) { diff --git a/lib/widgets/sessions/session_view.dart b/lib/widgets/sessions/session_view.dart index 217ffc3..df29aa1 100644 --- a/lib/widgets/sessions/session_view.dart +++ b/lib/widgets/sessions/session_view.dart @@ -78,7 +78,7 @@ class _SessionViewState extends State { distance: 70, type: ExpandableFabType.up, overlayStyle: ExpandableFabOverlayStyle( - color: Colors.black.withOpacity(0.5), + color: Colors.black.withValues(alpha: 0.5), blur: 10, ), children: [ diff --git a/pubspec.yaml b/pubspec.yaml index bb3386f..5928c0e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,6 +53,7 @@ dependencies: dart_casing: ^3.0.1 collection: ^1.18.0 flutter_sound: ^9.23.1 + vibration: ^3.1.2 flutter_launcher_name: name: "SendTrain"