| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- import 'dart:async';
- import 'package:flutter/foundation.dart';
- import '../../core/app_version.dart';
- import '../../data/models/update_info.dart';
- import '../../data/services/native_bridge.dart';
- import '../../data/services/update_service.dart';
- /// Non-blocking update check against the public Gogs releases API.
- class UpdateController extends ChangeNotifier {
- UpdateController(this._platform, {UpdateService? service})
- : _service = service ?? UpdateService();
- final LauncherPlatform _platform;
- final UpdateService _service;
- UpdateInfo? _result;
- bool _checking = false;
- bool _started = false;
- bool _disposed = false;
- String? _error;
- String get currentVersion => appVersion;
- String? get latestVersion => _result?.latestVersion;
- bool get checking => _checking;
- bool get updateAvailable => _result?.available ?? false;
- String? get error => _error;
- String? get releasePageUrl => _result?.releasePageUrl;
- Future<void> start() async {
- if (_started) return;
- _started = true;
- await check();
- }
- Future<void> check() async {
- if (_checking) return;
- _checking = true;
- _error = null;
- _notify();
- try {
- _result = await _service.check(appVersion);
- } on UpdateException catch (problem) {
- _error = problem.message;
- } catch (_) {
- _error = 'Could not check for updates.';
- } finally {
- _checking = false;
- _notify();
- }
- }
- Future<bool> openReleasePage() {
- return _platform.openUrl(
- _result?.releasePageUrl ?? UpdateService.releasePageUrl,
- );
- }
- void _notify() {
- if (!_disposed) notifyListeners();
- }
- @override
- void dispose() {
- _disposed = true;
- super.dispose();
- }
- }
|