Merge pull request #7704 from Stypox/fix-stream-menu-crash

Fix crash when long-pressing stream while player is starting
This commit is contained in:
litetex 2022-02-09 19:53:09 +01:00 committed by GitHub
commit be95d7fe0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 25 additions and 10 deletions

View File

@ -352,7 +352,7 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
} }
final List<StreamDialogEntry> entries = new ArrayList<>(); final List<StreamDialogEntry> entries = new ArrayList<>();
if (PlayerHolder.getInstance().isPlayerOpen()) { if (PlayerHolder.getInstance().isPlayQueueReady()) {
entries.add(StreamDialogEntry.enqueue); entries.add(StreamDialogEntry.enqueue);
if (PlayerHolder.getInstance().getQueueSize() > 1) { if (PlayerHolder.getInstance().getQueueSize() > 1) {

View File

@ -149,7 +149,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
final ArrayList<StreamDialogEntry> entries = new ArrayList<>(); final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
if (PlayerHolder.getInstance().isPlayerOpen()) { if (PlayerHolder.getInstance().isPlayQueueReady()) {
entries.add(StreamDialogEntry.enqueue); entries.add(StreamDialogEntry.enqueue);
if (PlayerHolder.getInstance().getQueueSize() > 1) { if (PlayerHolder.getInstance().getQueueSize() > 1) {

View File

@ -362,7 +362,7 @@ class FeedFragment : BaseStateFragment<FeedState>() {
if (context == null || context.resources == null || activity == null) return if (context == null || context.resources == null || activity == null) return
val entries = ArrayList<StreamDialogEntry>() val entries = ArrayList<StreamDialogEntry>()
if (PlayerHolder.getInstance().isPlayerOpen) { if (PlayerHolder.getInstance().isPlayQueueReady) {
entries.add(StreamDialogEntry.enqueue) entries.add(StreamDialogEntry.enqueue)
if (PlayerHolder.getInstance().queueSize > 1) { if (PlayerHolder.getInstance().queueSize > 1) {

View File

@ -338,7 +338,7 @@ public class StatisticsPlaylistFragment
final ArrayList<StreamDialogEntry> entries = new ArrayList<>(); final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
if (PlayerHolder.getInstance().isPlayerOpen()) { if (PlayerHolder.getInstance().isPlayQueueReady()) {
entries.add(StreamDialogEntry.enqueue); entries.add(StreamDialogEntry.enqueue);
if (PlayerHolder.getInstance().getQueueSize() > 1) { if (PlayerHolder.getInstance().getQueueSize() > 1) {

View File

@ -753,7 +753,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
final ArrayList<StreamDialogEntry> entries = new ArrayList<>(); final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
if (PlayerHolder.getInstance().isPlayerOpen()) { if (PlayerHolder.getInstance().isPlayQueueReady()) {
entries.add(StreamDialogEntry.enqueue); entries.add(StreamDialogEntry.enqueue);
if (PlayerHolder.getInstance().getQueueSize() > 1) { if (PlayerHolder.getInstance().getQueueSize() > 1) {

View File

@ -260,7 +260,8 @@ public final class Player implements
// Playback // Playback
//////////////////////////////////////////////////////////////////////////*/ //////////////////////////////////////////////////////////////////////////*/
private PlayQueue playQueue; // play queue might be null e.g. while player is starting
@Nullable private PlayQueue playQueue;
private PlayQueueAdapter playQueueAdapter; private PlayQueueAdapter playQueueAdapter;
private StreamSegmentAdapter segmentAdapter; private StreamSegmentAdapter segmentAdapter;
@ -4226,6 +4227,7 @@ public final class Player implements
} }
@Nullable
public PlayQueue getPlayQueue() { public PlayQueue getPlayQueue() {
return playQueue; return playQueue;
} }

View File

@ -38,12 +38,12 @@ public final class PlayerHolder {
private static final boolean DEBUG = MainActivity.DEBUG; private static final boolean DEBUG = MainActivity.DEBUG;
private static final String TAG = PlayerHolder.class.getSimpleName(); private static final String TAG = PlayerHolder.class.getSimpleName();
private PlayerServiceExtendedEventListener listener; @Nullable private PlayerServiceExtendedEventListener listener;
private final PlayerServiceConnection serviceConnection = new PlayerServiceConnection(); private final PlayerServiceConnection serviceConnection = new PlayerServiceConnection();
private boolean bound; private boolean bound;
private MainPlayer playerService; @Nullable private MainPlayer playerService;
private Player player; @Nullable private Player player;
/** /**
* Returns the current {@link MainPlayer.PlayerType} of the {@link MainPlayer} service, * Returns the current {@link MainPlayer.PlayerType} of the {@link MainPlayer} service,
@ -70,12 +70,25 @@ public final class PlayerHolder {
return player != null; return player != null;
} }
/**
* Use this method to only allow the user to manipulate the play queue (e.g. by enqueueing via
* the stream long press menu) when there actually is a play queue to manipulate.
* @return true only if the player is open and its play queue is ready (i.e. it is not null)
*/
public boolean isPlayQueueReady() {
return player != null && player.getPlayQueue() != null;
}
public boolean isBound() { public boolean isBound() {
return bound; return bound;
} }
public int getQueueSize() { public int getQueueSize() {
return isPlayerOpen() ? player.getPlayQueue().size() : 0; if (player == null || player.getPlayQueue() == null) {
// player play queue might be null e.g. while player is starting
return 0;
}
return player.getPlayQueue().size();
} }
public void setListener(@Nullable final PlayerServiceExtendedEventListener newListener) { public void setListener(@Nullable final PlayerServiceExtendedEventListener newListener) {