diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationBannerView.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationBannerView.java index 7d4562160f..26282b0b4c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationBannerView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationBannerView.java @@ -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 { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java index 90df28c487..bcb83c3d32 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java @@ -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, diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java index a4b018e019..211030a395 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupDescriptionDialog.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupDescriptionDialog.java index 5ec6251818..d506000f2d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupDescriptionDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupDescriptionDialog.java @@ -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) diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/GroupDescriptionUtil.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/GroupDescriptionUtil.java index 03a3b53e61..c3a0d527bc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/GroupDescriptionUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/GroupDescriptionUtil.java @@ -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); + } } }