mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-02-23 11:15:44 +00:00
Fix race condition that could show an empty link preview after send.
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user