display list of genres on main activity

This commit is contained in:
dkanada 2020-04-29 02:24:12 +09:00
commit fb43666488
7 changed files with 54 additions and 51 deletions

View file

@ -91,7 +91,7 @@ public class GenreAdapter extends RecyclerView.Adapter<GenreAdapter.ViewHolder>
@Override @Override
public String getSectionName(int position) { public String getSectionName(int position) {
final Genre genre = dataSet.get(position); final Genre genre = dataSet.get(position);
return genre.id == -1 ? "" : MusicUtil.getSectionName(dataSet.get(position).name); return genre.id.hashCode() == -1 ? "" : MusicUtil.getSectionName(dataSet.get(position).name);
} }
public class ViewHolder extends MediaEntryViewHolder { public class ViewHolder extends MediaEntryViewHolder {

View file

@ -3,13 +3,21 @@ package com.kabouzeid.gramophone.model;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import org.jellyfin.apiclient.model.dto.BaseItemDto;
public class Genre implements Parcelable { public class Genre implements Parcelable {
public final int id; public final String id;
public final String name; public final String name;
public final int songCount; public final int songCount;
public Genre(BaseItemDto itemDto) {
this.id = itemDto.getId();
this.name = itemDto.getName();
this.songCount = itemDto.getSongCount() != null ? itemDto.getSongCount() : 0;
}
public Genre(final int id, final String name, final int songCount) { public Genre(final int id, final String name, final int songCount) {
this.id = id; this.id = Integer.toString(id);
this.name = name; this.name = name;
this.songCount = songCount; this.songCount = songCount;
} }
@ -28,12 +36,12 @@ public class Genre implements Parcelable {
@Override @Override
public int hashCode() { public int hashCode() {
return id; return id.hashCode();
} }
@Override @Override
public String toString() { public String toString() {
return Integer.toString(id); return id;
} }
@Override @Override
@ -43,13 +51,13 @@ public class Genre implements Parcelable {
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.id); dest.writeString(this.id);
dest.writeString(this.name); dest.writeString(this.name);
dest.writeInt(this.songCount); dest.writeInt(this.songCount);
} }
protected Genre(Parcel in) { protected Genre(Parcel in) {
this.id = in.readInt(); this.id = in.readString();
this.name = in.readString(); this.name = in.readString();
this.songCount = in.readInt(); this.songCount = in.readInt();
} }

View file

@ -201,7 +201,7 @@ public class GenreDetailActivity extends AbsSlidingMusicPanelActivity implements
@Override @Override
public List<Song> loadInBackground() { public List<Song> loadInBackground() {
return GenreLoader.getSongs(getContext(), genre.id); return GenreLoader.getSongs(getContext(), genre.id.hashCode());
} }
} }
} }

View file

