mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-20 08:39:22 +01:00
Update link preview settings and add some UI polish.
This commit is contained in:
@@ -40,7 +40,7 @@ public final class LinkPreviewUtil {
|
||||
/**
|
||||
* @return All whitelisted URLs in the source text.
|
||||
*/
|
||||
public static @NonNull List<Link> findWhitelistedUrls(@NonNull String text) {
|
||||
public static @NonNull List<Link> findValidPreviewUrls(@NonNull String text) {
|
||||
SpannableString spannable = new SpannableString(text);
|
||||
boolean found = Linkify.addLinks(spannable, Linkify.WEB_URLS);
|
||||
|
||||
|
||||
@@ -41,6 +41,10 @@ public class LinkPreviewViewModel extends ViewModel {
|
||||
return linkPreviewState.getValue() != null && linkPreviewState.getValue().getLinkPreview().isPresent();
|
||||
}
|
||||
|
||||
public boolean hasLinkPreviewUi() {
|
||||
return linkPreviewState.getValue() != null && linkPreviewState.getValue().hasContent();
|
||||
}
|
||||
|
||||
public @NonNull List<LinkPreview> getActiveLinkPreviews() {
|
||||
final LinkPreviewState state = linkPreviewState.getValue();
|
||||
|
||||
@@ -61,7 +65,7 @@ public class LinkPreviewViewModel extends ViewModel {
|
||||
return;
|
||||
}
|
||||
|
||||
List<Link> links = LinkPreviewUtil.findWhitelistedUrls(text);
|
||||
List<Link> links = LinkPreviewUtil.findValidPreviewUrls(text);
|
||||
Optional<Link> link = links.isEmpty() ? Optional.absent() : Optional.of(links.get(0));
|
||||
|
||||
if (link.isPresent() && link.get().getUrl().equals(activeUrl)) {
|
||||
@@ -75,7 +79,7 @@ public class LinkPreviewViewModel extends ViewModel {
|
||||
|
||||
if (!link.isPresent() || !isCursorPositionValid(text, link.get(), cursorStart, cursorEnd)) {
|
||||
activeUrl = null;
|
||||
linkPreviewState.setValue(LinkPreviewState.forEmpty());
|
||||
linkPreviewState.setValue(LinkPreviewState.forNoLinks());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -85,7 +89,11 @@ public class LinkPreviewViewModel extends ViewModel {
|
||||
activeRequest = repository.getLinkPreview(context, link.get().getUrl(), lp -> {
|
||||
Util.runOnMain(() -> {
|
||||
if (!userCanceled) {
|
||||
linkPreviewState.setValue(LinkPreviewState.forPreview(lp));
|
||||
if (lp.isPresent()) {
|
||||
linkPreviewState.setValue(LinkPreviewState.forPreview(lp.get()));
|
||||
} else {
|
||||
linkPreviewState.setValue(LinkPreviewState.forLinksWithNoPreview());
|
||||
}
|
||||
}
|
||||
activeRequest = null;
|
||||
});
|
||||
@@ -103,7 +111,7 @@ public class LinkPreviewViewModel extends ViewModel {
|
||||
activeUrl = null;
|
||||
|
||||
debouncer.clear();
|
||||
linkPreviewState.setValue(LinkPreviewState.forEmpty());
|
||||
linkPreviewState.setValue(LinkPreviewState.forNoLinks());
|
||||
}
|
||||
|
||||
public void onEnabled() {
|
||||
@@ -133,32 +141,46 @@ public class LinkPreviewViewModel extends ViewModel {
|
||||
|
||||
public static class LinkPreviewState {
|
||||
private final boolean isLoading;
|
||||
private final boolean hasLinks;
|
||||
private final Optional<LinkPreview> linkPreview;
|
||||
|
||||
private LinkPreviewState(boolean isLoading, Optional<LinkPreview> linkPreview) {
|
||||
private LinkPreviewState(boolean isLoading, boolean hasLinks, Optional<LinkPreview> linkPreview) {
|
||||
this.isLoading = isLoading;
|
||||
this.hasLinks = hasLinks;
|
||||
this.linkPreview = linkPreview;
|
||||
}
|
||||
|
||||
private static LinkPreviewState forLoading() {
|
||||
return new LinkPreviewState(true, Optional.absent());
|
||||
return new LinkPreviewState(true, false, Optional.absent());
|
||||
}
|
||||
|
||||
private static LinkPreviewState forPreview(@NonNull Optional<LinkPreview> linkPreview) {
|
||||
return new LinkPreviewState(false, linkPreview);
|
||||
private static LinkPreviewState forPreview(@NonNull LinkPreview linkPreview) {
|
||||
return new LinkPreviewState(false, true, Optional.of(linkPreview));
|
||||
}
|
||||
|
||||
private static LinkPreviewState forEmpty() {
|
||||
return new LinkPreviewState(false, Optional.absent());
|
||||
private static LinkPreviewState forLinksWithNoPreview() {
|
||||
return new LinkPreviewState(false, true, Optional.absent());
|
||||
}
|
||||
|
||||
private static LinkPreviewState forNoLinks() {
|
||||
return new LinkPreviewState(false, false, Optional.absent());
|
||||
}
|
||||
|
||||
public boolean isLoading() {
|
||||
return isLoading;
|
||||
}
|
||||
|
||||
public boolean hasLinks() {
|
||||
return hasLinks;
|
||||
}
|
||||
|
||||
public Optional<LinkPreview> getLinkPreview() {
|
||||
return linkPreview;
|
||||
}
|
||||
|
||||
boolean hasContent() {
|
||||
return isLoading || hasLinks;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Factory extends ViewModelProvider.NewInstanceFactory {
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package org.thoughtcrime.securesms.linkpreview;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
||||
import org.thoughtcrime.securesms.megaphone.Megaphone;
|
||||
import org.thoughtcrime.securesms.megaphone.MegaphoneActionController;
|
||||
|
||||
public class LinkPreviewsMegaphoneView extends FrameLayout {
|
||||
|
||||
private View yesButton;
|
||||
private View noButton;
|
||||
|
||||
public LinkPreviewsMegaphoneView(Context context) {
|
||||
super(context);
|
||||
initialize(context);
|
||||
}
|
||||
|
||||
public LinkPreviewsMegaphoneView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
initialize(context);
|
||||
}
|
||||
|
||||
private void initialize(@NonNull Context context) {
|
||||
inflate(context, R.layout.link_previews_megaphone, this);
|
||||
|
||||
this.yesButton = findViewById(R.id.linkpreview_megaphone_ok);
|
||||
this.noButton = findViewById(R.id.linkpreview_megaphone_disable);
|
||||
}
|
||||
|
||||
public void present(@NonNull Megaphone megaphone, @NonNull MegaphoneActionController listener) {
|
||||
this.yesButton.setOnClickListener(v -> {
|
||||
SignalStore.settings().setLinkPreviewsEnabled(true);
|
||||
listener.onMegaphoneCompleted(megaphone.getEvent());
|
||||
});
|
||||
|
||||
this.noButton.setOnClickListener(v -> {
|
||||
SignalStore.settings().setLinkPreviewsEnabled(false);
|
||||
listener.onMegaphoneCompleted(megaphone.getEvent());
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user