feat: Add duration_picker dependency to pubspec.yaml

This commit is contained in:
Dr-Blank 2024-06-13 18:10:10 -04:00
parent b98188d7fb
commit fbd789f989
No known key found for this signature in database
GPG key ID: 7452CC63F210A266
13 changed files with 558 additions and 49 deletions

View file

@ -11,7 +11,14 @@ import 'package:whispering_pages/features/player/core/audiobook_player.dart';
/// timer is cancelled when the music player is paused or stopped
class SleepTimer {
/// The duration after which the music player will be paused
final Duration duration;
Duration _duration;
Duration get duration => _duration;
set duration(Duration value) {
_duration = value;
reset();
}
/// The player to be paused
final AudiobookPlayer player;
@ -23,22 +30,30 @@ class SleepTimer {
/// when the timer was started
DateTime? startedAt;
SleepTimer({required this.duration, required this.player}) {
player.playbackEventStream.listen((event) {
if (event.processingState == ProcessingState.completed ||
event.processingState == ProcessingState.idle) {
reset();
}
});
/// subscriptions
final List<StreamSubscription> _subscriptions = [];
SleepTimer({required duration, required this.player}) : _duration = duration {
_subscriptions.add(
player.playbackEventStream.listen((event) {
if (event.processingState == ProcessingState.completed ||
event.processingState == ProcessingState.idle) {
reset();
}
}),
);
/// pause the player when the timer is up
player.playerStateStream.listen((state) {
if (state.playing && timer == null) {
startTimer();
} else if (!state.playing) {
reset();
}
});
_subscriptions.add(
player.playerStateStream.listen((state) {
if (state.playing && timer == null) {
startTimer();
} else if (!state.playing) {
reset();
}
}),
);
debugPrint('SleepTimer created with duration: $duration');
}
@ -53,9 +68,12 @@ class SleepTimer {
}
}
/// starts the timer
void startTimer() {
/// starts the timer with the given duration or the default duration
void startTimer([
Duration? forDuration,
]) {
reset();
duration = forDuration ?? duration;
timer = Timer(duration, () {
player.pause();
reset();
@ -84,6 +102,9 @@ class SleepTimer {
/// dispose the timer
void dispose() {
reset();
for (var sub in _subscriptions) {
sub.cancel();
}
debugPrint('SleepTimer disposed');
}
}

View file

@ -1,19 +1,59 @@
import 'package:flutter/material.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:whispering_pages/features/player/providers/audiobook_player.dart';
import 'package:whispering_pages/features/sleep_timer/core/sleep_timer.dart';
import 'package:whispering_pages/features/sleep_timer/core/sleep_timer.dart'
as core;
import 'package:whispering_pages/settings/app_settings_provider.dart';
import 'package:whispering_pages/shared/extensions/time_of_day.dart';
part 'sleep_timer_provider.g.dart';
@Riverpod(keepAlive: true)
SleepTimer? sleepTimer(SleepTimerRef ref) {
final appSettings = ref.watch(appSettingsProvider);
final sleepTimerSettings = appSettings.playerSettings.sleepTimerSettings;
var sleepTimer = SleepTimer(
// duration: sleepTimerSettings.defaultDuration,
duration: const Duration(seconds: 5),
player: ref.watch(simpleAudiobookPlayerProvider),
);
ref.onDispose(sleepTimer.dispose);
return sleepTimer;
class SleepTimer extends _$SleepTimer {
@override
core.SleepTimer? build() {
final appSettings = ref.watch(appSettingsProvider);
final sleepTimerSettings = appSettings.playerSettings.sleepTimerSettings;
bool isEnabled = sleepTimerSettings.autoTurnOnTimer;
if (!isEnabled) {
return null;
}
if ((!sleepTimerSettings.alwaysAutoTurnOnTimer) &&
(sleepTimerSettings.autoTurnOnTime
.toTimeOfDay()
.isAfter(TimeOfDay.now()) &&
sleepTimerSettings.autoTurnOffTime
.toTimeOfDay()
.isBefore(TimeOfDay.now()))) {
return null;
}
var sleepTimer = core.SleepTimer(
// duration: sleepTimerSettings.defaultDuration,
duration: const Duration(seconds: 5),
player: ref.watch(simpleAudiobookPlayerProvider),
);
ref.onDispose(sleepTimer.dispose);
return sleepTimer;
}
void setTimer(Duration resultingDuration) {
if (state != null) {
state!.duration = resultingDuration;
ref.notifyListeners();
} else {
final timer = core.SleepTimer(
duration: resultingDuration,
player: ref.watch(simpleAudiobookPlayerProvider),
);
ref.onDispose(timer.dispose);
state = timer;
}
}
void cancelTimer() {
state?.dispose();
state = null;
}
}

View file

@ -6,12 +6,13 @@ part of 'sleep_timer_provider.dart';
// RiverpodGenerator
// **************************************************************************
String _$sleepTimerHash() => r'79646b12412f3300166db29328664a5e58e405bd';
String _$sleepTimerHash() => r'de2f39febda3c2234e792f64199c51828206ea9b';
/// See also [sleepTimer].
@ProviderFor(sleepTimer)
final sleepTimerProvider = Provider<SleepTimer?>.internal(
sleepTimer,
/// See also [SleepTimer].
@ProviderFor(SleepTimer)
final sleepTimerProvider =
NotifierProvider<SleepTimer, core.SleepTimer?>.internal(
SleepTimer.new,
name: r'sleepTimerProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product') ? null : _$sleepTimerHash,
@ -19,6 +20,6 @@ final sleepTimerProvider = Provider<SleepTimer?>.internal(
allTransitiveDependencies: null,
);
typedef SleepTimerRef = ProviderRef<SleepTimer?>;
typedef _$SleepTimer = Notifier<core.SleepTimer?>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member