1616import org .schabi .newpipe .R ;
1717import org .schabi .newpipe .database .playlist .PlaylistMetadataEntry ;
1818import org .schabi .newpipe .database .stream .model .StreamEntity ;
19- import org .schabi .newpipe .fragments .OnScrollBelowItemsListener ;
2019import org .schabi .newpipe .local .LocalItemListAdapter ;
2120import org .schabi .newpipe .local .playlist .LocalPlaylistManager ;
2221
2827public final class PlaylistAppendDialog extends PlaylistDialog {
2928 private static final String TAG = PlaylistAppendDialog .class .getCanonicalName ();
3029
30+ private static final float DEFAULT_ALPHA = 1f ;
31+ private static final float GRAYED_OUT_ALPHA = 0.3f ;
32+
3133 private RecyclerView playlistRecyclerView ;
3234 private LocalItemListAdapter playlistAdapter ;
35+ private List <Long > duplicateIds ;
3336
3437 private final CompositeDisposable playlistDisposables = new CompositeDisposable ();
3538
@@ -62,6 +65,9 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved
6265 final LocalPlaylistManager playlistManager =
6366 new LocalPlaylistManager (NewPipeDatabase .getInstance (requireContext ()));
6467
68+ duplicateIds = playlistManager .getDuplicatePlaylists (getStreamEntities ().get (0 ).getUrl ())
69+ .blockingFirst ();
70+
6571 playlistAdapter = new LocalItemListAdapter (getActivity ());
6672 playlistAdapter .setHasStableIds (true );
6773 playlistAdapter .setSelectedListener (selectedItem -> {
@@ -126,43 +132,43 @@ private void onPlaylistsReceived(@NonNull final List<PlaylistMetadataEntry> play
126132 playlistAdapter .addItems (playlists );
127133 playlistRecyclerView .setVisibility (View .VISIBLE );
128134
129- playlistRecyclerView .addOnScrollListener (new DefaultItemListOnScrolledDownListener ());
135+ playlistRecyclerView .addOnScrollListener (new RecyclerView .OnScrollListener () {
136+ @ Override
137+ public void onScrolled (@ NonNull final RecyclerView recyclerView , final int dx ,
138+ final int dy ) {
139+ showDuplicateIndicators (recyclerView );
140+ }
141+ });
130142 initDuplicateIndicators (playlistRecyclerView );
131143 }
132144 }
133145
134- public class DefaultItemListOnScrolledDownListener extends OnScrollBelowItemsListener {
135- @ Override
136- public void onScrolledDown (final RecyclerView recyclerView ) {
137- showDuplicateIndicators (recyclerView );
138- }
139- }
140-
141146 public void initDuplicateIndicators (@ NonNull final RecyclerView view ) {
142- view .postDelayed (new Runnable () {
143- @ Override
144- public void run () {
145- showDuplicateIndicators (view );
146- }
147- }, 50 );
148- }
147+ showDuplicateIndicators (view );
149148
150- public void showDuplicateIndicators (final RecyclerView view ) {
151- final LocalPlaylistManager playlistManager =
152- new LocalPlaylistManager (NewPipeDatabase .getInstance (requireContext ()));
153- final List <Long > duplicateIds = playlistManager .getDuplicatePlaylist (getStreamEntities ()
154- .get (0 ).getUrl ()).blockingFirst ();
149+ if (!duplicateIds .isEmpty ()) {
150+ final View indicatorExplanation = getView ()
151+ .findViewById (R .id .playlist_duplicate );
152+ indicatorExplanation .setVisibility (View .VISIBLE );
153+ }
154+ }
155155
156+ public void showDuplicateIndicators (@ NonNull final RecyclerView view ) {
156157 if (view .getAdapter () == null ) {
157158 return ;
158159 }
159160
160161 final int count = view .getAdapter ().getItemCount ();
161162 for (int i = 0 ; i < count ; i ++) {
162- if (view .findViewHolderForAdapterPosition (i ) != null
163- && duplicateIds .contains (playlistAdapter .getItemId (i ))) {
164- view .findViewHolderForAdapterPosition (i ).itemView
165- .findViewById (R .id .checkmark2 ).setVisibility (View .VISIBLE );
163+
164+ final RecyclerView .ViewHolder viewHolder = view .findViewHolderForAdapterPosition (i );
165+ if (viewHolder != null ) {
166+ if (duplicateIds .contains (view .getAdapter ().getItemId (i ))) {
167+ viewHolder .itemView .setAlpha (GRAYED_OUT_ALPHA );
168+ } else {
169+ viewHolder .itemView .setAlpha (DEFAULT_ALPHA );
170+ }
171+
166172 }
167173 }
168174 }
@@ -171,10 +177,10 @@ private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager,
171177 @ NonNull final PlaylistMetadataEntry playlist ,
172178 @ NonNull final List <StreamEntity > streams ) {
173179
174- final int numOfDuplicates = manager .getPlaylistDuplicates (playlist .uid ,
180+ final int numberOfDuplicates = manager .getPlaylistDuplicateCount (playlist .uid ,
175181 streams .get (0 ).getUrl ()).blockingFirst ();
176- if (numOfDuplicates > 0 ) {
177- createDuplicateDialog (numOfDuplicates , manager , playlist , streams );
182+ if (numberOfDuplicates > 0 ) {
183+ createDuplicateDialog (numberOfDuplicates , manager , playlist , streams );
178184 } else {
179185 addStreamToPlaylist (manager , playlist , streams );
180186 }
@@ -197,22 +203,24 @@ private void addStreamToPlaylist(@NonNull final LocalPlaylistManager manager,
197203 playlistDisposables .add (manager .appendToPlaylist (playlist .uid , streams )
198204 .observeOn (AndroidSchedulers .mainThread ())
199205 .subscribe (ignored -> successToast .show ()));
206+
200207 requireDialog ().dismiss ();
201208 }
202209
203- private void createDuplicateDialog (final int duplicates ,
210+ private void createDuplicateDialog (final int numberOfDuplicates ,
204211 @ NonNull final LocalPlaylistManager manager ,
205212 @ NonNull final PlaylistMetadataEntry playlist ,
206213 @ NonNull final List <StreamEntity > streams ) {
207214 final AlertDialog .Builder builder = new AlertDialog .Builder (this .getActivity ());
208215 builder .setTitle (R .string .duplicate_stream_in_playlist_title );
209216 builder .setMessage (getString (R .string .duplicate_stream_in_playlist_description ,
210- duplicates ));
217+ numberOfDuplicates ));
211218
212219 builder .setPositiveButton (android .R .string .yes , (dialog , i ) -> {
213220 addStreamToPlaylist (manager , playlist , streams );
214221 });
215222 builder .setNeutralButton (R .string .cancel , null );
223+
216224 builder .create ().show ();
217225 }
218226}
0 commit comments