[android] Use DataFetcherFactory to create data fetchers and allow cancelling loads

This commit is contained in:
Torsten Grote
2018-11-20 11:39:29 -02:00
parent 10e9fb308d
commit dd5ad86db8
4 changed files with 59 additions and 14 deletions

View File

@@ -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;
}
}

View File

@@ -35,17 +35,18 @@ class BriarDataFetcher implements DataFetcher<InputStream> {
private final MessagingManager messagingManager; private final MessagingManager messagingManager;
@DatabaseExecutor @DatabaseExecutor
private final Executor dbExecutor; private final Executor dbExecutor;
private final AttachmentItem attachment;
@Nullable
private AttachmentItem attachment;
@Nullable @Nullable
private volatile InputStream inputStream; private volatile InputStream inputStream;
private volatile boolean cancel = false;
@Inject @Inject
public BriarDataFetcher(MessagingManager messagingManager, public BriarDataFetcher(MessagingManager messagingManager,
@DatabaseExecutor Executor dbExecutor) { @DatabaseExecutor Executor dbExecutor, AttachmentItem attachment) {
this.messagingManager = messagingManager; this.messagingManager = messagingManager;
this.dbExecutor = dbExecutor; this.dbExecutor = dbExecutor;
this.attachment = attachment;
} }
@Override @Override
@@ -53,6 +54,7 @@ class BriarDataFetcher implements DataFetcher<InputStream> {
DataCallback<? super InputStream> callback) { DataCallback<? super InputStream> callback) {
MessageId id = requireNonNull(attachment).getMessageId(); MessageId id = requireNonNull(attachment).getMessageId();
dbExecutor.execute(() -> { dbExecutor.execute(() -> {
if (cancel) return;
try { try {
inputStream = messagingManager.getAttachment(id).getStream(); inputStream = messagingManager.getAttachment(id).getStream();
callback.onDataReady(inputStream); callback.onDataReady(inputStream);
@@ -76,7 +78,7 @@ class BriarDataFetcher implements DataFetcher<InputStream> {
@Override @Override
public void cancel() { public void cancel() {
// does it make sense to cancel a database load? cancel = true;
} }
@Override @Override
@@ -89,8 +91,4 @@ class BriarDataFetcher implements DataFetcher<InputStream> {
return LOCAL; return LOCAL;
} }
public void setAttachment(AttachmentItem attachment) {
this.attachment = attachment;
}
} }

View File

@@ -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);
}
}

View File

@@ -19,21 +19,19 @@ import javax.inject.Inject;
public final class BriarModelLoader public final class BriarModelLoader
implements ModelLoader<AttachmentItem, InputStream> { implements ModelLoader<AttachmentItem, InputStream> {
private final BriarApplication app;
@Inject @Inject
BriarDataFetcher dataFetcher; BriarDataFetcherFactory dataFetcherFactory;
public BriarModelLoader(BriarApplication app) { public BriarModelLoader(BriarApplication app) {
this.app = app; app.getApplicationComponent().inject(this);
} }
@Override @Override
public LoadData<InputStream> buildLoadData(AttachmentItem model, int width, public LoadData<InputStream> buildLoadData(AttachmentItem model, int width,
int height, Options options) { int height, Options options) {
app.getApplicationComponent().inject(this);
ObjectKey key = new ObjectKey(model.getMessageId()); ObjectKey key = new ObjectKey(model.getMessageId());
dataFetcher.setAttachment(model); BriarDataFetcher dataFetcher =
dataFetcherFactory.createBriarDataFetcher(model);
return new LoadData<>(key, dataFetcher); return new LoadData<>(key, dataFetcher);
} }