-Added scroll to fetch for external play queues.
-Modified service player activity scrolling to be instantaneous when difference is too large. -Modified service player activity to no longer update metadata if nothing change when sync is called.
This commit is contained in:
parent
b32f149a1b
commit
b1ee22cde6
5 changed files with 59 additions and 6 deletions
|
@ -378,6 +378,7 @@ public final class BackgroundPlayer extends Service {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sync(@NonNull final PlayQueueItem item, @Nullable final StreamInfo info) {
|
public void sync(@NonNull final PlayQueueItem item, @Nullable final StreamInfo info) {
|
||||||
|
if (currentItem == item && currentInfo == info) return;
|
||||||
super.sync(item, info);
|
super.sync(item, info);
|
||||||
|
|
||||||
resetNotification();
|
resetNotification();
|
||||||
|
|
|
@ -48,6 +48,7 @@ import com.google.android.exoplayer2.Player;
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||||
import org.schabi.newpipe.extractor.stream.VideoStream;
|
import org.schabi.newpipe.extractor.stream.VideoStream;
|
||||||
|
import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
|
||||||
import org.schabi.newpipe.player.helper.PlayerHelper;
|
import org.schabi.newpipe.player.helper.PlayerHelper;
|
||||||
import org.schabi.newpipe.playlist.PlayQueueItem;
|
import org.schabi.newpipe.playlist.PlayQueueItem;
|
||||||
import org.schabi.newpipe.playlist.PlayQueueItemBuilder;
|
import org.schabi.newpipe.playlist.PlayQueueItemBuilder;
|
||||||
|
@ -397,7 +398,7 @@ public final class MainVideoPlayer extends Activity {
|
||||||
getControlsRoot().setVisibility(View.INVISIBLE);
|
getControlsRoot().setVisibility(View.INVISIBLE);
|
||||||
queueLayout.setVisibility(View.VISIBLE);
|
queueLayout.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
itemsList.smoothScrollToPosition(playQueue.getIndex());
|
itemsList.scrollToPosition(playQueue.getIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onQueueClosed() {
|
private void onQueueClosed() {
|
||||||
|
@ -565,6 +566,9 @@ public final class MainVideoPlayer extends Activity {
|
||||||
itemsList.setClickable(true);
|
itemsList.setClickable(true);
|
||||||
itemsList.setLongClickable(true);
|
itemsList.setLongClickable(true);
|
||||||
|
|
||||||
|
itemsList.clearOnScrollListeners();
|
||||||
|
itemsList.addOnScrollListener(getQueueScrollListener());
|
||||||
|
|
||||||
itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());
|
itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());
|
||||||
itemTouchHelper.attachToRecyclerView(itemsList);
|
itemTouchHelper.attachToRecyclerView(itemsList);
|
||||||
|
|
||||||
|
@ -578,6 +582,19 @@ public final class MainVideoPlayer extends Activity {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private OnScrollBelowItemsListener getQueueScrollListener() {
|
||||||
|
return new OnScrollBelowItemsListener() {
|
||||||
|
@Override
|
||||||
|
public void onScrolledDown(RecyclerView recyclerView) {
|
||||||
|
if (playQueue != null && !playQueue.isComplete()) {
|
||||||
|
playQueue.fetch();
|
||||||
|
} else if (itemsList != null) {
|
||||||
|
itemsList.clearOnScrollListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
|
private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
|
||||||
return new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0) {
|
return new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0) {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -573,6 +573,7 @@ public final class PopupVideoPlayer extends Service {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sync(@NonNull PlayQueueItem item, @Nullable StreamInfo info) {
|
public void sync(@NonNull PlayQueueItem item, @Nullable StreamInfo info) {
|
||||||
|
if (currentItem == item && currentInfo == info) return;
|
||||||
super.sync(item, info);
|
super.sync(item, info);
|
||||||
updateMetadata();
|
updateMetadata();
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ import com.google.android.exoplayer2.Player;
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||||
|
import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
|
||||||
import org.schabi.newpipe.player.event.PlayerEventListener;
|
import org.schabi.newpipe.player.event.PlayerEventListener;
|
||||||
import org.schabi.newpipe.playlist.PlayQueueItem;
|
import org.schabi.newpipe.playlist.PlayQueueItem;
|
||||||
import org.schabi.newpipe.playlist.PlayQueueItemBuilder;
|
import org.schabi.newpipe.playlist.PlayQueueItemBuilder;
|
||||||
|
@ -57,6 +58,8 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||||
private static final int PLAYBACK_SPEED_POPUP_MENU_GROUP_ID = 61;
|
private static final int PLAYBACK_SPEED_POPUP_MENU_GROUP_ID = 61;
|
||||||
private static final int PLAYBACK_PITCH_POPUP_MENU_GROUP_ID = 97;
|
private static final int PLAYBACK_PITCH_POPUP_MENU_GROUP_ID = 97;
|
||||||
|
|
||||||
|
private static final int SMOOTH_SCROLL_MAXIMUM_DISTANCE = 80;
|
||||||
|
|
||||||
private View rootView;
|
private View rootView;
|
||||||
|
|
||||||
private RecyclerView itemsList;
|
private RecyclerView itemsList;
|
||||||
|
@ -225,6 +228,8 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||||
itemsList.setAdapter(player.getPlayQueueAdapter());
|
itemsList.setAdapter(player.getPlayQueueAdapter());
|
||||||
itemsList.setClickable(true);
|
itemsList.setClickable(true);
|
||||||
itemsList.setLongClickable(true);
|
itemsList.setLongClickable(true);
|
||||||
|
itemsList.clearOnScrollListeners();
|
||||||
|
itemsList.addOnScrollListener(getQueueScrollListener());
|
||||||
|
|
||||||
itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());
|
itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());
|
||||||
itemTouchHelper.attachToRecyclerView(itemsList);
|
itemTouchHelper.attachToRecyclerView(itemsList);
|
||||||
|
@ -345,6 +350,19 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||||
// Component Helpers
|
// Component Helpers
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
private OnScrollBelowItemsListener getQueueScrollListener() {
|
||||||
|
return new OnScrollBelowItemsListener() {
|
||||||
|
@Override
|
||||||
|
public void onScrolledDown(RecyclerView recyclerView) {
|
||||||
|
if (player != null && player.getPlayQueue() != null && !player.getPlayQueue().isComplete()) {
|
||||||
|
player.getPlayQueue().fetch();
|
||||||
|
} else if (itemsList != null) {
|
||||||
|
itemsList.clearOnScrollListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
|
private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
|
||||||
return new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0) {
|
return new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0) {
|
||||||
@Override
|
@Override
|
||||||
|
@ -401,7 +419,23 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scrollToSelected() {
|
private void scrollToSelected() {
|
||||||
itemsList.smoothScrollToPosition(player.getPlayQueue().getIndex());
|
if (player == null) return;
|
||||||
|
|
||||||
|
final int currentPlayingIndex = player.getPlayQueue().getIndex();
|
||||||
|
final int currentVisibleIndex;
|
||||||
|
if (itemsList.getLayoutManager() instanceof LinearLayoutManager) {
|
||||||
|
final LinearLayoutManager layout = ((LinearLayoutManager) itemsList.getLayoutManager());
|
||||||
|
currentVisibleIndex = layout.findFirstVisibleItemPosition();
|
||||||
|
} else {
|
||||||
|
currentVisibleIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int distance = Math.abs(currentPlayingIndex - currentVisibleIndex);
|
||||||
|
if (distance < SMOOTH_SCROLL_MAXIMUM_DISTANCE) {
|
||||||
|
itemsList.smoothScrollToPosition(currentPlayingIndex);
|
||||||
|
} else {
|
||||||
|
itemsList.scrollToPosition(currentPlayingIndex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -30,10 +30,10 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext
|
||||||
}
|
}
|
||||||
|
|
||||||
AbstractInfoPlayQueue(final int serviceId,
|
AbstractInfoPlayQueue(final int serviceId,
|
||||||
final String url,
|
final String url,
|
||||||
final String nextPageUrl,
|
final String nextPageUrl,
|
||||||
final List<InfoItem> streams,
|
final List<InfoItem> streams,
|
||||||
final int index) {
|
final int index) {
|
||||||
super(index, extractListItems(streams));
|
super(index, extractListItems(streams));
|
||||||
|
|
||||||
this.baseUrl = url;
|
this.baseUrl = url;
|
||||||
|
|
Loading…
Reference in a new issue