Fixed playlist chooser and tied up a couple other loose ends.

This commit is contained in:
casey langen 2019-02-16 22:46:50 -08:00
parent aadd2bec7e
commit dd4fe103c7
6 changed files with 102 additions and 40 deletions

View File

@ -2,18 +2,20 @@ package io.casey.musikcube.remote.ui.navigation
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import io.casey.musikcube.remote.R
import io.casey.musikcube.remote.service.playback.impl.remote.Metadata
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.constant.NavigationType
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
import io.casey.musikcube.remote.ui.shared.extension.pushWithToolbar
import io.casey.musikcube.remote.ui.shared.extension.*
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
import io.casey.musikcube.remote.ui.tracks.activity.EditPlaylistActivity
import io.casey.musikcube.remote.ui.tracks.activity.TrackListActivity
import io.casey.musikcube.remote.ui.tracks.fragment.TrackListFragment
@ -109,6 +111,35 @@ object Navigate {
.getStartIntent(activity, targetType, sourceType, sourceId, sourceValue))
}
/*
*
* playlist-related
*
*/
fun toPlaylistChooser(requestCode: Int,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
CategoryBrowseActivity.getStartIntent(
activity,
Metadata.Category.PLAYLISTS,
NavigationType.Select,
activity.getString(R.string.playlist_edit_pick_playlist))
.withoutTransport()
.withTransitionType(Transition.Vertical)
.apply {
startActivityForResult(this, requestCode, activity, fragment)
}
fun toPlaylistEditor(requestCode: Int,
playlistName: String,
playlistId: Long,
activity: AppCompatActivity,
fragment: BaseFragment? = null) =
EditPlaylistActivity.getStartIntent(activity, playlistName, playlistId).apply {
startActivityForResult(this, requestCode, activity, fragment)
}
/*
*
* list of tracks

View File

@ -1,5 +1,9 @@
package io.casey.musikcube.remote.ui.navigation
enum class Transition {
Horizontal, Vertical
Horizontal, Vertical;
companion object {
fun from(name: String, fallback: Transition = Horizontal): Transition =
values().firstOrNull { it.name == name } ?: fallback
}
}

View File

@ -5,12 +5,14 @@ import android.support.design.widget.FloatingActionButton
import android.view.Menu
import android.view.MenuItem
import io.casey.musikcube.remote.R
import io.casey.musikcube.remote.ui.navigation.Transition
import io.casey.musikcube.remote.ui.shared.constant.Shared
import io.casey.musikcube.remote.ui.shared.extension.*
import io.casey.musikcube.remote.ui.shared.fragment.BaseFragment
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
protected lateinit var transport: TransportFragment
protected var transport: TransportFragment? = null
private set
protected lateinit var content: BaseFragment
@ -30,7 +32,7 @@ abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
else -> restoreFragments()
}
transport.modelChangedListener = {
transport?.modelChangedListener = {
onTransportChanged()
}
@ -80,6 +82,9 @@ abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
setFilter(filter)
} ?: Unit
override val transitionType: Transition
get() = intent.transitionType
protected abstract fun createContentFragment(): BaseFragment
protected abstract val contentFragmentTag: String
@ -89,14 +94,16 @@ abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
private fun createFragments() {
content = createContentFragment()
.withToolbar()
.withTitleOverride(this)
transport = TransportFragment.create()
supportFragmentManager
.beginTransaction()
.add(R.id.content_container, content, contentFragmentTag)
.add(R.id.transport_container, transport, TransportFragment.TAG)
.commit()
.withToolbar().withTitleOverride(this)
supportFragmentManager.beginTransaction().apply {
add(R.id.content_container, content, contentFragmentTag)
if (!withoutTransport) {
transport = TransportFragment.create().apply {
add(R.id.transport_container, this, TransportFragment.TAG)
}
}
commit()
}
supportFragmentManager.executePendingTransactions()
}
@ -104,4 +111,7 @@ abstract class FragmentActivityWithTransport: BaseActivity(), IFilterable {
transport = findFragment(TransportFragment.TAG)
content = findFragment(contentFragmentTag)
}
private val withoutTransport
get() = extras.getBoolean(Shared.Extra.WITHOUT_TRANSPORT, false)
}

View File

@ -2,10 +2,11 @@ package io.casey.musikcube.remote.ui.shared.constant
object Shared {
object Extra {
const val TITLE_OVERRIDE = "extra_title_override"
const val WITH_TOOLBAR = "extra_with_toolbar"
const val PUSH_CONTAINER_ID = "extra_push_container_id"
const val WITHOUT_TRANSPORT = "extra_without_transport"
const val ELEVATION = "extra_elevation"
const val PUSH_CONTAINER_ID = "extra_push_container_id"
const val TITLE_OVERRIDE = "extra_title_override"
const val TRANSITION_TYPE = "extra_transition_type"
const val WITH_TOOLBAR = "extra_with_toolbar"
const val WITHOUT_TRANSPORT = "extra_without_transport"
}
}

View File

@ -2,6 +2,7 @@ package io.casey.musikcube.remote.ui.shared.extension
import android.app.SearchManager
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.support.design.widget.Snackbar
@ -197,6 +198,10 @@ val FragmentManager.topOfStack: String?
return null
}
inline fun <reified T> FragmentManager.find(tag: String): T {
return findFragmentByTag(tag) as T
}
/*
*
* Bundle
@ -211,6 +216,25 @@ fun Bundle.withElevation(fm: FragmentManager): Bundle {
val Bundle.elevation: Float
get() = this.getFloat(Shared.Extra.ELEVATION, 0.0f)
/*
*
* Intent
*
*/
fun Intent.withoutTransport() =
this.apply {
putExtra(Shared.Extra.WITHOUT_TRANSPORT, true)
}
fun Intent.withTransitionType(type: Transition) =
this.apply {
putExtra(Shared.Extra.TRANSITION_TYPE, type.name)
}
val Intent.transitionType
get() = Transition.from(getStringExtra(Shared.Extra.TRANSITION_TYPE))
/*
*
* BaseFragment
@ -391,10 +415,6 @@ fun View.setVisible(visible: Boolean) {
this.visibility = if (visible) View.VISIBLE else View.GONE
}
inline fun <reified T> FragmentManager.find(tag: String): T {
return findFragmentByTag(tag) as T
}
/*
*
* Colors
@ -480,3 +500,16 @@ fun fallback(input: String?, fallback: String): String =
fun fallback(input: String?, fallback: Int): String =
if (input.isNullOrEmpty()) Application.instance.getString(fallback) else input
fun startActivityForResult(intent: Intent,
requestCode: Int,
activity: AppCompatActivity?,
fragment: BaseFragment? = null) =
when {
fragment != null ->
fragment.startActivityForResult(intent, requestCode)
activity != null ->
activity.startActivityForResult(intent, requestCode)
else ->
throw IllegalArgumentException("")
}

View File

@ -20,9 +20,7 @@ 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.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
@ -185,14 +183,7 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
private fun showPlaylistChooser(callback: (Long, String) -> Unit) {
completion = callback
pendingCode = REQUEST_ADD_TO_PLAYLIST
val intent = CategoryBrowseActivity.getStartIntent(
activity,
Metadata.Category.PLAYLISTS,
NavigationType.Select,
activity.getString(R.string.playlist_edit_pick_playlist))
startActivityForResult(intent, pendingCode)
Navigate.toPlaylistChooser(pendingCode, activity, fragment)
}
fun showForTrack(track: ITrack, anchorView: View) {
@ -253,8 +244,7 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
ConfirmDeletePlaylistDialog.show(activity, this, playlistName, playlistId)
}
R.id.menu_playlist_edit -> {
startActivityForResult(EditPlaylistActivity.getStartIntent(
activity, playlistName, playlistId), REQUEST_EDIT_PLAYLIST)
Navigate.toPlaylistEditor(REQUEST_EDIT_PLAYLIST, playlistName, playlistId, activity, fragment)
}
R.id.menu_playlist_rename -> {
EnterPlaylistNameDialog.showForRename(activity, this, playlistName, playlistId)
@ -388,13 +378,6 @@ class ItemContextMenuMixin(private val activity: AppCompatActivity,
private fun showError(message: String) =
showErrorSnackbar(activity.findViewById(android.R.id.content), message)
private fun startActivityForResult(intent: Intent, requestCode: Int) {
when (fragment != null) {
true -> fragment.startActivityForResult(intent, requestCode)
false -> activity.startActivityForResult(intent, requestCode)
}
}
class ConfirmRemoveFromPlaylistDialog : BaseDialogFragment() {
private lateinit var mixin: ItemContextMenuMixin