remove final references to smart playlist class

This commit is contained in:
dkanada 2020-05-06 00:08:31 +09:00
commit 4dc3a89c0b
7 changed files with 39 additions and 254 deletions

View file

@ -1,7 +1,7 @@
package com.kabouzeid.gramophone.adapter;
import android.graphics.PorterDuff;
import android.os.Build;
import android.graphics.drawable.Drawable;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -12,29 +12,25 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupMenu;
import com.bumptech.glide.Glide;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
import com.kabouzeid.gramophone.dialogs.ClearSmartPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog;
import com.kabouzeid.gramophone.glide.CustomGlideRequest;
import com.kabouzeid.gramophone.glide.CustomPaletteTarget;
import com.kabouzeid.gramophone.helper.menu.PlaylistMenuHelper;
import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.playlist.AbsSmartPlaylist;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import java.util.ArrayList;
import java.util.List;
public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewHolder, Playlist> {
private static final int SMART_PLAYLIST = 0;
private static final int DEFAULT_PLAYLIST = 1;
protected final AppCompatActivity activity;
protected List<Playlist> dataSet;
protected int itemLayoutRes;
@ -58,7 +54,7 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
@Override
public long getItemId(int position) {
return dataSet.get(position).id.hashCode();
return dataSet.get(position).hashCode();
}
@Override
@ -87,27 +83,30 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
holder.shortSeparator.setVisibility(View.GONE);
}
} else {
if (holder.shortSeparator != null && !(dataSet.get(position) instanceof AbsSmartPlaylist)) {
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.VISIBLE);
}
}
if (holder.image != null) {
holder.image.setImageResource(getIconRes(playlist));
}
loadImage(playlist, holder);
}
private int getIconRes(Playlist playlist) {
if (playlist instanceof AbsSmartPlaylist) {
return ((AbsSmartPlaylist) playlist).iconRes;
}
protected void loadImage(Playlist playlist, final PlaylistAdapter.ViewHolder holder) {
if (holder.image == null) return;
return MusicUtil.isFavoritePlaylist(activity, playlist) ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_queue_music_white_24dp;
}
CustomGlideRequest.Builder
.from(Glide.with(activity), playlist.id)
.generatePalette(activity).build()
.into(new CustomPaletteTarget(holder.image) {
@Override
public void onLoadCleared(Drawable placeholder) {
super.onLoadCleared(placeholder);
}
@Override
public int getItemViewType(int position) {
return dataSet.get(position) instanceof AbsSmartPlaylist ? SMART_PLAYLIST : DEFAULT_PLAYLIST;
@Override
public void onColorReady(int color) {
}
});
}
@Override
@ -129,19 +128,7 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
protected void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull List<Playlist> selection) {
switch (menuItem.getItemId()) {
case R.id.action_delete_playlist:
for (int i = 0; i < selection.size(); i++) {
Playlist playlist = selection.get(i);
if (playlist instanceof AbsSmartPlaylist) {
AbsSmartPlaylist absSmartPlaylist = (AbsSmartPlaylist) playlist;
ClearSmartPlaylistDialog.create(absSmartPlaylist).show(activity.getSupportFragmentManager(), "CLEAR_PLAYLIST_" + absSmartPlaylist.name);
selection.remove(playlist);
i--;
}
}
if (selection.size() > 0) {
DeletePlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST");
}
DeletePlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST");
break;
default:
SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.getItemId());
@ -159,38 +146,12 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
public ViewHolder(@NonNull View itemView, int itemViewType) {
super(itemView);
if (itemViewType == SMART_PLAYLIST) {
if (shortSeparator != null) {
shortSeparator.setVisibility(View.GONE);
}
itemView.setBackgroundColor(ATHUtil.resolveColor(activity, R.attr.cardBackgroundColor));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation));
}
}
if (image != null) {
int iconPadding = activity.getResources().getDimensionPixelSize(R.dimen.list_item_image_icon_padding);
image.setPadding(iconPadding, iconPadding, iconPadding, iconPadding);
image.setColorFilter(ATHUtil.resolveColor(activity, R.attr.iconColor), PorterDuff.Mode.SRC_IN);
}
if (menu != null) {
menu.setOnClickListener(view -> {
final Playlist playlist = dataSet.get(getAdapterPosition());
final PopupMenu popupMenu = new PopupMenu(activity, view);
popupMenu.inflate(getItemViewType() == SMART_PLAYLIST ? R.menu.menu_item_smart_playlist : R.menu.menu_item_playlist);
popupMenu.setOnMenuItemClickListener(item -> {
if (item.getItemId() == R.id.action_clear_playlist) {
if (playlist instanceof AbsSmartPlaylist) {
ClearSmartPlaylistDialog.create((AbsSmartPlaylist) playlist).show(activity.getSupportFragmentManager(), "CLEAR_SMART_PLAYLIST_" + playlist.name);
return true;
}
}
return PlaylistMenuHelper.handleMenuClick(
activity, dataSet.get(getAdapterPosition()), item);
});
popupMenu.inflate(R.menu.menu_item_playlist);
popupMenu.setOnMenuItemClickListener(item -> PlaylistMenuHelper.handleMenuClick(activity, dataSet.get(getAdapterPosition()), item));
popupMenu.show();
});

View file

@ -1,46 +0,0 @@
package com.kabouzeid.gramophone.dialogs;
import android.app.Dialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import android.text.Html;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.model.playlist.AbsSmartPlaylist;
public class ClearSmartPlaylistDialog extends DialogFragment {
@NonNull
public static ClearSmartPlaylistDialog create(AbsSmartPlaylist playlist) {
ClearSmartPlaylistDialog dialog = new ClearSmartPlaylistDialog();
Bundle args = new Bundle();
args.putParcelable("playlist", playlist);
dialog.setArguments(args);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// noinspection unchecked
final AbsSmartPlaylist playlist = getArguments().getParcelable("playlist");
int title = R.string.clear_playlist_title;
// noinspection ConstantConditions
CharSequence content = Html.fromHtml(getString(R.string.clear_playlist_x, playlist.name));
return new MaterialDialog.Builder(getActivity())
.title(title)
.content(content)
.positiveText(R.string.clear_action)
.negativeText(android.R.string.cancel)
.onPositive((dialog, which) -> {
if (getActivity() == null) {
return;
}
playlist.clear(getActivity());
})
.build();
}
}

View file

@ -1,68 +0,0 @@
package com.kabouzeid.gramophone.model.playlist;
import android.content.Context;
import android.os.Parcel;
import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song;
import java.util.List;
public abstract class AbsSmartPlaylist extends Playlist {
@DrawableRes
public final int iconRes;
public AbsSmartPlaylist(final String name, final int iconRes) {
super(-Math.abs(31 * name.hashCode() + (iconRes * name.hashCode() * 31 * 31)), name);
this.iconRes = iconRes;
}
public AbsSmartPlaylist() {
super();
this.iconRes = R.drawable.ic_queue_music_white_24dp;
}
public abstract void clear(Context context);
public abstract List<Song> getSongs(Context context);
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + iconRes;
return result;
}
@Override
public boolean equals(@Nullable final Object obj) {
if (super.equals(obj)) {
if (getClass() != obj.getClass()) {
return false;
}
final AbsSmartPlaylist other = (AbsSmartPlaylist) obj;
return iconRes == other.iconRes;
}
return false;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(this.iconRes);
}
protected AbsSmartPlaylist(Parcel in) {
super(in);
this.iconRes = in.readInt();
}
}

