From 1f73572dd3d101a9c313e684d8a9bdd185450670 Mon Sep 17 00:00:00 2001 From: Stypox Date: Mon, 2 Nov 2020 14:24:39 +0100 Subject: [PATCH] Fix playlist select dialog and do some refactoring --- .../settings/SelectPlaylistFragment.java | 102 +++++++----------- 1 file changed, 40 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java index c858c7f77..153adf4c0 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java @@ -1,7 +1,6 @@ package org.schabi.newpipe.settings; import android.app.Activity; -import android.content.DialogInterface; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -34,6 +33,7 @@ import java.util.List; import java.util.Vector; import io.reactivex.Flowable; +import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; public class SelectPlaylistFragment extends DialogFragment { @@ -46,12 +46,11 @@ public class SelectPlaylistFragment extends DialogFragment { private final ImageLoader imageLoader = ImageLoader.getInstance(); private OnSelectedListener onSelectedListener = null; - private OnCancelListener onCancelListener = null; private ProgressBar progressBar; private TextView emptyView; private RecyclerView recyclerView; - private Disposable playlistsSubscriber; + private Disposable disposable = null; private List playlists = new Vector<>(); @@ -59,10 +58,6 @@ public class SelectPlaylistFragment extends DialogFragment { onSelectedListener = listener; } - public void setOnCancelListener(final OnCancelListener listener) { - onCancelListener = listener; - } - /*////////////////////////////////////////////////////////////////////////// // Fragment's Lifecycle //////////////////////////////////////////////////////////////////////////*/ @@ -70,15 +65,32 @@ public class SelectPlaylistFragment extends DialogFragment { @Override public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { - final View v = - inflater.inflate(R.layout.select_playlist_fragment, container, false); + final View v = inflater.inflate(R.layout.select_playlist_fragment, container, false); + progressBar = v.findViewById(R.id.progressBar); recyclerView = v.findViewById(R.id.items_list); + emptyView = v.findViewById(R.id.empty_state_view); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); final SelectPlaylistAdapter playlistAdapter = new SelectPlaylistAdapter(); recyclerView.setAdapter(playlistAdapter); - progressBar = v.findViewById(R.id.progressBar); - emptyView = v.findViewById(R.id.empty_state_view); + loadPlaylists(); + return v; + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (disposable != null) { + disposable.dispose(); + } + } + + /*////////////////////////////////////////////////////////////////////////// + // Load and display playlists + //////////////////////////////////////////////////////////////////////////*/ + + private void loadPlaylists() { progressBar.setVisibility(View.VISIBLE); recyclerView.setVisibility(View.GONE); emptyView.setVisibility(View.GONE); @@ -87,43 +99,36 @@ public class SelectPlaylistFragment extends DialogFragment { final LocalPlaylistManager localPlaylistManager = new LocalPlaylistManager(database); final RemotePlaylistManager remotePlaylistManager = new RemotePlaylistManager(database); - playlistsSubscriber = Flowable.combineLatest(localPlaylistManager.getPlaylists(), + disposable = Flowable.combineLatest(localPlaylistManager.getPlaylists(), remotePlaylistManager.getPlaylists(), PlaylistLocalItem::merge) + .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::displayPlaylists, this::onError); - - return v; } - @Override - public void onDestroy() { - super.onDestroy(); + private void displayPlaylists(final List newPlaylists) { + playlists = newPlaylists; + progressBar.setVisibility(View.GONE); + emptyView.setVisibility(newPlaylists.isEmpty() ? View.VISIBLE : View.GONE); + recyclerView.setVisibility(newPlaylists.isEmpty() ? View.GONE : View.VISIBLE); + } - if (playlistsSubscriber != null) { - playlistsSubscriber.dispose(); - playlistsSubscriber = null; - } + protected void onError(final Throwable e) { + final Activity activity = requireActivity(); + ErrorActivity.reportError(activity, e, activity.getClass(), null, ErrorActivity.ErrorInfo + .make(UserAction.UI_ERROR, "none", "load_playlists", R.string.app_ui_crash)); } /*////////////////////////////////////////////////////////////////////////// // Handle actions //////////////////////////////////////////////////////////////////////////*/ - @Override - public void onCancel(final DialogInterface dialogInterface) { - super.onCancel(dialogInterface); - if (onCancelListener != null) { - onCancelListener.onCancel(); - } - } - private void clickedItem(final int position) { if (onSelectedListener != null) { final LocalItem selectedItem = playlists.get(position); if (selectedItem instanceof PlaylistMetadataEntry) { final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); - onSelectedListener - .onLocalPlaylistSelected(entry.uid, entry.name); + onSelectedListener.onLocalPlaylistSelected(entry.uid, entry.name); } else if (selectedItem instanceof PlaylistRemoteEntity) { final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem); @@ -134,31 +139,6 @@ public class SelectPlaylistFragment extends DialogFragment { dismiss(); } - /*////////////////////////////////////////////////////////////////////////// - // Item handling - //////////////////////////////////////////////////////////////////////////*/ - - private void displayPlaylists(final List newPlaylists) { - this.playlists = newPlaylists; - progressBar.setVisibility(View.GONE); - if (newPlaylists.isEmpty()) { - emptyView.setVisibility(View.VISIBLE); - return; - } - recyclerView.setVisibility(View.VISIBLE); - - } - - /*////////////////////////////////////////////////////////////////////////// - // Error - //////////////////////////////////////////////////////////////////////////*/ - - protected void onError(final Throwable e) { - final Activity activity = getActivity(); - ErrorActivity.reportError(activity, e, activity.getClass(), null, ErrorActivity.ErrorInfo - .make(UserAction.UI_ERROR, "none", "", R.string.app_ui_crash)); - } - /*////////////////////////////////////////////////////////////////////////// // Interfaces //////////////////////////////////////////////////////////////////////////*/ @@ -168,22 +148,20 @@ public class SelectPlaylistFragment extends DialogFragment { void onRemotePlaylistSelected(int serviceId, String url, String name); } - public interface OnCancelListener { - void onCancel(); - } - private class SelectPlaylistAdapter extends RecyclerView.Adapter { + @NonNull @Override public SelectPlaylistItemHolder onCreateViewHolder(final ViewGroup parent, - final int viewType) { + final int viewType) { final View item = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_playlist_mini_item, parent, false); return new SelectPlaylistItemHolder(item); } @Override - public void onBindViewHolder(final SelectPlaylistItemHolder holder, final int position) { + public void onBindViewHolder(@NonNull final SelectPlaylistItemHolder holder, + final int position) { final PlaylistLocalItem selectedItem = playlists.get(position); if (selectedItem instanceof PlaylistMetadataEntry) {