@ -153,9 +153,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
libraries = (List<BaseItemDto>) media; libraries = (List<BaseItemDto>) media;
menu.clear(); menu.clear();
menu.add(R.id.navigation_drawer_menu_category_sections, R.id.nav_library, menu.size(), R.string.all);
menu.getItem(0).setIcon(R.drawable.ic_library_music_white_24dp);
for (BaseItemDto itemDto : libraries) { for (BaseItemDto itemDto : libraries) {
if (itemDto.getCollectionType() == null || !itemDto.getCollectionType().equals("music")) continue; if (itemDto.getCollectionType() == null || !itemDto.getCollectionType().equals("music")) continue;
menu.add(R.id.navigation_drawer_menu_category_sections, itemDto.getId().hashCode(), menu.size(), itemDto.getName()); menu.add(R.id.navigation_drawer_menu_category_sections, itemDto.getId().hashCode(), menu.size(), itemDto.getName());

View file

@ -1,30 +1,22 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager; package com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.GenreAdapter; import com.kabouzeid.gramophone.adapter.GenreAdapter;
import com.kabouzeid.gramophone.interfaces.LoaderIds; import com.kabouzeid.gramophone.interfaces.MediaCallback;
import com.kabouzeid.gramophone.loader.GenreLoader;
import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader;
import com.kabouzeid.gramophone.model.Genre; import com.kabouzeid.gramophone.model.Genre;
import com.kabouzeid.gramophone.util.QueryUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class GenresFragment extends AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearLayoutManager> implements LoaderManager.LoaderCallbacks<List<Genre>> { public class GenresFragment extends AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearLayoutManager> {
private static final int LOADER_ID = LoaderIds.GENRES_FRAGMENT;
@Override @Override
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(LOADER_ID, null, this);
} }
@NonNull @NonNull
@ -39,6 +31,14 @@ public class GenresFragment extends AbsLibraryPagerRecyclerViewFragment<GenreAda
List<Genre> dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet(); List<Genre> dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet();
GenreAdapter adapter = new GenreAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list_no_image); GenreAdapter adapter = new GenreAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list_no_image);
QueryUtil.getGenres(new MediaCallback() {
@Override
public void onLoadMedia(List<?> media) {
dataSet.addAll((List<Genre>) media);
adapter.notifyDataSetChanged();
}
});
return adapter; return adapter;
} }
@ -49,33 +49,5 @@ public class GenresFragment extends AbsLibraryPagerRecyclerViewFragment<GenreAda
@Override @Override
public void onMediaStoreChanged() { public void onMediaStoreChanged() {
getLoaderManager().restartLoader(LOADER_ID, null, this);
}
@Override
@NonNull
public Loader<List<Genre>> onCreateLoader(int id, Bundle args) {
return new GenresFragment.AsyncGenreLoader(getActivity());
}
@Override
public void onLoadFinished(@NonNull Loader<List<Genre>> loader, List<Genre> data) {
getAdapter().swapDataSet(data);
}
@Override
public void onLoaderReset(@NonNull Loader<List<Genre>> loader) {
getAdapter().swapDataSet(new ArrayList<>());
}
private static class AsyncGenreLoader extends WrappedAsyncTaskLoader<List<Genre>> {
public AsyncGenreLoader(Context context) {
super(context);
}
@Override
public List<Genre> loadInBackground() {
return GenreLoader.getAllGenres(getContext());
}
} }
} }

View file

@ -4,12 +4,14 @@ import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.interfaces.MediaCallback; import com.kabouzeid.gramophone.interfaces.MediaCallback;
import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Genre;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import org.jellyfin.apiclient.interaction.Response; import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.apiclient.model.dto.BaseItemDto; import org.jellyfin.apiclient.model.dto.BaseItemDto;
import org.jellyfin.apiclient.model.querying.ArtistsQuery; import org.jellyfin.apiclient.model.querying.ArtistsQuery;
import org.jellyfin.apiclient.model.querying.ItemQuery; import org.jellyfin.apiclient.model.querying.ItemQuery;
import org.jellyfin.apiclient.model.querying.ItemsByNameQuery;
import org.jellyfin.apiclient.model.querying.ItemsResult; import org.jellyfin.apiclient.model.querying.ItemsResult;
import java.util.ArrayList; import java.util.ArrayList;
@ -37,6 +39,30 @@ public class QueryUtil {
}); });
} }
public static void getGenres(MediaCallback callback) {
ItemsByNameQuery query = new ItemsByNameQuery();
query.setUserId(App.getApiClient().getCurrentUserId());
query.setLimit(100);
query.setRecursive(true);
if (currentLibrary != null && query.getParentId() == null) query.setParentId(currentLibrary.getId());
App.getApiClient().GetGenresAsync(query, new Response<ItemsResult>() {
@Override
public void onResponse(ItemsResult result) {
List<Genre> genres = new ArrayList<>();
for (BaseItemDto itemDto : result.getItems()) {
genres.add(new Genre(itemDto));
}
callback.onLoadMedia(genres);
}
@Override
public void onError(Exception exception) {
exception.printStackTrace();
}
});
}
public static void getAlbums(ItemQuery query, MediaCallback callback) { public static void getAlbums(ItemQuery query, MediaCallback callback) {
query.setIncludeItemTypes(new String[]{"MusicAlbum"}); query.setIncludeItemTypes(new String[]{"MusicAlbum"});
query.setUserId(App.getApiClient().getCurrentUserId()); query.setUserId(App.getApiClient().getCurrentUserId());

View file

@ -7,7 +7,7 @@
<item <item
android:id="@+id/nav_library" android:id="@+id/nav_library"
android:icon="@drawable/ic_library_music_white_24dp" android:icon="@drawable/ic_library_music_white_24dp"
android:title="@string/library" /> android:title="@string/all" />
</group> </group>
<group <group