View file

@ -28,7 +28,6 @@ import com.kabouzeid.gramophone.interfaces.MediaCallback;
import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.PlaylistSong;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.playlist.AbsSmartPlaylist;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.ThemeUtil;
import com.kabouzeid.gramophone.util.PlaylistUtil;
@ -97,26 +96,22 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
private void setUpRecyclerView() {
ViewUtil.setUpFastScrollRecyclerViewColor(this, ((FastScrollRecyclerView) recyclerView), ThemeStore.accentColor(this));
recyclerView.setLayoutManager(new LinearLayoutManager(this));
if (playlist instanceof AbsSmartPlaylist) {
adapter = new PlaylistSongAdapter(this, new ArrayList<>(), R.layout.item_list, false, this);
recyclerView.setAdapter(adapter);
} else {
recyclerViewDragDropManager = new RecyclerViewDragDropManager();
final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator();
adapter = new OrderablePlaylistSongAdapter(this, new ArrayList<>(), R.layout.item_list, false, this, (fromPosition, toPosition) -> {
PlaylistUtil.moveItem(playlist.id, (PlaylistSong) adapter.getDataSet().get(fromPosition), toPosition);
Song song = adapter.getDataSet().remove(fromPosition);
adapter.getDataSet().add(toPosition, song);
adapter.notifyItemMoved(fromPosition, toPosition);
});
wrappedAdapter = recyclerViewDragDropManager.createWrappedAdapter(adapter);
recyclerViewDragDropManager = new RecyclerViewDragDropManager();
final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator();
adapter = new OrderablePlaylistSongAdapter(this, new ArrayList<>(), R.layout.item_list, false, this, (fromPosition, toPosition) -> {
PlaylistUtil.moveItem(playlist.id, (PlaylistSong) adapter.getDataSet().get(fromPosition), toPosition);
Song song = adapter.getDataSet().remove(fromPosition);
adapter.getDataSet().add(toPosition, song);
adapter.notifyItemMoved(fromPosition, toPosition);
});
recyclerView.setAdapter(wrappedAdapter);
recyclerView.setItemAnimator(animator);
wrappedAdapter = recyclerViewDragDropManager.createWrappedAdapter(adapter);
recyclerViewDragDropManager.attachRecyclerView(recyclerView);
}
recyclerView.setAdapter(wrappedAdapter);
recyclerView.setItemAnimator(animator);
recyclerViewDragDropManager.attachRecyclerView(recyclerView);
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
@ -142,7 +137,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(playlist instanceof AbsSmartPlaylist ? R.menu.menu_smart_playlist_detail : R.menu.menu_playlist_detail, menu);
getMenuInflater().inflate(R.menu.menu_playlist_detail, menu);
return super.onCreateOptionsMenu(menu);
}

