From bb5440a7d6d6a744d213390fc675be43ee2cbf97 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Wed, 29 Sep 2021 03:06:46 +0800 Subject: [PATCH] Fix handling errors from other download instances --- .../nc_photos/DownloadEventChannelHandler.kt | 8 ++++++-- lib/mobile/android/download.dart | 19 ++++++++++++++++++- lib/mobile/file_downloader.dart | 10 +++++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/android/app/src/main/kotlin/com/nkming/nc_photos/DownloadEventChannelHandler.kt b/android/app/src/main/kotlin/com/nkming/nc_photos/DownloadEventChannelHandler.kt index 43eaf6d0..98a7f1ed 100644 --- a/android/app/src/main/kotlin/com/nkming/nc_photos/DownloadEventChannelHandler.kt +++ b/android/app/src/main/kotlin/com/nkming/nc_photos/DownloadEventChannelHandler.kt @@ -59,7 +59,9 @@ class DownloadEventCompleteChannelHandler(context: Context) : _eventSink?.error( "downloadError", "Download #$downloadId was not successful, status: $status, reason: $reason", - null + mapOf( + "downloadId" to downloadId + ) ) } } else { @@ -68,7 +70,9 @@ class DownloadEventCompleteChannelHandler(context: Context) : "ID #$downloadId not found, user canceled the job?" ) _eventSink?.error( - "userCanceled", "Download #$downloadId was canceled", null + "userCanceled", "Download #$downloadId was canceled", mapOf( + "downloadId" to downloadId + ) ) } } diff --git a/lib/mobile/android/download.dart b/lib/mobile/android/download.dart index e2101f29..0cd4d783 100644 --- a/lib/mobile/android/download.dart +++ b/lib/mobile/android/download.dart @@ -40,7 +40,16 @@ class DownloadEvent { .map((data) => DownloadCompleteEvent( data["downloadId"], data["uri"], - )); + )) + .handleError( + (e, stackTrace) { + throw AndroidDownloadError(e.details["downloadId"], e, stackTrace); + }, + test: (e) => + e is PlatformException && + e.details is Map && + e.details["downloadId"] is int, + ); } class DownloadCompleteEvent { @@ -49,3 +58,11 @@ class DownloadCompleteEvent { final int downloadId; final String uri; } + +class AndroidDownloadError implements Exception { + const AndroidDownloadError(this.downloadId, this.error, this.stackTrace); + + final int downloadId; + final dynamic error; + final StackTrace stackTrace; +} diff --git a/lib/mobile/file_downloader.dart b/lib/mobile/file_downloader.dart index 8b30ffb6..f22ec9c6 100644 --- a/lib/mobile/file_downloader.dart +++ b/lib/mobile/file_downloader.dart @@ -62,7 +62,15 @@ class FileDownloader extends itf.FileDownloader { subscription = DownloadEvent.listenDownloadComplete() ..onData(onDownloadComplete) ..onError((e, stackTrace) { - completer.completeError(e, stackTrace); + if (e is AndroidDownloadError) { + if (e.downloadId != id) { + // not us, ignore + return; + } + completer.completeError(e.error, e.stackTrace); + } else { + completer.completeError(e, stackTrace); + } }); await completer.future; } finally {