Skip to content

Commit 4b7c37e

Browse files
authored
Merge pull request #6955 from ktprograms/queue-long-press-menu
Show popup menu when long pressing in play queue (Full screen player)
2 parents a4c9732 + a4503eb commit 4b7c37e

4 files changed

Lines changed: 97 additions & 60 deletions

File tree

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.schabi.newpipe;
2+
3+
import static org.schabi.newpipe.util.external_communication.ShareUtils.shareText;
4+
5+
import android.content.Context;
6+
import android.view.ContextThemeWrapper;
7+
import android.view.View;
8+
import android.widget.PopupMenu;
9+
10+
import androidx.fragment.app.FragmentManager;
11+
12+
import org.schabi.newpipe.local.dialog.PlaylistAppendDialog;
13+
import org.schabi.newpipe.local.dialog.PlaylistCreationDialog;
14+
import org.schabi.newpipe.player.playqueue.PlayQueue;
15+
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
16+
import org.schabi.newpipe.util.NavigationHelper;
17+
18+
import java.util.Collections;
19+
20+
public final class QueueItemMenuUtil {
21+
public static void openPopupMenu(final PlayQueue playQueue,
22+
final PlayQueueItem item,
23+
final View view,
24+
final boolean hideDetails,
25+
final FragmentManager fragmentManager,
26+
final Context context) {
27+
final ContextThemeWrapper themeWrapper =
28+
new ContextThemeWrapper(context, R.style.DarkPopupMenu);
29+
30+
final PopupMenu popupMenu = new PopupMenu(themeWrapper, view);
31+
popupMenu.inflate(R.menu.menu_play_queue_item);
32+
33+
if (hideDetails) {
34+
popupMenu.getMenu().findItem(R.id.menu_item_details).setVisible(false);
35+
}
36+
37+
popupMenu.setOnMenuItemClickListener(menuItem -> {
38+
switch (menuItem.getItemId()) {
39+
case R.id.menu_item_remove:
40+
final int index = playQueue.indexOf(item);
41+
playQueue.remove(index);
42+
return true;
43+
case R.id.menu_item_details:
44+
// playQueue is null since we don't want any queue change
45+
NavigationHelper.openVideoDetail(context, item.getServiceId(),
46+
item.getUrl(), item.getTitle(), null,
47+
false);
48+
return true;
49+
case R.id.menu_item_append_playlist:
50+
final PlaylistAppendDialog d = PlaylistAppendDialog.fromPlayQueueItems(
51+
Collections.singletonList(item)
52+
);
53+
PlaylistAppendDialog.onPlaylistFound(context,
54+
() -> d.show(fragmentManager, "QueueItemMenuUtil@append_playlist"),
55+
() -> PlaylistCreationDialog.newInstance(d)
56+
.show(fragmentManager, "QueueItemMenuUtil@append_playlist"));
57+
return true;
58+
case R.id.menu_item_share:
59+
shareText(context, item.getTitle(), item.getUrl(),
60+
item.getThumbnailUrl());
61+
return true;
62+
}
63+
return false;
64+
});
65+
66+
popupMenu.show();
67+
}
68+
69+
private QueueItemMenuUtil() { }
70+
}

app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java

Lines changed: 7 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package org.schabi.newpipe.player;
22

3-
import static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed;
4-
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
5-
import static org.schabi.newpipe.util.external_communication.ShareUtils.shareText;
6-
73
import android.content.ComponentName;
84
import android.content.Context;
95
import android.content.Intent;
@@ -16,7 +12,6 @@
1612
import android.view.MenuItem;
1713
import android.view.View;
1814
import android.view.ViewGroup;
19-
import android.widget.PopupMenu;
2015
import android.widget.SeekBar;
2116

2217
import androidx.annotation.Nullable;
@@ -47,16 +42,18 @@
4742
import org.schabi.newpipe.util.ServiceHelper;
4843
import org.schabi.newpipe.util.ThemeHelper;
4944

50-
import java.util.Collections;
5145
import java.util.List;
5246

