diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/GenreAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/GenreAdapter.java index 09514a52..d21f670f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/GenreAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/GenreAdapter.java @@ -56,9 +56,27 @@ public class GenreAdapter extends RecyclerView.Adapter public void onBindViewHolder(@NonNull ViewHolder holder, int position) { final Genre genre = dataSet.get(position); + if (holder.getAdapterPosition() == getItemCount() - 1) { + if (holder.separator != null) { + holder.separator.setVisibility(View.GONE); + } + } else { + if (holder.separator != null) { + holder.separator.setVisibility(View.VISIBLE); + } + } + if (holder.shortSeparator != null) { + holder.shortSeparator.setVisibility(View.GONE); + } + if (holder.menu != null) { + holder.menu.setVisibility(View.GONE); + } if (holder.title != null) { holder.title.setText(genre.name); } + if (holder.text != null) { + holder.text.setText(MusicUtil.getGenreInfoString(activity, genre)); + } } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/GenreLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/GenreLoader.java index 6477c399..e6441a22 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/GenreLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/GenreLoader.java @@ -2,13 +2,10 @@ package com.kabouzeid.gramophone.loader; import android.content.Context; import android.database.Cursor; -import android.net.Uri; -import android.provider.BaseColumns; import android.provider.MediaStore.Audio.Genres; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.model.Genre; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.PreferenceUtil; @@ -24,27 +21,16 @@ public class GenreLoader { @NonNull public static ArrayList getSongs(@NonNull final Context context, final int genreId) { - // The genres table only stores songs that have a genre specified, - // so we need to get songs without a genre a different way. - if (genreId == -1) { - return getSongsWithNoGenre(context); - } - return SongLoader.getSongs(makeGenreSongCursor(context, genreId)); } @NonNull private static ArrayList getGenresFromCursor(@NonNull final Context context, @Nullable final Cursor cursor) { final ArrayList genres = new ArrayList<>(); - - if (hasSongsWithNoGenre(context)) { - genres.add(new Genre(context.getResources().getString(R.string.unknown_genre))); - } - if (cursor != null) { if (cursor.moveToFirst()) { do { - genres.add(getGenreFromCursor(cursor)); + genres.add(getGenreFromCursor(context, cursor)); } while (cursor.moveToNext()); } cursor.close(); @@ -53,42 +39,11 @@ public class GenreLoader { } @NonNull - private static Genre getGenreFromCursor(@NonNull final Cursor cursor) { + private static Genre getGenreFromCursor(@NonNull final Context context, @NonNull final Cursor cursor) { final int id = cursor.getInt(0); final String name = cursor.getString(1); - return new Genre(id, name); - } - - @NonNull - private static ArrayList getSongsWithNoGenre(@NonNull final Context context) { - String selection = BaseColumns._ID + " NOT IN " + - "(SELECT " + Genres.Members.AUDIO_ID + " FROM audio_genres_map)"; - return SongLoader.getSongs(SongLoader.makeSongCursor(context, selection, null)); - } - - private static boolean hasSongsWithNoGenre(@NonNull final Context context) { - final Cursor allSongsCursor = SongLoader.makeSongCursor(context, null, null); - final Cursor allSongsWithGenreCursor = makeAllSongsWithGenreCursor(context); - - if (allSongsCursor == null || allSongsWithGenreCursor == null) { - return false; - } - - final boolean hasSongsWithNoGenre = allSongsCursor.getCount() > allSongsWithGenreCursor.getCount(); - allSongsCursor.close(); - allSongsWithGenreCursor.close(); - return hasSongsWithNoGenre; - } - - @Nullable - private static Cursor makeAllSongsWithGenreCursor(@NonNull final Context context) { - try { - return context.getContentResolver().query( - Uri.parse("content://media/external/audio/genres/all/members"), - new String[]{Genres.Members.AUDIO_ID}, null, null, null); - } catch (SecurityException e) { - return null; - } + final int songs = getSongs(context, id).size(); + return new Genre(id, name, songs); } @Nullable @@ -108,15 +63,11 @@ public class GenreLoader { Genres._ID, Genres.NAME }; - // Genres that actually have songs - final String selection = Genres._ID + " IN" + - " (SELECT " + Genres.Members.GENRE_ID + " FROM audio_genres_map WHERE " + Genres.Members.AUDIO_ID + " IN" + - " (SELECT " + Genres._ID + " FROM audio_meta WHERE " + SongLoader.BASE_SELECTION + "))"; try { return context.getContentResolver().query( Genres.EXTERNAL_CONTENT_URI, - projection, selection, null, PreferenceUtil.getInstance(context).getGenreSortOrder()); + projection, null, null, PreferenceUtil.getInstance(context).getGenreSortOrder()); } catch (SecurityException e) { return null; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Genre.java b/app/src/main/java/com/kabouzeid/gramophone/model/Genre.java index 10b177c1..b0b6c90c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Genre.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Genre.java @@ -6,16 +6,12 @@ import android.os.Parcelable; public class Genre implements Parcelable { public final int id; public final String name; + public final int songCount; - public Genre(final int id, final String name) { + public Genre(final int id, final String name, final int songCount) { this.id = id; this.name = name; - } - - // For unknown genre - public Genre(final String name) { - this.id = -1; - this.name = name; + this.songCount = songCount; } @Override @@ -26,13 +22,15 @@ public class Genre implements Parcelable { Genre genre = (Genre) o; if (id != genre.id) return false; - return name != null ? name.equals(genre.name) : genre.name == null; + if (!name.equals(genre.name)) return false; + return songCount == genre.songCount; } @Override public int hashCode() { int result = id; - result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + name.hashCode(); + result = 31 * result + songCount; return result; } @@ -41,6 +39,7 @@ public class Genre implements Parcelable { return "Genre{" + "id=" + id + ", name='" + name + '\'' + + ", songCount=" + songCount + '\'' + '}'; } @@ -53,11 +52,13 @@ public class Genre implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.id); dest.writeString(this.name); + dest.writeInt(this.songCount); } protected Genre(Parcel in) { this.id = in.readInt(); this.name = in.readString(); + this.songCount = in.readInt(); } public static final Creator CREATOR = new Creator() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/GenresFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/GenresFragment.java index d51e0fd5..60ada36d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/GenresFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/GenresFragment.java @@ -38,7 +38,7 @@ public class GenresFragment extends AbsLibraryPagerRecyclerViewFragment dataSet = getAdapter() == null ? new ArrayList() : getAdapter().getDataSet(); - return new GenreAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list_simple); + return new GenreAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list_no_image); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java index 608b4486..710284b3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java @@ -23,6 +23,7 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.loader.PlaylistLoader; import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.model.Artist; +import com.kabouzeid.gramophone.model.Genre; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.lyrics.AbsSynchronizedLyrics; @@ -114,6 +115,13 @@ public class MusicUtil { return albumCount + " " + albumString + " • " + songCount + " " + songString; } + @NonNull + public static String getGenreInfoString(@NonNull final Context context, @NonNull final Genre genre) { + int songCount = genre.songCount; + String songString = songCount == 1 ? context.getResources().getString(R.string.song) : context.getResources().getString(R.string.songs); + return songCount + " " + songString; + } + @NonNull public static String getPlaylistInfoString(@NonNull final Context context, @NonNull List songs) { final int songCount = songs.size(); diff --git a/app/src/main/res/layout/item_list_no_image.xml b/app/src/main/res/layout/item_list_no_image.xml new file mode 100644 index 00000000..a77b598e --- /dev/null +++ b/app/src/main/res/layout/item_list_no_image.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_list_simple.xml b/app/src/main/res/layout/item_list_simple.xml deleted file mode 100644 index 68d972de..00000000 --- a/app/src/main/res/layout/item_list_simple.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 627d371b..0a05e391 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,7 +42,6 @@ Album Artist Genre - Unknown genre Album artist Year "Track (2 for track 2 or 3004 for CD3 track 4)"