fix: shake detector not detecting in background

This commit is contained in:
Dr-Blank 2024-09-30 01:37:49 -04:00
parent 4aa2014d3b
commit 195d303404
No known key found for this signature in database
GPG key ID: 7452CC63F210A266
5 changed files with 41 additions and 20 deletions

View file

@ -28,6 +28,9 @@ class ShakeDetector {
DateTime _lastShakeTime = DateTime.now(); DateTime _lastShakeTime = DateTime.now();
final StreamController<UserAccelerometerEvent>
_detectedShakeStreamController = StreamController.broadcast();
void start() { void start() {
if (_accelerometerSubscription != null) { if (_accelerometerSubscription != null) {
_logger.warning('ShakeDetector is already running'); _logger.warning('ShakeDetector is already running');
@ -36,6 +39,7 @@ class ShakeDetector {
_accelerometerSubscription = _accelerometerSubscription =
userAccelerometerEventStream(samplingPeriod: _settings.samplingPeriod) userAccelerometerEventStream(samplingPeriod: _settings.samplingPeriod)
.listen((event) { .listen((event) {
_logger.finest('RMS: ${event.rms}');
if (event.rms > _settings.threshold) { if (event.rms > _settings.threshold) {
_currentShakeCount++; _currentShakeCount++;
@ -44,6 +48,7 @@ class ShakeDetector {
_logger.fine('Shake detected $_currentShakeCount times'); _logger.fine('Shake detected $_currentShakeCount times');
onShakeDetected?.call(); onShakeDetected?.call();
_detectedShakeStreamController.add(event);
_lastShakeTime = DateTime.now(); _lastShakeTime = DateTime.now();
_currentShakeCount = 0; _currentShakeCount = 0;
@ -60,6 +65,7 @@ class ShakeDetector {
_currentShakeCount = 0; _currentShakeCount = 0;
_accelerometerSubscription?.cancel(); _accelerometerSubscription?.cancel();
_accelerometerSubscription = null; _accelerometerSubscription = null;
_detectedShakeStreamController.close();
_logger.fine('ShakeDetector stopped'); _logger.fine('ShakeDetector stopped');
} }

View file

@ -25,26 +25,38 @@ class ShakeDetector extends _$ShakeDetector {
final shakeDetectionSettings = appSettings.shakeDetectionSettings; final shakeDetectionSettings = appSettings.shakeDetectionSettings;
if (!shakeDetectionSettings.isEnabled) { if (!shakeDetectionSettings.isEnabled) {
_logger.fine('Shake detection is disabled'); _logger.config('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',
);
return null; 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 // if sleep timer is not enabled, shake detection should not be enabled
final sleepTimer = ref.watch(sleepTimerProvider); final sleepTimer = ref.watch(sleepTimerProvider);
if (!shakeDetectionSettings.isPlaybackManagementEnabled && if (!shakeDetectionSettings.isPlaybackManagementEnabled &&
sleepTimer == null) { sleepTimer == null) {
_logger.fine('No playback management is enabled and sleep timer is off, ' _logger
'so shake detection is disabled'); .config('No playback management is enabled and sleep timer is off, '
'so shake detection is disabled');
return null; return null;
} }
_logger.fine('Creating shake detector'); _logger.config('Creating shake detector');
final detector = core.ShakeDetector( final detector = core.ShakeDetector(
shakeDetectionSettings, shakeDetectionSettings,
() { () {
@ -63,11 +75,18 @@ class ShakeDetector extends _$ShakeDetector {
ShakeAction shakeAction, { ShakeAction shakeAction, {
required Ref ref, 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) { switch (shakeAction) {
case ShakeAction.resetSleepTimer: case ShakeAction.resetSleepTimer:
_logger.fine('Resetting sleep timer'); _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; break;
case ShakeAction.fastForward: case ShakeAction.fastForward:
_logger.fine('Fast forwarding'); _logger.fine('Fast forwarding');
@ -78,10 +97,6 @@ class ShakeDetector extends _$ShakeDetector {
player.seek(player.position - const Duration(seconds: 30)); player.seek(player.position - const Duration(seconds: 30));
break; break;
case ShakeAction.playPause: case ShakeAction.playPause:
if (player.book == null) {
_logger.warning('No book is loaded');
break;
}
player.togglePlayPause(); player.togglePlayPause();
break; break;
default: default:

View file

@ -6,7 +6,7 @@ part of 'shake_detector.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$shakeDetectorHash() => r'7bfbdd22f2f43ef3e3858d226d1eb78923e8114d'; String _$shakeDetectorHash() => r'b246be847d3ff8310f16abd683a4428dca60efdb';
/// See also [ShakeDetector]. /// See also [ShakeDetector].
@ProviderFor(ShakeDetector) @ProviderFor(ShakeDetector)

View file

@ -54,7 +54,7 @@ class SleepTimer extends _$SleepTimer {
void restartTimer() { void restartTimer() {
state?.restartTimer(); state?.restartTimer();
ref.notifyListeners(); // ref.notifyListeners();
} }
void cancelTimer() { void cancelTimer() {

View file

@ -6,7 +6,7 @@ part of 'sleep_timer_provider.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$sleepTimerHash() => r'9d9f20267da91e5483151b58b7d4d7c0762c3ca7'; String _$sleepTimerHash() => r'4f80bcc342e918c70c547b8b24790ccd88aba8c3';
/// See also [SleepTimer]. /// See also [SleepTimer].
@ProviderFor(SleepTimer) @ProviderFor(SleepTimer)