Added category support to Navigate, wired it into ItemContextMenuMixin

This commit is contained in:
casey langen 2019-02-16 19:43:38 -08:00
parent e578dae692
commit 96fece191c
5 changed files with 147 additions and 71 deletions

View File

@ -219,20 +219,27 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran
this.arguments = arguments
}
fun create(context: Context,
targetType: String,
predicateType: String = "",
predicateId: Long = -1,
predicateValue: String = ""): CategoryBrowseFragment =
create(arguments(context, targetType, predicateType, predicateId, predicateValue))
fun arguments(context: Context,
category: String,
predicateType: String = "",
predicateId: Long = -1,
predicateValue: String = ""): Bundle =
targetType: String,
sourceType: String = "",
sourceId: Long = -1,
sourceValue: String = ""): Bundle =
Bundle().apply {
putString(Category.Extra.CATEGORY, category)
putString(Category.Extra.PREDICATE_TYPE, predicateType)
putLong(Category.Extra.PREDICATE_ID, predicateId)
if (predicateValue.isNotBlank() && Category.NAME_TO_RELATED_TITLE.containsKey(category)) {
val format = Category.NAME_TO_RELATED_TITLE[category]
putString(Category.Extra.CATEGORY, targetType)
putString(Category.Extra.PREDICATE_TYPE, sourceType)
putLong(Category.Extra.PREDICATE_ID, sourceId)
if (sourceValue.isNotBlank() && Category.NAME_TO_RELATED_TITLE.containsKey(targetType)) {
val format = Category.NAME_TO_RELATED_TITLE[targetType]
when (format) {
null -> throw IllegalArgumentException("unknown category $category")
else -> putString(Shared.Extra.TITLE_OVERRIDE, context.getString(format, predicateValue))
null -> throw IllegalArgumentException("unknown category $targetType")
else -> putString(Shared.Extra.TITLE_OVERRIDE, context.getString(format, sourceValue))
}
}
}

View File

@ -7,6 +7,8 @@ import io.casey.musikcube.remote.service.websocket.model.IAlbum
import io.casey.musikcube.remote.service.websocket.model.ICategoryValue
import io.casey.musikcube.remote.ui.albums.activity.AlbumBrowseActivity
import io.casey.musikcube.remote.ui.albums.fragment.AlbumBrowseFragment
import io.casey.musikcube.remote.ui.category.activity.CategoryBrowseActivity
import io.casey.musikcube.remote.ui.category.fragment.CategoryBrowseFragment
import io.casey.musikcube.remote.ui.playqueue.activity.PlayQueueActivity
import io.casey.musikcube.remote.ui.playqueue.fragment.PlayQueueFragment
import io.casey.musikcube.remote.ui.shared.extension.pushContainerId
@ -16,21 +18,37 @@ import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
import io.casey.musikcube.remote.ui.tracks.fragment.TrackListFragment
object Navigate {
fun toAlbums(category: String,
entry: ICategoryValue,
/*
*
* list of albums
*
*/
fun toAlbums(categoryType: String,
categoryEntry: ICategoryValue,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
when (fragment != null && fragment.pushContainerId > 0) {
true ->
fragment.pushWithToolbar(
fragment.pushContainerId,
"AlbumsBy($entry.value)",
AlbumBrowseFragment.create(activity, category, entry.id, entry.value))
false ->
activity.startActivity(AlbumBrowseActivity
.getStartIntent(activity, category, entry))
toAlbums(categoryType, categoryEntry.id, categoryEntry.value, activity, fragment)
}
fun toAlbums(categoryEntry: ICategoryValue,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
toAlbums(categoryEntry.type, categoryEntry.id, categoryEntry.value, activity, fragment)
fun toAlbums(categoryType: String,
categoryId: Long,
categoryValue: String,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
when (fragment != null && fragment.pushContainerId > 0) {
true ->
fragment.pushWithToolbar(
fragment.pushContainerId,
"AlbumsBy($categoryType-$categoryId-$categoryValue)",
AlbumBrowseFragment.create(activity, categoryType, categoryId, categoryValue))
false ->
activity.startActivity(AlbumBrowseActivity
.getStartIntent(activity, categoryType, categoryId, categoryValue))
}
fun toAlbums(activity: AppCompatActivity,
fragment: BaseFragment? = null) =
@ -45,6 +63,12 @@ object Navigate {
activity.startActivity(AlbumBrowseActivity.getStartIntent(activity))
}
/*
*
* single album
*
*/
fun toAlbum(album: IAlbum,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
@ -62,19 +86,61 @@ object Navigate {
activity, Metadata.Category.ALBUM, album.id, album.value))
}
fun toTracks(category: String,
entry: ICategoryValue,
/*
*
* list of categories
*
*/
fun toCategoryList(targetType: String,
sourceType: String,
sourceId: Long,
sourceValue: String,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
when (fragment != null && fragment.pushContainerId > 0) {
true ->
fragment.pushWithToolbar(
fragment.pushContainerId,
"${targetType}By($sourceType-$sourceId-$sourceValue)",
CategoryBrowseFragment.create(activity, targetType, sourceType, sourceId, sourceValue))
false ->
activity.startActivity(CategoryBrowseActivity
.getStartIntent(activity, targetType, sourceType, sourceId, sourceValue))
}
/*
*
* list of tracks
*
*/
fun toTracks(categoryType: String,
categoryEntry: ICategoryValue,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
toTracks(categoryType, categoryEntry.id, categoryEntry.value, activity, fragment)
fun toTracks(categoryEntry: ICategoryValue,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
toTracks(categoryEntry.type, categoryEntry.id, categoryEntry.value, activity, fragment)
fun toTracks(categoryType: String,
categoryId: Long,
categoryValue: String,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
when (fragment != null && fragment.pushContainerId > 0) {
true ->
fragment.pushWithToolbar(
fragment.pushContainerId,
"TracksBy($entry.value)",
TrackListFragment.create(TrackListFragment.arguments(activity, entry.type, entry.id)))
"TracksBy($categoryType-$categoryId-$categoryValue)",
TrackListFragment.create(TrackListFragment.arguments(
activity, categoryType, categoryId, categoryValue)))
false ->
activity.startActivity(TrackListActivity.getStartIntent(
activity, category, entry.id, entry.value))
activity, categoryType, categoryId, categoryValue))
}
fun toPlayQueue(playingIndex: Int,

View File

@ -20,10 +20,10 @@ 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
import io.casey.musikcube.remote.ui.albums.activity.AlbumBrowseActivity
import io.casey.musikcube.remote.ui.category.activity.CategoryBrowseActivity
import io.casey.musikcube.remote.ui.category.constant.Category
import io.casey.musikcube.remote.ui.category.constant.NavigationType
import io.casey.musikcube.remote.ui.navigation.Navigate
import io.casey.musikcube.remote.ui.shared.extension.hideKeyboard
import io.casey.musikcube.remote.ui.shared.extension.showErrorSnackbar
import io.casey.musikcube.remote.ui.shared.extension.showKeyboard
@ -214,31 +214,31 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
}
popup.setOnMenuItemClickListener { item ->
val intent: Intent? = when (item.itemId) {
when (item.itemId) {
R.id.menu_add_to_playlist -> {
addToPlaylist(track)
null
}
R.id.menu_remove_from_playlist -> {
ConfirmRemoveFromPlaylistDialog.show(
activity, this, categoryId, categoryValue, position, track)
null
}
R.id.menu_show_artist_albums -> {
AlbumBrowseActivity.getStartIntent(
activity, Metadata.Category.ARTIST, track.artistId, track.artist)
Navigate.toAlbums(
Metadata.Category.ARTIST,
track.artistId,
track.artist,
activity,
fragment)
}
R.id.menu_show_artist_tracks -> {
TrackListActivity.getStartIntent(
activity, Metadata.Category.ARTIST, track.artistId, track.artist)
Navigate.toTracks(
Metadata.Category.ARTIST,
track.artistId,
track.artist,
activity,
fragment)
}
else -> null
}
if (intent != null) {
activity.startActivity(intent)
}
true
}
@ -290,54 +290,57 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
popup.inflate(menuId)
popup.setOnMenuItemClickListener { item ->
val intent: Intent? = when (item.itemId) {
when (item.itemId) {
R.id.menu_add_to_playlist -> {
addToPlaylist(value)
null
}
R.id.menu_show_artist_albums,
R.id.menu_show_genre_albums -> {
if (value is IAlbum) {
AlbumBrowseActivity.getStartIntent(
activity,
Navigate.toAlbums(
Metadata.Category.ALBUM_ARTIST,
value.albumArtistId,
value.albumArtist)
value.albumArtist,
activity,
fragment)
}
else {
AlbumBrowseActivity.getStartIntent(
activity, value.type, value.id, value.value)
Navigate.toAlbums(value, activity, fragment)
}
}
R.id.menu_show_artist_tracks,
R.id.menu_show_genre_tracks -> {
if (value is IAlbum) {
TrackListActivity.getStartIntent(
activity,
Navigate.toTracks(
Metadata.Category.ALBUM_ARTIST,
value.albumArtistId,
value.albumArtist)
value.albumArtist,
activity,
fragment)
}
else {
TrackListActivity.getStartIntent(
activity, value.type, value.id, value.value)
Navigate.toTracks(value, activity, fragment)
}
}
R.id.menu_show_artist_genres -> {
CategoryBrowseActivity.getStartIntent(
activity, Metadata.Category.GENRE, value.type, value.id, value.value)
Navigate.toCategoryList(
Metadata.Category.GENRE,
value.type,
value.id,
value.value,
activity,
fragment)
}
R.id.menu_show_genre_artists -> {
CategoryBrowseActivity.getStartIntent(
activity, Metadata.Category.ARTIST, value.type, value.id, value.value)
Navigate.toCategoryList(
Metadata.Category.ARTIST,
value.type,
value.id,
value.value,
activity,
fragment)
}
else -> null
}
if (intent != null) {
activity.startActivity(intent)
}
true
}

View File

@ -37,13 +37,13 @@ class TrackListActivity: FragmentActivityWithTransport() {
}
fun getStartIntent(context: Context,
type: String = "",
id: Long = 0,
categoryType: String = "",
categoryId: Long = 0,
categoryValue: String = ""): Intent =
Intent(context, TrackListActivity::class.java).apply {
putExtra(
Track.Extra.FRAGMENT_ARGUMENTS,
TrackListFragment.arguments(context, type, id, categoryValue))
TrackListFragment.arguments(context, categoryType, categoryId, categoryValue))
}
}
}

View File

@ -278,11 +278,11 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport
const val TAG = "TrackListFragment"
fun arguments(context: Context,
type: String = "",
id: Long = 0,
categoryType: String = "",
categoryId: Long = 0,
categoryValue: String = ""): Bundle = Bundle().apply {
putString(Track.Extra.CATEGORY_TYPE, type)
putLong(Track.Extra.SELECTED_ID, id)
putLong(Track.Extra.SELECTED_ID, categoryId)
putString(Track.Extra.CATEGORY_TYPE, categoryType)
putString(Track.Extra.CATEGORY_VALUE, categoryValue)
if (Strings.notEmpty(categoryValue)) {
putString(