NewPipe-app-android/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java

189 lines
7.5 KiB
Java
Raw Normal View History

2018-09-03 01:22:59 +02:00
package org.schabi.newpipe.info_list.holder;
import static org.schabi.newpipe.util.ServiceHelper.getServiceById;
2023-02-10 06:40:43 +01:00
import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan;
import android.view.View;
2018-09-03 01:22:59 +02:00
import android.view.ViewGroup;
2023-04-11 14:56:04 +02:00
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
2018-09-03 01:22:59 +02:00
import android.widget.TextView;
2023-12-22 18:50:48 +01:00
import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;
2018-09-03 01:22:59 +02:00
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.comments.CommentsInfoItem;
import org.schabi.newpipe.info_list.InfoItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.Localization;
2018-09-03 01:22:59 +02:00
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import org.schabi.newpipe.util.image.ImageStrategy;
2023-05-02 11:08:32 +02:00
import org.schabi.newpipe.util.image.PicassoHelper;
import org.schabi.newpipe.util.text.CommentTextOnTouchListener;
import org.schabi.newpipe.util.text.TextEllipsizer;
2019-03-02 00:42:06 +01:00
public class CommentInfoItemHolder extends InfoItemHolder {
private static final int COMMENT_DEFAULT_LINES = 2;
private final int commentHorizontalPadding;
private final int commentVerticalPadding;
2023-01-15 14:57:34 +01:00
private final RelativeLayout itemRoot;
2022-09-06 05:50:52 +02:00
private final ImageView itemThumbnailView;
2018-09-03 01:22:59 +02:00
private final TextView itemContentView;
2023-04-11 14:56:04 +02:00
private final ImageView itemThumbsUpView;
2018-09-03 01:22:59 +02:00
private final TextView itemLikesCountView;
private final TextView itemTitleView;
private final ImageView itemHeartView;
private final ImageView itemPinnedView;
2023-04-11 14:56:04 +02:00
private final Button repliesButton;
2018-09-03 01:22:59 +02:00
@NonNull
private final TextEllipsizer textEllipsizer;
2019-03-02 00:42:06 +01:00
public CommentInfoItemHolder(final InfoItemBuilder infoItemBuilder,
final ViewGroup parent) {
super(infoItemBuilder, R.layout.list_comment_item, parent);
2018-09-03 01:22:59 +02:00
itemRoot = itemView.findViewById(R.id.itemRoot);
2018-09-03 01:22:59 +02:00
itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView);
2018-12-07 02:15:33 +01:00
itemContentView = itemView.findViewById(R.id.itemCommentContentView);
2023-04-11 14:56:04 +02:00
itemThumbsUpView = itemView.findViewById(R.id.detail_thumbs_up_img_view);
itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view);
itemTitleView = itemView.findViewById(R.id.itemTitleView);
itemHeartView = itemView.findViewById(R.id.detail_heart_image_view);
itemPinnedView = itemView.findViewById(R.id.detail_pinned_view);
2023-04-11 14:56:04 +02:00
repliesButton = itemView.findViewById(R.id.replies_button);
commentHorizontalPadding = (int) infoItemBuilder.getContext()
.getResources().getDimension(R.dimen.comments_horizontal_padding);
commentVerticalPadding = (int) infoItemBuilder.getContext()
.getResources().getDimension(R.dimen.comments_vertical_padding);
textEllipsizer = new TextEllipsizer(itemContentView, COMMENT_DEFAULT_LINES, null);
textEllipsizer.setStateChangeListener(isEllipsized -> {
if (Boolean.TRUE.equals(isEllipsized)) {
denyLinkFocus();
} else {
determineMovementMethod();
}
});
2018-09-03 01:22:59 +02:00
}
@Override
public void updateFromItem(final InfoItem infoItem,
final HistoryRecordManager historyRecordManager) {
if (!(infoItem instanceof CommentsInfoItem)) {
return;
}
2018-09-03 01:22:59 +02:00
final CommentsInfoItem item = (CommentsInfoItem) infoItem;
2023-04-11 14:56:04 +02:00
// load the author avatar
PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(itemThumbnailView);
if (ImageStrategy.shouldLoadImages()) {
itemThumbnailView.setVisibility(View.VISIBLE);
itemRoot.setPadding(commentVerticalPadding, commentVerticalPadding,
commentVerticalPadding, commentVerticalPadding);
} else {
itemThumbnailView.setVisibility(View.GONE);
itemRoot.setPadding(commentHorizontalPadding, commentVerticalPadding,
commentHorizontalPadding, commentVerticalPadding);
}
itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item));
2023-04-11 14:56:04 +02:00
// setup the top row, with pinned icon, author name and comment date
itemPinnedView.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE);
itemTitleView.setText(Localization.concatenateStrings(item.getUploaderName(),
Localization.relativeTimeOrTextual(itemBuilder.getContext(), item.getUploadDate(),
item.getTextualUploadDate())));
2023-04-11 14:56:04 +02:00
// setup bottom row, with likes, heart and replies button
itemLikesCountView.setText(
Localization.likeCount(itemBuilder.getContext(), item.getLikeCount()));
2023-04-11 14:56:04 +02:00
itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE);
2018-09-03 01:22:59 +02:00
2023-04-11 14:56:04 +02:00
final boolean hasReplies = item.getReplies() != null;
repliesButton.setOnClickListener(hasReplies ? v -> openCommentReplies(item) : null);
2023-04-11 14:56:04 +02:00
repliesButton.setVisibility(hasReplies ? View.VISIBLE : View.GONE);
repliesButton.setText(hasReplies
? Localization.replyCount(itemBuilder.getContext(), item.getReplyCount()) : "");
((RelativeLayout.LayoutParams) itemThumbsUpView.getLayoutParams()).topMargin =
hasReplies ? 0 : DeviceUtils.dpToPx(6, itemBuilder.getContext());
// setup comment content and click listeners to expand/ellipsize it
textEllipsizer.setStreamingService(getServiceById(item.getServiceId()));
textEllipsizer.setStreamUrl(item.getUrl());
textEllipsizer.setContent(item.getCommentText());
textEllipsizer.ellipsize();
//noinspection ClickableViewAccessibility
itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE);
2018-12-07 02:15:33 +01:00
2018-09-03 01:22:59 +02:00
itemView.setOnClickListener(view -> {
textEllipsizer.toggle();
2018-09-03 01:22:59 +02:00
if (itemBuilder.getOnCommentsSelectedListener() != null) {
itemBuilder.getOnCommentsSelectedListener().selected(item);
}
});
itemView.setOnLongClickListener(view -> {
2020-07-21 00:43:49 +02:00
if (DeviceUtils.isTv(itemBuilder.getContext())) {
openCommentAuthor(item);
2020-06-11 18:36:05 +02:00
} else {
2023-02-10 06:40:43 +01:00
final CharSequence text = itemContentView.getText();
if (text != null) {
ShareUtils.copyToClipboard(itemBuilder.getContext(), text.toString());
}
2020-02-04 13:31:39 +01:00
}
return true;
2020-02-04 13:31:39 +01:00
});
}
2023-12-22 18:50:48 +01:00
private void openCommentAuthor(@NonNull final CommentsInfoItem item) {
NavigationHelper.openCommentAuthorIfPresent((FragmentActivity) itemBuilder.getContext(),
item);
}
2023-12-22 18:50:48 +01:00
private void openCommentReplies(@NonNull final CommentsInfoItem item) {
NavigationHelper.openCommentRepliesFragment((FragmentActivity) itemBuilder.getContext(),
item);
2018-09-03 01:22:59 +02:00
}
private void allowLinkFocus() {
2019-11-14 14:51:35 +01:00
itemContentView.setMovementMethod(LinkMovementMethod.getInstance());
}
private void denyLinkFocus() {
itemContentView.setMovementMethod(null);
}
private boolean shouldFocusLinks() {
if (itemView.isInTouchMode()) {
2019-11-14 14:51:35 +01:00
return false;
}
2020-08-16 10:24:58 +02:00
final URLSpan[] urls = itemContentView.getUrls();
2019-11-14 14:51:35 +01:00
return urls != null && urls.length != 0;
}
private void determineMovementMethod() {
2019-11-14 14:51:35 +01:00
if (shouldFocusLinks()) {
allowLinkFocus();
} else {
denyLinkFocus();
}
}
2018-09-03 01:22:59 +02:00
}