47+
import static org.schabi.newpipe.QueueItemMenuUtil.openPopupMenu;
48+
import static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed;
49+
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
50+
5351
public final class PlayQueueActivity extends AppCompatActivity
5452
implements PlayerEventListener, SeekBar.OnSeekBarChangeListener,
5553
View.OnClickListener, PlaybackParameterDialog.Callback {
5654

5755
private static final String TAG = PlayQueueActivity.class.getSimpleName();
5856

59-
private static final int RECYCLER_ITEM_POPUP_MENU_GROUP_ID = 47;
6057
private static final int SMOOTH_SCROLL_MAXIMUM_DISTANCE = 80;
6158

6259
protected Player player;
@@ -279,49 +276,6 @@ private void buildControls() {
279276
queueControlBinding.controlShuffle.setOnClickListener(this);
280277
}
281278

282-
private void buildItemPopupMenu(final PlayQueueItem item, final View view) {
283-
final PopupMenu popupMenu = new PopupMenu(this, view);
284-
final MenuItem remove = popupMenu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 0,
285-
Menu.NONE, R.string.play_queue_remove);
286-
remove.setOnMenuItemClickListener(menuItem -> {
287-
if (player == null) {
288-
return false;
289-
}
290-
291-
final int index = player.getPlayQueue().indexOf(item);
292-
if (index != -1) {
293-
player.getPlayQueue().remove(index);
294-
}
295-
return true;
296-
});
297-
298-
final MenuItem detail = popupMenu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 1,
299-
Menu.NONE, R.string.play_queue_stream_detail);
300-
detail.setOnMenuItemClickListener(menuItem -> {
301-
// playQueue is null since we don't want any queue change
302-
NavigationHelper.openVideoDetail(this, item.getServiceId(), item.getUrl(),
303-
item.getTitle(), null, false);
304-
return true;
305-
});
306-
307-
final MenuItem append = popupMenu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 2,
308-
Menu.NONE, R.string.append_playlist);
309-
append.setOnMenuItemClickListener(menuItem -> {
310-
openPlaylistAppendDialog(Collections.singletonList(item));
311-
return true;
312-
});
313-
314-
final MenuItem share = popupMenu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 3,
315-
Menu.NONE, R.string.share);
316-
share.setOnMenuItemClickListener(menuItem -> {
317-
shareText(getApplicationContext(), item.getTitle(), item.getUrl(),
318-
item.getThumbnailUrl());
319-
return true;
320-
});
321-
322-
popupMenu.show();
323-
}
324-
325279
////////////////////////////////////////////////////////////////////////////
326280
// Component Helpers
327281
////////////////////////////////////////////////////////////////////////////
@@ -369,13 +323,9 @@ public void selected(final PlayQueueItem item, final View view) {
369323

370324
@Override
371325
public void held(final PlayQueueItem item, final View view) {
372-
if (player == null) {
373-
return;
374-
}
375-
376-
final int index = player.getPlayQueue().indexOf(item);
377-
if (index != -1) {
378-
buildItemPopupMenu(item, view);
326+
if (player != null && player.getPlayQueue().indexOf(item) != -1) {
327+
openPopupMenu(player.getPlayQueue(), item, view, false,
328+
getSupportFragmentManager(), PlayQueueActivity.this);
379329
}
380330
}
381331

app/src/main/java/org/schabi/newpipe/player/Player.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@
159159
import static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE;
160160
import static com.google.android.exoplayer2.Player.RepeatMode;
161161
import static java.util.concurrent.TimeUnit.MILLISECONDS;
162+
import static org.schabi.newpipe.QueueItemMenuUtil.openPopupMenu;
162163
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
163164
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
164165
import static org.schabi.newpipe.ktx.ViewUtils.animate;
@@ -3213,9 +3214,9 @@ public void selected(final PlayQueueItem item, final View view) {
32133214

32143215
@Override
32153216
public void held(final PlayQueueItem item, final View view) {
3216-
final int index = playQueue.indexOf(item);
3217-
if (index != -1) {
3218-
playQueue.remove(index);
3217+
if (playQueue.indexOf(item) != -1) {
3218+
openPopupMenu(playQueue, item, view, true,
3219+
getParentActivity().getSupportFragmentManager(), context);
32193220
}
32203221
}
32213222

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<menu xmlns:android="http://schemas.android.com/apk/res/android">
3+
4+
<item
5+
android:id="@+id/menu_item_remove"
6+
android:title="@string/play_queue_remove" />
7+
<item
8+
android:id="@+id/menu_item_details"
9+
android:title="@string/play_queue_stream_detail" />
10+
<item
11+
android:id="@+id/menu_item_append_playlist"
12+
android:title="@string/append_playlist" />
13+
<item
14+
android:id="@+id/menu_item_share"
15+
android:title="@string/share" />
16+
</menu>

0 commit comments

Comments
 (0)