Add long click copy for urls in group descriptions.

This commit is contained in:
Cody Henthorne 2021-05-19 12:21:19 -04:00
parent f890ae8ddc
commit f490d1f6d2
5 changed files with 18 additions and 16 deletions

View file

@ -1,11 +1,7 @@
package org.thoughtcrime.securesms.conversation;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.graphics.drawable.LayerDrawable;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
@ -13,8 +9,6 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import androidx.core.widget.ImageViewCompat;
import org.signal.core.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.R;
@ -25,6 +19,7 @@ import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
public class ConversationBannerView extends ConstraintLayout {
@ -117,7 +112,7 @@ public class ConversationBannerView extends ConstraintLayout {
}
public void setLinkifyDescription(boolean enable) {
contactDescription.setMovementMethod(enable ? LinkMovementMethod.getInstance() : null);
contactDescription.setMovementMethod(enable ? LongClickMovementMethod.getInstance(getContext()) : null);
}
private static final class FallbackPhotoProvider extends Recipient.FallbackPhotoProvider {

View file

@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.groups.ui.invitesandrequests.joining;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -35,6 +34,7 @@ import org.thoughtcrime.securesms.groups.v2.GroupInviteLinkUrl;
import org.thoughtcrime.securesms.jobs.RetrieveProfileJob;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.BottomSheetUtil;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
import org.thoughtcrime.securesms.util.ThemeUtil;
public final class GroupJoinBottomSheetDialogFragment extends BottomSheetDialogFragment {
@ -158,7 +158,7 @@ public final class GroupJoinBottomSheetDialogFragment extends BottomSheetDialogF
private void updateGroupDescription(@NonNull String name, @NonNull String description) {
groupDescription.setVisibility(View.VISIBLE);
groupDescription.setMovementMethod(LinkMovementMethod.getInstance());
groupDescription.setMovementMethod(LongClickMovementMethod.getInstance(requireContext()));
GroupDescriptionUtil.setText(requireContext(),
groupDescription,
description,

View file

@ -6,7 +6,6 @@ import android.database.Cursor;
import android.graphics.Color;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
@ -65,6 +64,7 @@ import org.thoughtcrime.securesms.util.AsynchronousCallback;
import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.LifecycleCursorWrapper;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.LearnMoreTextView;
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
@ -448,7 +448,7 @@ public class ManageGroupFragment extends LoggingFragment {
private void updateGroupDescription(@NonNull ManageGroupViewModel.Description description) {
if (!TextUtils.isEmpty(description.getDescription()) || (FeatureFlags.groupsV2Description() && description.canEditDescription())) {
groupDescription.setVisibility(View.VISIBLE);
groupDescription.setMovementMethod(LinkMovementMethod.getInstance());
groupDescription.setMovementMethod(LongClickMovementMethod.getInstance(requireContext()));
memberCountUnderAvatar.setVisibility(View.GONE);
} else {
groupDescription.setVisibility(View.GONE);

View file

@ -3,10 +3,8 @@ package org.thoughtcrime.securesms.groups.ui.managegroup.dialogs;
import android.app.Dialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -21,6 +19,7 @@ import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.LiveGroup;
import org.thoughtcrime.securesms.groups.ParcelableGroupId;
import org.thoughtcrime.securesms.groups.v2.GroupDescriptionUtil;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
/**
* Dialog to show a full group description. Information regarding the description can be provided
@ -68,7 +67,7 @@ public final class GroupDescriptionDialog extends DialogFragment {
LiveGroup liveGroup = argumentGroupId != null ? new LiveGroup(argumentGroupId) : null;
descriptionText = dialogView.findViewById(R.id.group_description_dialog_text);
descriptionText.setMovementMethod(LinkMovementMethod.getInstance());
descriptionText.setMovementMethod(LongClickMovementMethod.getInstance(requireContext()));
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext(), R.style.Signal_ThemeOverlay_Dialog_Rounded);
Dialog dialog = builder.setTitle(TextUtils.isEmpty(argumentTitle) ? getString(R.string.GroupDescriptionDialog__group_description) : argumentTitle)

View file

@ -2,9 +2,7 @@ package org.thoughtcrime.securesms.groups.v2;
import android.content.Context;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.TextUtils;
@ -21,6 +19,7 @@ import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil;
import org.thoughtcrime.securesms.util.LongClickCopySpan;
public final class GroupDescriptionUtil {
@ -45,6 +44,15 @@ public final class GroupDescriptionUtil {
Stream.of(descriptionSpannable.getSpans(0, descriptionSpannable.length(), URLSpan.class))
.filterNot(url -> LinkPreviewUtil.isLegalUrl(url.getURL()))
.forEach(descriptionSpannable::removeSpan);
URLSpan[] urlSpans = descriptionSpannable.getSpans(0, descriptionSpannable.length(), URLSpan.class);
for (URLSpan urlSpan : urlSpans) {
int start = descriptionSpannable.getSpanStart(urlSpan);
int end = descriptionSpannable.getSpanEnd(urlSpan);
URLSpan span = new LongClickCopySpan(urlSpan.getURL());
descriptionSpannable.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}