View file

@ -112,11 +112,9 @@ public class MusicUtil {
public static String buildInfoString(@Nullable final String one, @Nullable final String two) {
// skip empty strings
if (TextUtils.isEmpty(one)) {
// noinspection ConstantConditions
return TextUtils.isEmpty(two) ? "" : two;
}
if (TextUtils.isEmpty(two)) {
// noinspection ConstantConditions
return TextUtils.isEmpty(one) ? "" : one;
}
@ -129,10 +127,6 @@ public class MusicUtil {
return trackNumberToFix % 1000;
}
public static boolean isFavoritePlaylist(@NonNull final Context context, @NonNull final Playlist playlist) {
return playlist.name != null && playlist.name.equals(context.getString(R.string.favorites));
}
public static void toggleFavorite(@NonNull final Context context, @NonNull final Song song) {
song.favorite = !song.favorite;

View file

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/action_play" />
<item
android:id="@+id/action_play_next"
android:title="@string/action_play_next" />
<item
android:id="@+id/action_add_to_queue"
android:title="@string/action_add_to_queue" />
<item
android:id="@+id/action_add_to_playlist"
android:title="@string/action_add_to_playlist" />
<item
android:id="@+id/action_clear_playlist"
android:title="@string/action_clear_playlist" />
</menu>

View file

@ -1,27 +0,0 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.kabouzeid.gramophone.ui.activities.PlaylistDetailActivity">
<item
android:id="@+id/action_shuffle_playlist"
android:icon="@drawable/ic_shuffle_white_24dp"
android:title="@string/action_shuffle_playlist"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_play"
android:title="@string/action_play"
app:showAsAction="never" />
<item
android:id="@+id/action_play_next"
android:title="@string/action_play_next"
app:showAsAction="never" />
<item
android:id="@+id/action_add_to_queue"
android:title="@string/action_add_to_queue"
app:showAsAction="never" />
<item
android:id="@+id/action_add_to_playlist"
android:title="@string/action_add_to_playlist" />
</menu>