diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java index 46067a496..c16ca3f29 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java @@ -3,6 +3,7 @@ package org.briarproject.briar.android.blog; import android.content.Context; import android.content.Intent; import android.text.Spanned; +import android.text.util.Linkify; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -170,7 +171,12 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder { // TODO make author clickable #624 text.setText(c.getComment()); - if (fullText) text.setTextIsSelectable(true); + Linkify.addLinks(text, Linkify.WEB_URLS); + text.setMovementMethod(null); + if (fullText) { + text.setTextIsSelectable(true); + makeLinksClickable(text, listener::onLinkClick); + } commentContainer.addView(v); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index f4f31af4b..c85fa50aa 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -66,6 +66,7 @@ import org.briarproject.briar.android.view.TextAttachmentController.AttachmentLi import org.briarproject.briar.android.view.TextInputView; import org.briarproject.briar.android.view.TextSendController; import org.briarproject.briar.android.view.TextSendController.SendState; +import org.briarproject.briar.android.widget.LinkDialogFragment; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.attachment.AttachmentHeader; import org.briarproject.briar.api.autodelete.event.ConversationMessagesDeletedEvent; @@ -476,6 +477,12 @@ public class ConversationActivity extends BriarActivity actionMode = null; } + @Override + public void onLinkClick(String url) { + LinkDialogFragment f = LinkDialogFragment.newInstance(url); + f.show(getSupportFragmentManager(), f.getUniqueTag()); + } + private void addSelectionTracker() { RecyclerView recyclerView = list.getRecyclerView(); if (recyclerView.getAdapter() != adapter) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java index 42fdd03c3..d28ff2a12 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java @@ -1,6 +1,7 @@ package org.briarproject.briar.android.conversation; import android.content.Context; +import android.text.util.Linkify; import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -19,6 +20,7 @@ import static android.view.View.VISIBLE; import static org.briarproject.bramble.util.StringUtils.trim; import static org.briarproject.briar.android.util.UiUtils.formatDate; import static org.briarproject.briar.android.util.UiUtils.formatDuration; +import static org.briarproject.briar.android.util.UiUtils.makeLinksClickable; import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; @UiThread @@ -58,6 +60,8 @@ abstract class ConversationItemViewHolder extends ViewHolder { if (item.getText() != null) { text.setText(trim(item.getText())); + Linkify.addLinks(text, Linkify.WEB_URLS); + makeLinksClickable(text, listener::onLinkClick); } long timestamp = item.getTime(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationListener.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationListener.java index ad392705e..de9b526c7 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationListener.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationListener.java @@ -20,4 +20,6 @@ interface ConversationListener { void onAutoDeleteTimerNoticeClicked(); + void onLinkClick(String url); + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationNoticeViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationNoticeViewHolder.java index 2109b5f57..98abdcab1 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationNoticeViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationNoticeViewHolder.java @@ -1,5 +1,6 @@ package org.briarproject.briar.android.conversation; +import android.text.util.Linkify; import android.view.View; import android.widget.TextView; @@ -13,6 +14,7 @@ import static android.view.View.GONE; import static android.view.View.VISIBLE; import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; import static org.briarproject.bramble.util.StringUtils.trim; +import static org.briarproject.briar.android.util.UiUtils.makeLinksClickable; @UiThread @NotNullByDefault @@ -40,6 +42,8 @@ class ConversationNoticeViewHolder extends ConversationItemViewHolder { } else { msgText.setVisibility(VISIBLE); msgText.setText(trim(text)); + Linkify.addLinks(msgText, Linkify.WEB_URLS); + makeLinksClickable(msgText, listener::onLinkClick); layout.setBackgroundResource(isIncoming() ? R.drawable.notice_in_bottom : R.drawable.notice_out_bottom); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java index cc0b8289f..44742c5c7 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java @@ -13,6 +13,7 @@ import org.briarproject.briar.android.privategroup.memberlist.GroupMemberListAct import org.briarproject.briar.android.privategroup.reveal.RevealContactsActivity; import org.briarproject.briar.android.threaded.ThreadListActivity; import org.briarproject.briar.android.threaded.ThreadListViewModel; +import org.briarproject.briar.android.widget.LinkDialogFragment; import org.briarproject.nullsafety.MethodsNotNullByDefault; import org.briarproject.nullsafety.ParametersNotNullByDefault; @@ -158,6 +159,12 @@ public class GroupActivity extends if (isDissolved != null && !isDissolved) super.onReplyClick(item); } + @Override + public void onLinkClick(String url){ + LinkDialogFragment f = LinkDialogFragment.newInstance(url); + f.show(getSupportFragmentManager(), f.getUniqueTag()); + } + private void setGroupEnabled(boolean enabled) { sendController.setReady(enabled); list.getRecyclerView().setAlpha(enabled ? 1f : 0.5f); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/BaseThreadItemViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/BaseThreadItemViewHolder.java index 3de0b5ce5..fbd784528 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/BaseThreadItemViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/BaseThreadItemViewHolder.java @@ -4,6 +4,7 @@ import android.animation.Animator; import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; import android.content.Context; +import android.text.util.Linkify; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; @@ -20,6 +21,7 @@ import androidx.annotation.UiThread; import androidx.recyclerview.widget.RecyclerView; import static androidx.core.content.ContextCompat.getColor; +import static org.briarproject.briar.android.util.UiUtils.makeLinksClickable; @UiThread @NotNullByDefault @@ -43,6 +45,8 @@ public abstract class BaseThreadItemViewHolder @CallSuper public void bind(I item, ThreadItemListener listener) { textView.setText(StringUtils.trim(item.getText())); + Linkify.addLinks(textView, Linkify.WEB_URLS); + makeLinksClickable(textView, listener::onLinkClick); author.setAuthor(item.getAuthor(), item.getAuthorInfo()); author.setDate(item.getTimestamp()); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java index cca103919..2941cdf94 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java @@ -137,6 +137,7 @@ public class ThreadItemAdapter public interface ThreadItemListener { void onReplyClick(I item); + void onLinkClick(String url); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java index 003061618..1939a5d9b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java @@ -19,6 +19,7 @@ import org.briarproject.briar.android.view.TextSendController; import org.briarproject.briar.android.view.TextSendController.SendListener; import org.briarproject.briar.android.view.TextSendController.SendState; import org.briarproject.briar.android.view.UnreadMessageButton; +import org.briarproject.briar.android.widget.LinkDialogFragment; import org.briarproject.briar.api.attachment.AttachmentHeader; import org.briarproject.nullsafety.MethodsNotNullByDefault; import org.briarproject.nullsafety.ParametersNotNullByDefault; @@ -202,6 +203,12 @@ public abstract class ThreadListActivity diff --git a/briar-android/src/main/res/layout/list_item_conversation_notice_out.xml b/briar-android/src/main/res/layout/list_item_conversation_notice_out.xml index ff473129c..70c7574fa 100644 --- a/briar-android/src/main/res/layout/list_item_conversation_notice_out.xml +++ b/briar-android/src/main/res/layout/list_item_conversation_notice_out.xml @@ -23,6 +23,7 @@ android:background="@drawable/msg_out_top" android:elevation="@dimen/message_bubble_elevation" android:textColor="@color/briar_text_primary_inverse" + android:textColorLink="@color/briar_text_link_inverse" tools:text="This is a long long long message that spans over several lines.\n\nIt ends here." tools:visibility="visible" /> diff --git a/briar-android/src/main/res/layout/list_item_conversation_request.xml b/briar-android/src/main/res/layout/list_item_conversation_request.xml index 9ac5087a0..56468fda0 100644 --- a/briar-android/src/main/res/layout/list_item_conversation_request.xml +++ b/briar-android/src/main/res/layout/list_item_conversation_request.xml @@ -22,6 +22,7 @@ android:background="@drawable/msg_in_top" android:elevation="@dimen/message_bubble_elevation" android:textColor="?android:attr/textColorPrimary" + android:textColorLink="@color/briar_text_link" tools:text="Short message" tools:visibility="visible" /> diff --git a/briar-android/src/main/res/layout/list_item_thread.xml b/briar-android/src/main/res/layout/list_item_thread.xml index a248c5474..8c625d60a 100644 --- a/briar-android/src/main/res/layout/list_item_thread.xml +++ b/briar-android/src/main/res/layout/list_item_thread.xml @@ -114,6 +114,7 @@ android:textColor="?android:attr/textColorPrimary" android:textIsSelectable="true" android:textSize="@dimen/text_size_medium" + android:textColorLink="@color/briar_text_link" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/briar-android/src/main/res/values/color.xml b/briar-android/src/main/res/values/color.xml index 486bd4f4a..5722c8cd0 100644 --- a/briar-android/src/main/res/values/color.xml +++ b/briar-android/src/main/res/values/color.xml @@ -67,6 +67,7 @@ @color/briar_blue_400 + @android:color/white #df000000 @android:color/white #b4ffffff