From 8163cd5c8f7ab9706d4711d64e553007b82e73a2 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 6 Oct 2023 19:58:46 -0400 Subject: [PATCH] Improvements, bugfixes --- lib/custom_errors.dart | 24 +++++++++++++----------- lib/pages/apps.dart | 2 +- lib/pages/import_export.dart | 5 +++-- lib/providers/apps_provider.dart | 29 +++++++++++++++-------------- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/lib/custom_errors.dart b/lib/custom_errors.dart index 4d807c5..04e6104 100644 --- a/lib/custom_errors.dart +++ b/lib/custom_errors.dart @@ -66,27 +66,29 @@ class NotImplementedError extends ObtainiumError { class MultiAppMultiError extends ObtainiumError { Map rawErrors = {}; - Map> content = {}; + Map> idsByErrorString = {}; + Map appIdNames = {}; MultiAppMultiError() : super(tr('placeholder'), unexpected: true); - add(String appId, dynamic error) { + add(String appId, dynamic error, {String? appName}) { rawErrors[appId] = error; var string = error.toString(); - var tempIds = content.remove(string); + var tempIds = idsByErrorString.remove(string); tempIds ??= []; tempIds.add(appId); - content.putIfAbsent(string, () => tempIds!); + idsByErrorString.putIfAbsent(string, () => tempIds!); + if (appName != null) { + appIdNames[appId] = appName; + } } + String errorString(String appId) => + '${appIdNames.containsKey(appId) ? '${appIdNames[appId]} ($appId)' : appId}: ${rawErrors[appId].toString()}'; + @override - String toString() { - String finalString = ''; - for (var e in content.keys) { - finalString += '$e: ${content[e].toString()}\n\n'; - } - return finalString; - } + String toString() => + idsByErrorString.keys.map((e) => errorString(e)).join('\n\n'); } showError(dynamic e, BuildContext context) { diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index cb7ce46..fe98aa9 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -833,7 +833,7 @@ class AppsPageState extends State { items: const [], initValid: true, message: tr('installStatusOfXWillBeResetExplanation', - args: [plural('app', selectedAppIds.length)]), + args: [plural('apps', selectedAppIds.length)]), ); }); if (values != null) { diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart index 264f3a9..68de7f5 100644 --- a/lib/pages/import_export.dart +++ b/lib/pages/import_export.dart @@ -217,7 +217,8 @@ class _ImportExportPageState extends State { if (errors.isEmpty) { // ignore: use_build_context_synchronously showError( - tr('importedX', args: [plural('app', selectedUrls.length)]), + tr('importedX', + args: [plural('apps', selectedUrls.length)]), context); } else { // ignore: use_build_context_synchronously @@ -274,7 +275,7 @@ class _ImportExportPageState extends State { if (errors.isEmpty) { // ignore: use_build_context_synchronously showError( - tr('importedX', args: [plural('app', selectedUrls.length)]), + tr('importedX', args: [plural('apps', selectedUrls.length)]), context); } else { // ignore: use_build_context_synchronously diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 31824c2..7c150c6 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -449,7 +449,7 @@ class AppsProvider with ChangeNotifier { } catch (e) { logs.add( 'Could not install APK from XAPK \'${file.path}\': ${e.toString()}'); - errors.add(dir.appId, e); + errors.add(dir.appId, e, appName: apps[dir.appId]?.name); } } else if (file.path.toLowerCase().endsWith('.obb')) { await moveObbFile(file, dir.appId); @@ -457,7 +457,7 @@ class AppsProvider with ChangeNotifier { } if (somethingInstalled) { dir.file.delete(recursive: true); - } else if (errors.content.isNotEmpty) { + } else if (errors.idsByErrorString.isNotEmpty) { throw errors; } } finally { @@ -677,11 +677,11 @@ class AppsProvider with ChangeNotifier { } installedIds.add(id); } catch (e) { - errors.add(id, e); + errors.add(id, e, appName: apps[id]?.name); } } - if (errors.content.isNotEmpty) { + if (errors.idsByErrorString.isNotEmpty) { throw errors; } @@ -1090,7 +1090,7 @@ class AppsProvider with ChangeNotifier { throwErrorsForRetry) { rethrow; } - errors.add(appId, e); + errors.add(appId, e, appName: apps[appId]?.name); } if (newApp != null) { updates.add(newApp); @@ -1100,7 +1100,7 @@ class AppsProvider with ChangeNotifier { gettingUpdates = false; } } - if (errors.content.isNotEmpty) { + if (errors.idsByErrorString.isNotEmpty) { var res = Map(); res['errors'] = errors; res['updates'] = updates; @@ -1392,15 +1392,16 @@ Future bgUpdateCheck(int taskId, Map? params) async { List toNotify = []; List> toRetry = []; var retryAfterXSeconds = 0; - List> toThrow = []; + List toThrow = []; var networkRestricted = false; if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) { var netResult = await (Connectivity().checkConnectivity()); networkRestricted = (netResult != ConnectivityResult.wifi) && (netResult != ConnectivityResult.ethernet); } + MultiAppMultiError? errors; CheckingUpdatesNotification notif = - CheckingUpdatesNotification(plural('app', toCheck.length)); + CheckingUpdatesNotification(plural('apps', toCheck.length)); try { // Check for updates @@ -1411,8 +1412,8 @@ Future bgUpdateCheck(int taskId, Map? params) async { // If there were errors, group them into toRetry and toThrow if (e is Map) { updates = e['updates']; - MultiAppMultiError errors = e['errors']; - errors.rawErrors.forEach((key, err) { + errors = e['errors']; + errors!.rawErrors.forEach((key, err) { logs.add( 'BG update task $taskId: Got error on checking for $key \'${err.toString()}\'.'); var toCheckApp = toCheck.where((element) => element.key == key).first; @@ -1422,12 +1423,12 @@ Future bgUpdateCheck(int taskId, Map? params) async { ? (err.remainingMinutes * 60) : e is ClientException ? (15 * 60) - : pow(toCheckApp.value, 2).toInt(); + : pow(toCheckApp.value + 1, 2).toInt(); if (minRetryIntervalForThisApp > retryAfterXSeconds) { retryAfterXSeconds = minRetryIntervalForThisApp; } } else { - toThrow.add(MapEntry(key, err)); + toThrow.add(key); } }); } else { @@ -1456,9 +1457,9 @@ Future bgUpdateCheck(int taskId, Map? params) async { // Send the error notifications if (toThrow.isNotEmpty) { - for (var element in toThrow) { + for (var appId in toThrow) { notificationsProvider.notify(ErrorCheckingUpdatesNotification( - '${element.key}: ${element.value.toString()}', + errors!.errorString(appId), id: Random().nextInt(10000))); } }