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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -18,7 +18,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class PlaylistUtil { 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.setUserId(App.getApiClient().getCurrentUserId());
query.setFields(new ItemFields[]{ItemFields.MediaSources}); query.setFields(new ItemFields[]{ItemFields.MediaSources});
App.getApiClient().GetPlaylistItems(query, new Response<ItemsResult>() { App.getApiClient().GetPlaylistItems(query, new Response<ItemsResult>() {

View file

@ -28,7 +28,7 @@ public class QueryUtil {
// TODO return BaseItemDto everywhere // TODO return BaseItemDto everywhere
// will simplify the code for the getPlaylists method // 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(); String id = App.getApiClient().getCurrentUserId();
App.getApiClient().GetUserViews(id, new Response<ItemsResult>() { App.getApiClient().GetUserViews(id, new Response<ItemsResult>() {
@Override @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(); ItemQuery query = new ItemQuery();
query.setIncludeItemTypes(new String[]{"Playlist"}); query.setIncludeItemTypes(new String[]{"Playlist"});
applyProperties(query); 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(); ItemsByNameQuery query = new ItemsByNameQuery();
applyProperties(query); applyProperties(query);
App.getApiClient().GetGenresAsync(query, new Response<ItemsResult>() { App.getApiClient().GetGenresAsync(query, new Response<ItemsResult>() {
@ -89,8 +89,8 @@ public class QueryUtil {
}); });
} }
public static void getItems(ItemQuery query, MediaCallback callback) { public static void getItems(ItemQuery query, MediaCallback<Object> callback) {
query.setIncludeItemTypes(new String[]{"MusicAlbum", "Audio"}); query.setIncludeItemTypes(new String[]{"MusicArtist", "MusicAlbum", "Audio"});
query.setFields(new ItemFields[]{ItemFields.MediaSources}); query.setFields(new ItemFields[]{ItemFields.MediaSources});
query.setUserId(App.getApiClient().getCurrentUserId()); query.setUserId(App.getApiClient().getCurrentUserId());
query.setLimit(40); 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"}); query.setIncludeItemTypes(new String[]{"MusicAlbum"});
applyProperties(query); applyProperties(query);
applySortMethod(query, PreferenceUtil.getInstance(App.getInstance()).getAlbumSortMethod()); 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}); query.setFields(new ItemFields[]{ItemFields.Genres});
applyProperties(query); applyProperties(query);
App.getApiClient().GetAlbumArtistsAsync(query, new Response<ItemsResult>() { 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.setIncludeItemTypes(new String[]{"Audio"});
query.setFields(new ItemFields[]{ItemFields.MediaSources}); query.setFields(new ItemFields[]{ItemFields.MediaSources});
applyProperties(query); applyProperties(query);