use generics for media callback and remove extra artist search

This commit is contained in:
dkanada 2021-04-24 13:08:17 +09:00
commit e2dddfa57c
9 changed files with 54 additions and 90 deletions

View file

@ -23,14 +23,11 @@ import com.dkanada.gramophone.util.QueryUtil;
import com.dkanada.gramophone.util.Util;
import com.kabouzeid.appthemehelper.ThemeStore;
import org.jellyfin.apiclient.model.querying.ArtistsQuery;
import org.jellyfin.apiclient.model.querying.ItemQuery;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SearchActivity extends AbsMusicServiceActivity implements SearchView.OnQueryTextListener {
public String QUERY = "query";
@ -139,51 +136,36 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie
ItemQuery itemQuery = new ItemQuery();
itemQuery.setSearchTerm(query);
ArtistsQuery artistsQuery = new ArtistsQuery();
artistsQuery.setSearchTerm(query);
MediaCallback callback = new MediaCallback() {
private final List<Object> data = new ArrayList<>();
@SuppressWarnings("ConstantConditions")
MediaCallback<Object> callback = new MediaCallback<Object>() {
@Override
public void onLoadMedia(List<?> media) {
data.addAll(media);
public void onLoadMedia(List<Object> media) {
List<Artist> artists = new ArrayList<>();
List<Album> albums = new ArrayList<>();
List<Song> songs = new ArrayList<>();
Map<Class<?>, List<Object>> byClass = new HashMap<>();
byClass.put(Artist.class, new ArrayList<>());
byClass.put(Album.class, new ArrayList<>());
byClass.put(Song.class, new ArrayList<>());
byClass.put(Object.class, new ArrayList<>());
for (Object datum : data) {
if (byClass.containsKey(datum.getClass())) {
byClass.get(datum.getClass()).add(datum);
} else {
byClass.get(Object.class).add(datum);
for (Object result : media) {
if (result instanceof Artist) {
artists.add((Artist) result);
} else if (result instanceof Album) {
albums.add((Album) result);
} else if (result instanceof Song) {
songs.add((Song) result);
}
}
Collections.sort(byClass.get(Artist.class),
(one, two) -> ((Artist) one).name.compareTo(((Artist) two).name));
Collections.sort(artists, (one, two) -> one.name.compareTo(two.name));
Collections.sort(albums, (one, two) -> one.title.compareTo(two.title));
Collections.sort(songs, (one, two) -> one.title.compareTo(two.title));
Collections.sort(byClass.get(Album.class),
(one, two) -> ((Album) one).title.compareTo(((Album) two).title));
Collections.sort(byClass.get(Song.class),
(one, two) -> ((Song) one).title.compareTo(((Song) two).title));
List<Object> sortedData = byClass.get(Artist.class);
sortedData.addAll(byClass.get(Album.class));
sortedData.addAll(byClass.get(Song.class));
sortedData.addAll(byClass.get(Object.class));
List<Object> sortedData = new ArrayList<>();
sortedData.addAll(artists);
sortedData.addAll(albums);
sortedData.addAll(songs);
adapter.swapDataSet(sortedData);
}
};
QueryUtil.getArtists(artistsQuery, callback);
QueryUtil.getItems(itemQuery, callback);
}

View file

@ -68,12 +68,9 @@ public class AlbumDetailActivity extends AbsMusicPanelActivity implements Palett
query.setParentId(album.id);
query.setSortBy(new String[]{"ParentIndexNumber", "IndexNumber"});
QueryUtil.getSongs(query, new MediaCallback() {
@Override
public void onLoadMedia(List<?> media) {
album.songs = (List<Song>) media;
QueryUtil.getSongs(query, media -> {
album.songs = media;
setAlbum(album);
}
});
}

View file

@ -72,22 +72,16 @@ public class ArtistDetailActivity extends AbsMusicPanelActivity implements Palet
ItemQuery albums = new ItemQuery();
albums.setArtistIds(new String[]{artist.id});
QueryUtil.getAlbums(albums, new MediaCallback() {
@Override
public void onLoadMedia(List<?> media) {
artist.albums = (List<Album>) media;
QueryUtil.getAlbums(albums, media -> {
artist.albums = media;
setArtist(artist);
}
});
ItemQuery songs = new ItemQuery();
songs.setArtistIds(new String[]{artist.id});
QueryUtil.getSongs(songs, new MediaCallback() {
@Override
public void onLoadMedia(List<?> media) {
artist.songs = (List<Song>) media;
QueryUtil.getSongs(songs, media -> {
artist.songs = media;
setArtist(artist);
}
});
}

View file

@ -60,12 +60,9 @@ public class GenreDetailActivity extends AbsMusicPanelActivity implements CabHol
ItemQuery query = new ItemQuery();
query.setGenreIds(new String[]{genre.id});
QueryUtil.getSongs(query, new MediaCallback() {
@Override
public void onLoadMedia(List<?> media) {
adapter.getDataSet().addAll((List<Song>) media);
QueryUtil.getSongs(query, media -> {
adapter.getDataSet().addAll(media);
adapter.notifyDataSetChanged();
}
});
}

View file

@ -67,12 +67,9 @@ public class PlaylistDetailActivity extends AbsMusicPanelActivity implements Cab
PlaylistItemQuery query = new PlaylistItemQuery();
query.setId(playlist.id);
PlaylistUtil.getPlaylist(query, new MediaCallback() {
@Override
public void onLoadMedia(List<?> media) {
adapter.getDataSet().addAll((List<PlaylistSong>) media);
PlaylistUtil.getPlaylist(query, media -> {
adapter.getDataSet().addAll(media);
adapter.notifyDataSetChanged();
}
});
}

View file

@ -57,19 +57,16 @@ public class AddToPlaylistDialog extends DialogFragment {
})
.build();
QueryUtil.getPlaylists(new MediaCallback() {
@Override
public void onLoadMedia(List<?> media) {
playlists.addAll((List<Playlist>) media);
QueryUtil.getPlaylists(media -> {
List<String> names = new ArrayList<>();
CharSequence[] names = new CharSequence[playlists.size() + 1];
names[0] = requireActivity().getResources().getString(R.string.action_new_playlist);
for (int i = 0; i < playlists.size(); i++) {
names[i + 1] = playlists.get(i).name;
names.add(requireActivity().getResources().getString(R.string.action_new_playlist));
for (Playlist playlist : media) {
names.add(playlist.name);
}
dialog.setItems(names);
}
playlists.addAll(media);
dialog.setItems(names.toArray(new String[0]));
});
return dialog;

View file

@ -2,6 +2,6 @@ package com.dkanada.gramophone.interfaces;
import java.util.List;
public interface MediaCallback {
void onLoadMedia(List<?> media);
public interface MediaCallback<T> {
void onLoadMedia(List<T> media);
}

View file

@ -18,7 +18,7 @@ import java.util.ArrayList;
import java.util.List;
public class PlaylistUtil {
public static void getPlaylist(PlaylistItemQuery query, MediaCallback callback) {
public static void getPlaylist(PlaylistItemQuery query, MediaCallback<PlaylistSong> callback) {
query.setUserId(App.getApiClient().getCurrentUserId());
query.setFields(new ItemFields[]{ItemFields.MediaSources});
App.getApiClient().GetPlaylistItems(query, new Response<ItemsResult>() {

View file

@ -28,7 +28,7 @@ public class QueryUtil {
// TODO return BaseItemDto everywhere
// will simplify the code for the getPlaylists method
public static void getLibraries(MediaCallback callback) {
public static void getLibraries(MediaCallback<BaseItemDto> callback) {
String id = App.getApiClient().getCurrentUserId();
App.getApiClient().GetUserViews(id, new Response<ItemsResult>() {
@Override
@ -46,7 +46,7 @@ public class QueryUtil {
});
}
public static void getPlaylists(MediaCallback callback) {
public static void getPlaylists(MediaCallback<Playlist> callback) {
ItemQuery query = new ItemQuery();
query.setIncludeItemTypes(new String[]{"Playlist"});
applyProperties(query);
@ -68,7 +68,7 @@ public class QueryUtil {
});
}
public static void getGenres(MediaCallback callback) {
public static void getGenres(MediaCallback<Genre> callback) {
ItemsByNameQuery query = new ItemsByNameQuery();
applyProperties(query);
App.getApiClient().GetGenresAsync(query, new Response<ItemsResult>() {
@ -89,8 +89,8 @@ public class QueryUtil {
});
}
public static void getItems(ItemQuery query, MediaCallback callback) {
query.setIncludeItemTypes(new String[]{"MusicAlbum", "Audio"});
public static void getItems(ItemQuery query, MediaCallback<Object> callback) {
query.setIncludeItemTypes(new String[]{"MusicArtist", "MusicAlbum", "Audio"});
query.setFields(new ItemFields[]{ItemFields.MediaSources});
query.setUserId(App.getApiClient().getCurrentUserId());
query.setLimit(40);
@ -119,7 +119,7 @@ public class QueryUtil {
});
}
public static void getAlbums(ItemQuery query, MediaCallback callback) {
public static void getAlbums(ItemQuery query, MediaCallback<Album> callback) {
query.setIncludeItemTypes(new String[]{"MusicAlbum"});
applyProperties(query);
applySortMethod(query, PreferenceUtil.getInstance(App.getInstance()).getAlbumSortMethod());
@ -141,7 +141,7 @@ public class QueryUtil {
});
}
public static void getArtists(ArtistsQuery query, MediaCallback callback) {
public static void getArtists(ArtistsQuery query, MediaCallback<Artist> callback) {
query.setFields(new ItemFields[]{ItemFields.Genres});
applyProperties(query);
App.getApiClient().GetAlbumArtistsAsync(query, new Response<ItemsResult>() {
@ -162,7 +162,7 @@ public class QueryUtil {
});
}
public static void getSongs(ItemQuery query, MediaCallback callback) {
public static void getSongs(ItemQuery query, MediaCallback<Song> callback) {
query.setIncludeItemTypes(new String[]{"Audio"});
query.setFields(new ItemFields[]{ItemFields.MediaSources});
applyProperties(query);