From 66e999fa8521af8dcc5656a52d38f0c15059b08f Mon Sep 17 00:00:00 2001 From: golfinq Date: Wed, 13 Oct 2021 19:26:08 -0400 Subject: [PATCH 1/6] Added "Show Replies" --- .../holder/CommentsInfoItemHolder.java | 38 +++++++++++++++++++ .../main/res/layout/list_comments_item.xml | 34 ++++++++++++++++- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java index fb144574acf..f82c3883dbc 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java @@ -5,12 +5,19 @@ import android.widget.ImageView; import android.widget.TextView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + 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.info_list.InfoListAdapter; import org.schabi.newpipe.local.history.HistoryRecordManager; +import java.util.List; +import java.util.Objects; + /* * Created by Christian Schabesberger on 12.02.17. * @@ -35,11 +42,34 @@ public class CommentsInfoItemHolder extends CommentsMiniInfoItemHolder { public final TextView itemTitleView; private final ImageView itemHeartView; + private final TextView showReplies; + private final RecyclerView repliesView; + public CommentsInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) { super(infoItemBuilder, R.layout.list_comments_item, parent); itemTitleView = itemView.findViewById(R.id.itemTitleView); itemHeartView = itemView.findViewById(R.id.detail_heart_image_view); + + showReplies = itemView.findViewById(R.id.showReplies); + repliesView = itemView.findViewById(R.id.replyRecycleView); + repliesView.setAdapter(new InfoListAdapter(repliesView.getContext())); + repliesView.setLayoutManager(new LinearLayoutManager(repliesView.getContext())); + } + + public void addReplies(final View buttonView, final CommentsInfoItem comment) { + + final List replies = comment.getRepliesInfoList(); + ((InfoListAdapter) Objects.requireNonNull(repliesView.getAdapter())) + .setInfoItemList(replies); + + final ViewGroup.MarginLayoutParams params = + (ViewGroup.MarginLayoutParams) repliesView.getLayoutParams(); + params.topMargin = 45; + + repliesView.setMinimumHeight(100); + repliesView.setHasFixedSize(true); + buttonView.setVisibility(View.GONE); } @Override @@ -55,5 +85,13 @@ public void updateFromItem(final InfoItem infoItem, itemTitleView.setText(item.getUploaderName()); itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE); + + if (item.getReplies() == null) { + showReplies.setVisibility(View.GONE); + } else { + showReplies.setVisibility(View.VISIBLE); + showReplies.setOnClickListener(v -> addReplies(v, item)); + } + } } diff --git a/app/src/main/res/layout/list_comments_item.xml b/app/src/main/res/layout/list_comments_item.xml index fb526aa0639..92f35635a44 100644 --- a/app/src/main/res/layout/list_comments_item.xml +++ b/app/src/main/res/layout/list_comments_item.xml @@ -80,8 +80,8 @@ android:layout_toRightOf="@+id/detail_thumbs_up_count_view" android:contentDescription="@string/detail_heart_img_view_description" android:visibility="gone" - tools:visibility="visible" - app:srcCompat="@drawable/ic_heart" /> + app:srcCompat="@drawable/ic_heart" + tools:visibility="visible" /> @@ -123,4 +123,34 @@ android:textSize="@dimen/video_item_search_upload_date_text_size" tools:text="1 year ago" /> + + + + + + From ead685e76c0325af6bf09b9b60bb8c1f6543065d Mon Sep 17 00:00:00 2001 From: golfinq Date: Thu, 14 Oct 2021 07:44:50 -0400 Subject: [PATCH 2/6] Changed "Show Replies" to Resource --- app/src/main/res/layout/list_comments_item.xml | 6 +++--- app/src/main/res/values-en-rGB/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/list_comments_item.xml b/app/src/main/res/layout/list_comments_item.xml index 92f35635a44..0a8bb8c282f 100644 --- a/app/src/main/res/layout/list_comments_item.xml +++ b/app/src/main/res/layout/list_comments_item.xml @@ -80,8 +80,8 @@ android:layout_toRightOf="@+id/detail_thumbs_up_count_view" android:contentDescription="@string/detail_heart_img_view_description" android:visibility="gone" - app:srcCompat="@drawable/ic_heart" - tools:visibility="visible" /> + tools:visibility="visible" + app:srcCompat="@drawable/ic_heart" /> @@ -135,7 +135,7 @@ android:layout_marginEnd="0sp" android:layout_marginBottom="0sp" android:layout_toEndOf="@+id/itemPublishedTime" - android:text="Show Replies" + android:text="@string/show_replies" android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textSize="@dimen/video_item_search_upload_date_text_size" /> diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 2fc6954fd25..8a05ab56f5e 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -79,4 +79,5 @@ Published on %1$s Report this error via e-mail Select your favorite night theme – %s + Show Replies \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 897ec0af8b3..09ded2e7d48 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -704,4 +704,5 @@ Error at Show Channel Details Loading Channel Details… + Show Replies From f6f7994a14cad559401ae34b70369a2c811242e1 Mon Sep 17 00:00:00 2001 From: golfinq Date: Thu, 14 Oct 2021 22:51:52 -0400 Subject: [PATCH 3/6] Remove redundant string resource Co-authored-by: Mohammed Anas --- app/src/main/res/values-en-rGB/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 8a05ab56f5e..2fc6954fd25 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -79,5 +79,4 @@ Published on %1$s Report this error via e-mail Select your favorite night theme – %s - Show Replies \ No newline at end of file From b11d62fc85dfb88342846ca83188884da051df02 Mon Sep 17 00:00:00 2001 From: golfinq Date: Fri, 15 Oct 2021 00:29:22 -0400 Subject: [PATCH 4/6] Fixed behavior when scrolling --- .../newpipe/info_list/holder/CommentsInfoItemHolder.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java index f82c3883dbc..d67487076b3 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java @@ -69,7 +69,9 @@ public void addReplies(final View buttonView, final CommentsInfoItem comment) { repliesView.setMinimumHeight(100); repliesView.setHasFixedSize(true); + comment.setRepliesOpen(true); buttonView.setVisibility(View.GONE); + repliesView.setVisibility(View.VISIBLE); } @Override @@ -87,8 +89,12 @@ public void updateFromItem(final InfoItem infoItem, itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE); if (item.getReplies() == null) { + repliesView.setVisibility(View.GONE); showReplies.setVisibility(View.GONE); + } else if (item.getRepliesOpen()) { + addReplies(showReplies, item); } else { + repliesView.setVisibility(View.GONE); showReplies.setVisibility(View.VISIBLE); showReplies.setOnClickListener(v -> addReplies(v, item)); } From 8d306939a4199bd078f14bbe082c8740986fdfda Mon Sep 17 00:00:00 2001 From: golfinq Date: Wed, 20 Oct 2021 05:41:58 -0400 Subject: [PATCH 5/6] Moved downloading and reply code to new class --- .../holder/CommentsInfoItemHolder.java | 45 +------ .../info_list/holder/RepliesHandler.java | 122 ++++++++++++++++++ 2 files changed, 127 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/info_list/holder/RepliesHandler.java diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java index d67487076b3..9fe4b543d4f 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java @@ -5,19 +5,14 @@ import android.widget.ImageView; import android.widget.TextView; -import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; 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.info_list.InfoListAdapter; import org.schabi.newpipe.local.history.HistoryRecordManager; -import java.util.List; -import java.util.Objects; - /* * Created by Christian Schabesberger on 12.02.17. * @@ -41,9 +36,7 @@ public class CommentsInfoItemHolder extends CommentsMiniInfoItemHolder { public final TextView itemTitleView; private final ImageView itemHeartView; - - private final TextView showReplies; - private final RecyclerView repliesView; + private final RepliesHandler repliesHandler; public CommentsInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) { super(infoItemBuilder, R.layout.list_comments_item, parent); @@ -51,27 +44,9 @@ public CommentsInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewG itemTitleView = itemView.findViewById(R.id.itemTitleView); itemHeartView = itemView.findViewById(R.id.detail_heart_image_view); - showReplies = itemView.findViewById(R.id.showReplies); - repliesView = itemView.findViewById(R.id.replyRecycleView); - repliesView.setAdapter(new InfoListAdapter(repliesView.getContext())); - repliesView.setLayoutManager(new LinearLayoutManager(repliesView.getContext())); - } - - public void addReplies(final View buttonView, final CommentsInfoItem comment) { - - final List replies = comment.getRepliesInfoList(); - ((InfoListAdapter) Objects.requireNonNull(repliesView.getAdapter())) - .setInfoItemList(replies); - - final ViewGroup.MarginLayoutParams params = - (ViewGroup.MarginLayoutParams) repliesView.getLayoutParams(); - params.topMargin = 45; - - repliesView.setMinimumHeight(100); - repliesView.setHasFixedSize(true); - comment.setRepliesOpen(true); - buttonView.setVisibility(View.GONE); - repliesView.setVisibility(View.VISIBLE); + final TextView showReplies = itemView.findViewById(R.id.showReplies); + final RecyclerView repliesView = itemView.findViewById(R.id.replyRecycleView); + repliesHandler = new RepliesHandler(showReplies, repliesView); } @Override @@ -88,16 +63,6 @@ public void updateFromItem(final InfoItem infoItem, itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE); - if (item.getReplies() == null) { - repliesView.setVisibility(View.GONE); - showReplies.setVisibility(View.GONE); - } else if (item.getRepliesOpen()) { - addReplies(showReplies, item); - } else { - repliesView.setVisibility(View.GONE); - showReplies.setVisibility(View.VISIBLE); - showReplies.setOnClickListener(v -> addReplies(v, item)); - } - + repliesHandler.checkForReplies(item); } } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/RepliesHandler.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/RepliesHandler.java new file mode 100644 index 00000000000..494d4da0534 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/RepliesHandler.java @@ -0,0 +1,122 @@ +package org.schabi.newpipe.info_list.holder; + +import android.annotation.SuppressLint; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import org.schabi.newpipe.extractor.ListExtractor; +import org.schabi.newpipe.extractor.comments.CommentsInfo; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; +import org.schabi.newpipe.info_list.InfoListAdapter; +import org.schabi.newpipe.util.ExtractorHelper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.Callable; + +import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.schedulers.Schedulers; + +public class RepliesHandler { + private final List cachedReplies; + private final TextView showReplies; + private final RecyclerView repliesView; + + public RepliesHandler(final TextView showReplies, final RecyclerView recyclerView) { + this.repliesView = recyclerView; + repliesView.setAdapter(new InfoListAdapter(repliesView.getContext())); + repliesView.setLayoutManager(new LinearLayoutManager(repliesView.getContext())); + + this.showReplies = showReplies; + this.cachedReplies = new ArrayList<>(); + } + + static class GetMoreItemsCallable implements + Callable> { + private CommentsInfo parentCommentInfo; + private CommentsInfoItem parentInfoItem; + + public void setCallableParameters( + final CommentsInfo commentInfo, final CommentsInfoItem infoItem) { + parentCommentInfo = commentInfo; + parentInfoItem = infoItem; + } + + @Override + public ListExtractor.InfoItemsPage call() throws Exception { + return CommentsInfo.getMoreItems(parentCommentInfo, parentInfoItem.getReplies()); + } + } + + + public void addRepliesToUI(final CommentsInfoItem parentInfoItem) { + ((InfoListAdapter) Objects.requireNonNull(repliesView.getAdapter())) + .setInfoItemList(cachedReplies); + + final ViewGroup.MarginLayoutParams params = + (ViewGroup.MarginLayoutParams) repliesView.getLayoutParams(); + params.topMargin = 45; + + repliesView.setMinimumHeight(100); + repliesView.setHasFixedSize(true); + parentInfoItem.setRepliesOpen(true); + showReplies.setVisibility(View.GONE); + repliesView.setVisibility(View.VISIBLE); + } + + @SuppressLint("SetTextI18n") // Testing purposes + public void downloadReplies(final CommentsInfoItem parentInfoItem) { + showReplies.setText("Loading..."); + + final Single parentInfoSingle = ExtractorHelper.getCommentsInfo( + parentInfoItem.getServiceId(), + parentInfoItem.getUrl(), + false + ); + + final CommentsInfo infoListInfo = parentInfoSingle.blockingGet(); + + final GetMoreItemsCallable getMoreItems = new GetMoreItemsCallable(); + getMoreItems.setCallableParameters(infoListInfo, parentInfoItem); + final Single> + getItemsSingle = Single.fromCallable(getMoreItems); + + final ListExtractor.InfoItemsPage infoItemsPageList = getItemsSingle + .subscribeOn(Schedulers.newThread()) + .blockingGet(); // It works, just isn't great + + final List actualList = infoItemsPageList.getItems(); + cachedReplies.addAll(actualList); + addRepliesToUI(parentInfoItem); + } + + public void addReplies(final CommentsInfoItem parentInfoItem) { + if (parentInfoItem.getReplies() == null) { + return; + } + + if (cachedReplies.isEmpty()) { + downloadReplies(parentInfoItem); + } else { + addRepliesToUI(parentInfoItem); + } + } + + public void checkForReplies(final CommentsInfoItem item) { + if (item.getReplies() == null) { + repliesView.setVisibility(View.GONE); + showReplies.setVisibility(View.GONE); + } else if (item.getRepliesOpen()) { + addReplies(item); + } else { + repliesView.setVisibility(View.GONE); + showReplies.setVisibility(View.VISIBLE); + showReplies.setOnClickListener(v -> addReplies(item)); + } + } +} From a6f68fc5155435e12dac5c8bff45518ef25bd2c0 Mon Sep 17 00:00:00 2001 From: golfinq Date: Thu, 21 Oct 2021 22:07:37 -0400 Subject: [PATCH 6/6] Non-Blocking Downloading and Showing --- .../info_list/holder/RepliesHandler.java | 100 +++++++++++++++--- 1 file changed, 85 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/RepliesHandler.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/RepliesHandler.java index 494d4da0534..18affbb45ae 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/RepliesHandler.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/RepliesHandler.java @@ -19,7 +19,11 @@ import java.util.Objects; import java.util.concurrent.Callable; +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.core.SingleObserver; +import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; public class RepliesHandler { @@ -53,6 +57,81 @@ public ListExtractor.InfoItemsPage call() throws Exception { } } + private Single> + repliesSingle(final CommentsInfo parentCommentInfo, + final CommentsInfoItem parentInfoItem) { + + final GetMoreItemsCallable getMoreItems = new GetMoreItemsCallable(); + getMoreItems.setCallableParameters(parentCommentInfo, parentInfoItem); + return Single.fromCallable(getMoreItems); + + } + + private SingleObserver> + repliesObserver(final CommentsInfoItem parentInfoItem) { + + return new SingleObserver>() { + + @SuppressLint("SetTextI18n") + @Override + public void onSubscribe(@NonNull final Disposable d) { + showReplies.setText("Setting up replies"); + } + + @Override + public void onSuccess(@NonNull final + ListExtractor.InfoItemsPage + commentsInfoItemInfoItemsPage) { + + final List actualList + = commentsInfoItemInfoItemsPage.getItems(); + + cachedReplies.addAll(actualList); + addRepliesToUI(parentInfoItem); + } + + @SuppressLint("SetTextI18n") + @Override + public void onError(@NonNull final Throwable e) { + showReplies.setText("Error getting replies"); + } + }; + } + + private SingleObserver + repliesInfoObserver(final CommentsInfoItem parentInfoItem) { + + return new SingleObserver() { + + @SuppressLint("SetTextI18n") + @Override + public void onSubscribe(@NonNull final Disposable d) { + showReplies.setText("Downloading Replies"); + } + + @Override + public void onSuccess(@NonNull final CommentsInfo commentsInfo) { + final Single> + getRepliesInfoSingle = + repliesSingle(commentsInfo, parentInfoItem); + + final SingleObserver> + getRepliesInfoObserver = repliesObserver(parentInfoItem); + + getRepliesInfoSingle + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getRepliesInfoObserver); + } + + @SuppressLint("SetTextI18n") + @Override + public void onError(@NonNull final Throwable e) { + showReplies.setText("Error getting replies"); + } + }; + } + public void addRepliesToUI(final CommentsInfoItem parentInfoItem) { ((InfoListAdapter) Objects.requireNonNull(repliesView.getAdapter())) @@ -69,9 +148,7 @@ public void addRepliesToUI(final CommentsInfoItem parentInfoItem) { repliesView.setVisibility(View.VISIBLE); } - @SuppressLint("SetTextI18n") // Testing purposes public void downloadReplies(final CommentsInfoItem parentInfoItem) { - showReplies.setText("Loading..."); final Single parentInfoSingle = ExtractorHelper.getCommentsInfo( parentInfoItem.getServiceId(), @@ -79,20 +156,13 @@ public void downloadReplies(final CommentsInfoItem parentInfoItem) { false ); - final CommentsInfo infoListInfo = parentInfoSingle.blockingGet(); - - final GetMoreItemsCallable getMoreItems = new GetMoreItemsCallable(); - getMoreItems.setCallableParameters(infoListInfo, parentInfoItem); - final Single> - getItemsSingle = Single.fromCallable(getMoreItems); - - final ListExtractor.InfoItemsPage infoItemsPageList = getItemsSingle - .subscribeOn(Schedulers.newThread()) - .blockingGet(); // It works, just isn't great + final SingleObserver singleInfoRepliesInfoObserver + = repliesInfoObserver(parentInfoItem); - final List actualList = infoItemsPageList.getItems(); - cachedReplies.addAll(actualList); - addRepliesToUI(parentInfoItem); + parentInfoSingle + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(singleInfoRepliesInfoObserver); } public void addReplies(final CommentsInfoItem parentInfoItem) {