From aca0ea697a1e7d014a9ea57427417aeef7d36c7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Dardenne?= Date: Sat, 27 Jun 2020 14:50:18 +0200 Subject: [PATCH 1/2] Query API for artists when searching. --- app/build.gradle | 2 +- .../ui/activities/SearchActivity.java | 38 ++++++++++++------- .../library/pager/ArtistsFragment.java | 4 +- .../dkanada/gramophone/util/MusicUtil.java | 2 +- .../dkanada/gramophone/util/QueryUtil.java | 3 +- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e1e63d3e..db4567ba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,7 +41,7 @@ android { } dependencies { - implementation 'com.github.jellyfin.jellyfin-apiclient-java:android:0.6.1' + implementation 'com.github.jellyfin.jellyfin-apiclient-java:android:0.6.3' implementation 'com.google.android.exoplayer:exoplayer:2.11.4' implementation 'androidx.core:core:1.3.0' diff --git a/app/src/main/java/com/dkanada/gramophone/ui/activities/SearchActivity.java b/app/src/main/java/com/dkanada/gramophone/ui/activities/SearchActivity.java index 4f7740e3..b8708c2e 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/activities/SearchActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/activities/SearchActivity.java @@ -24,10 +24,11 @@ import com.dkanada.gramophone.ui.activities.base.AbsMusicServiceActivity; import com.dkanada.gramophone.util.QueryUtil; import com.dkanada.gramophone.util.Util; +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.Comparator; import java.util.List; import butterknife.BindView; @@ -144,26 +145,35 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie this.query = query; ItemQuery itemQuery = new ItemQuery(); itemQuery.setSearchTerm(query); - QueryUtil.getItems(itemQuery, new MediaCallback() { + + ArtistsQuery artistsQuery = new ArtistsQuery(); + artistsQuery.setSearchTerm(query); + + MediaCallback callback = new MediaCallback() { + private final List data = new ArrayList<>(); + @Override public void onLoadMedia(List media) { - Collections.sort(media, new Comparator() { - public int compare(Object one, Object two) { - if (one.getClass() == Album.class || one.getClass() == Artist.class) { - if (two.getClass() == Song.class) return -1; - } + data.addAll(media); - if (two.getClass() == Album.class || two.getClass() == Artist.class) { - if (one.getClass() == Song.class) return 1; - } - - return 0; + Collections.sort(data, (one, two) -> { + if (one.getClass() == Album.class || one.getClass() == Artist.class) { + if (two.getClass() == Song.class) return -1; } + + if (two.getClass() == Album.class || two.getClass() == Artist.class) { + if (one.getClass() == Song.class) return 1; + } + + return 0; }); - adapter.swapDataSet((List) media); + adapter.swapDataSet(data); } - }); + }; + + QueryUtil.getArtists(artistsQuery, callback); + QueryUtil.getItems(itemQuery, callback); } @Override diff --git a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java index 4018147a..c480c80a 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java @@ -14,6 +14,8 @@ import com.dkanada.gramophone.model.Artist; import com.dkanada.gramophone.util.PreferenceUtil; import com.dkanada.gramophone.util.QueryUtil; +import org.jellyfin.apiclient.model.querying.ArtistsQuery; + import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -38,7 +40,7 @@ public class ArtistsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFr List dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); ArtistAdapter adapter = new ArtistAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, loadUsePalette(), getLibraryFragment()); - QueryUtil.getArtists(new MediaCallback() { + QueryUtil.getArtists(new ArtistsQuery(), new MediaCallback() { @Override public void onLoadMedia(List media) { dataSet.addAll((Collection) media); diff --git a/app/src/main/java/com/dkanada/gramophone/util/MusicUtil.java b/app/src/main/java/com/dkanada/gramophone/util/MusicUtil.java index 4c144f8b..0c62c8b0 100644 --- a/app/src/main/java/com/dkanada/gramophone/util/MusicUtil.java +++ b/app/src/main/java/com/dkanada/gramophone/util/MusicUtil.java @@ -63,7 +63,7 @@ public class MusicUtil { @NonNull public static String getArtistInfoString(@NonNull final Context context, @NonNull final Artist artist) { - return artist.genres.size() != 0 ? artist.genres.get(0).name : artist.id; + return artist.genres.size() != 0 ? artist.genres.get(0).name : ""; } @NonNull diff --git a/app/src/main/java/com/dkanada/gramophone/util/QueryUtil.java b/app/src/main/java/com/dkanada/gramophone/util/QueryUtil.java index 27e776df..86090ef7 100644 --- a/app/src/main/java/com/dkanada/gramophone/util/QueryUtil.java +++ b/app/src/main/java/com/dkanada/gramophone/util/QueryUtil.java @@ -139,8 +139,7 @@ public class QueryUtil { }); } - public static void getArtists(MediaCallback callback) { - ArtistsQuery query = new ArtistsQuery(); + public static void getArtists(ArtistsQuery query, MediaCallback callback) { query.setFields(new ItemFields[]{ItemFields.Genres}); applyProperties(query); App.getApiClient().GetAlbumArtistsAsync(query, new Response() { From 9e56cd9dbf3c82f6e040ee68b5748145807d1899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Dardenne?= Date: Sat, 27 Jun 2020 15:28:46 +0200 Subject: [PATCH 2/2] Improve search results sorting a little --- .../ui/activities/SearchActivity.java | 52 +++++++++++++------ 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/dkanada/gramophone/ui/activities/SearchActivity.java b/app/src/main/java/com/dkanada/gramophone/ui/activities/SearchActivity.java index b8708c2e..320218a0 100644 --- a/app/src/main/java/com/dkanada/gramophone/ui/activities/SearchActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/ui/activities/SearchActivity.java @@ -1,19 +1,18 @@ package com.dkanada.gramophone.ui.activities; import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.appcompat.widget.SearchView; -import androidx.appcompat.widget.Toolbar; - import android.os.Handler; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.TextView; -import com.kabouzeid.appthemehelper.ThemeStore; +import androidx.annotation.NonNull; +import androidx.appcompat.widget.SearchView; +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.dkanada.gramophone.R; import com.dkanada.gramophone.adapter.SearchAdapter; import com.dkanada.gramophone.interfaces.MediaCallback; @@ -23,13 +22,16 @@ import com.dkanada.gramophone.model.Song; import com.dkanada.gramophone.ui.activities.base.AbsMusicServiceActivity; 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; import butterknife.BindView; import butterknife.ButterKnife; @@ -152,23 +154,41 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie MediaCallback callback = new MediaCallback() { private final List data = new ArrayList<>(); + @SuppressWarnings("ConstantConditions") @Override public void onLoadMedia(List media) { data.addAll(media); - Collections.sort(data, (one, two) -> { - if (one.getClass() == Album.class || one.getClass() == Artist.class) { - if (two.getClass() == Song.class) return -1; + Map, List> 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); } + } - if (two.getClass() == Album.class || two.getClass() == Artist.class) { - if (one.getClass() == Song.class) return 1; - } + Collections.sort(byClass.get(Artist.class), + (one, two) -> ((Artist) one).name.compareTo(((Artist) two).name)); - return 0; - }); + Collections.sort(byClass.get(Album.class), + (one, two) -> ((Album) one).title.compareTo(((Album) two).title)); - adapter.swapDataSet(data); + Collections.sort(byClass.get(Song.class), + (one, two) -> ((Song) one).title.compareTo(((Song) two).title)); + + + List 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); } };