Vaani/lib/features/sleep_timer/providers/sleep_timer_provider.dart

75 lines
2.1 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
2024-06-06 15:35:30 -04:00
import 'package:riverpod_annotation/riverpod_annotation.dart';
2024-08-23 04:21:46 -04:00
import 'package:vaani/features/player/providers/audiobook_player.dart';
import 'package:vaani/features/sleep_timer/core/sleep_timer.dart' as core;
2024-08-23 04:21:46 -04:00
import 'package:vaani/settings/app_settings_provider.dart';
import 'package:vaani/shared/extensions/time_of_day.dart';
2024-06-06 15:35:30 -04:00
part 'sleep_timer_provider.g.dart';
@Riverpod(keepAlive: true)
class SleepTimer extends _$SleepTimer {
@override
core.SleepTimer? build() {
final sleepTimerSettings = ref.watch(sleepTimerSettingsProvider);
if (!sleepTimerSettings.autoTurnOnTimer) {
return null;
}
if ((!sleepTimerSettings.alwaysAutoTurnOnTimer) &&
!shouldBuildRightNow(
sleepTimerSettings.autoTurnOnTime,
sleepTimerSettings.autoTurnOffTime,
)) {
return null;
}
var sleepTimer = core.SleepTimer(
2024-08-20 08:36:39 -04:00
duration: sleepTimerSettings.defaultDuration,
player: ref.watch(simpleAudiobookPlayerProvider),
);
ref.onDispose(sleepTimer.dispose);
return sleepTimer;
}
void setTimer(Duration? resultingDuration, {bool notifyListeners = true}) {
if (resultingDuration == null || resultingDuration.inSeconds == 0) {
cancelTimer();
return;
}
if (state != null) {
state!.duration = resultingDuration;
if (notifyListeners) {
ref.notifyListeners();
}
} else {
final timer = core.SleepTimer(
duration: resultingDuration,
player: ref.watch(simpleAudiobookPlayerProvider),
);
ref.onDispose(timer.dispose);
state = timer;
state!.startCountDown();
}
}
void restartTimer() {
state?.restartTimer();
// ref.notifyListeners(); // see https://github.com/Dr-Blank/Vaani/pull/40 for more information on why this is commented out
}
void cancelTimer() {
state?.dispose();
state = null;
}
2024-06-06 15:35:30 -04:00
}
bool shouldBuildRightNow(Duration autoTurnOnTime, Duration autoTurnOffTime) {
final now = TimeOfDay.now();
return now.isBetween(
autoTurnOnTime.toTimeOfDay(),
autoTurnOffTime.toTimeOfDay(),
);
}