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..89ce7f7d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/GenreAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/GenreAdapter.java @@ -59,6 +59,9 @@ public class GenreAdapter extends RecyclerView.Adapter 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 4c552761..6f23a39d 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; @@ -23,26 +20,16 @@ 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 + "))"; final Cursor cursor = context.getContentResolver().query( Genres.EXTERNAL_CONTENT_URI, - projection, selection, null, PreferenceUtil.getInstance(context).getGenreSortOrder()); + projection, null, null, PreferenceUtil.getInstance(context).getGenreSortOrder()); return getGenresFromCursor(context, cursor); } @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); - } - final Cursor cursor = context.getContentResolver().query( Genres.Members.getContentUri("external", genreId), SongLoader.BASE_PROJECTION, SongLoader.BASE_SELECTION, null, null); @@ -53,15 +40,10 @@ public class GenreLoader { @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(); @@ -70,41 +52,10 @@ 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); } } 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..59880dff 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 songs; - public Genre(final int id, final String name) { + public Genre(final int id, final String name, final int songs) { this.id = id; this.name = name; - } - - // For unknown genre - public Genre(final String name) { - this.id = -1; - this.name = name; + this.songs = songs; } @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 songs == genre.songs; } @Override public int hashCode() { int result = id; - result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + name.hashCode(); + result = 31 * result + songs; return result; } @@ -41,6 +39,7 @@ public class Genre implements Parcelable { return "Genre{" + "id=" + id + ", name='" + name + '\'' + + ", songs=" + songs + '}'; } @@ -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.songs); } protected Genre(Parcel in) { this.id = in.readInt(); this.name = in.readString(); + this.songs = in.readInt(); } public static final Creator CREATOR = new Creator() { 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..622b17a1 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.songs; + 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_simple.xml b/app/src/main/res/layout/item_list_simple.xml index 68d972de..237a9d86 100644 --- a/app/src/main/res/layout/item_list_simple.xml +++ b/app/src/main/res/layout/item_list_simple.xml @@ -6,18 +6,34 @@ android:foreground="?attr/rectSelector" tools:ignore="UnusedAttribute"> - + android:paddingEnd="16dp" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:paddingStart="16dp" + android:orientation="vertical"> + + + + + + - \ 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)"