2023-11-06 22:00:44 +03:30
|
|
|
import 'package:flutter/foundation.dart';
|
2023-12-01 12:56:24 +03:30
|
|
|
import 'package:hiddify/core/app_info/app_info_provider.dart';
|
|
|
|
|
import 'package:hiddify/core/localization/locale_preferences.dart';
|
|
|
|
|
import 'package:hiddify/core/preferences/preferences_provider.dart';
|
2024-03-02 22:53:14 +03:30
|
|
|
import 'package:hiddify/core/utils/preferences_utils.dart';
|
2023-12-01 12:56:24 +03:30
|
|
|
import 'package:hiddify/features/app_update/data/app_update_data_providers.dart';
|
|
|
|
|
import 'package:hiddify/features/app_update/model/app_update_failure.dart';
|
|
|
|
|
import 'package:hiddify/features/app_update/model/remote_version_entity.dart';
|
|
|
|
|
import 'package:hiddify/features/app_update/notifier/app_update_state.dart';
|
2023-09-12 15:22:58 +03:30
|
|
|
import 'package:hiddify/utils/utils.dart';
|
|
|
|
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
2023-11-06 22:00:44 +03:30
|
|
|
import 'package:upgrader/upgrader.dart';
|
2023-11-10 12:17:51 +03:30
|
|
|
import 'package:version/version.dart';
|
2023-09-12 15:22:58 +03:30
|
|
|
|
|
|
|
|
part 'app_update_notifier.g.dart';
|
|
|
|
|
|
2023-11-06 22:00:44 +03:30
|
|
|
const _debugUpgrader = true;
|
|
|
|
|
|
|
|
|
|
@riverpod
|
|
|
|
|
Upgrader upgrader(UpgraderRef ref) => Upgrader(
|
2026-01-15 12:28:40 +03:00
|
|
|
// Removed appcastConfig - no updates for Umbrix
|
2023-11-06 22:00:44 +03:30
|
|
|
debugLogging: _debugUpgrader && kDebugMode,
|
|
|
|
|
durationUntilAlertAgain: const Duration(hours: 12),
|
|
|
|
|
messages: UpgraderMessages(
|
2023-12-01 12:56:24 +03:30
|
|
|
code: ref.watch(localePreferencesProvider).languageCode,
|
2023-11-06 22:00:44 +03:30
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
|
2023-09-12 15:22:58 +03:30
|
|
|
@Riverpod(keepAlive: true)
|
|
|
|
|
class AppUpdateNotifier extends _$AppUpdateNotifier with AppLogger {
|
|
|
|
|
@override
|
2023-12-01 12:56:24 +03:30
|
|
|
AppUpdateState build() => const AppUpdateState.initial();
|
2023-09-20 22:38:38 +03:30
|
|
|
|
2024-03-02 22:53:14 +03:30
|
|
|
PreferencesEntry<String?, dynamic> get _ignoreReleasePref => PreferencesEntry(
|
|
|
|
|
preferences: ref.read(sharedPreferencesProvider).requireValue,
|
|
|
|
|
key: 'ignored_release_version',
|
|
|
|
|
defaultValue: null,
|
2023-10-05 21:49:36 +03:30
|
|
|
);
|
|
|
|
|
|
2023-09-20 22:38:38 +03:30
|
|
|
Future<AppUpdateState> check() async {
|
2023-09-12 15:22:58 +03:30
|
|
|
loggy.debug("checking for update");
|
2023-09-20 22:38:38 +03:30
|
|
|
state = const AppUpdateState.checking();
|
2023-12-01 12:56:24 +03:30
|
|
|
final appInfo = ref.watch(appInfoProvider).requireValue;
|
2023-09-15 23:09:58 +03:30
|
|
|
if (!appInfo.release.allowCustomUpdateChecker) {
|
|
|
|
|
loggy.debug(
|
|
|
|
|
"custom update checkers are not allowed for [${appInfo.release.name}] release",
|
|
|
|
|
);
|
2023-09-20 22:38:38 +03:30
|
|
|
return state = const AppUpdateState.disabled();
|
2023-09-15 23:09:58 +03:30
|
|
|
}
|
2023-12-01 12:56:24 +03:30
|
|
|
return ref.watch(appUpdateRepositoryProvider).getLatestVersion().match(
|
2023-09-20 22:38:38 +03:30
|
|
|
(err) {
|
2023-10-03 21:12:14 +03:30
|
|
|
loggy.warning("failed to get latest version", err);
|
2023-09-20 22:38:38 +03:30
|
|
|
return state = AppUpdateState.error(err);
|
2023-09-12 15:22:58 +03:30
|
|
|
},
|
|
|
|
|
(remote) {
|
2023-11-10 12:17:51 +03:30
|
|
|
try {
|
|
|
|
|
final latestVersion = Version.parse(remote.version);
|
|
|
|
|
final currentVersion = Version.parse(appInfo.version);
|
|
|
|
|
if (latestVersion > currentVersion) {
|
2024-03-02 22:53:14 +03:30
|
|
|
if (remote.version == _ignoreReleasePref.read()) {
|
2023-11-10 12:17:51 +03:30
|
|
|
loggy.debug("ignored release [${remote.version}]");
|
|
|
|
|
return state = AppUpdateStateIgnored(remote);
|
|
|
|
|
}
|
|
|
|
|
loggy.debug("new version available: $remote");
|
|
|
|
|
return state = AppUpdateState.available(remote);
|
2023-10-07 20:22:21 +03:30
|
|
|
}
|
2023-11-10 12:17:51 +03:30
|
|
|
loggy.info(
|
|
|
|
|
"already using latest version[$currentVersion], remote: [${remote.version}]",
|
|
|
|
|
);
|
|
|
|
|
return state = const AppUpdateState.notAvailable();
|
|
|
|
|
} catch (error, stackTrace) {
|
|
|
|
|
loggy.warning("error parsing versions", error, stackTrace);
|
|
|
|
|
return state = AppUpdateState.error(
|
2023-12-01 12:56:24 +03:30
|
|
|
AppUpdateFailure.unexpected(error, stackTrace),
|
2023-11-10 12:17:51 +03:30
|
|
|
);
|
2023-09-12 15:22:58 +03:30
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
).run();
|
|
|
|
|
}
|
2023-09-20 22:38:38 +03:30
|
|
|
|
2023-12-01 12:56:24 +03:30
|
|
|
Future<void> ignoreRelease(RemoteVersionEntity version) async {
|
|
|
|
|
loggy.debug("ignoring release [${version.version}]");
|
2024-03-02 22:53:14 +03:30
|
|
|
await _ignoreReleasePref.write(version.version);
|
2023-12-01 12:56:24 +03:30
|
|
|
state = AppUpdateStateIgnored(version);
|
2023-10-05 21:49:36 +03:30
|
|
|
}
|
2023-09-12 15:22:58 +03:30
|
|
|
}
|