diff --git a/lib/screen_settings.dart b/lib/screen_settings.dart index f9d3d5e..7a0a68d 100644 --- a/lib/screen_settings.dart +++ b/lib/screen_settings.dart @@ -1,11 +1,11 @@ import 'dart:convert'; import 'dart:io'; -import 'package:bitsdojo_window/bitsdojo_window.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'main.dart'; +import 'worker_update.dart'; import 'package:ollama_app/worker_setter.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -16,10 +16,8 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:restart_app/restart_app.dart'; import 'package:file_picker/file_picker.dart'; import 'package:intl/intl.dart'; -import 'package:install_referrer/install_referrer.dart'; -import 'package:package_info_plus/package_info_plus.dart'; import 'package:version/version.dart'; -import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:bitsdojo_window/bitsdojo_window.dart'; class ScreenSettings extends StatefulWidget { const ScreenSettings({super.key}); @@ -92,113 +90,15 @@ class _ScreenSettingsState extends State { final systemInputController = TextEditingController( text: prefs?.getString("system") ?? "You are a helpful assistant"); - final repoUrl = "https://github.com/JHubi1/ollama-app"; - - bool updateChecked = false; - bool updateLoading = false; - String updateStatus = "ok"; - String? updateUrl; - String? latestVersion; - String? currentVersion; - String? updateChangeLog; - Future updatesSupported([bool takeAction = false]) async { - bool returnValue = true; - var installerApps = [ - "org.fdroid.fdroid", - "org.gdroid.gdroid", - "eu.bubu1.fdroidclassic", - "in.sunilpaulmathew.izzyondroid", - "com.looker.droidify", - "com.machiav3lli.fdroid", - "nya.kitsunyan.foxydroid" - ]; - if (!(Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { - if ((await InstallReferrer.referrer != - InstallationAppReferrer.androidManually) && - !(installerApps - .contains((await InstallReferrer.app).packageName ?? ""))) { - returnValue = false; - if (await InstallReferrer.referrer == - InstallationAppReferrer.androidDebug || - await InstallReferrer.referrer == - InstallationAppReferrer.iosDebug) { - returnValue = true; - } - } - if (!repoUrl.startsWith("https://github.com")) { - returnValue = false; - } - } - - if (!returnValue && takeAction) { - setState(() { - updateStatus = "notAvailable"; - updateLoading = false; - }); - } - return returnValue; - } - - void checkUpdate() async { - setState(() { - updateChecked = true; - updateLoading = true; - }); - - if (!await updatesSupported()) { - setState(() { - updateStatus = "notAvailable"; - updateLoading = false; - }); - return; - } - - var repo = repoUrl.split("/"); - - currentVersion = (await PackageInfo.fromPlatform()).version; - // currentVersion = "1.0.0"; - - String? version; - try { - var request = await http - .get(Uri.parse( - "https://api.github.com/repos/${repo[3]}/${repo[4]}/releases")) - .timeout(const Duration(seconds: 5)); - if (request.statusCode == 403) { - setState(() { - updateStatus = "rateLimit"; - updateLoading = false; - }); - return; - } - version = jsonDecode(request.body)[0]["tag_name"]; - updateChangeLog = jsonDecode(request.body)[0]["body"]; - updateUrl = jsonDecode(request.body)[0]["html_url"]; - } catch (_) { - setState(() { - updateStatus = "error"; - updateLoading = false; - }); - return; - } - - latestVersion = version; - updateStatus = "ok"; - - setState(() { - updateLoading = false; - }); - } - @override void initState() { super.initState(); WidgetsFlutterBinding.ensureInitialized(); checkHost(); - updatesSupported(true); + updatesSupported(setState, true); if (prefs!.getBool("checkUpdateOnSettingsOpen") ?? false) { - checkUpdate(); + checkUpdate(setState); } } @@ -719,54 +619,9 @@ class _ScreenSettingsState extends State { if ((Version.parse(latestVersion ?? "1.0.0") > Version.parse(currentVersion ?? "2.0.0")) && (updateStatus == "ok")) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text( - AppLocalizations.of(context)! - .settingsUpdateDialogTitle), - content: SizedBox( - width: 200, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text(AppLocalizations.of(context)! - .settingsUpdateDialogDescription), - title( - AppLocalizations.of(context)! - .settingsUpdateChangeLog), - MarkdownBody( - data: updateChangeLog ?? - "Nothing"), - ], - ), - ), - actions: [ - TextButton( - onPressed: () { - HapticFeedback.selectionClick(); - Navigator.of(context).pop(); - }, - child: Text(AppLocalizations.of( - context)! - .settingsUpdateDialogCancel)), - TextButton( - onPressed: () { - HapticFeedback.selectionClick(); - Navigator.of(context).pop(); - launchUrl( - mode: LaunchMode - .inAppBrowserView, - Uri.parse(updateUrl!)); - }, - child: Text(AppLocalizations.of( - context)! - .settingsUpdateDialogUpdate)) - ]); - }); + updateDialog(context, title); } else { - checkUpdate(); + checkUpdate(setState); return; } }, diff --git a/lib/worker_update.dart b/lib/worker_update.dart new file mode 100644 index 0000000..cd3de30 --- /dev/null +++ b/lib/worker_update.dart @@ -0,0 +1,152 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +import 'package:http/http.dart' as http; +import 'package:install_referrer/install_referrer.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:url_launcher/url_launcher.dart'; + +const repoUrl = "https://github.com/JHubi1/ollama-app"; + +bool updateChecked = false; +bool updateLoading = false; +String updateStatus = "ok"; +String? updateUrl; +String? latestVersion; +String? currentVersion; +String? updateChangeLog; +Future updatesSupported(Function setState, + [bool takeAction = false]) async { + bool returnValue = true; + var installerApps = [ + "org.fdroid.fdroid", + "org.gdroid.gdroid", + "eu.bubu1.fdroidclassic", + "in.sunilpaulmathew.izzyondroid", + "com.looker.droidify", + "com.machiav3lli.fdroid", + "nya.kitsunyan.foxydroid" + ]; + if (!(Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + if ((await InstallReferrer.referrer != + InstallationAppReferrer.androidManually) && + !(installerApps + .contains((await InstallReferrer.app).packageName ?? ""))) { + returnValue = false; + if (await InstallReferrer.referrer == + InstallationAppReferrer.androidDebug || + await InstallReferrer.referrer == InstallationAppReferrer.iosDebug) { + returnValue = true; + } + } + if (!repoUrl.startsWith("https://github.com")) { + returnValue = false; + } + } + + if (!returnValue && takeAction) { + setState(() { + updateStatus = "notAvailable"; + updateLoading = false; + }); + } + return returnValue; +} + +void checkUpdate(Function setState) async { + setState(() { + updateChecked = true; + updateLoading = true; + }); + + if (!await updatesSupported(setState)) { + setState(() { + updateStatus = "notAvailable"; + updateLoading = false; + }); + return; + } + + var repo = repoUrl.split("/"); + + currentVersion = (await PackageInfo.fromPlatform()).version; + // currentVersion = "1.0.0"; + + String? version; + try { + var request = await http + .get(Uri.parse( + "https://api.github.com/repos/${repo[3]}/${repo[4]}/releases")) + .timeout(const Duration(seconds: 5)); + if (request.statusCode == 403) { + setState(() { + updateStatus = "rateLimit"; + updateLoading = false; + }); + return; + } + version = jsonDecode(request.body)[0]["tag_name"]; + updateChangeLog = jsonDecode(request.body)[0]["body"]; + updateUrl = jsonDecode(request.body)[0]["html_url"]; + } catch (_) { + setState(() { + updateStatus = "error"; + updateLoading = false; + }); + return; + } + + latestVersion = version; + updateStatus = "ok"; + + setState(() { + updateLoading = false; + }); +} + +void updateDialog(BuildContext context, Function title) { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: + Text(AppLocalizations.of(context)!.settingsUpdateDialogTitle), + content: SizedBox( + width: 200, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(AppLocalizations.of(context)! + .settingsUpdateDialogDescription), + title(AppLocalizations.of(context)!.settingsUpdateChangeLog), + MarkdownBody(data: updateChangeLog ?? "Nothing"), + ], + ), + ), + actions: [ + TextButton( + onPressed: () { + HapticFeedback.selectionClick(); + Navigator.of(context).pop(); + }, + child: Text(AppLocalizations.of(context)! + .settingsUpdateDialogCancel)), + TextButton( + onPressed: () { + HapticFeedback.selectionClick(); + Navigator.of(context).pop(); + launchUrl( + mode: LaunchMode.inAppBrowserView, + Uri.parse(updateUrl!)); + }, + child: Text( + AppLocalizations.of(context)!.settingsUpdateDialogUpdate)) + ]); + }); +}