mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2024-12-22 16:10:31 +00:00
Add replies button to comments
This commit is contained in:
parent
4c709b2c4d
commit
059db6fb31
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user