diff --git a/android/app/src/main/java/deckers/thibault/aves/channelhandlers/ImageDecodeTaskManager.java b/android/app/src/main/java/deckers/thibault/aves/channelhandlers/ImageDecodeTaskManager.java index 809044110..0cf14896b 100644 --- a/android/app/src/main/java/deckers/thibault/aves/channelhandlers/ImageDecodeTaskManager.java +++ b/android/app/src/main/java/deckers/thibault/aves/channelhandlers/ImageDecodeTaskManager.java @@ -1,34 +1,45 @@ package deckers.thibault.aves.channelhandlers; import android.app.Activity; -import android.os.AsyncTask; +import android.util.Log; -import java.util.HashMap; +import java.util.concurrent.LinkedBlockingDeque; import deckers.thibault.aves.model.ImageEntry; +import deckers.thibault.aves.utils.Utils; import io.flutter.plugin.common.MethodChannel; public class ImageDecodeTaskManager { - private Activity activity; - private HashMap taskMap = new HashMap<>(); + private static final String LOG_TAG = Utils.createLogTag(ImageDecodeTaskManager.class); + + private LinkedBlockingDeque taskParamsQueue; + private boolean running = true; ImageDecodeTaskManager(Activity activity) { - this.activity = activity; + taskParamsQueue = new LinkedBlockingDeque<>(); + new Thread(() -> { + try { + while (running) { + ImageDecodeTask.Params params = taskParamsQueue.take(); + new ImageDecodeTask(activity).execute(params); + Thread.sleep(10); + } + } catch (InterruptedException ex) { + Log.w(LOG_TAG, ex); + } + }).start(); } void fetch(MethodChannel.Result result, ImageEntry entry, Integer width, Integer height) { - ImageDecodeTask.Params params = new ImageDecodeTask.Params(entry, width, height, result, this::complete); - AsyncTask task = new ImageDecodeTask(activity).execute(params); - taskMap.put(entry.getUri().toString(), task); + taskParamsQueue.addFirst(new ImageDecodeTask.Params(entry, width, height, result, this::complete)); } void cancel(String uri) { - AsyncTask task = taskMap.get(uri); - if (task != null) task.cancel(true); - taskMap.remove(uri); + boolean removed = taskParamsQueue.removeIf(p -> uri.equals(p.entry.getUri().toString())); + if (removed) Log.d(LOG_TAG, "cancelled uri=" + uri); } private void complete(String uri) { - taskMap.remove(uri); + // nothing for now } } diff --git a/lib/model/image_file_service.dart b/lib/model/image_file_service.dart index 53f96af01..36c9e53ff 100644 --- a/lib/model/image_file_service.dart +++ b/lib/model/image_file_service.dart @@ -31,6 +31,16 @@ class ImageFileService { return Uint8List(0); } + static cancelGetImageBytes(String uri) async { + try { + await platform.invokeMethod('cancelGetImageBytes', { + 'uri': uri, + }); + } on PlatformException catch (e) { + debugPrint('cancelGetImageBytes failed with exception=${e.message}'); + } + } + static Future delete(ImageEntry entry) async { try { await platform.invokeMethod('delete', { diff --git a/lib/widgets/fullscreen/info/info_page.dart b/lib/widgets/fullscreen/info/info_page.dart index 838d3f60c..c13ceda90 100644 --- a/lib/widgets/fullscreen/info/info_page.dart +++ b/lib/widgets/fullscreen/info/info_page.dart @@ -59,6 +59,7 @@ class InfoPageState extends State { InfoRow('Resolution', resolutionText), InfoRow('Size', formatFilesize(entry.sizeBytes)), InfoRow('Path', entry.path), + InfoRow('Uri', entry.uri), LocationSection(entry: entry), XmpTagSection(collection: widget.collection, entry: entry), MetadataSection(entry: entry),