[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;
@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<InputStream> {
DataCallback<? super InputStream> 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<InputStream> {
@Override
public void cancel() {
// does it make sense to cancel a database load?
cancel = true;
}
@Override
@@ -89,8 +91,4 @@ class BriarDataFetcher implements DataFetcher<InputStream> {
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
implements ModelLoader<AttachmentItem, InputStream> {
private final BriarApplication app;
@Inject
BriarDataFetcher dataFetcher;
BriarDataFetcherFactory dataFetcherFactory;
public BriarModelLoader(BriarApplication app) {
this.app = app;
app.getApplicationComponent().inject(this);
}
@Override
public LoadData<InputStream> 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);
}