Created
August 23, 2018 23:23
-
-
Save kgilmer/f83334a7efabf49a9ba3949b20135c7f to your computer and use it in GitHub Desktop.
Add artist to uamp java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/mobile/src/main/java/com/example/android/uamp/model/MusicProvider.java b/mobile/src/main/java/com/example/android/uamp/model/MusicProvider.java | |
index 3370c6a..86c6777 100644 | |
--- a/mobile/src/main/java/com/example/android/uamp/model/MusicProvider.java | |
+++ b/mobile/src/main/java/com/example/android/uamp/model/MusicProvider.java | |
@@ -53,6 +51,7 @@ public class MusicProvider { | |
// Categorized caches for music track data: | |
private ConcurrentMap<String, List<MediaMetadataCompat>> mMusicListByGenre; | |
+ private ConcurrentMap<String, List<MediaMetadataCompat>> mMusicListByArtist; | |
private final ConcurrentMap<String, MutableMediaMetadata> mMusicListById; | |
private final Set<String> mFavoriteTracks; | |
@@ -73,6 +72,7 @@ public class MusicProvider { | |
public MusicProvider(MusicProviderSource source) { | |
mSource = source; | |
mMusicListByGenre = new ConcurrentHashMap<>(); | |
+ mMusicListByArtist = new ConcurrentHashMap<>(); | |
mMusicListById = new ConcurrentHashMap<>(); | |
mFavoriteTracks = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>()); | |
} | |
@@ -90,6 +90,18 @@ public class MusicProvider { | |
} | |
/** | |
+ * Get an iterator over the list of artists | |
+ * | |
+ * @return artists | |
+ */ | |
+ public Iterable<String> getArtists() { | |
+ if (mCurrentState != State.INITIALIZED) { | |
+ return Collections.emptyList(); | |
+ } | |
+ return mMusicListByArtist.keySet(); | |
+ } | |
+ | |
+ /** | |
* Get an iterator over a shuffled collection of all songs | |
*/ | |
public Iterable<MediaMetadataCompat> getShuffledMusic() { | |
@@ -116,6 +128,17 @@ public class MusicProvider { | |
} | |
/** | |
+ * Get music tracks of the given genre | |
+ * | |
+ */ | |
+ public List<MediaMetadataCompat> getMusicsByArtist(String artist) { | |
+ if (mCurrentState != State.INITIALIZED || !mMusicListByArtist.containsKey(artist)) { | |
+ return Collections.emptyList(); | |
+ } | |
+ return mMusicListByArtist.get(artist); | |
+ } | |
+ | |
+ /** | |
* Very basic implementation of a search that filter music tracks with title containing | |
* the given query. | |
* | |
@@ -262,6 +285,21 @@ public class MusicProvider { | |
mMusicListByGenre = newMusicListByGenre; | |
} | |
+ private synchronized void buildListsByArtist() { | |
+ ConcurrentMap<String, List<MediaMetadataCompat>> newMusicListByArtist = new ConcurrentHashMap<>(); | |
+ | |
+ for (MutableMediaMetadata m : mMusicListById.values()) { | |
+ String artist = m.metadata.getString(MediaMetadataCompat.METADATA_KEY_ARTIST); | |
+ List<MediaMetadataCompat> list = newMusicListByArtist.get(artist); | |
+ if (list == null) { | |
+ list = new ArrayList<>(); | |
+ newMusicListByArtist.put(artist, list); | |
+ } | |
+ list.add(m.metadata); | |
+ } | |
+ mMusicListByArtist = newMusicListByArtist; | |
+ } | |
+ | |
private synchronized void retrieveMedia() { | |
try { | |
if (mCurrentState == State.NON_INITIALIZED) { | |
@@ -274,6 +312,7 @@ public class MusicProvider { | |
mMusicListById.put(musicId, new MutableMediaMetadata(musicId, item)); | |
} | |
buildListsByGenre(); | |
+ buildListsByArtist(); | |
mCurrentState = State.INITIALIZED; | |
} | |
} finally { | |
@@ -294,26 +333,38 @@ public class MusicProvider { | |
} | |
if (MEDIA_ID_ROOT.equals(mediaId)) { | |
- mediaItems.add(createBrowsableMediaItemForRoot(resources)); | |
+ mediaItems.addAll(createBrowsableMediaItemForRoot(resources)); | |
} else if (MEDIA_ID_MUSICS_BY_GENRE.equals(mediaId)) { | |
for (String genre : getGenres()) { | |
mediaItems.add(createBrowsableMediaItemForGenre(genre, resources)); | |
} | |
+ } else if (MEDIA_ID_MUSICS_BY_ARTIST.equals(mediaId)) { | |
+ for (String artist : getArtists()) { | |
+ mediaItems.add(createBrowsableMediaItemForArtist(artist, resources)); | |
+ } | |
+ | |
} else if (mediaId.startsWith(MEDIA_ID_MUSICS_BY_GENRE)) { | |
String genre = MediaIDHelper.getHierarchy(mediaId)[1]; | |
for (MediaMetadataCompat metadata : getMusicsByGenre(genre)) { | |
mediaItems.add(createMediaItem(metadata)); | |
} | |
+ } else if (mediaId.startsWith(MEDIA_ID_MUSICS_BY_ARTIST)) { | |
+ String artist = MediaIDHelper.getHierarchy(mediaId)[1]; | |
+ for (MediaMetadataCompat metadata : getMusicsByArtist(artist)) { | |
+ mediaItems.add(createMediaItem(metadata)); | |
+ } | |
+ | |
} else { | |
LogHelper.w(TAG, "Skipping unmatched mediaId: ", mediaId); | |
} | |
return mediaItems; | |
} | |
- private MediaBrowserCompat.MediaItem createBrowsableMediaItemForRoot(Resources resources) { | |
+ private List<MediaBrowserCompat.MediaItem> createBrowsableMediaItemForRoot(Resources resources) { | |
+ List<MediaBrowserCompat.MediaItem> items = new ArrayList<>(2); | |
MediaDescriptionCompat description = new MediaDescriptionCompat.Builder() | |
.setMediaId(MEDIA_ID_MUSICS_BY_GENRE) | |
.setTitle(resources.getString(R.string.browse_genres)) | |
@@ -321,8 +372,22 @@ public class MusicProvider { | |
.setIconUri(Uri.parse("android.resource://" + | |
"com.example.android.uamp/drawable/ic_by_genre")) | |
.build(); | |
- return new MediaBrowserCompat.MediaItem(description, | |
- MediaBrowserCompat.MediaItem.FLAG_BROWSABLE); | |
+ | |
+ items.add(new MediaBrowserCompat.MediaItem(description, | |
+ MediaBrowserCompat.MediaItem.FLAG_BROWSABLE)); | |
+ | |
+ description = new MediaDescriptionCompat.Builder() | |
+ .setMediaId(MEDIA_ID_MUSICS_BY_ARTIST) | |
+ .setTitle(resources.getString(R.string.browse_artists)) | |
+ .setSubtitle(resources.getString(R.string.browse_artist_subtitle)) | |
+ .setIconUri(Uri.parse("android.resource://" + | |
+ "com.example.android.uamp/drawable/ic_by_genre")) | |
+ .build(); | |
+ | |
+ items.add(new MediaBrowserCompat.MediaItem(description, | |
+ MediaBrowserCompat.MediaItem.FLAG_BROWSABLE)); | |
+ | |
+ return items; | |
} | |
private MediaBrowserCompat.MediaItem createBrowsableMediaItemForGenre(String genre, | |
@@ -337,6 +402,18 @@ public class MusicProvider { | |
MediaBrowserCompat.MediaItem.FLAG_BROWSABLE); | |
} | |
+ private MediaBrowserCompat.MediaItem createBrowsableMediaItemForArtist(String artist, | |
+ Resources resources) { | |
+ MediaDescriptionCompat description = new MediaDescriptionCompat.Builder() | |
+ .setMediaId(createMediaID(null, MEDIA_ID_MUSICS_BY_ARTIST, artist)) | |
+ .setTitle(artist) | |
+ .setSubtitle(resources.getString( | |
+ R.string.browse_musics_by_artist_subtitle, artist)) | |
+ .build(); | |
+ return new MediaBrowserCompat.MediaItem(description, | |
+ MediaBrowserCompat.MediaItem.FLAG_BROWSABLE); | |
+ } | |
+ | |
private MediaBrowserCompat.MediaItem createMediaItem(MediaMetadataCompat metadata) { | |
// Since mediaMetadata fields are immutable, we need to create a copy, so we | |
// can set a hierarchy-aware mediaID. We will need to know the media hierarchy | |
diff --git a/mobile/src/main/java/com/example/android/uamp/utils/MediaIDHelper.java b/mobile/src/main/java/com/example/android/uamp/utils/MediaIDHelper.java | |
index 6138926..6105be7 100644 | |
--- a/mobile/src/main/java/com/example/android/uamp/utils/MediaIDHelper.java | |
+++ b/mobile/src/main/java/com/example/android/uamp/utils/MediaIDHelper.java | |
@@ -33,9 +33,10 @@ public class MediaIDHelper { | |
public static final String MEDIA_ID_EMPTY_ROOT = "__EMPTY_ROOT__"; | |
public static final String MEDIA_ID_ROOT = "__ROOT__"; | |
public static final String MEDIA_ID_MUSICS_BY_GENRE = "__BY_GENRE__"; | |
+ public static final String MEDIA_ID_MUSICS_BY_ARTIST = "__BY_ARTIST__"; | |
public static final String MEDIA_ID_MUSICS_BY_SEARCH = "__BY_SEARCH__"; | |
- private static final char CATEGORY_SEPARATOR = '/'; | |
+ private static final char CATEGORY_SEPARATOR = '`'; | |
private static final char LEAF_SEPARATOR = '|'; | |
/** |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment