Update link preview settings and add some UI polish.

This commit is contained in:
Greyson Parrelli
2020-08-13 13:50:38 -04:00
parent 676356e800
commit ace1b8ee71
20 changed files with 336 additions and 37 deletions

View File

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

View File

@@ -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 {

View File

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