timer_data.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import 'package:shared_preferences/shared_preferences.dart';
  2. /// A model class to store timer state data
  3. class TimerData {
  4. static const String _startTimeKey = 'timer_start_time';
  5. static const String _endTimeKey = 'timer_end_time';
  6. static const String _pausedRemainingKey = 'timer_paused_remaining';
  7. static const String _isRunningKey = 'timer_is_running';
  8. static const String _isPausedKey = 'timer_is_paused';
  9. // Timer start time in milliseconds since epoch
  10. final int? startTime;
  11. // Timer end time in milliseconds since epoch
  12. final int? endTime;
  13. // Remaining seconds when timer was paused
  14. final int? pausedRemaining;
  15. // Whether timer is currently running
  16. final bool isRunning;
  17. // Whether timer is currently paused
  18. final bool isPaused;
  19. TimerData({
  20. this.startTime,
  21. this.endTime,
  22. this.pausedRemaining,
  23. this.isRunning = false,
  24. this.isPaused = false,
  25. });
  26. /// Save timer data to SharedPreferences
  27. Future<void> save() async {
  28. final prefs = await SharedPreferences.getInstance();
  29. if (startTime != null) {
  30. await prefs.setInt(_startTimeKey, startTime!);
  31. } else {
  32. await prefs.remove(_startTimeKey);
  33. }
  34. if (endTime != null) {
  35. await prefs.setInt(_endTimeKey, endTime!);
  36. } else {
  37. await prefs.remove(_endTimeKey);
  38. }
  39. if (pausedRemaining != null) {
  40. await prefs.setInt(_pausedRemainingKey, pausedRemaining!);
  41. } else {
  42. await prefs.remove(_pausedRemainingKey);
  43. }
  44. await prefs.setBool(_isRunningKey, isRunning);
  45. await prefs.setBool(_isPausedKey, isPaused);
  46. }
  47. /// Load timer data from SharedPreferences
  48. static Future<TimerData> load() async {
  49. final prefs = await SharedPreferences.getInstance();
  50. return TimerData(
  51. startTime: prefs.containsKey(_startTimeKey) ? prefs.getInt(_startTimeKey) : null,
  52. endTime: prefs.containsKey(_endTimeKey) ? prefs.getInt(_endTimeKey) : null,
  53. pausedRemaining: prefs.containsKey(_pausedRemainingKey) ? prefs.getInt(_pausedRemainingKey) : null,
  54. isRunning: prefs.getBool(_isRunningKey) ?? false,
  55. isPaused: prefs.getBool(_isPausedKey) ?? false,
  56. );
  57. }
  58. /// Calculate remaining seconds based on current time and end time
  59. int calculateRemainingSeconds() {
  60. if (isPaused && pausedRemaining != null) {
  61. return pausedRemaining!;
  62. }
  63. if (endTime != null) {
  64. final now = DateTime.now().millisecondsSinceEpoch;
  65. final remaining = (endTime! - now) ~/ 1000;
  66. return remaining > 0 ? remaining : 0;
  67. }
  68. return 0;
  69. }
  70. /// Create a copy of this timer data with modified properties
  71. TimerData copyWith({
  72. int? startTime,
  73. int? endTime,
  74. int? pausedRemaining,
  75. bool? isRunning,
  76. bool? isPaused,
  77. }) {
  78. return TimerData(
  79. startTime: startTime ?? this.startTime,
  80. endTime: endTime ?? this.endTime,
  81. pausedRemaining: pausedRemaining ?? this.pausedRemaining,
  82. isRunning: isRunning ?? this.isRunning,
  83. isPaused: isPaused ?? this.isPaused,
  84. );
  85. }
  86. }