From c0004e988a64b241a916b83370ab16290ff83f59 Mon Sep 17 00:00:00 2001
From: Ritvik Saraf <13ritvik@gmail.com>
Date: Fri, 1 Mar 2019 13:28:32 +0530
Subject: [PATCH] make links in comments clickable, increase text size
---
.../holder/CommentsMiniInfoItemHolder.java | 57 ++++++++++++-----
.../util/CommentTextOnTouchListener.java | 62 +++++++++++++++++++
.../main/res/layout/list_comments_item.xml | 6 +-
.../res/layout/list_comments_mini_item.xml | 4 +-
app/src/main/res/values/dimens.xml | 4 ++
5 files changed, 111 insertions(+), 22 deletions(-)
create mode 100644 app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java
diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java
index c2bc86691..0e6321f35 100644
--- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java
+++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java
@@ -1,7 +1,7 @@
package org.schabi.newpipe.info_list.holder;
import android.support.v7.app.AppCompatActivity;
-import android.text.TextUtils;
+import android.text.util.Linkify;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
@@ -11,6 +11,7 @@ import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.comments.CommentsInfoItem;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.report.ErrorActivity;
+import org.schabi.newpipe.util.CommentTextOnTouchListener;
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.NavigationHelper;
@@ -26,6 +27,9 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
private static final int commentDefaultLines = 2;
private static final int commentExpandedLines = 1000;
+ private String commentText;
+ private boolean containsLinks = false;
+
CommentsMiniInfoItemHolder(InfoItemBuilder infoItemBuilder, int layoutId, ViewGroup parent) {
super(infoItemBuilder, layoutId, parent);
@@ -66,34 +70,57 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
}
});
- // ellipsize if not already ellipsized
- if (null == itemContentView.getEllipsize()) {
- itemContentView.setEllipsize(TextUtils.TruncateAt.END);
- itemContentView.setMaxLines(commentDefaultLines);
+ itemContentView.setMaxLines(commentDefaultLines);
+ commentText = item.getCommentText();
+ itemContentView.setText(commentText);
+ containsLinks = linkify();
+ itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE);
+
+ if(itemContentView.getLineCount() == 0){
+ itemContentView.post(() -> ellipsize());
+ }else{
+ ellipsize();
}
- itemContentView.setText(item.getCommentText());
if (null != item.getLikeCount()) {
itemLikesCountView.setText(String.valueOf(item.getLikeCount()));
}
itemPublishedTime.setText(item.getPublishedTime());
itemView.setOnClickListener(view -> {
- toggleEllipsize(item.getCommentText());
+ toggleEllipsize();
if (itemBuilder.getOnCommentsSelectedListener() != null) {
itemBuilder.getOnCommentsSelectedListener().selected(item);
}
});
}
- private void toggleEllipsize(String text) {
- // toggle ellipsize
- if (null == itemContentView.getEllipsize()) {
- itemContentView.setEllipsize(TextUtils.TruncateAt.END);
- itemContentView.setMaxLines(commentDefaultLines);
- } else {
- itemContentView.setEllipsize(null);
- itemContentView.setMaxLines(commentExpandedLines);
+ private void ellipsize() {
+ if (itemContentView.getLineCount() > commentDefaultLines){
+ int endOfLastLine = itemContentView.getLayout().getLineEnd(commentDefaultLines - 1);
+ String newVal = itemContentView.getText().subSequence(0, endOfLastLine - 3) + "...";
+ itemContentView.setText(newVal);
+ if(containsLinks) linkify();
}
}
+
+ private void toggleEllipsize() {
+ if (itemContentView.getText().toString().equals(commentText)) {
+ ellipsize();
+ } else {
+ expand();
+ }
+ }
+
+ private void expand() {
+ itemContentView.setMaxLines(commentExpandedLines);
+ itemContentView.setText(commentText);
+ if(containsLinks) linkify();
+ }
+
+ private boolean linkify(){
+ boolean res = Linkify.addLinks(itemContentView, Linkify.WEB_URLS);
+ itemContentView.setMovementMethod(null);
+ return res;
+ }
}
diff --git a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java b/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java
new file mode 100644
index 000000000..2934145ff
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java
@@ -0,0 +1,62 @@
+package org.schabi.newpipe.util;
+
+import android.text.Layout;
+import android.text.Selection;
+import android.text.Spannable;
+import android.text.Spanned;
+import android.text.style.ClickableSpan;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.TextView;
+
+public class CommentTextOnTouchListener implements View.OnTouchListener {
+
+ public static final CommentTextOnTouchListener INSTANCE = new CommentTextOnTouchListener();
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if(!(v instanceof TextView)){
+ return false;
+ }
+ TextView widget = (TextView) v;
+ Object text = widget.getText();
+ if (text instanceof Spanned) {
+ Spannable buffer = (Spannable) text;
+
+ int action = event.getAction();
+
+ if (action == MotionEvent.ACTION_UP
+ || action == MotionEvent.ACTION_DOWN) {
+ int x = (int) event.getX();
+ int y = (int) event.getY();
+
+ x -= widget.getTotalPaddingLeft();
+ y -= widget.getTotalPaddingTop();
+
+ x += widget.getScrollX();
+ y += widget.getScrollY();
+
+ Layout layout = widget.getLayout();
+ int line = layout.getLineForVertical(y);
+ int off = layout.getOffsetForHorizontal(line, x);
+
+ ClickableSpan[] link = buffer.getSpans(off, off,
+ ClickableSpan.class);
+
+ if (link.length != 0) {
+ if (action == MotionEvent.ACTION_UP) {
+ link[0].onClick(widget);
+ } else if (action == MotionEvent.ACTION_DOWN) {
+ Selection.setSelection(buffer,
+ buffer.getSpanStart(link[0]),
+ buffer.getSpanEnd(link[0]));
+ }
+ return true;
+ }
+ }
+
+ }
+
+ return false;
+ }
+}
diff --git a/app/src/main/res/layout/list_comments_item.xml b/app/src/main/res/layout/list_comments_item.xml
index a9b091329..393d7d1b4 100644
--- a/app/src/main/res/layout/list_comments_item.xml
+++ b/app/src/main/res/layout/list_comments_item.xml
@@ -32,7 +32,7 @@
android:ellipsize="end"
android:lines="1"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textSize="@dimen/video_item_search_title_text_size"
+ android:textSize="@dimen/comment_item_title_text_size"
tools:text="Author Name, Lorem ipsum" />
diff --git a/app/src/main/res/layout/list_comments_mini_item.xml b/app/src/main/res/layout/list_comments_mini_item.xml
index 36f3e2e6e..3f3c6c468 100644
--- a/app/src/main/res/layout/list_comments_mini_item.xml
+++ b/app/src/main/res/layout/list_comments_mini_item.xml
@@ -27,10 +27,8 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/channel_item_description_to_details_margin"
android:layout_toRightOf="@+id/itemThumbnailView"
- android:ellipsize="end"
- android:lines="2"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textSize="@dimen/video_item_search_uploader_text_size"
+ android:textSize="@dimen/comment_item_content_text_size"
tools:text="Channel description, Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blandit" />
14sp
+
+
+ 12sp
+ 12sp