1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2024-12-23 00:20:32 +00:00

Add replies button to comments

This commit is contained in:
Stypox 2023-04-11 14:56:04 +02:00
parent 4c709b2c4d
commit 059db6fb31
No known key found for this signature in database
GPG Key ID: 4BDF1B40A49FDD23
4 changed files with 74 additions and 29 deletions

View File

@ -9,6 +9,7 @@ import android.text.style.URLSpan;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
@ -57,15 +58,20 @@ public class CommentInfoItemHolder extends InfoItemHolder {
private final RelativeLayout itemRoot; private final RelativeLayout itemRoot;
private final ImageView itemThumbnailView; private final ImageView itemThumbnailView;
private final TextView itemContentView; private final TextView itemContentView;
private final ImageView itemThumbsUpView;
private final TextView itemLikesCountView; private final TextView itemLikesCountView;
private final TextView itemTitleView; private final TextView itemTitleView;
private final ImageView itemHeartView; private final ImageView itemHeartView;
private final ImageView itemPinnedView; private final ImageView itemPinnedView;
private final Button repliesButton;
private final CompositeDisposable disposables = new CompositeDisposable(); private final CompositeDisposable disposables = new CompositeDisposable();
@Nullable private Description commentText; @Nullable
@Nullable private StreamingService streamService; private Description commentText;
@Nullable private String streamUrl; @Nullable
private StreamingService streamService;
@Nullable
private String streamUrl;
public CommentInfoItemHolder(final InfoItemBuilder infoItemBuilder, public CommentInfoItemHolder(final InfoItemBuilder infoItemBuilder,
final ViewGroup parent) { final ViewGroup parent) {
@ -74,10 +80,12 @@ public class CommentInfoItemHolder extends InfoItemHolder {
itemRoot = itemView.findViewById(R.id.itemRoot); itemRoot = itemView.findViewById(R.id.itemRoot);
itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView); itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView);
itemContentView = itemView.findViewById(R.id.itemCommentContentView); itemContentView = itemView.findViewById(R.id.itemCommentContentView);
itemThumbsUpView = itemView.findViewById(R.id.detail_thumbs_up_img_view);
itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view); itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view);
itemTitleView = itemView.findViewById(R.id.itemTitleView); itemTitleView = itemView.findViewById(R.id.itemTitleView);
itemHeartView = itemView.findViewById(R.id.detail_heart_image_view); itemHeartView = itemView.findViewById(R.id.detail_heart_image_view);
itemPinnedView = itemView.findViewById(R.id.detail_pinned_view); itemPinnedView = itemView.findViewById(R.id.detail_pinned_view);
repliesButton = itemView.findViewById(R.id.replies_button);
commentHorizontalPadding = (int) infoItemBuilder.getContext() commentHorizontalPadding = (int) infoItemBuilder.getContext()
.getResources().getDimension(R.dimen.comments_horizontal_padding); .getResources().getDimension(R.dimen.comments_horizontal_padding);
@ -97,6 +105,8 @@ public class CommentInfoItemHolder extends InfoItemHolder {
} }
final CommentsInfoItem item = (CommentsInfoItem) infoItem; final CommentsInfoItem item = (CommentsInfoItem) infoItem;
// load the author avatar
PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(itemThumbnailView); PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(itemThumbnailView);
if (ImageStrategy.shouldLoadImages()) { if (ImageStrategy.shouldLoadImages()) {
itemThumbnailView.setVisibility(View.VISIBLE); itemThumbnailView.setVisibility(View.VISIBLE);
@ -109,6 +119,10 @@ public class CommentInfoItemHolder extends InfoItemHolder {
} }
itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item)); itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item));
// setup the top row, with pinned icon, author name and comment date
itemPinnedView.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE);
final String uploadDate; final String uploadDate;
if (item.getUploadDate() != null) { if (item.getUploadDate() != null) {
uploadDate = Localization.relativeTime(item.getUploadDate().offsetDateTime()); uploadDate = Localization.relativeTime(item.getUploadDate().offsetDateTime());
@ -117,9 +131,29 @@ public class CommentInfoItemHolder extends InfoItemHolder {
} }
itemTitleView.setText(Localization.concatenateStrings(item.getUploaderName(), uploadDate)); itemTitleView.setText(Localization.concatenateStrings(item.getUploaderName(), uploadDate));
itemPinnedView.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE);
// setup bottom row, with likes, heart and replies button
if (item.getLikeCount() >= 0) {
itemLikesCountView.setText(
Localization.shortCount(
itemBuilder.getContext(),
item.getLikeCount()));
} else {
itemLikesCountView.setText("-");
}
itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE); itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE);
final boolean hasReplies = item.getReplies() != null;
repliesButton.setOnClickListener(hasReplies ? (v) -> openRepliesFragment() : null);
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
try { try {
streamService = NewPipe.getService(item.getServiceId()); streamService = NewPipe.getService(item.getServiceId());
} catch (final ExtractionException e) { } catch (final ExtractionException e) {
@ -135,16 +169,6 @@ public class CommentInfoItemHolder extends InfoItemHolder {
//noinspection ClickableViewAccessibility //noinspection ClickableViewAccessibility
itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE); itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE);
if (item.getLikeCount() >= 0) {
itemLikesCountView.setText(
Localization.shortCount(
itemBuilder.getContext(),
item.getLikeCount()));
} else {
itemLikesCountView.setText("-");
}
itemView.setOnClickListener(view -> { itemView.setOnClickListener(view -> {
toggleEllipsize(); toggleEllipsize();
if (itemBuilder.getOnCommentsSelectedListener() != null) { if (itemBuilder.getOnCommentsSelectedListener() != null) {
@ -278,4 +302,8 @@ public class CommentInfoItemHolder extends InfoItemHolder {
onCompletion); onCompletion);
} }
} }
private void openRepliesFragment() {
// TODO
}
} }

