From 6421d3017eb0a139ee1b45be6b92189ac81453b7 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Wed, 13 Mar 2019 07:01:03 +0530 Subject: [PATCH 1/5] seek on clicking timestamp links in comments --- .../holder/CommentsMiniInfoItemHolder.java | 2 +- .../org/schabi/newpipe/player/BasePlayer.java | 12 ++++++++++++ .../player/playqueue/SinglePlayQueue.java | 5 +++++ .../util/CommentTextOnTouchListener.java | 17 ++++++++++------- 4 files changed, 28 insertions(+), 8 deletions(-) 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 9be272198..b8362f947 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 @@ -45,7 +45,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { if(hours != null) timestamp += (Integer.parseInt(hours.replace(":", ""))*3600); if(minutes != null) timestamp += (Integer.parseInt(minutes.replace(":", ""))*60); if(seconds != null) timestamp += (Integer.parseInt(seconds)); - return streamUrl + url.replace(match.group(0), "&t=" + String.valueOf(timestamp)); + return streamUrl + url.replace(match.group(0), "#timestamp=" + String.valueOf(timestamp)); } }; diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 4d5f29148..22c69fdd4 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -269,6 +269,18 @@ public abstract class BasePlayer implements final boolean playbackSkipSilence = intent.getBooleanExtra(PLAYBACK_SKIP_SILENCE, getPlaybackSkipSilence()); + // seek to timestamp if stream is already playing + if (simpleExoPlayer != null + && queue.size() == 1 + && playQueue != null + && playQueue.getItem() != null + && queue.getItem().getUrl().equals(playQueue.getItem().getUrl()) + && queue.getItem().getRecoveryPosition() != PlayQueueItem.RECOVERY_UNSET + ) { + simpleExoPlayer.seekTo(playQueue.getIndex(), queue.getItem().getRecoveryPosition()); + return; + } + // Good to go... initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence, /*playOnInit=*/true); diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java index 5993481e2..40d1a11e7 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java @@ -16,6 +16,11 @@ public final class SinglePlayQueue extends PlayQueue { super(0, Collections.singletonList(new PlayQueueItem(info))); } + public SinglePlayQueue(final StreamInfo info, final long startPosition) { + super(0, Collections.singletonList(new PlayQueueItem(info))); + getItem().setRecoveryPosition(startPosition); + } + public SinglePlayQueue(final List items, final int index) { super(index, playQueueItemsOf(items)); } diff --git a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java b/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java index 570b5f8b2..e1ecc662d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java +++ b/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java @@ -31,7 +31,7 @@ public class CommentTextOnTouchListener implements View.OnTouchListener { public static final CommentTextOnTouchListener INSTANCE = new CommentTextOnTouchListener(); - private static final Pattern timestampPattern = Pattern.compile(".*&t=(\\d+)"); + private static final Pattern timestampPattern = Pattern.compile("(.*)#timestamp=(\\d+)"); @Override public boolean onTouch(View v, MotionEvent event) { @@ -86,6 +86,12 @@ public class CommentTextOnTouchListener implements View.OnTouchListener { private boolean handleUrl(Context context, URLSpan urlSpan) { String url = urlSpan.getURL(); + int seconds = -1; + Matcher matcher = timestampPattern.matcher(url); + if(matcher.matches()){ + url = matcher.group(1); + seconds = Integer.parseInt(matcher.group(2)); + } StreamingService service; StreamingService.LinkType linkType; try { @@ -97,9 +103,7 @@ public class CommentTextOnTouchListener implements View.OnTouchListener { if(linkType == StreamingService.LinkType.NONE){ return false; } - Matcher matcher = timestampPattern.matcher(url); - if(linkType == StreamingService.LinkType.STREAM && matcher.matches()){ - int seconds = Integer.parseInt(matcher.group(1)); + if(linkType == StreamingService.LinkType.STREAM && seconds != -1){ return playOnPopup(context, url, service, seconds); }else{ NavigationHelper.openRouterActivity(context, url); @@ -119,9 +123,8 @@ public class CommentTextOnTouchListener implements View.OnTouchListener { single.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(info -> { - PlayQueue playQueue = new SinglePlayQueue((StreamInfo) info); - ((StreamInfo) info).setStartPosition(seconds); - NavigationHelper.enqueueOnPopupPlayer(context, playQueue, true); + PlayQueue playQueue = new SinglePlayQueue((StreamInfo) info, seconds*1000); + NavigationHelper.playOnPopupPlayer(context, playQueue); }); return true; } From a026143a840b9ac57534357a2074a50175be388a Mon Sep 17 00:00:00 2001 From: yausername <13ritvik@gmail.com> Date: Fri, 22 Mar 2019 04:57:33 +0530 Subject: [PATCH 2/5] linkify optimizations --- .../holder/CommentsMiniInfoItemHolder.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) 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 b8362f947..78eb06ea4 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 @@ -91,15 +91,14 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { streamUrl = item.getUrl(); - itemContentView.setMaxLines(commentDefaultLines); + itemContentView.setLines(commentDefaultLines); commentText = item.getCommentText(); itemContentView.setText(commentText); - linkify(); itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE); - if(itemContentView.getLineCount() == 0){ + if (itemContentView.getLineCount() == 0) { itemContentView.post(() -> ellipsize()); - }else{ + } else { ellipsize(); } @@ -119,15 +118,17 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { private void ellipsize() { if (itemContentView.getLineCount() > commentDefaultLines){ int endOfLastLine = itemContentView.getLayout().getLineEnd(commentDefaultLines - 1); - String newVal = itemContentView.getText().subSequence(0, endOfLastLine - 3) + "..."; + int end = itemContentView.getText().toString().lastIndexOf(' ', endOfLastLine -3); + if(end == -1) end = Math.max(endOfLastLine -3, 0); + String newVal = itemContentView.getText().subSequence(0, end) + "..."; itemContentView.setText(newVal); - linkify(); } + linkify(); } private void toggleEllipsize() { if (itemContentView.getText().toString().equals(commentText)) { - ellipsize(); + if (itemContentView.getLineCount() > commentDefaultLines) ellipsize(); } else { expand(); } From 07f8dcb3ca1af4840d31754edb5331ecc652c24d Mon Sep 17 00:00:00 2001 From: yausername <13ritvik@gmail.com> Date: Fri, 22 Mar 2019 05:56:56 +0530 Subject: [PATCH 3/5] use ellipsis character --- .../info_list/holder/CommentsMiniInfoItemHolder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 78eb06ea4..b726a40c6 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 @@ -118,9 +118,9 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { private void ellipsize() { if (itemContentView.getLineCount() > commentDefaultLines){ int endOfLastLine = itemContentView.getLayout().getLineEnd(commentDefaultLines - 1); - int end = itemContentView.getText().toString().lastIndexOf(' ', endOfLastLine -3); - if(end == -1) end = Math.max(endOfLastLine -3, 0); - String newVal = itemContentView.getText().subSequence(0, end) + "..."; + int end = itemContentView.getText().toString().lastIndexOf(' ', endOfLastLine -2); + if(end == -1) end = Math.max(endOfLastLine -2, 0); + String newVal = itemContentView.getText().subSequence(0, end) + " …"; itemContentView.setText(newVal); } linkify(); From d6cc6ba1444a600417f474cb3279198968448b8f Mon Sep 17 00:00:00 2001 From: yausername <13ritvik@gmail.com> Date: Sat, 23 Mar 2019 00:22:59 +0530 Subject: [PATCH 4/5] fix empty author endpoint --- .../newpipe/info_list/holder/CommentsMiniInfoItemHolder.java | 2 ++ 1 file changed, 2 insertions(+) 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 9be272198..94fb78875 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 @@ -6,6 +6,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import org.jsoup.helper.StringUtil; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; @@ -76,6 +77,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { itemThumbnailView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + if(StringUtil.isBlank(item.getAuthorEndpoint())) return; try { final AppCompatActivity activity = (AppCompatActivity) itemBuilder.getContext(); NavigationHelper.openChannelFragment( From 657125f43ca96cf0785be74b0867ab83d4b8a106 Mon Sep 17 00:00:00 2001 From: yausername <13ritvik@gmail.com> Date: Sun, 24 Mar 2019 06:31:28 +0530 Subject: [PATCH 5/5] save selected tab sate in stream detail fragment, fixes #2238 --- .../schabi/newpipe/fragments/detail/TabAdaptor.java | 13 +++++++++++++ .../fragments/detail/VideoDetailFragment.java | 13 +++++++++++++ app/src/main/res/values/settings_keys.xml | 1 + 3 files changed, 27 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java index 27cc3ec8a..8314f9539 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.fragments.detail; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; @@ -61,6 +62,18 @@ public class TabAdaptor extends FragmentPagerAdapter { else return POSITION_NONE; } + public int getItemPositionByTitle(String title) { + return mFragmentTitleList.indexOf(title); + } + + @Nullable + public String getItemTitle(int position) { + if (position < 0 || position >= mFragmentTitleList.size()) { + return null; + } + return mFragmentTitleList.get(position); + } + public void notifyDataSetUpdate(){ notifyDataSetChanged(); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 8c87c1875..68d1b49ea 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -122,6 +122,7 @@ public class VideoDetailFragment private boolean autoPlayEnabled; private boolean showRelatedStreams; private boolean showComments; + private String selectedTabTag; @State protected int serviceId = Constants.NO_SERVICE_ID; @@ -213,6 +214,9 @@ public class VideoDetailFragment showComments = PreferenceManager.getDefaultSharedPreferences(activity) .getBoolean(getString(R.string.show_comments_key), true); + selectedTabTag = PreferenceManager.getDefaultSharedPreferences(activity) + .getString(getString(R.string.stream_info_selected_tab_key), COMMENTS_TAB_TAG); + PreferenceManager.getDefaultSharedPreferences(activity) .registerOnSharedPreferenceChangeListener(this); } @@ -226,6 +230,10 @@ public class VideoDetailFragment public void onPause() { super.onPause(); if (currentWorker != null) currentWorker.dispose(); + PreferenceManager.getDefaultSharedPreferences(getContext()) + .edit() + .putString(getString(R.string.stream_info_selected_tab_key), pageAdapter.getItemTitle(viewPager.getCurrentItem())) + .apply(); } @Override @@ -815,6 +823,9 @@ public class VideoDetailFragment } private void initTabs() { + if (pageAdapter.getCount() != 0) { + selectedTabTag = pageAdapter.getItemTitle(viewPager.getCurrentItem()); + } pageAdapter.clearAllItems(); if(shouldShowComments()){ @@ -835,6 +846,8 @@ public class VideoDetailFragment if(pageAdapter.getCount() < 2){ tabLayout.setVisibility(View.GONE); }else{ + int position = pageAdapter.getItemPositionByTitle(selectedTabTag); + if(position != -1) viewPager.setCurrentItem(position); tabLayout.setVisibility(View.VISIBLE); } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index b6c214caf..3861f53d5 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -139,6 +139,7 @@ show_play_with_kodi show_next_video show_comments + stream_info_selected_tab show_hold_to_append en GB