115 lines
3.0 KiB
Dart
115 lines
3.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:kooltab2/utils/app_update_util.dart';
|
|
import 'package:ota_update/ota_update.dart';
|
|
|
|
class UpdateChecker {
|
|
static bool _hasChecked = false;
|
|
|
|
static Future<void> check(BuildContext context) async {
|
|
if (_hasChecked) {
|
|
debugPrint("Update already checked this boot");
|
|
return;
|
|
}
|
|
|
|
_hasChecked = true;
|
|
|
|
final updater = AppUpdateUtil(serverUrl: "https://updater.brammie15.dev");
|
|
|
|
try {
|
|
final update = await updater.checkForUpdate();
|
|
|
|
if (update == null) {
|
|
debugPrint("No update available");
|
|
return;
|
|
}
|
|
|
|
debugPrint("Update available: ${update.version}");
|
|
|
|
if (!context.mounted) return;
|
|
|
|
_showUpdateDialog(context, update);
|
|
} catch (e) {
|
|
debugPrint("Update check failed: $e");
|
|
}
|
|
}
|
|
|
|
static void _showUpdateDialog(BuildContext context, UpdateInfo update) {
|
|
showDialog(
|
|
context: context,
|
|
barrierDismissible: !update.mandatory,
|
|
builder: (_) => AlertDialog(
|
|
title: const Text("Update available"),
|
|
content: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text("Version ${update.version} is available."),
|
|
const SizedBox(height: 12),
|
|
Text(update.notes),
|
|
],
|
|
),
|
|
actions: [
|
|
if (!update.mandatory)
|
|
TextButton(
|
|
onPressed: () => Navigator.pop(context),
|
|
child: const Text("Later"),
|
|
),
|
|
|
|
FilledButton(
|
|
onPressed: () async {
|
|
Navigator.pop(context);
|
|
await _downloadAndInstall(update);
|
|
},
|
|
child: const Text("Update"),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
Future<void> _downloadAndInstall(UpdateInfo update) async {
|
|
try {
|
|
final url = update.download.startsWith("http")
|
|
? update.download
|
|
: "https://updater.brammie15.dev${update.download}";
|
|
OtaUpdate()
|
|
.execute(
|
|
url,
|
|
destinationFilename: "update.apk",
|
|
sha256checksum: update.sha256,
|
|
)
|
|
.listen((OtaEvent event) {
|
|
debugPrint("OTA status: ${event.status}");
|
|
|
|
debugPrint("OTA value: ${event.value}");
|
|
|
|
switch (event.status) {
|
|
case OtaStatus.DOWNLOADING:
|
|
final progress = double.tryParse(event.value ?? "0") ?? 0;
|
|
|
|
debugPrint("Downloading ${progress.toStringAsFixed(0)}%");
|
|
|
|
break;
|
|
|
|
case OtaStatus.INSTALLING:
|
|
debugPrint("Installing update");
|
|
break;
|
|
|
|
case OtaStatus.INSTALLATION_ERROR:
|
|
debugPrint("Installation error: ${event.value}");
|
|
break;
|
|
|
|
case OtaStatus.DOWNLOAD_ERROR:
|
|
debugPrint("Download error: ${event.value}");
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
});
|
|
} catch (e) {
|
|
debugPrint("OTA update failed: $e");
|
|
}
|
|
}
|