package com.marverenic.music.model; import android.database.Cursor; import android.os.Parcel; import android.os.Parcelable; import android.provider.MediaStore; import android.support.annotation.NonNull; import com.google.gson.annotations.SerializedName; import com.marverenic.music.data.store.MediaStoreUtil; import java.util.ArrayList; import java.util.List; import static com.marverenic.music.model.ModelUtil.compareTitle; import static com.marverenic.music.model.ModelUtil.hashLong; public class Playlist implements Parcelable, Comparable<Playlist> { public static final Parcelable.Creator<Playlist> CREATOR = new Parcelable.Creator<Playlist>() { public Playlist createFromParcel(Parcel in) { return new Playlist(in); } public Playlist[] newArray(int size) { return new Playlist[size]; } }; @SerializedName("playlistId") protected long playlistId; @SerializedName("playlistName") protected String playlistName; protected Playlist(long playlistId, String playlistName) { this.playlistId = playlistId; this.playlistName = playlistName; } public Playlist(Cursor cursor) { playlistId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Playlists._ID)); playlistName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Playlists.NAME)); } public Playlist(Parcel in) { playlistId = in.readLong(); playlistName = in.readString(); } /** * Builds a {@link List} of Songs from a Cursor. Any {@link AutoPlaylist}s on the filesystem * are ignored by this scan and will be loaded into the List as a regular playlist. * @param cur A {@link Cursor} to use when reading the {@link MediaStore}. This Cursor may have * any filters and sorting, but MUST have AT LEAST the columns in * {@link MediaStoreUtil#PLAYLIST_PROJECTION}. The caller is responsible for closing * this Cursor. * @return A List of songs populated by entries in the Cursor */ public static List<Playlist> buildPlaylistList(Cursor cur) { List<Playlist> playlists = new ArrayList<>(cur.getCount()); final int idIndex = cur.getColumnIndex(MediaStore.Audio.Playlists._ID); final int nameIndex = cur.getColumnIndex(MediaStore.Audio.Playlists.NAME); for (int i = 0; i < cur.getCount(); i++) { cur.moveToPosition(i); Playlist next = new Playlist(cur.getLong(idIndex), cur.getString(nameIndex)); playlists.add(next); } return playlists; } public long getPlaylistId() { return playlistId; } public String getPlaylistName() { return playlistName; } @Override public int hashCode() { return hashLong(playlistId); } @Override public boolean equals(final Object obj) { return this == obj || (obj != null && obj instanceof Playlist && playlistId == ((Playlist) obj).playlistId); } public String toString() { return playlistName; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeLong(playlistId); dest.writeString(playlistName); } @Override public int compareTo(@NonNull Playlist another) { if (!getClass().equals(another.getClass())) { if (another instanceof AutoPlaylist) { return 1; } else if (this instanceof AutoPlaylist) { return -1; } } return compareTitle(getPlaylistName(), another.getPlaylistName()); } public static class Builder { private long playlistId; private String playlistName; public Builder setPlaylistId(long playlistId) { this.playlistId = playlistId; return this; } public Builder setPlaylistName(String playlistName) { this.playlistName = playlistName; return this; } public Playlist build() { return new Playlist(playlistId, playlistName); } } }