Files
rmtPocketWatcher/flutter_app/lib/providers/update_provider.dart
HRiggs 9ff0d62651
Some checks failed
Flutter Release / get-version (push) Successful in 8s
Flutter Release / build-windows (push) Failing after 9s
Flutter Release / build-android (push) Failing after 1m12s
Flutter Release / create-release (push) Has been skipped
check update
2025-12-14 23:11:50 -05:00

95 lines
2.9 KiB
Dart

import 'package:flutter/foundation.dart';
import '../services/update_service.dart';
import '../services/storage_service.dart';
class UpdateProvider extends ChangeNotifier {
final UpdateService _updateService = UpdateService();
final StorageService _storageService = StorageService();
UpdateInfo? _availableUpdate;
bool _isChecking = false;
DateTime? _lastChecked;
bool _updateDismissed = false;
UpdateInfo? get availableUpdate => _availableUpdate;
bool get isChecking => _isChecking;
DateTime? get lastChecked => _lastChecked;
bool get hasUpdate => _availableUpdate != null && !_updateDismissed;
/// Check for updates manually
Future<void> checkForUpdates({bool force = false}) async {
if (_isChecking) return;
// Don't check too frequently unless forced
if (!force && _lastChecked != null) {
final timeSinceLastCheck = DateTime.now().difference(_lastChecked!);
if (timeSinceLastCheck.inHours < 1) {
if (kDebugMode) {
print('Skipping update check - last checked ${timeSinceLastCheck.inMinutes} minutes ago');
}
return;
}
}
_isChecking = true;
notifyListeners();
try {
final updateInfo = await _updateService.checkForUpdates();
_availableUpdate = updateInfo;
_lastChecked = DateTime.now();
_updateDismissed = false;
// Save last check time
await _storageService.setString('last_update_check', _lastChecked!.toIso8601String());
if (updateInfo != null) {
if (kDebugMode) {
print('Update available: ${updateInfo.latestVersion}');
}
// Check if this version was already dismissed
final dismissedVersion = await _storageService.getString('dismissed_update_version');
if (dismissedVersion == updateInfo.latestVersion) {
_updateDismissed = true;
}
}
} catch (e) {
if (kDebugMode) {
print('Error checking for updates: $e');
}
} finally {
_isChecking = false;
notifyListeners();
}
}
/// Dismiss the current update notification
Future<void> dismissUpdate() async {
if (_availableUpdate != null) {
_updateDismissed = true;
await _storageService.setString('dismissed_update_version', _availableUpdate!.latestVersion);
notifyListeners();
}
}
/// Initialize the provider and load saved state
Future<void> initialize() async {
// Load last check time
final lastCheckString = await _storageService.getString('last_update_check');
if (lastCheckString != null) {
_lastChecked = DateTime.tryParse(lastCheckString);
}
// Check for updates on startup (but don't force it)
await checkForUpdates();
}
/// Check for updates automatically in the background
void startPeriodicChecks() {
// Check every 4 hours
Stream.periodic(const Duration(hours: 4)).listen((_) {
checkForUpdates();
});
}
}