mirror of https://github.com/TeamNewPipe/NewPipe
162 lines
6.2 KiB
Java
162 lines
6.2 KiB
Java
package org.schabi.newpipe.fragments.local.dialog;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.os.Bundle;
|
|
import android.support.annotation.NonNull;
|
|
import android.support.annotation.Nullable;
|
|
import android.support.v7.widget.LinearLayoutManager;
|
|
import android.support.v7.widget.RecyclerView;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.Toast;
|
|
|
|
import org.schabi.newpipe.NewPipeDatabase;
|
|
import org.schabi.newpipe.R;
|
|
import org.schabi.newpipe.database.LocalItem;
|
|
import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;
|
|
import org.schabi.newpipe.database.stream.model.StreamEntity;
|
|
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
|
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
|
import org.schabi.newpipe.fragments.local.LocalItemListAdapter;
|
|
import org.schabi.newpipe.local.playlist.LocalPlaylistManager;
|
|
import org.schabi.newpipe.playqueue.PlayQueueItem;
|
|
import org.schabi.newpipe.util.OnClickGesture;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
|
import io.reactivex.disposables.Disposable;
|
|
|
|
public final class PlaylistAppendDialog extends PlaylistDialog {
|
|
private static final String TAG = PlaylistAppendDialog.class.getCanonicalName();
|
|
|
|
private RecyclerView playlistRecyclerView;
|
|
private LocalItemListAdapter playlistAdapter;
|
|
|
|
private Disposable playlistReactor;
|
|
|
|
public static PlaylistAppendDialog fromStreamInfo(final StreamInfo info) {
|
|
PlaylistAppendDialog dialog = new PlaylistAppendDialog();
|
|
dialog.setInfo(Collections.singletonList(new StreamEntity(info)));
|
|
return dialog;
|
|
}
|
|
|
|
public static PlaylistAppendDialog fromStreamInfoItems(final List<StreamInfoItem> items) {
|
|
PlaylistAppendDialog dialog = new PlaylistAppendDialog();
|
|
List<StreamEntity> entities = new ArrayList<>(items.size());
|
|
for (final StreamInfoItem item : items) {
|
|
entities.add(new StreamEntity(item));
|
|
}
|
|
dialog.setInfo(entities);
|
|
return dialog;
|
|
}
|
|
|
|
public static PlaylistAppendDialog fromPlayQueueItems(final List<PlayQueueItem> items) {
|
|
PlaylistAppendDialog dialog = new PlaylistAppendDialog();
|
|
List<StreamEntity> entities = new ArrayList<>(items.size());
|
|
for (final PlayQueueItem item : items) {
|
|
entities.add(new StreamEntity(item));
|
|
}
|
|
dialog.setInfo(entities);
|
|
return dialog;
|
|
}
|
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
// LifeCycle - Creation
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
@Override
|
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
|
Bundle savedInstanceState) {
|
|
return inflater.inflate(R.layout.dialog_playlists, container);
|
|
}
|
|
|
|
@Override
|
|
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
|
super.onViewCreated(view, savedInstanceState);
|
|
|
|
final LocalPlaylistManager playlistManager =
|
|
new LocalPlaylistManager(NewPipeDatabase.getInstance(getContext()));
|
|
|
|
playlistAdapter = new LocalItemListAdapter(getActivity());
|
|
playlistAdapter.setSelectedListener(new OnClickGesture<LocalItem>() {
|
|
@Override
|
|
public void selected(LocalItem selectedItem) {
|
|
if (!(selectedItem instanceof PlaylistMetadataEntry) || getStreams() == null)
|
|
return;
|
|
onPlaylistSelected(playlistManager, (PlaylistMetadataEntry) selectedItem,
|
|
getStreams());
|
|
}
|
|
});
|
|
|
|
playlistRecyclerView = view.findViewById(R.id.playlist_list);
|
|
playlistRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
|
playlistRecyclerView.setAdapter(playlistAdapter);
|
|
|
|
final View newPlaylistButton = view.findViewById(R.id.newPlaylist);
|
|
newPlaylistButton.setOnClickListener(ignored -> openCreatePlaylistDialog());
|
|
|
|
playlistReactor = playlistManager.getPlaylists()
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
.subscribe(this::onPlaylistsReceived);
|
|
}
|
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
// LifeCycle - Destruction
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
@Override
|
|
public void onDestroyView() {
|
|
super.onDestroyView();
|
|
if (playlistReactor != null) playlistReactor.dispose();
|
|
if (playlistAdapter != null) playlistAdapter.unsetSelectedListener();
|
|
|
|
playlistReactor = null;
|
|
playlistRecyclerView = null;
|
|
playlistAdapter = null;
|
|
}
|
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
// Helper
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
public void openCreatePlaylistDialog() {
|
|
if (getStreams() == null || getFragmentManager() == null) return;
|
|
|
|
PlaylistCreationDialog.newInstance(getStreams()).show(getFragmentManager(), TAG);
|
|
getDialog().dismiss();
|
|
}
|
|
|
|
private void onPlaylistsReceived(@NonNull final List<PlaylistMetadataEntry> playlists) {
|
|
if (playlists.isEmpty()) {
|
|
openCreatePlaylistDialog();
|
|
return;
|
|
}
|
|
|
|
if (playlistAdapter != null && playlistRecyclerView != null) {
|
|
playlistAdapter.clearStreamItemList();
|
|
playlistAdapter.addItems(playlists);
|
|
playlistRecyclerView.setVisibility(View.VISIBLE);
|
|
}
|
|
}
|
|
|
|
private void onPlaylistSelected(@NonNull LocalPlaylistManager manager,
|
|
@NonNull PlaylistMetadataEntry playlist,
|
|
@NonNull List<StreamEntity> streams) {
|
|
if (getStreams() == null) return;
|
|
|
|
@SuppressLint("ShowToast")
|
|
final Toast successToast = Toast.makeText(getContext(),
|
|
R.string.playlist_add_stream_success, Toast.LENGTH_SHORT);
|
|
|
|
manager.appendToPlaylist(playlist.uid, streams)
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
.subscribe(ignored -> successToast.show());
|
|
|
|
getDialog().dismiss();
|
|
}
|
|
}
|