From a15d634cd2d9ce7d13fa55f1b1697d77959d592d Mon Sep 17 00:00:00 2001 From: Dr-Blank <64108942+Dr-Blank@users.noreply.github.com> Date: Mon, 30 Sep 2024 01:50:24 -0400 Subject: [PATCH] enhance shake action handling to avoid unnecessary feedback --- .../providers/shake_detector.dart | 37 +++++++++++-------- .../providers/shake_detector.g.dart | 2 +- .../sleep_timer/core/sleep_timer.dart | 3 ++ lib/main.dart | 2 +- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/lib/features/shake_detection/providers/shake_detector.dart b/lib/features/shake_detection/providers/shake_detector.dart index fdf03c8..22c07c2 100644 --- a/lib/features/shake_detection/providers/shake_detector.dart +++ b/lib/features/shake_detection/providers/shake_detector.dart @@ -48,7 +48,7 @@ class ShakeDetector extends _$ShakeDetector { // } // if sleep timer is not enabled, shake detection should not be enabled final sleepTimer = ref.watch(sleepTimerProvider); - if (!shakeDetectionSettings.isPlaybackManagementEnabled && + if (!shakeDetectionSettings.shakeAction.isPlaybackManagementEnabled && sleepTimer == null) { _logger .config('No playback management is enabled and sleep timer is off, ' @@ -60,47 +60,52 @@ class ShakeDetector extends _$ShakeDetector { final detector = core.ShakeDetector( shakeDetectionSettings, () { - doShakeAction( + final wasActionComplete = doShakeAction( shakeDetectionSettings.shakeAction, ref: ref, ); - shakeDetectionSettings.feedback.forEach(postShakeFeedback); + if (wasActionComplete) { + shakeDetectionSettings.feedback.forEach(postShakeFeedback); + } }, ); ref.onDispose(detector.dispose); return detector; } - void doShakeAction( + /// Perform the shake action and return whether the action was successful + bool doShakeAction( ShakeAction shakeAction, { required Ref ref, }) { final player = ref.read(simpleAudiobookPlayerProvider); - if (player.book == null) { + if (player.book == null && shakeAction.isPlaybackManagementEnabled) { _logger.warning('No book is loaded'); + return false; } switch (shakeAction) { case ShakeAction.resetSleepTimer: _logger.fine('Resetting sleep timer'); var sleepTimer = ref.read(sleepTimerProvider); - if (sleepTimer == null) { + if (sleepTimer == null || !sleepTimer.isActive) { _logger.warning('No sleep timer is running'); + return false; } - sleepTimer!.restartTimer(); - break; + sleepTimer.restartTimer(); + return true; case ShakeAction.fastForward: _logger.fine('Fast forwarding'); player.seek(player.position + const Duration(seconds: 30)); - break; + return true; case ShakeAction.rewind: _logger.fine('Rewinding'); player.seek(player.position - const Duration(seconds: 30)); - break; + return true; case ShakeAction.playPause: player.togglePlayPause(); - break; + return true; default: - break; + return false; } } @@ -136,18 +141,18 @@ class ShakeDetector extends _$ShakeDetector { } } -extension on ShakeDetectionSettings { +extension on ShakeAction { bool get isActiveWhenPaused { // If the shake action is play/pause, it should be required when not playing - return shakeAction == ShakeAction.playPause; + return this == ShakeAction.playPause; } bool get isPlaybackManagementEnabled { return {ShakeAction.playPause, ShakeAction.fastForward, ShakeAction.rewind} - .contains(shakeAction); + .contains(this); } bool get shouldActOnSleepTimer { - return {ShakeAction.resetSleepTimer}.contains(shakeAction); + return {ShakeAction.resetSleepTimer}.contains(this); } } diff --git a/lib/features/shake_detection/providers/shake_detector.g.dart b/lib/features/shake_detection/providers/shake_detector.g.dart index 1ea8a63..f316b1f 100644 --- a/lib/features/shake_detection/providers/shake_detector.g.dart +++ b/lib/features/shake_detection/providers/shake_detector.g.dart @@ -6,7 +6,7 @@ part of 'shake_detector.dart'; // RiverpodGenerator // ************************************************************************** -String _$shakeDetectorHash() => r'b246be847d3ff8310f16abd683a4428dca60efdb'; +String _$shakeDetectorHash() => r'e22fbd7a3b0143db3a9e2c8489749ee0dd8cd25a'; /// See also [ShakeDetector]. @ProviderFor(ShakeDetector) diff --git a/lib/features/sleep_timer/core/sleep_timer.dart b/lib/features/sleep_timer/core/sleep_timer.dart index 728cec1..215c264 100644 --- a/lib/features/sleep_timer/core/sleep_timer.dart +++ b/lib/features/sleep_timer/core/sleep_timer.dart @@ -28,6 +28,9 @@ class SleepTimer { /// The timer that will pause the player Timer? timer; + /// is the sleep timer actively counting down + bool get isActive => timer != null && timer!.isActive; + /// for internal use only /// when the timer was started DateTime? startedAt; diff --git a/lib/main.dart b/lib/main.dart index 3228a8a..8eef350 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -20,7 +20,7 @@ final appLogger = Logger('vaani'); void main() async { WidgetsFlutterBinding.ensureInitialized(); // Configure the root Logger - Logger.root.level = Level.ALL; // Capture all logs + Logger.root.level = Level.FINE; // Capture all logs Logger.root.onRecord.listen((record) { // Print log records to the console debugPrint(