Fix race condition that could show an empty link preview after send.

This commit is contained in:
Greyson Parrelli
2021-08-05 17:45:14 -04:00
parent 80e1b2c843
commit 2bac1a7707
2 changed files with 25 additions and 20 deletions

View File

@@ -53,13 +53,27 @@ public class LinkPreviewViewModel extends ViewModel {
return linkPreviewSafeState.getValue() != null && linkPreviewSafeState.getValue().hasContent();
}
public @NonNull List<LinkPreview> getActiveLinkPreviews() {
final LinkPreviewState state = linkPreviewSafeState.getValue();
/**
* Gets the current state for use in the UI, then resets local state to prepare for the next message send.
*/
public @NonNull List<LinkPreview> onSend() {
final LinkPreviewState currentState = linkPreviewSafeState.getValue();
if (state == null || !state.getLinkPreview().isPresent()) {
if (activeRequest != null) {
activeRequest.cancel();
activeRequest = null;
}
userCanceled = false;
activeUrl = null;
debouncer.clear();
linkPreviewState.setValue(LinkPreviewState.forNoLinks());
if (currentState == null || !currentState.getLinkPreview().isPresent()) {
return Collections.emptyList();
} else {
return Collections.singletonList(state.getLinkPreview().get());
return Collections.singletonList(currentState.getLinkPreview().get());
}
}
@@ -115,7 +129,11 @@ public class LinkPreviewViewModel extends ViewModel {
public void onError(@NonNull LinkPreviewRepository.Error error) {
ThreadUtil.runOnMain(() -> {
if (!userCanceled) {
linkPreviewState.setValue(LinkPreviewState.forLinksWithNoPreview(error));
if (activeUrl != null) {
linkPreviewState.setValue(LinkPreviewState.forLinksWithNoPreview(error));
} else {
linkPreviewState.setValue(LinkPreviewState.forNoLinks());
}
}
activeRequest = null;
});
@@ -145,19 +163,6 @@ public class LinkPreviewViewModel extends ViewModel {
}
}
public void onSend() {
if (activeRequest != null) {
activeRequest.cancel();
activeRequest = null;
}
userCanceled = false;
activeUrl = null;
debouncer.clear();
linkPreviewState.setValue(LinkPreviewState.forNoLinks());
}
public void onEnabled() {
userCanceled = false;
enabled = SignalStore.settings().isLinkPreviewsEnabled();