ollama-app/lib/worker/update.dart

188 lines
5.0 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_install_referrer/flutter_install_referrer.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:version/version.dart';
import '../l10n/gen/app_localizations.dart';
import '../main.dart';
import '../services/clients.dart';
import 'desktop.dart';
import 'haptic.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<bool> updatesSupported(
Function setState, [
bool takeAction = false,
]) async {
var returnValue = true;
final installerApps = [
"org.fdroid.fdroid",
"org.gdroid.gdroid",
"eu.bubu1.fdroidclassic",
"in.sunilpaulmathew.izzyondroid",
"com.looker.droidify",
"com.machiav3lli.fdroid",
"nya.kitsunyan.foxydroid",
];
if (!desktopFeature(web: true)) {
if ((await InstallReferrer.referrer !=
InstallationAppReferrer.androidManually) ||
(installerApps.contains(
(await InstallReferrer.app).packageName ?? "",
))) {
returnValue = false;
if (await InstallReferrer.referrer ==
InstallationAppReferrer.androidDebug) {
returnValue = true;
}
}
if (!repoUrl.startsWith("https://github.com")) {
returnValue = false;
}
}
if (!returnValue && takeAction) {
setState(() {
updateStatus = "notAvailable";
updateLoading = false;
});
}
return returnValue;
}
Future<bool> checkUpdate(Function setState) async {
try {
setState(() {
updateChecked = true;
updateLoading = true;
});
if (!await updatesSupported(setState)) {
setState(() {
updateStatus = "notAvailable";
updateLoading = false;
});
return false;
}
final repo = repoUrl.split("/");
currentVersion = (await PackageInfo.fromPlatform()).version;
// currentVersion = "1.0.0";
String? version;
try {
final request = await httpClient
.get(
Uri.parse(
"https://api.github.com/repos/${repo[3]}/${repo[4]}/releases",
),
)
.timeout(
Duration(
milliseconds:
(5000.0 * (prefs!.getDouble("timeoutMultiplier") ?? 1.0))
.round(),
),
);
if (request.statusCode == 403) {
setState(() {
updateStatus = "rateLimit";
updateLoading = false;
});
return false;
}
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 false;
}
latestVersion = version;
updateStatus = "ok";
setState(() {
updateLoading = false;
});
} catch (e) {
setState(() {
updateStatus = "notAvailable";
updateLoading = false;
});
}
return updateStatus == "ok" &&
(Version.parse(latestVersion ?? "1.0.0") >
Version.parse(currentVersion ?? "2.0.0"));
}
Future<void> updateDialog(BuildContext context, Function title) async {
await showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(AppLocalizations.of(context).settingsUpdateDialogTitle),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(AppLocalizations.of(context).settingsUpdateDialogDescription),
title(AppLocalizations.of(context).settingsUpdateChangeLog),
Flexible(
child: SingleChildScrollView(
child: Container(
constraints: const BoxConstraints(maxWidth: 1000),
child: MarkdownBody(
data: updateChangeLog ?? "No changelog given.",
shrinkWrap: true,
),
),
),
),
],
),
actions: [
TextButton(
onPressed: () {
selectionHaptic();
Navigator.of(context).pop();
},
child: Text(
AppLocalizations.of(context).settingsUpdateDialogCancel,
),
),
TextButton(
onPressed: () {
selectionHaptic();
Navigator.of(context).pop();
launchUrl(
mode: LaunchMode.inAppBrowserView,
Uri.parse(updateUrl!),
);
},
child: Text(
AppLocalizations.of(context).settingsUpdateDialogUpdate,
),
),
],
);
},
);
}