package com.marverenic.music.model; import android.content.Context; import android.content.res.Resources; import android.database.Cursor; import android.os.Parcel; import android.os.Parcelable; import android.provider.MediaStore; import android.support.annotation.NonNull; import com.marverenic.music.R; 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.parseUnknown; public final class Artist implements Parcelable, Comparable<Artist> { public static final Parcelable.Creator<Artist> CREATOR = new Parcelable.Creator<Artist>() { public Artist createFromParcel(Parcel in) { return new Artist(in); } public Artist[] newArray(int size) { return new Artist[size]; } }; protected int artistId; protected String artistName; private Artist() { } public Artist(final int artistId, final String artistName) { this.artistId = artistId; this.artistName = artistName; } public Artist(Context context, Cursor cur) { artistId = cur.getInt(cur.getColumnIndex(MediaStore.Audio.Artists._ID)); artistName = parseUnknown( cur.getString(cur.getColumnIndex(MediaStore.Audio.Artists.ARTIST)), context.getResources().getString(R.string.unknown_artist)); } private Artist(Parcel in) { artistId = in.readInt(); artistName = in.readString(); } /** * Builds a {@link List} of Artists from a Cursor * @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#ARTIST_PROJECTION}. The caller is responsible for closing * this Cursor. * @param res A {@link Resources} Object from {@link Context#getResources()} used to get the * default values if an unknown value is encountered * @return A List of artists populated by entries in the Cursor */ public static List<Artist> buildArtistList(Cursor cur, Resources res) { List<Artist> artists = new ArrayList<>(cur.getCount()); final int idIndex = cur.getColumnIndex(MediaStore.Audio.Artists._ID); final int artistIndex = cur.getColumnIndex(MediaStore.Audio.Artists.ARTIST); final String unknownName = res.getString(R.string.unknown_artist); for (int i = 0; i < cur.getCount(); i++) { cur.moveToPosition(i); Artist next = new Artist(); next.artistId = cur.getInt(idIndex); next.artistName = parseUnknown(cur.getString(artistIndex), unknownName); artists.add(next); } return artists; } public int getArtistId() { return artistId; } public String getArtistName() { return artistName; } @Override public int hashCode() { return artistId; } @Override public boolean equals(final Object obj) { return this == obj || (obj != null && obj instanceof Artist && artistId == ((Artist) obj).artistId); } public String toString() { return artistName; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(artistId); dest.writeString(artistName); } @Override public int compareTo(@NonNull Artist another) { return compareTitle(getArtistName(), another.getArtistName()); } public static class Builder { private int artistId; private String artistName; public Builder setArtistId(int artistId) { this.artistId = artistId; return this; } public Builder setArtistName(String artistName) { this.artistName = artistName; return this; } public Artist build() { Artist built = new Artist(); built.artistId = artistId; built.artistName = artistName; return built; } } }