mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 18:59:06 +01:00
[android] Use DataFetcherFactory to create data fetchers and allow cancelling loads
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user