From acdfee5c25d948f17c59f9144912957a1d88a585 Mon Sep 17 00:00:00 2001 From: ktprograms Date: Sun, 22 Aug 2021 20:36:12 +0800 Subject: [PATCH] Show popup menu when long pressing in play queue (Full screen player) --- app/build.gradle | 4 ++ .../newpipe/player/PlayQueueActivity.java | 57 +++++++------------ .../org/schabi/newpipe/player/Player.java | 48 +++++++++++++++- .../main/res/menu/menu_play_queue_item.xml | 16 ++++++ 4 files changed, 87 insertions(+), 38 deletions(-) create mode 100644 app/src/main/res/menu/menu_play_queue_item.xml diff --git a/app/build.gradle b/app/build.gradle index cf2823024..f8334c11b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -214,6 +214,10 @@ dependencies { implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation "androidx.room:room-runtime:${androidxRoomVersion}" implementation "androidx.room:room-rxjava3:${androidxRoomVersion}" + + // Apple Sillicon Mac workaround (https://issuetracker.google.com/issues/174695268#comment9) + kapt "org.xerial:sqlite-jdbc:3.34.0" + kapt "androidx.room:room-compiler:${androidxRoomVersion}" implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.webkit:webkit:1.4.0' diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index ce7b82de4..914416489 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -281,42 +281,29 @@ public final class PlayQueueActivity extends AppCompatActivity private void buildItemPopupMenu(final PlayQueueItem item, final View view) { final PopupMenu popupMenu = new PopupMenu(this, view); - final MenuItem remove = popupMenu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 0, - Menu.NONE, R.string.play_queue_remove); - remove.setOnMenuItemClickListener(menuItem -> { - if (player == null) { - return false; + popupMenu.inflate(R.menu.menu_play_queue_item); + + popupMenu.setOnMenuItemClickListener(menuItem -> { + switch (menuItem.getItemId()) { + case R.id.menu_item_remove: + final int index = player.getPlayQueue().indexOf(item); + player.getPlayQueue().remove(index); + return true; + case R.id.menu_item_details: + // playQueue is null since we don't want any queue change + NavigationHelper.openVideoDetail(this, item.getServiceId(), + item.getUrl(), item.getTitle(), null, + false); + return true; + case R.id.menu_item_append_playlist: + openPlaylistAppendDialog(Collections.singletonList(item)); + return true; + case R.id.menu_item_share: + shareText(this, item.getTitle(), item.getUrl(), + item.getThumbnailUrl()); + return true; } - - final int index = player.getPlayQueue().indexOf(item); - if (index != -1) { - player.getPlayQueue().remove(index); - } - return true; - }); - - final MenuItem detail = popupMenu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 1, - Menu.NONE, R.string.play_queue_stream_detail); - detail.setOnMenuItemClickListener(menuItem -> { - // playQueue is null since we don't want any queue change - NavigationHelper.openVideoDetail(this, item.getServiceId(), item.getUrl(), - item.getTitle(), null, false); - return true; - }); - - final MenuItem append = popupMenu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 2, - Menu.NONE, R.string.append_playlist); - append.setOnMenuItemClickListener(menuItem -> { - openPlaylistAppendDialog(Collections.singletonList(item)); - return true; - }); - - final MenuItem share = popupMenu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 3, - Menu.NONE, R.string.share); - share.setOnMenuItemClickListener(menuItem -> { - shareText(getApplicationContext(), item.getTitle(), item.getUrl(), - item.getThumbnailUrl()); - return true; + return false; }); popupMenu.show(); diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 83c567cb6..c36b721b4 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -100,6 +100,8 @@ import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.info_list.StreamSegmentAdapter; import org.schabi.newpipe.ktx.AnimationType; +import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; +import org.schabi.newpipe.local.dialog.PlaylistCreationDialog; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.player.MainPlayer.PlayerType; import org.schabi.newpipe.player.event.PlayerEventListener; @@ -138,6 +140,7 @@ import org.schabi.newpipe.views.ExpandableSurfaceView; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; @@ -193,6 +196,7 @@ import static org.schabi.newpipe.util.ListHelper.getPopupResolutionIndex; import static org.schabi.newpipe.util.ListHelper.getResolutionIndex; import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; import static org.schabi.newpipe.util.Localization.containsCaseInsensitive; +import static org.schabi.newpipe.util.external_communication.ShareUtils.shareText; public final class Player implements EventListener, @@ -3032,6 +3036,45 @@ public final class Player implements playQueue.setIndex(index); } + private void heldQueueItem(final PlayQueueItem item, final View view) { + final Context themeWrapper = + new ContextThemeWrapper(context, R.style.DarkPopupMenu); + + final PopupMenu popupMenu = new PopupMenu(themeWrapper, view); + popupMenu.inflate(R.menu.menu_play_queue_item); + + popupMenu.setOnMenuItemClickListener(menuItem -> { + switch (menuItem.getItemId()) { + case R.id.menu_item_remove: + final int index = playQueue.indexOf(item); + playQueue.remove(index); + return true; + case R.id.menu_item_details: + // playQueue is null since we don't want any queue change + NavigationHelper.openVideoDetail(context, item.getServiceId(), + item.getUrl(), item.getTitle(), null, + false); + return true; + case R.id.menu_item_append_playlist: + final PlaylistAppendDialog d = PlaylistAppendDialog.fromPlayQueueItems( + Collections.singletonList(item) + ); + PlaylistAppendDialog.onPlaylistFound(context, + () -> d.show(getParentActivity().getSupportFragmentManager(), TAG), + () -> PlaylistCreationDialog.newInstance(d) + .show(getParentActivity().getSupportFragmentManager(), TAG)); + return true; + case R.id.menu_item_share: + shareText(context, item.getTitle(), item.getUrl(), + item.getThumbnailUrl()); + return true; + } + return false; + }); + + popupMenu.show(); + } + @Override public void onPlayQueueEdited() { notifyPlaybackUpdateToListeners(); @@ -3198,9 +3241,8 @@ public final class Player implements @Override public void held(final PlayQueueItem item, final View view) { - final int index = playQueue.indexOf(item); - if (index != -1) { - playQueue.remove(index); + if (playQueue.indexOf(item) != -1) { + heldQueueItem(item, view); } } diff --git a/app/src/main/res/menu/menu_play_queue_item.xml b/app/src/main/res/menu/menu_play_queue_item.xml new file mode 100644 index 000000000..ebb361be9 --- /dev/null +++ b/app/src/main/res/menu/menu_play_queue_item.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file