From dd5ad86db80f7649bc8cb87cd01fc2be2622e157 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 20 Nov 2018 11:39:29 -0200 Subject: [PATCH] [android] Use DataFetcherFactory to create data fetchers and allow cancelling loads --- .../conversation/ConversationModule.java | 19 ++++++++++++ .../conversation/glide/BriarDataFetcher.java | 14 ++++----- .../glide/BriarDataFetcherFactory.java | 30 +++++++++++++++++++ .../conversation/glide/BriarModelLoader.java | 10 +++---- 4 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationModule.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarDataFetcherFactory.java diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationModule.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationModule.java new file mode 100644 index 000000000..287d7d00b --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationModule.java @@ -0,0 +1,19 @@ +package org.briarproject.briar.android.conversation; + +import org.briarproject.briar.android.activity.ActivityScope; +import org.briarproject.briar.android.conversation.glide.BriarDataFetcherFactory; + +import dagger.Module; +import dagger.Provides; + +@Module +public class ConversationModule { + + @ActivityScope + @Provides + BriarDataFetcherFactory provideBriarDataFetcherFactory( + BriarDataFetcherFactory dataFetcherFactory) { + return dataFetcherFactory; + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarDataFetcher.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarDataFetcher.java index 5ef97d6ed..252e8df57 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarDataFetcher.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarDataFetcher.java @@ -35,17 +35,18 @@ class BriarDataFetcher implements DataFetcher { private final MessagingManager messagingManager; @DatabaseExecutor private final Executor dbExecutor; + private final AttachmentItem attachment; - @Nullable - private AttachmentItem attachment; @Nullable private volatile InputStream inputStream; + private volatile boolean cancel = false; @Inject public BriarDataFetcher(MessagingManager messagingManager, - @DatabaseExecutor Executor dbExecutor) { + @DatabaseExecutor Executor dbExecutor, AttachmentItem attachment) { this.messagingManager = messagingManager; this.dbExecutor = dbExecutor; + this.attachment = attachment; } @Override @@ -53,6 +54,7 @@ class BriarDataFetcher implements DataFetcher { DataCallback callback) { MessageId id = requireNonNull(attachment).getMessageId(); dbExecutor.execute(() -> { + if (cancel) return; try { inputStream = messagingManager.getAttachment(id).getStream(); callback.onDataReady(inputStream); @@ -76,7 +78,7 @@ class BriarDataFetcher implements DataFetcher { @Override public void cancel() { - // does it make sense to cancel a database load? + cancel = true; } @Override @@ -89,8 +91,4 @@ class BriarDataFetcher implements DataFetcher { return LOCAL; } - public void setAttachment(AttachmentItem attachment) { - this.attachment = attachment; - } - } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarDataFetcherFactory.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarDataFetcherFactory.java new file mode 100644 index 000000000..87f55a170 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarDataFetcherFactory.java @@ -0,0 +1,30 @@ +package org.briarproject.briar.android.conversation.glide; + +import org.briarproject.bramble.api.db.DatabaseExecutor; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.briar.android.conversation.AttachmentItem; +import org.briarproject.briar.api.messaging.MessagingManager; + +import java.util.concurrent.Executor; + +import javax.inject.Inject; + +@NotNullByDefault +public class BriarDataFetcherFactory { + + private final MessagingManager messagingManager; + @DatabaseExecutor + private final Executor dbExecutor; + + @Inject + public BriarDataFetcherFactory(MessagingManager messagingManager, + @DatabaseExecutor Executor dbExecutor) { + this.messagingManager = messagingManager; + this.dbExecutor = dbExecutor; + } + + BriarDataFetcher createBriarDataFetcher(AttachmentItem model) { + return new BriarDataFetcher(messagingManager, dbExecutor, model); + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarModelLoader.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarModelLoader.java index 397910de9..1891abdfe 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarModelLoader.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/glide/BriarModelLoader.java @@ -19,21 +19,19 @@ import javax.inject.Inject; public final class BriarModelLoader implements ModelLoader { - private final BriarApplication app; - @Inject - BriarDataFetcher dataFetcher; + BriarDataFetcherFactory dataFetcherFactory; public BriarModelLoader(BriarApplication app) { - this.app = app; + app.getApplicationComponent().inject(this); } @Override public LoadData buildLoadData(AttachmentItem model, int width, int height, Options options) { - app.getApplicationComponent().inject(this); ObjectKey key = new ObjectKey(model.getMessageId()); - dataFetcher.setAttachment(model); + BriarDataFetcher dataFetcher = + dataFetcherFactory.createBriarDataFetcher(model); return new LoadData<>(key, dataFetcher); }