Commit 5beed1a7 authored by Torsten Grote's avatar Torsten Grote

Merge branch '1594-preview-fails-to-load' into 'master'

Use a fresh LiveData for each attachment creation task

Closes #1594

See merge request !1144
parents 774047d8 be1c33cb
Pipeline #3616 passed with stage
in 9 minutes and 6 seconds
...@@ -49,11 +49,12 @@ public class AttachmentCreator { ...@@ -49,11 +49,12 @@ public class AttachmentCreator {
private final CopyOnWriteArrayList<AttachmentItemResult> itemResults = private final CopyOnWriteArrayList<AttachmentItemResult> itemResults =
new CopyOnWriteArrayList<>(); new CopyOnWriteArrayList<>();
private final MutableLiveData<AttachmentResult> result =
new MutableLiveData<>();
@Nullable @Nullable
private AttachmentCreationTask task; private AttachmentCreationTask task;
@Nullable
private volatile MutableLiveData<AttachmentResult> result;
public AttachmentCreator(Application app, @IoExecutor Executor ioExecutor, public AttachmentCreator(Application app, @IoExecutor Executor ioExecutor,
MessagingManager messagingManager, AttachmentRetriever retriever) { MessagingManager messagingManager, AttachmentRetriever retriever) {
this.app = app; this.app = app;
...@@ -65,7 +66,7 @@ public class AttachmentCreator { ...@@ -65,7 +66,7 @@ public class AttachmentCreator {
@UiThread @UiThread
public LiveData<AttachmentResult> storeAttachments( public LiveData<AttachmentResult> storeAttachments(
LiveData<GroupId> groupId, Collection<Uri> newUris) { LiveData<GroupId> groupId, Collection<Uri> newUris) {
if (task != null || !uris.isEmpty()) if (task != null || result != null || !uris.isEmpty())
throw new IllegalStateException(); throw new IllegalStateException();
uris.addAll(newUris); uris.addAll(newUris);
observeForeverOnce(groupId, id -> { observeForeverOnce(groupId, id -> {
...@@ -75,6 +76,8 @@ public class AttachmentCreator { ...@@ -75,6 +76,8 @@ public class AttachmentCreator {
app.getContentResolver(), this, id, uris, needsSize); app.getContentResolver(), this, id, uris, needsSize);
ioExecutor.execute(() -> task.storeAttachments()); ioExecutor.execute(() -> task.storeAttachments());
}); });
MutableLiveData<AttachmentResult> result = new MutableLiveData<>();
this.result = result;
return result; return result;
} }
...@@ -85,7 +88,8 @@ public class AttachmentCreator { ...@@ -85,7 +88,8 @@ public class AttachmentCreator {
*/ */
@UiThread @UiThread
public LiveData<AttachmentResult> getLiveAttachments() { public LiveData<AttachmentResult> getLiveAttachments() {
if (task == null || uris.isEmpty()) MutableLiveData<AttachmentResult> result = this.result;
if (task == null || result == null || uris.isEmpty())
throw new IllegalStateException(); throw new IllegalStateException();
// A task is already running. It will update the result LiveData. // A task is already running. It will update the result LiveData.
// So nothing more to do here. // So nothing more to do here.
...@@ -103,7 +107,8 @@ public class AttachmentCreator { ...@@ -103,7 +107,8 @@ public class AttachmentCreator {
AttachmentItemResult itemResult = AttachmentItemResult itemResult =
new AttachmentItemResult(uri, item); new AttachmentItemResult(uri, item);
itemResults.add(itemResult); itemResults.add(itemResult);
result.postValue(getResult(false)); MutableLiveData<AttachmentResult> result = this.result;
if (result != null) result.postValue(getResult(false));
} catch (IOException | DbException e) { } catch (IOException | DbException e) {
logException(LOG, WARNING, e); logException(LOG, WARNING, e);
onAttachmentError(uri, e); onAttachmentError(uri, e);
...@@ -127,13 +132,15 @@ public class AttachmentCreator { ...@@ -127,13 +132,15 @@ public class AttachmentCreator {
AttachmentItemResult itemResult = AttachmentItemResult itemResult =
new AttachmentItemResult(uri, errorMsg); new AttachmentItemResult(uri, errorMsg);
itemResults.add(itemResult); itemResults.add(itemResult);
result.postValue(getResult(false)); MutableLiveData<AttachmentResult> result = this.result;
if (result != null) result.postValue(getResult(false));
// expect to receive a cancel from the UI // expect to receive a cancel from the UI
} }
@IoExecutor @IoExecutor
void onAttachmentCreationFinished() { void onAttachmentCreationFinished() {
result.postValue(getResult(true)); MutableLiveData<AttachmentResult> result = this.result;
if (result != null) result.postValue(getResult(true));
} }
@UiThread @UiThread
...@@ -180,7 +187,11 @@ public class AttachmentCreator { ...@@ -180,7 +187,11 @@ public class AttachmentCreator {
task = null; task = null;
uris.clear(); uris.clear();
itemResults.clear(); itemResults.clear();
result.setValue(null); MutableLiveData<AttachmentResult> result = this.result;
if (result != null) {
result.setValue(null);
this.result = null;
}
} }
@UiThread @UiThread
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment