diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/playback/impl/remote/Metadata.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/playback/impl/remote/Metadata.kt index 0e16892c4..62c4e0cca 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/playback/impl/remote/Metadata.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/playback/impl/remote/Metadata.kt @@ -13,9 +13,9 @@ object Metadata { val ALBUM_ARTIST_ID = "album_artist_id" val GENRE = "genre" val TRACK_NUM = "track_num" - val GENRE_ID = "visual_genre_id" + val GENRE_ID = "genre_id" val ARTIST = "artist" - val ARTIST_ID = "visual_artist_id" + val ARTIST_ID = "artist_id" val THUMBNAIL_ID = "thumbnail_id" } } @@ -26,6 +26,8 @@ object Metadata { val TITLE = "title" val ALBUM_ARTIST = "album_artist" val ALBUM_ARTIST_ID = "album_artist_id" + val ARTIST = "artist" + val ARTIST_ID = "artist_id" val THUMBNAIL_ID = "thumbnail_id" } } diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/websocket/model/IAlbum.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/websocket/model/IAlbum.kt index 49a528c2e..dbae2ffb1 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/websocket/model/IAlbum.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/websocket/model/IAlbum.kt @@ -1,6 +1,8 @@ package io.casey.musikcube.remote.service.websocket.model interface IAlbum : ICategoryValue { + val artist: String + val artistId: Long val albumArtist: String val albumArtistId: Long val name: String diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/websocket/model/impl/remote/RemoteAlbum.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/websocket/model/impl/remote/RemoteAlbum.kt index 4d9e7cd94..df711deea 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/websocket/model/impl/remote/RemoteAlbum.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/service/websocket/model/impl/remote/RemoteAlbum.kt @@ -9,6 +9,8 @@ class RemoteAlbum(val json: JSONObject) : IAlbum { override val id: Long get() = json.optLong(Metadata.Album.ID, -1) override val value: String get() = json.optString(Metadata.Album.TITLE, "") override val name: String get() = value + override val artist: String get() = json.optString(Metadata.Album.ARTIST, "") + override val artistId: Long get() =json.optLong(Metadata.Album.ARTIST_ID, -1) override val albumArtist: String get() = json.optString(Metadata.Album.ALBUM_ARTIST, "") override val albumArtistId: Long get() = json.optLong(Metadata.Album.ALBUM_ARTIST_ID, -1) override val thumbnailId: Long get() = json.optLong(Metadata.Album.THUMBNAIL_ID, -1) diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/mixin/ItemContextMenuMixin.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/mixin/ItemContextMenuMixin.kt index 3ad04a94d..9b1c25787 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/mixin/ItemContextMenuMixin.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/mixin/ItemContextMenuMixin.kt @@ -17,6 +17,7 @@ import io.casey.musikcube.remote.injection.DaggerViewComponent import io.casey.musikcube.remote.injection.DataModule import io.casey.musikcube.remote.service.playback.PlaybackServiceFactory import io.casey.musikcube.remote.service.websocket.Messages +import io.casey.musikcube.remote.service.websocket.model.IAlbum import io.casey.musikcube.remote.service.websocket.model.ICategoryValue import io.casey.musikcube.remote.service.websocket.model.IDataProvider import io.casey.musikcube.remote.service.websocket.model.ITrack @@ -96,11 +97,16 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity, fun createPlaylist(playlistName: String) { provider.createPlaylist(playlistName).subscribeBy( onNext = { id -> - listener?.onPlaylistCreated(id) - showSuccess(activity.getString(R.string.playlist_created, playlistName)) + if (id > 0L) { + listener?.onPlaylistCreated(id) + showSuccess(activity.getString(R.string.playlist_created, playlistName)) + } + else { + showError(activity.getString(R.string.playlist_not_created, playlistName)) + } }, onError = { - showSuccess(activity.getString(R.string.playlist_not_created, playlistName)) + showError(activity.getString(R.string.playlist_not_created, playlistName)) }) } @@ -156,9 +162,7 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity, fun showForTrack(track: ITrack, anchorView: View) { val popup = PopupMenu(activity, anchorView) - popup.inflate(R.menu.generic_item_context_menu) - - popup.menu.removeItem(R.id.menu_show_tracks) + popup.inflate(R.menu.track_item_context_menu) popup.setOnMenuItemClickListener { item -> val intent: Intent? = when (item.itemId) { @@ -166,26 +170,17 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity, addToPlaylist(track) null } - R.id.menu_show_albums -> { + R.id.menu_show_artist_albums -> { AlbumBrowseActivity.getStartIntent( activity, Messages.Category.ARTIST, track.artistId) } - R.id.menu_show_artists -> { + R.id.menu_show_artist_tracks -> { TrackListActivity.getStartIntent( activity, Messages.Category.ARTIST, track.artistId) } - R.id.menu_show_genres -> { - CategoryBrowseActivity.getStartIntent( - activity, - Messages.Category.GENRE, - Messages.Category.ARTIST, - track.artistId) - } - else -> { - null - } + else -> null } if (intent != null) { @@ -223,61 +218,74 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity, showForPlaylist(value.value, value.id, anchorView) } else { - val popup = PopupMenu(activity, anchorView) - popup.inflate(R.menu.generic_item_context_menu) - - if (value.type != Messages.Category.GENRE) { - popup.menu.removeItem(R.id.menu_show_artists) + val menuId = when (value.type) { + Messages.Category.ARTIST -> R.menu.artist_item_context_menu + Messages.Category.ALBUM_ARTIST -> R.menu.artist_item_context_menu + Messages.Category.ALBUM -> R.menu.album_item_context_menu + Messages.Category.GENRE -> R.menu.genre_item_context_menu + else -> -1 } - when (value.type) { - Messages.Category.ARTIST -> popup.menu.removeItem(R.id.menu_show_artists) - Messages.Category.ALBUM -> popup.menu.removeItem(R.id.menu_show_albums) - Messages.Category.GENRE -> popup.menu.removeItem(R.id.menu_show_genres) - } + if (menuId != -1) { + val popup = PopupMenu(activity, anchorView) + popup.inflate(menuId) - popup.setOnMenuItemClickListener { item -> - val intent: Intent? = when (item.itemId) { - R.id.menu_add_to_playlist -> { - addToPlaylist(value) - null + popup.setOnMenuItemClickListener { item -> + val intent: Intent? = when (item.itemId) { + R.id.menu_add_to_playlist -> { + addToPlaylist(value) + null + } + R.id.menu_show_artist_albums -> { + if (value is IAlbum) { + AlbumBrowseActivity.getStartIntent( + activity, Messages.Category.ALBUM_ARTIST, value.albumArtistId) + } + else { + null /* should never happen */ + } + } + R.id.menu_show_genre_albums -> { + AlbumBrowseActivity.getStartIntent(activity, value.type, value.id) + } + R.id.menu_show_artist_tracks, + R.id.menu_show_genre_tracks -> { + TrackListActivity.getStartIntent(activity, value.type, value.id) + } + R.id.menu_show_artist_genres -> { + CategoryBrowseActivity.getStartIntent( + activity, Messages.Category.GENRE, value.type, value.id) + } + R.id.menu_show_genre_artists -> { + CategoryBrowseActivity.getStartIntent( + activity, Messages.Category.ARTIST, value.type, value.id) + } + else -> null } - R.id.menu_show_albums -> { - AlbumBrowseActivity.getStartIntent(activity, value.type, value.id) - } - R.id.menu_show_tracks -> { - TrackListActivity.getStartIntent(activity, value.type, value.id) - } - R.id.menu_show_genres -> { - CategoryBrowseActivity.getStartIntent( - activity, Messages.Category.GENRE, value.type, value.id) - } - R.id.menu_show_artists -> { - CategoryBrowseActivity.getStartIntent( - activity, Messages.Category.ARTIST, value.type, value.id) - } - else -> { - null + + if (intent != null) { + activity.startActivity(intent) } + + true } - if (intent != null) { - activity.startActivity(intent) - } - - true + popup.show() } - - popup.show() } } private fun deletePlaylistConfirmed(playlistId: Long, playlistName: String) { if (playlistId != -1L) { provider.deletePlaylist(playlistId).subscribeBy( - onNext = { - listener?.onPlaylistDeleted(playlistId) - showSuccess(activity.getString(R.string.playlist_deleted, playlistName)) + onNext = { success -> + if (success) { + listener?.onPlaylistDeleted(playlistId) + showSuccess(activity.getString(R.string.playlist_deleted, playlistName)) + } + else { + showSuccess(activity.getString(R.string.playlist_not_deleted, playlistName)) + } }, onError = { showSuccess(activity.getString(R.string.playlist_not_deleted, playlistName)) @@ -292,6 +300,9 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity, showSnackbar(activity.findViewById(android.R.id.content), message) private fun showError(message: Int) = + showError(activity.getString(message)) + + private fun showError(message: String) = showErrorSnackbar(activity.findViewById(android.R.id.content), message) class ConfirmDeletePlaylistDialog : BaseDialogFragment() { diff --git a/src/musikdroid/app/src/main/res/layout/recycler_view_activity.xml b/src/musikdroid/app/src/main/res/layout/recycler_view_activity.xml index bd313bf22..2076b0124 100644 --- a/src/musikdroid/app/src/main/res/layout/recycler_view_activity.xml +++ b/src/musikdroid/app/src/main/res/layout/recycler_view_activity.xml @@ -30,11 +30,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/fab_padding" - android:backgroundTint="@color/color_primary" android:src="@drawable/ic_fab_add" android:scaleType="center" android:elevation="6dp" android:visibility="gone" + app:backgroundTint="@color/color_primary" app:fabSize="mini" app:rippleColor="?colorAccent"/> diff --git a/src/musikdroid/app/src/main/res/menu/album_item_context_menu.xml b/src/musikdroid/app/src/main/res/menu/album_item_context_menu.xml new file mode 100644 index 000000000..2c1409fd5 --- /dev/null +++ b/src/musikdroid/app/src/main/res/menu/album_item_context_menu.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/src/musikdroid/app/src/main/res/menu/artist_item_context_menu.xml b/src/musikdroid/app/src/main/res/menu/artist_item_context_menu.xml new file mode 100644 index 000000000..f14de8a3c --- /dev/null +++ b/src/musikdroid/app/src/main/res/menu/artist_item_context_menu.xml @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/musikdroid/app/src/main/res/menu/generic_item_context_menu.xml b/src/musikdroid/app/src/main/res/menu/genre_item_context_menu.xml similarity index 63% rename from src/musikdroid/app/src/main/res/menu/generic_item_context_menu.xml rename to src/musikdroid/app/src/main/res/menu/genre_item_context_menu.xml index 68ccd9327..d69e8498e 100644 --- a/src/musikdroid/app/src/main/res/menu/generic_item_context_menu.xml +++ b/src/musikdroid/app/src/main/res/menu/genre_item_context_menu.xml @@ -1,23 +1,18 @@ - - - \ No newline at end of file diff --git a/src/musikdroid/app/src/main/res/menu/track_item_context_menu.xml b/src/musikdroid/app/src/main/res/menu/track_item_context_menu.xml new file mode 100644 index 000000000..9cbeb2f69 --- /dev/null +++ b/src/musikdroid/app/src/main/res/menu/track_item_context_menu.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/src/musikdroid/app/src/main/res/values/strings.xml b/src/musikdroid/app/src/main/res/values/strings.xml index 7b719d449..892600121 100644 --- a/src/musikdroid/app/src/main/res/values/strings.xml +++ b/src/musikdroid/app/src/main/res/values/strings.xml @@ -67,7 +67,10 @@ add to playlist songs albums - artist + artists + artist + artist albums + artist songs genres delete play now @@ -129,6 +132,6 @@ playlist \'%s\' created could not create playlist \'%s\' playlist \'%s\' deleted - could not create playlist \'%s\' + could not delete playlist \'%s\'