View File

@ -209,6 +209,11 @@ public final class Localization {
deletedCount, shortCount(context, deletedCount)); deletedCount, shortCount(context, deletedCount));
} }
public static String replyCount(final Context context, final int replyCount) {
return getQuantity(context, R.plurals.replies, 0, replyCount,
String.valueOf(replyCount));
}
public static String getDurationString(final long duration) { public static String getDurationString(final long duration) {
final String output; final String output;

View File

@ -16,7 +16,6 @@
android:layout_height="42dp" android:layout_height="42dp"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_marginStart="3dp"
android:layout_marginEnd="@dimen/comment_item_avatar_right_margin" android:layout_marginEnd="@dimen/comment_item_avatar_right_margin"
android:focusable="false" android:focusable="false"
android:src="@drawable/placeholder_person" android:src="@drawable/placeholder_person"
@ -31,39 +30,37 @@
android:layout_marginEnd="@dimen/video_item_detail_pinned_right_margin" android:layout_marginEnd="@dimen/video_item_detail_pinned_right_margin"
android:layout_toEndOf="@+id/itemThumbnailView" android:layout_toEndOf="@+id/itemThumbnailView"
android:contentDescription="@string/detail_pinned_comment_view_description" android:contentDescription="@string/detail_pinned_comment_view_description"
android:src="@drawable/ic_pin" android:src="@drawable/ic_pin" />
android:visibility="gone"
tools:visibility="visible" />
<org.schabi.newpipe.views.NewPipeTextView <org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemTitleView" android:id="@+id/itemTitleView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_marginBottom="@dimen/video_item_search_image_right_margin"
android:layout_toEndOf="@+id/detail_pinned_view" android:layout_toEndOf="@+id/detail_pinned_view"
android:ellipsize="end" android:ellipsize="end"
android:lines="1" android:lines="1"
android:textAppearance="?android:attr/textAppearanceSmall" android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="@dimen/comment_item_title_text_size" android:textSize="@dimen/comment_item_title_text_size"
tools:text="Author Name, Lorem ipsum · 5 months ago" /> tools:text="Author Name, Lorem ipsum 5 months ago" />
<org.schabi.newpipe.views.NewPipeTextView <org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemCommentContentView" android:id="@+id/itemCommentContentView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/itemTitleView" android:layout_below="@id/itemTitleView"
android:layout_marginBottom="@dimen/channel_item_description_to_details_margin" android:layout_marginTop="6dp"
android:layout_toEndOf="@+id/itemThumbnailView" android:layout_toEndOf="@+id/itemThumbnailView"
android:textAppearance="?android:attr/textAppearanceLarge" android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="@dimen/comment_item_content_text_size" android:textSize="@dimen/comment_item_content_text_size"
tools:text="Comment Content, 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" /> tools:text="@tools:sample/lorem/random[1]" />
<ImageView <ImageView
android:id="@+id/detail_thumbs_up_img_view" android:id="@+id/detail_thumbs_up_img_view"
android:layout_width="@dimen/video_item_detail_like_image_width" android:layout_width="@dimen/video_item_detail_like_image_width"
android:layout_height="@dimen/video_item_detail_like_image_height" android:layout_height="@dimen/video_item_detail_like_image_height"
android:layout_below="@id/itemCommentContentView" android:layout_below="@id/itemCommentContentView"
android:layout_alignBottom="@+id/replies_button"
android:layout_toEndOf="@+id/itemThumbnailView" android:layout_toEndOf="@+id/itemThumbnailView"
android:contentDescription="@string/detail_likes_img_view_description" android:contentDescription="@string/detail_likes_img_view_description"
android:src="@drawable/ic_thumb_up" /> android:src="@drawable/ic_thumb_up" />
@ -71,26 +68,37 @@
<org.schabi.newpipe.views.NewPipeTextView <org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_up_count_view" android:id="@+id/detail_thumbs_up_count_view"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height" android:layout_height="wrap_content"
android:layout_below="@id/itemCommentContentView" android:layout_alignTop="@id/detail_thumbs_up_img_view"
android:layout_alignBottom="@id/detail_thumbs_up_img_view"
android:layout_marginStart="@dimen/video_item_detail_like_margin" android:layout_marginStart="@dimen/video_item_detail_like_margin"
android:layout_toEndOf="@id/detail_thumbs_up_img_view" android:layout_toEndOf="@id/detail_thumbs_up_img_view"
android:gravity="center"
android:lines="1" android:lines="1"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="@dimen/video_item_detail_likes_text_size" android:textSize="@dimen/video_item_detail_likes_text_size"
tools:ignore="RtlHardcoded"
tools:text="12M" /> tools:text="12M" />
<ImageView <ImageView
android:id="@+id/detail_heart_image_view" android:id="@+id/detail_heart_image_view"
android:layout_width="@dimen/video_item_detail_heart_image_size" android:layout_width="@dimen/video_item_detail_heart_image_size"
android:layout_height="@dimen/video_item_detail_heart_image_size" android:layout_height="@dimen/video_item_detail_heart_image_size"
android:layout_below="@id/itemCommentContentView" android:layout_alignTop="@id/detail_thumbs_up_img_view"
android:layout_alignBottom="@id/detail_thumbs_up_img_view"
android:layout_marginStart="@dimen/video_item_detail_heart_margin" android:layout_marginStart="@dimen/video_item_detail_heart_margin"
android:layout_toEndOf="@+id/detail_thumbs_up_count_view" android:layout_toEndOf="@+id/detail_thumbs_up_count_view"
android:contentDescription="@string/detail_heart_img_view_description" android:contentDescription="@string/detail_heart_img_view_description"
android:src="@drawable/ic_heart" android:src="@drawable/ic_heart" />
android:visibility="gone"
tools:visibility="visible" /> <Button
android:id="@+id/replies_button"
style="?android:attr/borderlessButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/itemCommentContentView"
android:layout_alignParentEnd="true"
android:layout_marginStart="@dimen/video_item_detail_heart_margin"
android:minHeight="0dp"
tools:text="543 replies" />
</RelativeLayout> </RelativeLayout>

View File

@ -838,4 +838,8 @@
<string name="share_playlist_with_list">Share URL list</string> <string name="share_playlist_with_list">Share URL list</string>
<string name="video_details_list_item">- %1$s: %2$s</string> <string name="video_details_list_item">- %1$s: %2$s</string>
<string name="share_playlist_content_details">%1$s\n%2$s</string> <string name="share_playlist_content_details">%1$s\n%2$s</string>
<plurals name="replies">
<item quantity="one">%s reply</item>
<item quantity="other">%s replies</item>
</plurals>
</resources> </resources>