2018-04-23 22:02:36 +02:00
|
|
|
package org.schabi.newpipe.local.dialog;
|
2018-01-16 20:48:52 +01:00
|
|
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
import android.view.LayoutInflater;
|
|
|
|
import android.view.View;
|
|
|
|
import android.view.ViewGroup;
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
2020-01-07 22:48:35 +01:00
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
|
|
|
2018-01-16 20:48:52 +01:00
|
|
|
import org.schabi.newpipe.NewPipeDatabase;
|
|
|
|
import org.schabi.newpipe.R;
|
|
|
|
import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;
|
|
|
|
import org.schabi.newpipe.database.stream.model.StreamEntity;
|
2018-04-23 22:02:36 +02:00
|
|
|
import org.schabi.newpipe.local.LocalItemListAdapter;
|
2018-04-12 23:46:03 +02:00
|
|
|
import org.schabi.newpipe.local.playlist.LocalPlaylistManager;
|
2018-01-16 20:48:52 +01:00
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
2020-10-31 21:55:45 +01:00
|
|
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
|
|
|
import io.reactivex.rxjava3.disposables.CompositeDisposable;
|
2018-01-16 20:48:52 +01:00
|
|
|
|
2018-01-22 04:32:49 +01:00
|
|
|
public final class PlaylistAppendDialog extends PlaylistDialog {
|
2018-01-16 20:48:52 +01:00
|
|
|
private static final String TAG = PlaylistAppendDialog.class.getCanonicalName();
|
|
|
|
|
|
|
|
private RecyclerView playlistRecyclerView;
|
2018-01-29 03:26:19 +01:00
|
|
|
private LocalItemListAdapter playlistAdapter;
|
2018-01-16 20:48:52 +01:00
|
|
|
|
2020-11-18 23:50:00 +01:00
|
|
|
private final CompositeDisposable playlistDisposables = new CompositeDisposable();
|
2018-01-30 05:42:52 +01:00
|
|
|
|
2022-04-04 07:50:27 +02:00
|
|
|
/**
|
|
|
|
* Create a new instance of {@link PlaylistAppendDialog}.
|
|
|
|
*
|
|
|
|
* @param streamEntities a list of {@link StreamEntity} to be added to playlists
|
|
|
|
* @return a new instance of {@link PlaylistAppendDialog}
|
|
|
|
*/
|
|
|
|
public static PlaylistAppendDialog newInstance(final List<StreamEntity> streamEntities) {
|
|
|
|
final PlaylistAppendDialog dialog = new PlaylistAppendDialog();
|
|
|
|
dialog.setStreamEntities(streamEntities);
|
|
|
|
return dialog;
|
2021-10-02 19:21:25 +02:00
|
|
|
}
|
|
|
|
|
2018-01-16 20:48:52 +01:00
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
2018-01-31 01:01:11 +01:00
|
|
|
// LifeCycle - Creation
|
2018-01-22 04:32:49 +01:00
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
2018-01-16 20:48:52 +01:00
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,
|
|
|
|
final Bundle savedInstanceState) {
|
2018-01-16 20:48:52 +01:00
|
|
|
return inflater.inflate(R.layout.dialog_playlists, container);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
|
2018-01-16 20:48:52 +01:00
|
|
|
super.onViewCreated(view, savedInstanceState);
|
|
|
|
|
|
|
|
final LocalPlaylistManager playlistManager =
|
2020-10-31 21:55:45 +01:00
|
|
|
new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext()));
|
2018-01-16 20:48:52 +01:00
|
|
|
|
2018-01-31 01:01:11 +01:00
|
|
|
playlistAdapter = new LocalItemListAdapter(getActivity());
|
2022-07-31 10:08:24 +02:00
|
|
|
playlistAdapter.setSelectedListener(selectedItem -> {
|
|
|
|
final List<StreamEntity> entities = getStreamEntities();
|
|
|
|
if (selectedItem instanceof PlaylistMetadataEntry && entities != null) {
|
|
|
|
onPlaylistSelected(playlistManager, (PlaylistMetadataEntry) selectedItem, entities);
|
2018-01-16 20:48:52 +01:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2018-01-31 01:01:11 +01:00
|
|
|
playlistRecyclerView = view.findViewById(R.id.playlist_list);
|
2020-10-31 21:55:45 +01:00
|
|
|
playlistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
|
2018-01-31 01:01:11 +01:00
|
|
|
playlistRecyclerView.setAdapter(playlistAdapter);
|
|
|
|
|
|
|
|
final View newPlaylistButton = view.findViewById(R.id.newPlaylist);
|
|
|
|
newPlaylistButton.setOnClickListener(ignored -> openCreatePlaylistDialog());
|
|
|
|
|
2019-08-14 12:54:17 +02:00
|
|
|
playlistDisposables.add(playlistManager.getPlaylists()
|
2018-01-16 20:48:52 +01:00
|
|
|
.observeOn(AndroidSchedulers.mainThread())
|
2019-08-14 12:54:17 +02:00
|
|
|
.subscribe(this::onPlaylistsReceived));
|
2018-01-31 01:01:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
|
|
// LifeCycle - Destruction
|
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onDestroyView() {
|
|
|
|
super.onDestroyView();
|
2019-08-14 12:54:17 +02:00
|
|
|
playlistDisposables.dispose();
|
2019-04-15 21:18:24 +02:00
|
|
|
if (playlistAdapter != null) {
|
|
|
|
playlistAdapter.unsetSelectedListener();
|
|
|
|
}
|
2018-01-31 01:01:11 +01:00
|
|
|
|
2019-08-14 12:54:17 +02:00
|
|
|
playlistDisposables.clear();
|
2018-01-31 01:01:11 +01:00
|
|
|
playlistRecyclerView = null;
|
|
|
|
playlistAdapter = null;
|
2018-01-16 20:48:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
|
|
// Helper
|
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
2022-04-04 07:50:27 +02:00
|
|
|
/** Display create playlist dialog. */
|
2018-01-16 20:48:52 +01:00
|
|
|
public void openCreatePlaylistDialog() {
|
2021-10-09 18:46:20 +02:00
|
|
|
if (getStreamEntities() == null || !isAdded()) {
|
2020-03-31 19:20:15 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-01-16 20:48:52 +01:00
|
|
|
|
2021-10-09 18:46:20 +02:00
|
|
|
final PlaylistCreationDialog playlistCreationDialog =
|
2022-04-04 07:50:27 +02:00
|
|
|
PlaylistCreationDialog.newInstance(getStreamEntities());
|
2021-10-02 19:21:25 +02:00
|
|
|
// Move the dismissListener to the new dialog.
|
2021-10-09 18:46:20 +02:00
|
|
|
playlistCreationDialog.setOnDismissListener(this.getOnDismissListener());
|
|
|
|
this.setOnDismissListener(null);
|
2021-10-02 19:21:25 +02:00
|
|
|
|
2021-10-09 18:46:20 +02:00
|
|
|
playlistCreationDialog.show(getParentFragmentManager(), TAG);
|
2020-10-31 21:55:45 +01:00
|
|
|
requireDialog().dismiss();
|
2018-01-16 20:48:52 +01:00
|
|
|
}
|
2018-01-31 01:01:11 +01:00
|
|
|
|
|
|
|
private void onPlaylistsReceived(@NonNull final List<PlaylistMetadataEntry> playlists) {
|
|
|
|
if (playlistAdapter != null && playlistRecyclerView != null) {
|
|
|
|
playlistAdapter.clearStreamItemList();
|
|
|
|
playlistAdapter.addItems(playlists);
|
|
|
|
playlistRecyclerView.setVisibility(View.VISIBLE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager,
|
|
|
|
@NonNull final PlaylistMetadataEntry playlist,
|
|
|
|
@NonNull final List<StreamEntity> streams) {
|
2018-01-31 01:01:11 +01:00
|
|
|
final Toast successToast = Toast.makeText(getContext(),
|
|
|
|
R.string.playlist_add_stream_success, Toast.LENGTH_SHORT);
|
|
|
|
|
2022-07-14 10:58:48 +02:00
|
|
|
if (playlist.thumbnailUrl
|
|
|
|
.equals("drawable://" + R.drawable.placeholder_thumbnail_playlist)) {
|
2020-03-31 19:20:15 +02:00
|
|
|
playlistDisposables.add(manager
|
2022-12-07 02:32:53 +01:00
|
|
|
.changePlaylistThumbnail(playlist.uid, streams.get(0).getThumbnailUrl(), false)
|
2019-12-02 22:20:43 +01:00
|
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
|
|
.subscribe(ignored -> successToast.show()));
|
|
|
|
}
|
2018-01-31 01:01:11 +01:00
|
|
|
|
2019-12-04 19:24:34 +01:00
|
|
|
playlistDisposables.add(manager.appendToPlaylist(playlist.uid, streams)
|
|
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
|
|
.subscribe(ignored -> successToast.show()));
|
|
|
|
|
2020-10-31 21:55:45 +01:00
|
|
|
requireDialog().dismiss();
|
2018-01-31 01:01:11 +01:00
|
|
|
}
|
2018-01-16 20:48:52 +01:00
|
|
|
}
|