2019-04-20 05:29:45 +00:00
|
|
|
package code.name.monkey.retromusic.activities
|
2018-12-05 04:29:55 +00:00
|
|
|
|
|
|
|
import android.os.Bundle
|
2019-12-01 15:27:01 +00:00
|
|
|
import android.view.Menu
|
|
|
|
import android.view.MenuItem
|
|
|
|
import android.view.View
|
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import code.name.monkey.appthemehelper.util.ATHUtil
|
|
|
|
import code.name.monkey.retromusic.App
|
|
|
|
import code.name.monkey.retromusic.R
|
2019-05-20 19:38:43 +00:00
|
|
|
import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity
|
2019-12-01 15:27:01 +00:00
|
|
|
import code.name.monkey.retromusic.adapter.song.OrderablePlaylistSongAdapter
|
|
|
|
import code.name.monkey.retromusic.adapter.song.PlaylistSongAdapter
|
|
|
|
import code.name.monkey.retromusic.adapter.song.SongAdapter
|
2018-12-05 04:29:55 +00:00
|
|
|
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
|
|
|
|
import code.name.monkey.retromusic.interfaces.CabHolder
|
|
|
|
import code.name.monkey.retromusic.loaders.PlaylistLoader
|
2019-12-01 15:27:01 +00:00
|
|
|
import code.name.monkey.retromusic.model.AbsCustomPlaylist
|
|
|
|
import code.name.monkey.retromusic.model.Playlist
|
|
|
|
import code.name.monkey.retromusic.model.Song
|
|
|
|
import code.name.monkey.retromusic.mvp.presenter.PlaylistSongsPresenter
|
|
|
|
import code.name.monkey.retromusic.mvp.presenter.PlaylistSongsView
|
|
|
|
import code.name.monkey.retromusic.util.DensityUtil
|
|
|
|
import code.name.monkey.retromusic.util.PlaylistsUtil
|
|
|
|
import code.name.monkey.retromusic.util.RetroColorUtil
|
2018-12-05 04:29:55 +00:00
|
|
|
import com.afollestad.materialcab.MaterialCab
|
|
|
|
import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator
|
|
|
|
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager
|
|
|
|
import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils
|
2019-12-30 11:01:50 +00:00
|
|
|
import kotlinx.android.synthetic.main.activity_playlist_detail.empty
|
|
|
|
import kotlinx.android.synthetic.main.activity_playlist_detail.emptyEmoji
|
|
|
|
import kotlinx.android.synthetic.main.activity_playlist_detail.emptyText
|
|
|
|
import kotlinx.android.synthetic.main.activity_playlist_detail.recyclerView
|
|
|
|
import kotlinx.android.synthetic.main.activity_playlist_detail.toolbar
|
2019-09-04 19:30:24 +00:00
|
|
|
import javax.inject.Inject
|
|
|
|
|
2019-06-06 12:04:28 +00:00
|
|
|
class PlaylistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder, PlaylistSongsView {
|
2018-12-05 04:29:55 +00:00
|
|
|
|
2019-12-01 15:27:01 +00:00
|
|
|
@Inject
|
|
|
|
lateinit var playlistSongsPresenter: PlaylistSongsPresenter
|
|
|
|
|
|
|
|
private lateinit var playlist: Playlist
|
|
|
|
private var cab: MaterialCab? = null
|
|
|
|
private lateinit var adapter: SongAdapter
|
|
|
|
private var wrappedAdapter: RecyclerView.Adapter<*>? = null
|
|
|
|
private var recyclerViewDragDropManager: RecyclerViewDragDropManager? = null
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
setDrawUnderStatusBar()
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
setStatusbarColorAuto()
|
|
|
|
setNavigationbarColorAuto()
|
|
|
|
setTaskDescriptionColorAuto()
|
|
|
|
setLightNavigationBar(true)
|
|
|
|
toggleBottomNavigationView(true)
|
|
|
|
|
|
|
|
App.musicComponent.inject(this)
|
|
|
|
playlistSongsPresenter.attachView(this)
|
|
|
|
|
|
|
|
if (intent.extras != null) {
|
|
|
|
playlist = intent.extras!!.getParcelable(EXTRA_PLAYLIST)!!
|
|
|
|
} else {
|
|
|
|
finish()
|
|
|
|
}
|
|
|
|
|
|
|
|
setUpToolBar()
|
|
|
|
setUpRecyclerView()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun createContentView(): View {
|
|
|
|
return wrapSlidingMusicPanel(R.layout.activity_playlist_detail)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun setUpRecyclerView() {
|
2020-01-05 18:22:21 +00:00
|
|
|
|
2019-12-01 15:27:01 +00:00
|
|
|
recyclerView.layoutManager = LinearLayoutManager(this)
|
|
|
|
if (playlist is AbsCustomPlaylist) {
|
2020-01-17 17:19:06 +00:00
|
|
|
adapter = PlaylistSongAdapter(this, ArrayList(), R.layout.item_list, this)
|
2019-12-01 15:27:01 +00:00
|
|
|
recyclerView.adapter = adapter
|
|
|
|
} else {
|
|
|
|
recyclerViewDragDropManager = RecyclerViewDragDropManager()
|
|
|
|
val animator = RefactoredDefaultItemAnimator()
|
|
|
|
adapter = OrderablePlaylistSongAdapter(this,
|
2019-12-30 11:01:50 +00:00
|
|
|
ArrayList(),
|
|
|
|
R.layout.item_list,
|
|
|
|
this,
|
|
|
|
object : OrderablePlaylistSongAdapter.OnMoveItemListener {
|
|
|
|
override fun onMoveItem(fromPosition: Int, toPosition: Int) {
|
|
|
|
if (PlaylistsUtil.moveItem(
|
|
|
|
this@PlaylistDetailActivity,
|
|
|
|
playlist.id,
|
|
|
|
fromPosition,
|
|
|
|
toPosition
|
|
|
|
)
|
|
|
|
) {
|
|
|
|
val song = adapter.dataSet.removeAt(fromPosition)
|
|
|
|
adapter.dataSet.add(toPosition, song)
|
|
|
|
adapter.notifyItemMoved(fromPosition, toPosition)
|
2019-12-01 15:27:01 +00:00
|
|
|
}
|
2019-12-30 11:01:50 +00:00
|
|
|
}
|
|
|
|
})
|
2019-12-01 15:27:01 +00:00
|
|
|
wrappedAdapter = recyclerViewDragDropManager!!.createWrappedAdapter(adapter)
|
|
|
|
|
|
|
|
recyclerView.adapter = wrappedAdapter
|
|
|
|
recyclerView.itemAnimator = animator
|
|
|
|
|
|
|
|
recyclerViewDragDropManager?.attachRecyclerView(recyclerView)
|
|
|
|
}
|
|
|
|
adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
|
|
|
|
override fun onChanged() {
|
|
|
|
super.onChanged()
|
|
|
|
checkIsEmpty()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onResume() {
|
|
|
|
super.onResume()
|
|
|
|
playlistSongsPresenter.loadPlaylistSongs(playlist)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun setUpToolBar() {
|
|
|
|
toolbar.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorSurface))
|
|
|
|
setSupportActionBar(toolbar)
|
|
|
|
title = playlist.name
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
|
|
|
menuInflater.inflate(
|
2019-12-30 11:01:50 +00:00
|
|
|
if (playlist is AbsCustomPlaylist) R.menu.menu_smart_playlist_detail
|
|
|
|
else R.menu.menu_playlist_detail, menu
|
2019-12-01 15:27:01 +00:00
|
|
|
)
|
|
|
|
return super.onCreateOptionsMenu(menu)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
|
|
|
when (item.itemId) {
|
|
|
|
android.R.id.home -> {
|
|
|
|
onBackPressed()
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return PlaylistMenuHelper.handleMenuClick(this, playlist, item)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab {
|
|
|
|
if (cab != null && cab!!.isActive) {
|
|
|
|
cab!!.finish()
|
|
|
|
}
|
2019-12-30 11:01:50 +00:00
|
|
|
cab = MaterialCab(this, R.id.cab_stub).setMenu(menuRes).setCloseDrawableRes(R.drawable.ic_close_white_24dp)
|
|
|
|
.setBackgroundColor(
|
|
|
|
RetroColorUtil.shiftBackgroundColorForLightText(
|
|
|
|
ATHUtil.resolveColor(
|
|
|
|
this,
|
|
|
|
R.attr.colorSurface
|
|
|
|
)
|
|
|
|
)
|
|
|
|
).start(callback)
|
2019-12-01 15:27:01 +00:00
|
|
|
return cab!!
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onBackPressed() {
|
|
|
|
if (cab != null && cab!!.isActive) {
|
|
|
|
cab!!.finish()
|
|
|
|
} else {
|
|
|
|
recyclerView!!.stopScroll()
|
|
|
|
super.onBackPressed()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onMediaStoreChanged() {
|
|
|
|
super.onMediaStoreChanged()
|
|
|
|
if (playlist !is AbsCustomPlaylist) {
|
|
|
|
// Playlist deleted
|
|
|
|
if (!PlaylistsUtil.doesPlaylistExist(this, playlist.id)) {
|
|
|
|
finish()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
// Playlist renamed
|
|
|
|
val playlistName = PlaylistsUtil.getNameForPlaylist(this, playlist.id.toLong())
|
|
|
|
if (playlistName != playlist.name) {
|
|
|
|
playlist = PlaylistLoader.getPlaylist(this, playlist.id)
|
|
|
|
setToolbarTitle(playlist.name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
playlistSongsPresenter.loadPlaylistSongs(playlist)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun setToolbarTitle(title: String) {
|
|
|
|
supportActionBar!!.title = title
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun checkForPadding() {
|
|
|
|
val height = DensityUtil.dip2px(this, 52f)
|
|
|
|
recyclerView.setPadding(0, 0, 0, (height))
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun checkIsEmpty() {
|
|
|
|
checkForPadding()
|
2019-12-06 17:13:09 +00:00
|
|
|
emptyEmoji.text = getEmojiByUnicode(0x1F631)
|
2019-12-01 15:27:01 +00:00
|
|
|
empty.visibility = if (adapter.itemCount == 0) View.VISIBLE else View.GONE
|
|
|
|
emptyText.visibility = if (adapter.itemCount == 0) View.VISIBLE else View.GONE
|
|
|
|
}
|
|
|
|
|
2019-12-06 17:13:09 +00:00
|
|
|
private fun getEmojiByUnicode(unicode: Int): String {
|
|
|
|
return String(Character.toChars(unicode))
|
|
|
|
}
|
|
|
|
|
2019-12-01 15:27:01 +00:00
|
|
|
public override fun onPause() {
|
|
|
|
if (recyclerViewDragDropManager != null) {
|
|
|
|
recyclerViewDragDropManager!!.cancelDrag()
|
|
|
|
}
|
|
|
|
super.onPause()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onDestroy() {
|
|
|
|
if (recyclerViewDragDropManager != null) {
|
|
|
|
recyclerViewDragDropManager!!.release()
|
|
|
|
recyclerViewDragDropManager = null
|
|
|
|
}
|
|
|
|
|
|
|
|
if (recyclerView != null) {
|
|
|
|
recyclerView!!.itemAnimator = null
|
|
|
|
recyclerView!!.adapter = null
|
|
|
|
}
|
|
|
|
|
|
|
|
if (wrappedAdapter != null) {
|
|
|
|
WrapperAdapterUtils.releaseAll(wrappedAdapter)
|
|
|
|
wrappedAdapter = null
|
|
|
|
}
|
|
|
|
super.onDestroy()
|
|
|
|
playlistSongsPresenter.detachView()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun showEmptyView() {
|
|
|
|
empty.visibility = View.VISIBLE
|
|
|
|
emptyText.visibility = View.VISIBLE
|
|
|
|
}
|
|
|
|
|
2020-02-17 11:20:08 +00:00
|
|
|
override fun songs(songs: List<Song>) {
|
2019-12-01 15:27:01 +00:00
|
|
|
adapter.swapDataSet(songs)
|
|
|
|
}
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
var EXTRA_PLAYLIST = "extra_playlist"
|
|
|
|
}
|
2018-12-05 04:29:55 +00:00
|
|
|
}
|