enhance shake action handling to avoid unnecessary feedback

This commit is contained in:
Dr-Blank 2024-09-30 01:50:24 -04:00
parent 195d303404
commit a15d634cd2
No known key found for this signature in database
GPG key ID: 7452CC63F210A266
4 changed files with 26 additions and 18 deletions

View file

@ -48,7 +48,7 @@ class ShakeDetector extends _$ShakeDetector {
// } // }
// 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.shakeAction.isPlaybackManagementEnabled &&
sleepTimer == null) { sleepTimer == null) {
_logger _logger
.config('No playback management is enabled and sleep timer is off, ' .config('No playback management is enabled and sleep timer is off, '
@ -60,47 +60,52 @@ class ShakeDetector extends _$ShakeDetector {
final detector = core.ShakeDetector( final detector = core.ShakeDetector(
shakeDetectionSettings, shakeDetectionSettings,
() { () {
doShakeAction( final wasActionComplete = doShakeAction(
shakeDetectionSettings.shakeAction, shakeDetectionSettings.shakeAction,
ref: ref, ref: ref,
); );
if (wasActionComplete) {
shakeDetectionSettings.feedback.forEach(postShakeFeedback); shakeDetectionSettings.feedback.forEach(postShakeFeedback);
}
}, },
); );
ref.onDispose(detector.dispose); ref.onDispose(detector.dispose);
return detector; return detector;
} }
void doShakeAction( /// Perform the shake action and return whether the action was successful
bool doShakeAction(
ShakeAction shakeAction, { ShakeAction shakeAction, {
required Ref ref, required Ref ref,
}) { }) {
final player = ref.read(simpleAudiobookPlayerProvider); final player = ref.read(simpleAudiobookPlayerProvider);
if (player.book == null) { if (player.book == null && shakeAction.isPlaybackManagementEnabled) {
_logger.warning('No book is loaded'); _logger.warning('No book is loaded');
return false;
} }
switch (shakeAction) { switch (shakeAction) {
case ShakeAction.resetSleepTimer: case ShakeAction.resetSleepTimer:
_logger.fine('Resetting sleep timer'); _logger.fine('Resetting sleep timer');
var sleepTimer = ref.read(sleepTimerProvider); var sleepTimer = ref.read(sleepTimerProvider);
if (sleepTimer == null) { if (sleepTimer == null || !sleepTimer.isActive) {
_logger.warning('No sleep timer is running'); _logger.warning('No sleep timer is running');
return false;
} }
sleepTimer!.restartTimer(); sleepTimer.restartTimer();
break; return true;
case ShakeAction.fastForward: case ShakeAction.fastForward:
_logger.fine('Fast forwarding'); _logger.fine('Fast forwarding');
player.seek(player.position + const Duration(seconds: 30)); player.seek(player.position + const Duration(seconds: 30));
break; return true;
case ShakeAction.rewind: case ShakeAction.rewind:
_logger.fine('Rewinding'); _logger.fine('Rewinding');
player.seek(player.position - const Duration(seconds: 30)); player.seek(player.position - const Duration(seconds: 30));
break; return true;
case ShakeAction.playPause: case ShakeAction.playPause:
player.togglePlayPause(); player.togglePlayPause();
break; return true;
default: default:
break; return false;
} }
} }
@ -136,18 +141,18 @@ class ShakeDetector extends _$ShakeDetector {
} }
} }
extension on ShakeDetectionSettings { extension on ShakeAction {
bool get isActiveWhenPaused { bool get isActiveWhenPaused {
// If the shake action is play/pause, it should be required when not playing // 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 { bool get isPlaybackManagementEnabled {
return {ShakeAction.playPause, ShakeAction.fastForward, ShakeAction.rewind} return {ShakeAction.playPause, ShakeAction.fastForward, ShakeAction.rewind}
.contains(shakeAction); .contains(this);
} }
bool get shouldActOnSleepTimer { bool get shouldActOnSleepTimer {
return {ShakeAction.resetSleepTimer}.contains(shakeAction); return {ShakeAction.resetSleepTimer}.contains(this);
} }
} }

View file

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

View file

@ -28,6 +28,9 @@ class SleepTimer {
/// The timer that will pause the player /// The timer that will pause the player
Timer? timer; Timer? timer;
/// is the sleep timer actively counting down
bool get isActive => timer != null && timer!.isActive;
/// for internal use only /// for internal use only
/// when the timer was started /// when the timer was started
DateTime? startedAt; DateTime? startedAt;

View file

@ -20,7 +20,7 @@ final appLogger = Logger('vaani');
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
// Configure the root Logger // 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) { Logger.root.onRecord.listen((record) {
// Print log records to the console // Print log records to the console
debugPrint( debugPrint(