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.Album;
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 AlbumRule extends AutoPlaylistRule implements Parcelable {
protected AlbumRule(@Field int field, @Match int match, String value) {
super(ALBUM, field, match, value);
}
protected AlbumRule(Parcel in) {
super(in);
}
@Override
public Observable<List<Song>> applyFilter(PlaylistStore playlistStore, MusicStore musicStore,
PlayCountStore playCountStore) {
return musicStore.getAlbums()
.observeOn(Schedulers.computation())
.take(1)
.map(library -> {
List<Album> filtered = new ArrayList<>();
for (Album album : library) {
if (includeAlbum(album)) {
filtered.add(album);
}
}
return filtered;
})
.map(albums -> {
Set<Long> albumIds = new HashSet<>();
for (Album album : albums) {
albumIds.add(album.getAlbumId());
}
return albumIds;
})
.zipWith(musicStore.getSongs(), (albumIds, songs) -> {
List<Song> filtered = new ArrayList<>();
for (Song song : songs) {
if (albumIds.contains(song.getAlbumId())) {
filtered.add(song);
}
}
return filtered;
});
}
@SuppressLint("SwitchIntDef")
private boolean includeAlbum(Album album) {
switch (getField()) {
case AutoPlaylistRule.ID:
return checkId(album.getAlbumId());
case AutoPlaylistRule.NAME:
return checkString(album.getAlbumName());
}
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<AlbumRule> CREATOR = new Creator<AlbumRule>() {
@Override
public AlbumRule createFromParcel(Parcel in) {
return new AlbumRule(in);
}
@Override
public AlbumRule[] newArray(int size) {
return new AlbumRule[size];
}
};
}