diff --git a/app/build.gradle b/app/build.gradle index f1a2a4d1..2e738b17 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..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,12 +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.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; import butterknife.BindView; import butterknife.ButterKnife; @@ -144,26 +147,53 @@ 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<>(); + + @SuppressWarnings("ConstantConditions") @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; - } + 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<>()); - return 0; + for (Object datum : data) { + if (byClass.containsKey(datum.getClass())) { + byClass.get(datum.getClass()).add(datum); + } else { + byClass.get(Object.class).add(datum); } - }); + } - adapter.swapDataSet((List) media); + Collections.sort(byClass.get(Artist.class), + (one, two) -> ((Artist) one).name.compareTo(((Artist) two).name)); + + 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 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); } - }); + }; + + 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() {