package com.fastbootmobile.encore.providers;
import com.fastbootmobile.encore.model.Album;
import com.fastbootmobile.encore.model.Artist;
import com.fastbootmobile.encore.model.Playlist;
import com.fastbootmobile.encore.model.Song;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Caches information gotten by providers
*/
public class ProviderCache {
private final Map<String, Playlist> mPlaylists;
private final Map<String, Song> mSongs;
private final Map<String, ProviderIdentifier> mRefProvider;
private final Map<String, Album> mAlbums;
private final Map<String, Artist> mArtists;
private final List<Playlist> mMultiProviderPlaylists;
/**
* Default constructor
*/
public ProviderCache() {
mPlaylists = new HashMap<>();
mSongs = new HashMap<>();
mRefProvider = new HashMap<>();
mAlbums = new HashMap<>();
mArtists = new HashMap<>();
mMultiProviderPlaylists = new ArrayList<>();
}
/**
* Purges the cache in case the provider may change for the specified provider
*/
public void purgeCacheForProvider(ProviderIdentifier id) {
List<String> keysToRemove;
// Playlists
synchronized (mPlaylists) {
Set<Map.Entry<String, Playlist>> playlists = mPlaylists.entrySet();
keysToRemove = new ArrayList<>();
for (Map.Entry<String, Playlist> item : playlists) {
if (item.getValue() == null || item.getValue().getProvider().equals(id)) {
keysToRemove.add(item.getKey());
}
}
for (String key : keysToRemove) {
mPlaylists.remove(key);
}
}
// Songs
synchronized (mSongs) {
Set<Map.Entry<String, Song>> songs = mSongs.entrySet();
keysToRemove.clear();
for (Map.Entry<String, Song> item : songs) {
if (item.getValue().getProvider() != null
&& item.getValue().getProvider().equals(id)) {
keysToRemove.add(item.getKey());
}
}
for (String key : keysToRemove) {
mSongs.remove(key);
}
}
// Albums
synchronized (mAlbums) {
Set<Map.Entry<String, Album>> albums = mAlbums.entrySet();
keysToRemove.clear();
for (Map.Entry<String, Album> item : albums) {
if (item.getValue().getProvider().equals(id)) {
keysToRemove.add(item.getKey());
}
}
for (String key : keysToRemove) {
mAlbums.remove(key);
}
}
// Artists
synchronized (mArtists) {
Set<Map.Entry<String, Artist>> artists = mArtists.entrySet();
keysToRemove.clear();
for (Map.Entry<String, Artist> item : artists) {
if (item.getValue().getProvider().equals(id)) {
keysToRemove.add(item.getKey());
}
}
for (String key : keysToRemove) {
mArtists.remove(key);
}
}
}
public ProviderIdentifier getRefProvider(final String ref) {
return mRefProvider.get(ref);
}
public void putPlaylist(final ProviderIdentifier provider, final Playlist pl) {
synchronized (mPlaylists) {
mPlaylists.put(pl.getRef(), pl);
}
mRefProvider.put(pl.getRef(), provider);
}
public void putAllProviderPlaylist(List<Playlist> playlists) {
mMultiProviderPlaylists.addAll(playlists);
}
Playlist getPlaylist(final String ref) {
synchronized(mPlaylists) {
return mPlaylists.get(ref);
}
}
public List<Playlist> getAllPlaylists() {
synchronized (mPlaylists) {
return new ArrayList<>(mPlaylists.values());
}
}
public void removePlaylist(String ref) {
synchronized (mPlaylists) {
mPlaylists.remove(ref);
}
}
public List<Playlist> getAllMultiProviderPlaylists() {
return mMultiProviderPlaylists;
}
public List<Song> getAllSongs() {
return new ArrayList<>(mSongs.values());
}
public List<Artist> getAllArtists() {
synchronized (mArtists) {
return new ArrayList<>(mArtists.values());
}
}
public List<Album> getAllAlbums() {
synchronized (mAlbums) {
return new ArrayList<>(mAlbums.values());
}
}
public void putSong(final ProviderIdentifier provider, final Song song) {
synchronized (mSongs) {
mSongs.put(song.getRef(), song);
}
mRefProvider.put(song.getRef(), provider);
}
Song getSong(final String ref) {
synchronized (mSongs) {
return mSongs.get(ref);
}
}
public void putAlbum(final ProviderIdentifier provider, final Album album) {
synchronized (mAlbums) {
mAlbums.put(album.getRef(), album);
mRefProvider.put(album.getRef(), provider);
}
}
Album getAlbum(final String ref) {
synchronized (mAlbums) {
return mAlbums.get(ref);
}
}
public void putArtist(final ProviderIdentifier provider, final Artist artist) {
synchronized (mArtists) {
mArtists.put(artist.getRef(), artist);
mRefProvider.put(artist.getRef(), provider);
}
}
Artist getArtist(final String ref) {
synchronized (mArtists) {
return mArtists.get(ref);
}
}
}