From 7991f1a3856d1303a08301292747443cc73b1987 Mon Sep 17 00:00:00 2001 From: nyne Date: Tue, 5 Nov 2024 16:04:10 +0800 Subject: [PATCH] check updates on start --- assets/translation.json | 6 ++-- lib/components/message.dart | 7 +++-- lib/foundation/appdata.dart | 1 + lib/main.dart | 19 ++++++++++++ lib/pages/comic_source_page.dart | 13 +++++--- lib/pages/settings/about.dart | 52 +++++++++++++++++--------------- 6 files changed, 64 insertions(+), 34 deletions(-) diff --git a/assets/translation.json b/assets/translation.json index e89eb09..0df06c2 100644 --- a/assets/translation.json +++ b/assets/translation.json @@ -168,7 +168,8 @@ "Order": "顺序", "minAppVersion @version is required": "需要最低App版本 @version", "Remove": "移除", - "Long press to zoom": "长按缩放" + "Long press to zoom": "长按缩放", + "Updates Available": "更新可用" }, "zh_TW": { "Home": "首頁", @@ -339,6 +340,7 @@ "Order": "順序", "minAppVersion @version is required": "需要最低App版本 @version", "Remove": "移除", - "Long press to zoom": "長按縮放" + "Long press to zoom": "長按縮放", + "Updates Available": "更新可用" } } \ No newline at end of file diff --git a/lib/components/message.dart b/lib/components/message.dart index 642dae6..d1fb8aa 100644 --- a/lib/components/message.dart +++ b/lib/components/message.dart @@ -129,13 +129,14 @@ void showDialogMessage(BuildContext context, String title, String message) { ); } -void showConfirmDialog({ +Future showConfirmDialog({ required BuildContext context, required String title, required String content, required void Function() onConfirm, + String confirmText = "Confirm", }) { - showDialog( + return showDialog( context: context, builder: (context) => ContentDialog( title: title, @@ -146,7 +147,7 @@ void showConfirmDialog({ context.pop(); onConfirm(); }, - child: Text("Confirm".tl), + child: Text(confirmText.tl), ), ], ), diff --git a/lib/foundation/appdata.dart b/lib/foundation/appdata.dart index 50c941c..817aa96 100644 --- a/lib/foundation/appdata.dart +++ b/lib/foundation/appdata.dart @@ -112,6 +112,7 @@ class _Settings with ChangeNotifier { 'cacheSize': 2048, // in MB 'downloadThreads': 5, 'enableLongPressToZoom': true, + 'checkUpdateOnStart': true, }; operator [](String key) { diff --git a/lib/main.dart b/lib/main.dart index 9a7be51..9286fc0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,7 +4,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:venera/foundation/log.dart'; +import 'package:venera/pages/comic_source_page.dart'; import 'package:venera/pages/main_page.dart'; +import 'package:venera/pages/settings/settings_page.dart'; import 'package:venera/utils/app_links.dart'; import 'package:window_manager/window_manager.dart'; import 'components/components.dart'; @@ -63,6 +65,7 @@ class MyApp extends StatefulWidget { class _MyAppState extends State { @override void initState() { + checkUpdates(); App.registerForceRebuild(forceRebuild); SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); super.initState(); @@ -163,6 +166,22 @@ class _MyAppState extends State { }, ); } + + void checkUpdates() async { + if(!appdata.settings['checkUpdateOnStart']) { + return; + } + var lastCheck = appdata.implicitData['lastCheckUpdate'] ?? 0; + var now = DateTime.now().millisecondsSinceEpoch; + if(now - lastCheck < 24 * 60 * 60 * 1000) { + // return; + } + appdata.implicitData['lastCheckUpdate'] = now; + appdata.writeImplicitData(); + await Future.delayed(const Duration(milliseconds: 300)); + await checkUpdateUi(false); + await ComicSourcePage.checkComicSourceUpdate(true); + } } class _SystemUiProvider extends StatelessWidget { diff --git a/lib/pages/comic_source_page.dart b/lib/pages/comic_source_page.dart index 1079dc8..9683804 100644 --- a/lib/pages/comic_source_page.dart +++ b/lib/pages/comic_source_page.dart @@ -14,11 +14,11 @@ import 'package:venera/utils/translations.dart'; class ComicSourcePage extends StatefulWidget { const ComicSourcePage({super.key}); - static void checkComicSourceUpdate([bool showLoading = false]) async { + static Future checkComicSourceUpdate([bool implicit = false]) async { if (ComicSource.all().isEmpty) { return; } - var controller = showLoading ? showLoadingDialog(App.rootContext) : null; + var controller = implicit ? null : showLoadingDialog(App.rootContext); var dio = AppDio(); var res = await dio.get( "https://raw.githubusercontent.com/venera-app/venera-configs/master/index.json"); @@ -40,7 +40,9 @@ class ComicSourcePage extends StatefulWidget { } controller?.close(); if (shouldUpdate.isEmpty) { - App.rootContext.showMessage(message: "No Update Available".tl); + if(!implicit) { + App.rootContext.showMessage(message: "No Update Available".tl); + } return; } var msg = ""; @@ -48,10 +50,11 @@ class ComicSourcePage extends StatefulWidget { msg += "${ComicSource.find(key)?.name}: v${versions[key]}\n"; } msg = msg.trim(); - showConfirmDialog( + await showConfirmDialog( context: App.rootContext, title: "Updates Available".tl, content: msg, + confirmText: "Update", onConfirm: () { for (var key in shouldUpdate) { var source = ComicSource.find(key); @@ -104,7 +107,7 @@ class _BodyState extends State<_Body> { child: ListTile( leading: const Icon(Icons.update_outlined), title: Text("Check updates".tl), - onTap: () => ComicSourcePage.checkComicSourceUpdate(true), + onTap: () => ComicSourcePage.checkComicSourceUpdate(false), trailing: const Icon(Icons.arrow_right), ), ); diff --git a/lib/pages/settings/about.dart b/lib/pages/settings/about.dart index f9a46da..f68ef69 100644 --- a/lib/pages/settings/about.dart +++ b/lib/pages/settings/about.dart @@ -53,30 +53,7 @@ class _AboutSettingsState extends State { setState(() { isCheckingUpdate = true; }); - checkUpdate().then((value) { - if (value) { - showDialog( - context: App.rootContext, - builder: (context) { - return ContentDialog( - title: "New version available".tl, - content: Text( - "A new version is available. Do you want to update now?" - .tl), - actions: [ - Button.text( - onPressed: () { - Navigator.pop(context); - launchUrlString( - "https://github.com/venera-app/venera/releases"); - }, - child: Text("Update".tl), - ), - ]); - }); - } else { - context.showMessage(message: "No new version available".tl); - } + checkUpdateUi().then((value) { setState(() { isCheckingUpdate = false; }); @@ -108,6 +85,33 @@ Future checkUpdate() async { return false; } +Future checkUpdateUi([bool showMessageIfNoUpdate = true]) async { + var value = await checkUpdate(); + if (value) { + showDialog( + context: App.rootContext, + builder: (context) { + return ContentDialog( + title: "New version available".tl, + content: Text( + "A new version is available. Do you want to update now?".tl), + actions: [ + Button.text( + onPressed: () { + Navigator.pop(context); + launchUrlString( + "https://github.com/venera-app/venera/releases"); + }, + child: Text("Update".tl), + ), + ], + ); + }); + } else if (showMessageIfNoUpdate) { + App.rootContext.showMessage(message: "No new version available".tl); + } +} + /// return true if version1 > version2 bool _compareVersion(String version1, String version2) { var v1 = version1.split(".");