mirror of
https://github.com/TeamNewPipe/NewPipe.git
synced 2024-11-22 11:02:35 +01:00
Merge pull request #9203 from Callisto404/add-chapter-timestamp-share
Added timestamped link sharing from the start of a chapter with a long hold press
This commit is contained in:
commit
9d2ab61993
@ -61,5 +61,6 @@ class StreamSegmentAdapter(
|
|||||||
|
|
||||||
interface StreamSegmentListener {
|
interface StreamSegmentListener {
|
||||||
fun onItemClick(item: StreamSegmentItem, seconds: Int)
|
fun onItemClick(item: StreamSegmentItem, seconds: Int)
|
||||||
|
fun onItemLongClick(item: StreamSegmentItem, seconds: Int)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ class StreamSegmentItem(
|
|||||||
viewHolder.root.findViewById<TextView>(R.id.textViewStartSeconds).text =
|
viewHolder.root.findViewById<TextView>(R.id.textViewStartSeconds).text =
|
||||||
Localization.getDurationString(item.startTimeSeconds.toLong())
|
Localization.getDurationString(item.startTimeSeconds.toLong())
|
||||||
viewHolder.root.setOnClickListener { onClick.onItemClick(this, item.startTimeSeconds) }
|
viewHolder.root.setOnClickListener { onClick.onItemClick(this, item.startTimeSeconds) }
|
||||||
|
viewHolder.root.setOnLongClickListener { onClick.onItemLongClick(this, item.startTimeSeconds); true }
|
||||||
viewHolder.root.isSelected = isSelected
|
viewHolder.root.isSelected = isSelected
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ package org.schabi.newpipe.player.ui;
|
|||||||
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
|
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
|
||||||
import static org.schabi.newpipe.MainActivity.DEBUG;
|
import static org.schabi.newpipe.MainActivity.DEBUG;
|
||||||
import static org.schabi.newpipe.QueueItemMenuUtil.openPopupMenu;
|
import static org.schabi.newpipe.QueueItemMenuUtil.openPopupMenu;
|
||||||
|
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
|
||||||
import static org.schabi.newpipe.ktx.ViewUtils.animate;
|
import static org.schabi.newpipe.ktx.ViewUtils.animate;
|
||||||
import static org.schabi.newpipe.player.Player.STATE_COMPLETED;
|
import static org.schabi.newpipe.player.Player.STATE_COMPLETED;
|
||||||
import static org.schabi.newpipe.player.Player.STATE_PAUSED;
|
import static org.schabi.newpipe.player.Player.STATE_PAUSED;
|
||||||
@ -52,6 +53,7 @@ import org.schabi.newpipe.extractor.stream.StreamSegment;
|
|||||||
import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
|
import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
|
||||||
import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
|
import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
|
||||||
import org.schabi.newpipe.info_list.StreamSegmentAdapter;
|
import org.schabi.newpipe.info_list.StreamSegmentAdapter;
|
||||||
|
import org.schabi.newpipe.info_list.StreamSegmentItem;
|
||||||
import org.schabi.newpipe.ktx.AnimationType;
|
import org.schabi.newpipe.ktx.AnimationType;
|
||||||
import org.schabi.newpipe.local.dialog.PlaylistDialog;
|
import org.schabi.newpipe.local.dialog.PlaylistDialog;
|
||||||
import org.schabi.newpipe.player.Player;
|
import org.schabi.newpipe.player.Player;
|
||||||
@ -60,6 +62,7 @@ import org.schabi.newpipe.player.gesture.BasePlayerGestureListener;
|
|||||||
import org.schabi.newpipe.player.gesture.MainPlayerGestureListener;
|
import org.schabi.newpipe.player.gesture.MainPlayerGestureListener;
|
||||||
import org.schabi.newpipe.player.helper.PlaybackParameterDialog;
|
import org.schabi.newpipe.player.helper.PlaybackParameterDialog;
|
||||||
import org.schabi.newpipe.player.helper.PlayerHelper;
|
import org.schabi.newpipe.player.helper.PlayerHelper;
|
||||||
|
import org.schabi.newpipe.player.mediaitem.MediaItemTag;
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueueAdapter;
|
import org.schabi.newpipe.player.playqueue.PlayQueueAdapter;
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
|
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
|
||||||
@ -69,6 +72,7 @@ import org.schabi.newpipe.player.playqueue.PlayQueueItemTouchCallback;
|
|||||||
import org.schabi.newpipe.util.DeviceUtils;
|
import org.schabi.newpipe.util.DeviceUtils;
|
||||||
import org.schabi.newpipe.util.NavigationHelper;
|
import org.schabi.newpipe.util.NavigationHelper;
|
||||||
import org.schabi.newpipe.util.external_communication.KoreUtils;
|
import org.schabi.newpipe.util.external_communication.KoreUtils;
|
||||||
|
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -644,7 +648,7 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh
|
|||||||
private void buildSegments() {
|
private void buildSegments() {
|
||||||
binding.itemsList.setAdapter(segmentAdapter);
|
binding.itemsList.setAdapter(segmentAdapter);
|
||||||
binding.itemsList.setClickable(true);
|
binding.itemsList.setClickable(true);
|
||||||
binding.itemsList.setLongClickable(false);
|
binding.itemsList.setLongClickable(true);
|
||||||
|
|
||||||
binding.itemsList.clearOnScrollListeners();
|
binding.itemsList.clearOnScrollListeners();
|
||||||
if (itemTouchHelper != null) {
|
if (itemTouchHelper != null) {
|
||||||
@ -696,10 +700,30 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh
|
|||||||
}
|
}
|
||||||
|
|
||||||
private StreamSegmentAdapter.StreamSegmentListener getStreamSegmentListener() {
|
private StreamSegmentAdapter.StreamSegmentListener getStreamSegmentListener() {
|
||||||
return (item, seconds) -> {
|
return new StreamSegmentAdapter.StreamSegmentListener() {
|
||||||
segmentAdapter.selectSegment(item);
|
@Override
|
||||||
player.seekTo(seconds * 1000L);
|
public void onItemClick(@NonNull final StreamSegmentItem item, final int seconds) {
|
||||||
player.triggerProgressUpdate();
|
segmentAdapter.selectSegment(item);
|
||||||
|
player.seekTo(seconds * 1000L);
|
||||||
|
player.triggerProgressUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onItemLongClick(@NonNull final StreamSegmentItem item, final int seconds) {
|
||||||
|
@Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata();
|
||||||
|
if (currentMetadata == null
|
||||||
|
|| currentMetadata.getServiceId() != YouTube.getServiceId()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final PlayQueueItem currentItem = player.getCurrentItem();
|
||||||
|
if (currentItem != null) {
|
||||||
|
String videoUrl = player.getVideoUrl();
|
||||||
|
videoUrl += ("&t=" + seconds);
|
||||||
|
ShareUtils.shareText(context, currentItem.getTitle(),
|
||||||
|
videoUrl, currentItem.getThumbnailUrl());
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user