From 2680d41a3dff08aa5505da4aec0f67ff3f4155c8 Mon Sep 17 00:00:00 2001 From: vkay94 Date: Tue, 29 Sep 2020 00:32:24 +0200 Subject: [PATCH] Fix PlaylistAppendDialog showing when no local playlists exist --- .../database/playlist/dao/PlaylistDAO.java | 3 ++ .../fragments/detail/VideoDetailFragment.java | 11 ++++++-- .../local/dialog/PlaylistAppendDialog.java | 28 +++++++++++++++---- .../local/dialog/PlaylistCreationDialog.java | 6 ++++ .../local/playlist/LocalPlaylistManager.java | 6 ++++ .../newpipe/player/ServicePlayerActivity.java | 10 +++++-- .../newpipe/util/StreamDialogEntry.java | 11 ++++++-- 7 files changed, 64 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java index 2cfe5440c..ad9c148ca 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java @@ -33,4 +33,7 @@ public abstract class PlaylistDAO implements BasicDAO { @Query("DELETE FROM " + PLAYLIST_TABLE + " WHERE " + PLAYLIST_ID + " = :playlistId") public abstract int deletePlaylist(long playlistId); + + @Query("SELECT COUNT(*) FROM " + PLAYLIST_TABLE) + public abstract Flowable getCount(); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 536c3b35c..463a264e1 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -80,6 +80,7 @@ import org.schabi.newpipe.fragments.EmptyFragment; import org.schabi.newpipe.fragments.list.comments.CommentsFragment; import org.schabi.newpipe.fragments.list.videos.RelatedVideosFragment; 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.BasePlayer; import org.schabi.newpipe.player.MainPlayer; @@ -482,8 +483,14 @@ public class VideoDetailFragment break; case R.id.detail_controls_playlist_append: if (getFM() != null && currentInfo != null) { - PlaylistAppendDialog.fromStreamInfo(currentInfo) - .show(getFM(), TAG); + + final PlaylistAppendDialog d = PlaylistAppendDialog.fromStreamInfo(currentInfo); + disposables.add( + PlaylistAppendDialog.checkPlaylists(getContext(), + () -> d.show(getFM(), TAG), + () -> PlaylistCreationDialog.newInstance(d).show(getFM(), TAG) + ) + ); } break; case R.id.detail_controls_download: diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 5bb03f531..800ec427e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.local.dialog; +import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -29,6 +30,7 @@ import java.util.List; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; public final class PlaylistAppendDialog extends PlaylistDialog { private static final String TAG = PlaylistAppendDialog.class.getCanonicalName(); @@ -38,6 +40,27 @@ public final class PlaylistAppendDialog extends PlaylistDialog { private CompositeDisposable playlistDisposables = new CompositeDisposable(); + public static Disposable checkPlaylists( + final Context context, final Invoker onSuccess, final Invoker onFailed + ) { + final LocalPlaylistManager playlistManager = + new LocalPlaylistManager(NewPipeDatabase.getInstance(context)); + + return playlistManager.hasPlaylists() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(hasPlaylists -> { + if (hasPlaylists) { + onSuccess.invoke(); + } else { + onFailed.invoke(); + } + }); + } + + public interface Invoker { + void invoke(); + } + public static PlaylistAppendDialog fromStreamInfo(final StreamInfo info) { final PlaylistAppendDialog dialog = new PlaylistAppendDialog(); dialog.setInfo(Collections.singletonList(new StreamEntity(info))); @@ -136,11 +159,6 @@ public final class PlaylistAppendDialog extends PlaylistDialog { } private void onPlaylistsReceived(@NonNull final List playlists) { - if (playlists.isEmpty()) { - openCreatePlaylistDialog(); - return; - } - if (playlistAdapter != null && playlistRecyclerView != null) { playlistAdapter.clearStreamItemList(); playlistAdapter.addItems(playlists); diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java index ff6966644..55782b452 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java @@ -26,6 +26,12 @@ public final class PlaylistCreationDialog extends PlaylistDialog { return dialog; } + public static PlaylistCreationDialog newInstance(final PlaylistAppendDialog appendDialog) { + final PlaylistCreationDialog dialog = new PlaylistCreationDialog(); + dialog.setInfo(appendDialog.getStreams()); + return dialog; + } + /*////////////////////////////////////////////////////////////////////////// // Dialog //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index 2dec53fae..d6101eb1d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -126,4 +126,10 @@ public class LocalPlaylistManager { }).subscribeOn(Schedulers.io()); } + public Maybe hasPlaylists() { + return playlistTable.getCount() + .firstElement() + .map(count -> count > 0) + .subscribeOn(Schedulers.io()); + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java index 0ffd7f594..7e8b50419 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java @@ -33,6 +33,7 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; +import org.schabi.newpipe.local.dialog.PlaylistCreationDialog; import org.schabi.newpipe.player.event.PlayerEventListener; import org.schabi.newpipe.player.helper.PlaybackParameterDialog; import org.schabi.newpipe.player.playqueue.PlayQueue; @@ -571,8 +572,13 @@ public abstract class ServicePlayerActivity extends AppCompatActivity } private void openPlaylistAppendDialog(final List playlist) { - PlaylistAppendDialog.fromPlayQueueItems(playlist) - .show(getSupportFragmentManager(), getTag()); + final PlaylistAppendDialog d = PlaylistAppendDialog.fromPlayQueueItems(playlist); + + PlaylistAppendDialog.checkPlaylists(getApplicationContext(), + () -> d.show(getSupportFragmentManager(), getTag()), + () -> PlaylistCreationDialog.newInstance(d) + .show(getSupportFragmentManager(), getTag() + )); } //////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java b/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java index aee24fc03..80233c5c3 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java @@ -7,6 +7,7 @@ import androidx.fragment.app.Fragment; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; +import org.schabi.newpipe.local.dialog.PlaylistCreationDialog; import org.schabi.newpipe.player.MainPlayer; import org.schabi.newpipe.player.helper.PlayerHolder; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; @@ -58,8 +59,14 @@ public enum StreamDialogEntry { append_playlist(R.string.append_playlist, (fragment, item) -> { if (fragment.getFragmentManager() != null) { - PlaylistAppendDialog.fromStreamInfoItems(Collections.singletonList(item)) - .show(fragment.getFragmentManager(), "StreamDialogEntry@append_playlist"); + final PlaylistAppendDialog d = PlaylistAppendDialog + .fromStreamInfoItems(Collections.singletonList(item)); + + PlaylistAppendDialog.checkPlaylists(fragment.getContext(), + () -> d.show(fragment.getFragmentManager(), "StreamDialogEntry@append_playlist"), + () -> PlaylistCreationDialog.newInstance(d) + .show(fragment.getFragmentManager(), "StreamDialogEntry@create_playlist") + ); } }),