Skip to content

Instantly share code, notes, and snippets.

@kgilmer
Created August 23, 2018 23:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kgilmer/f83334a7efabf49a9ba3949b20135c7f to your computer and use it in GitHub Desktop.
Save kgilmer/f83334a7efabf49a9ba3949b20135c7f to your computer and use it in GitHub Desktop.
Add artist to uamp java
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