package com.marverenic.music.model.playlistrules; import android.annotation.SuppressLint; import android.os.Parcel; import android.os.Parcelable; import com.marverenic.music.data.store.MusicStore; import com.marverenic.music.data.store.PlayCountStore; import com.marverenic.music.data.store.PlaylistStore; import com.marverenic.music.model.Artist; import com.marverenic.music.model.Song; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import rx.Observable; import rx.schedulers.Schedulers; public class ArtistRule extends AutoPlaylistRule implements Parcelable { protected ArtistRule(@Field int field, @Match int match, String value) { super(ARTIST, field, match, value); } protected ArtistRule(Parcel in) { super(in); } @Override public Observable<List<Song>> applyFilter(PlaylistStore playlistStore, MusicStore musicStore, PlayCountStore playCountStore) { return musicStore.getArtists() .observeOn(Schedulers.computation()) .take(1) .map(library -> { List<Artist> filtered = new ArrayList<>(); for (Artist artist : library) { if (includeArtist(artist)) { filtered.add(artist); } } return filtered; }) .map(artists -> { Set<Long> artistIds = new HashSet<>(); for (Artist artist : artists) { artistIds.add((long) artist.getArtistId()); } return artistIds; }) .zipWith(musicStore.getSongs(), (artistIds, songs) -> { List<Song> filtered = new ArrayList<>(); for (Song song : songs) { if (artistIds.contains(song.getArtistId())) { filtered.add(song); } } return filtered; }); } @SuppressLint("SwitchIntDef") private boolean includeArtist(Artist artist) { switch (getField()) { case AutoPlaylistRule.ID: return checkId(artist.getArtistId()); case AutoPlaylistRule.NAME: return checkString(artist.getArtistName()); } throw new IllegalArgumentException("Cannot compare against field " + getField()); } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); } @Override public int describeContents() { return 0; } public static final Creator<ArtistRule> CREATOR = new Creator<ArtistRule>() { @Override public ArtistRule createFromParcel(Parcel in) { return new ArtistRule(in); } @Override public ArtistRule[] newArray(int size) { return new ArtistRule[size]; } }; }