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

@@ -2846,7 +2846,6 @@ public class ConversationActivity extends PassphraseRequiredActivity
attachmentManager.cleanup();
updateLinkPreviewState();
linkPreviewViewModel.onSend();
}
private void sendMessage() {
@@ -2939,13 +2938,14 @@ public class ConversationActivity extends PassphraseRequiredActivity
throws InvalidMessageException
{
Log.i(TAG, "Sending media message...");
List<LinkPreview> linkPreviews = linkPreviewViewModel.onSend();
sendMediaMessage(recipient.getId(),
forceSms,
getMessage(),
attachmentManager.buildSlideDeck(),
inputPanel.getQuote().orNull(),
Collections.emptyList(),
linkPreviewViewModel.getActiveLinkPreviews(),
linkPreviews,
composeText.getMentions(),
expiresIn,
viewOnce,

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();