From 195d303404a942c39592dc9c45f79c31a447abf1 Mon Sep 17 00:00:00 2001 From: Dr-Blank <64108942+Dr-Blank@users.noreply.github.com> Date: Mon, 30 Sep 2024 01:37:49 -0400 Subject: [PATCH] fix: shake detector not detecting in background --- .../shake_detection/core/shake_detector.dart | 6 +++ .../providers/shake_detector.dart | 49 ++++++++++++------- .../providers/shake_detector.g.dart | 2 +- .../providers/sleep_timer_provider.dart | 2 +- .../providers/sleep_timer_provider.g.dart | 2 +- 5 files changed, 41 insertions(+), 20 deletions(-) diff --git a/lib/features/shake_detection/core/shake_detector.dart b/lib/features/shake_detection/core/shake_detector.dart index 4b7b719..023a8ab 100644 --- a/lib/features/shake_detection/core/shake_detector.dart +++ b/lib/features/shake_detection/core/shake_detector.dart @@ -28,6 +28,9 @@ class ShakeDetector { DateTime _lastShakeTime = DateTime.now(); + final StreamController + _detectedShakeStreamController = StreamController.broadcast(); + void start() { if (_accelerometerSubscription != null) { _logger.warning('ShakeDetector is already running'); @@ -36,6 +39,7 @@ class ShakeDetector { _accelerometerSubscription = userAccelerometerEventStream(samplingPeriod: _settings.samplingPeriod) .listen((event) { + _logger.finest('RMS: ${event.rms}'); if (event.rms > _settings.threshold) { _currentShakeCount++; @@ -44,6 +48,7 @@ class ShakeDetector { _logger.fine('Shake detected $_currentShakeCount times'); onShakeDetected?.call(); + _detectedShakeStreamController.add(event); _lastShakeTime = DateTime.now(); _currentShakeCount = 0; @@ -60,6 +65,7 @@ class ShakeDetector { _currentShakeCount = 0; _accelerometerSubscription?.cancel(); _accelerometerSubscription = null; + _detectedShakeStreamController.close(); _logger.fine('ShakeDetector stopped'); } diff --git a/lib/features/shake_detection/providers/shake_detector.dart b/lib/features/shake_detection/providers/shake_detector.dart index 956fc16..fdf03c8 100644 --- a/lib/features/shake_detection/providers/shake_detector.dart +++ b/lib/features/shake_detection/providers/shake_detector.dart @@ -25,26 +25,38 @@ class ShakeDetector extends _$ShakeDetector { final shakeDetectionSettings = appSettings.shakeDetectionSettings; if (!shakeDetectionSettings.isEnabled) { - _logger.fine('Shake detection is disabled'); - return null; - } - final player = ref.watch(audiobookPlayerProvider); - if (!player.playing && !shakeDetectionSettings.isActiveWhenPaused) { - _logger.fine( - 'Shake detection is disabled when paused and player is not playing', - ); + _logger.config('Shake detection is disabled'); return null; } + + // TODO: implement optimization when no book is loaded, currently it is not possible + // as rebuild is not triggered when app is in background and player keeps rebuilding + // when paused or playing + + // if no book is loaded, shake detection should not be enabled + // final player = ref.watch(audiobookPlayerProvider); + + // if (player.book == null) { + // _logger.config('No book is loaded'); + // return null; + // } + // if (!player.playing && !shakeDetectionSettings.isActiveWhenPaused) { + // _logger.config( + // 'Shake detection is disabled when paused and player is not playing', + // ); + // return null; + // } // if sleep timer is not enabled, shake detection should not be enabled final sleepTimer = ref.watch(sleepTimerProvider); if (!shakeDetectionSettings.isPlaybackManagementEnabled && sleepTimer == null) { - _logger.fine('No playback management is enabled and sleep timer is off, ' - 'so shake detection is disabled'); + _logger + .config('No playback management is enabled and sleep timer is off, ' + 'so shake detection is disabled'); return null; } - _logger.fine('Creating shake detector'); + _logger.config('Creating shake detector'); final detector = core.ShakeDetector( shakeDetectionSettings, () { @@ -63,11 +75,18 @@ class ShakeDetector extends _$ShakeDetector { ShakeAction shakeAction, { required Ref ref, }) { - final player = ref.watch(simpleAudiobookPlayerProvider); + final player = ref.read(simpleAudiobookPlayerProvider); + if (player.book == null) { + _logger.warning('No book is loaded'); + } switch (shakeAction) { case ShakeAction.resetSleepTimer: _logger.fine('Resetting sleep timer'); - ref.read(sleepTimerProvider.notifier).restartTimer(); + var sleepTimer = ref.read(sleepTimerProvider); + if (sleepTimer == null) { + _logger.warning('No sleep timer is running'); + } + sleepTimer!.restartTimer(); break; case ShakeAction.fastForward: _logger.fine('Fast forwarding'); @@ -78,10 +97,6 @@ class ShakeDetector extends _$ShakeDetector { player.seek(player.position - const Duration(seconds: 30)); break; case ShakeAction.playPause: - if (player.book == null) { - _logger.warning('No book is loaded'); - break; - } player.togglePlayPause(); break; default: diff --git a/lib/features/shake_detection/providers/shake_detector.g.dart b/lib/features/shake_detection/providers/shake_detector.g.dart index c3035b8..1ea8a63 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'7bfbdd22f2f43ef3e3858d226d1eb78923e8114d'; +String _$shakeDetectorHash() => r'b246be847d3ff8310f16abd683a4428dca60efdb'; /// See also [ShakeDetector]. @ProviderFor(ShakeDetector) diff --git a/lib/features/sleep_timer/providers/sleep_timer_provider.dart b/lib/features/sleep_timer/providers/sleep_timer_provider.dart index 6f1b1b7..c4c8912 100644 --- a/lib/features/sleep_timer/providers/sleep_timer_provider.dart +++ b/lib/features/sleep_timer/providers/sleep_timer_provider.dart @@ -54,7 +54,7 @@ class SleepTimer extends _$SleepTimer { void restartTimer() { state?.restartTimer(); - ref.notifyListeners(); + // ref.notifyListeners(); } void cancelTimer() { diff --git a/lib/features/sleep_timer/providers/sleep_timer_provider.g.dart b/lib/features/sleep_timer/providers/sleep_timer_provider.g.dart index fe74010..6d820e4 100644 --- a/lib/features/sleep_timer/providers/sleep_timer_provider.g.dart +++ b/lib/features/sleep_timer/providers/sleep_timer_provider.g.dart @@ -6,7 +6,7 @@ part of 'sleep_timer_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$sleepTimerHash() => r'9d9f20267da91e5483151b58b7d4d7c0762c3ca7'; +String _$sleepTimerHash() => r'4f80bcc342e918c70c547b8b24790ccd88aba8c3'; /// See also [SleepTimer]. @ProviderFor(SleepTimer)