mirror of
https://github.com/Dr-Blank/Vaani.git
synced 2026-07-06 17:31:33 +00:00
fix: shake detector not detecting in background
This commit is contained in:
parent
4aa2014d3b
commit
195d303404
5 changed files with 41 additions and 20 deletions
|
|
@ -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');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ class SleepTimer extends _$SleepTimer {
|
||||||
void restartTimer() {
|
void restartTimer() {
|
||||||
state?.restartTimer();
|
state?.restartTimer();
|
||||||
|
|
||||||
ref.notifyListeners();
|
// ref.notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cancelTimer() {
|
void cancelTimer() {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue