PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt

164 lines
6.0 KiB
Kotlin
Raw Normal View History

2020-08-11 18:29:44 +00:00
package code.name.monkey.retromusic.fragments.playlists
import android.os.Bundle
2019-12-01 15:27:01 +00:00
import android.view.Menu
2020-08-11 18:29:44 +00:00
import android.view.MenuInflater
2020-08-11 22:20:22 +00:00
import android.view.MenuItem
2019-12-01 15:27:01 +00:00
import android.view.View
2020-08-11 22:20:22 +00:00
import androidx.navigation.fragment.navArgs
2019-12-01 15:27:01 +00:00
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.song.OrderablePlaylistSongAdapter
import code.name.monkey.retromusic.adapter.song.SongAdapter
2020-08-20 09:52:38 +00:00
import code.name.monkey.retromusic.db.PlaylistWithSongs
2020-09-10 19:22:10 +00:00
import code.name.monkey.retromusic.db.toSongs
2020-08-11 18:29:44 +00:00
import code.name.monkey.retromusic.extensions.dipToPix
2020-08-11 21:31:09 +00:00
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
2020-08-20 20:02:40 +00:00
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
2019-12-01 15:27:01 +00:00
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PlaylistsUtil
import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager
import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils
2020-08-11 21:31:09 +00:00
import kotlinx.android.synthetic.main.fragment_playlist_detail.*
2020-07-28 19:18:34 +00:00
import org.koin.androidx.viewmodel.ext.android.viewModel
2020-07-20 19:05:48 +00:00
import org.koin.core.parameter.parametersOf
2019-09-04 19:30:24 +00:00
2020-08-11 21:31:09 +00:00
class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail) {
2020-08-11 22:20:22 +00:00
private val arguments by navArgs<PlaylistDetailsFragmentArgs>()
2020-07-20 19:05:48 +00:00
private val viewModel: PlaylistDetailsViewModel by viewModel {
2020-08-11 22:20:22 +00:00
parametersOf(arguments.extraPlaylist)
2020-07-20 19:05:48 +00:00
}
2020-08-11 22:20:22 +00:00
2020-08-20 09:52:38 +00:00
private lateinit var playlist: PlaylistWithSongs
2019-12-01 15:27:01 +00:00
private lateinit var adapter: SongAdapter
2020-08-11 18:29:44 +00:00
2019-12-01 15:27:01 +00:00
private var wrappedAdapter: RecyclerView.Adapter<*>? = null
private var recyclerViewDragDropManager: RecyclerViewDragDropManager? = null
2020-08-11 22:20:22 +00:00
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
2020-08-11 18:29:44 +00:00
mainActivity.addMusicServiceEventListener(viewModel)
mainActivity.setSupportActionBar(toolbar)
2020-08-13 08:24:36 +00:00
mainActivity.hideBottomBarVisibility(false)
2019-12-01 15:27:01 +00:00
2020-08-11 22:20:22 +00:00
playlist = arguments.extraPlaylist
2020-08-20 09:52:38 +00:00
toolbar.title = playlist.playlistEntity.playlistName
2019-12-01 15:27:01 +00:00
setUpRecyclerView()
2020-07-20 19:05:48 +00:00
2020-09-10 19:22:10 +00:00
viewModel.getSongs().observe(viewLifecycleOwner, {
songs(it.toSongs())
2020-07-20 19:05:48 +00:00
})
2019-12-01 15:27:01 +00:00
}
private fun setUpRecyclerView() {
2020-08-11 18:29:44 +00:00
recyclerView.layoutManager = LinearLayoutManager(requireContext())
2020-08-20 09:52:38 +00:00
recyclerViewDragDropManager = RecyclerViewDragDropManager()
val animator = RefactoredDefaultItemAnimator()
2020-08-20 20:02:40 +00:00
adapter =
OrderablePlaylistSongAdapter(
2020-08-24 16:27:08 +00:00
playlist.playlistEntity,
2020-08-20 20:02:40 +00:00
requireActivity(),
ArrayList(),
R.layout.item_list,
null,
object : OrderablePlaylistSongAdapter.OnMoveItemListener {
override fun onMoveItem(fromPosition: Int, toPosition: Int) {
if (PlaylistsUtil.moveItem(
requireContext(),
playlist.playlistEntity.playListId,
fromPosition,
toPosition
)
) {
val song = adapter.dataSet.removeAt(fromPosition)
adapter.dataSet.add(toPosition, song)
adapter.notifyItemMoved(fromPosition, toPosition)
}
2019-12-30 11:01:50 +00:00
}
2020-08-20 20:02:40 +00:00
})
2020-08-20 09:52:38 +00:00
wrappedAdapter = recyclerViewDragDropManager!!.createWrappedAdapter(adapter)
2019-12-01 15:27:01 +00:00
2020-08-20 09:52:38 +00:00
recyclerView.adapter = wrappedAdapter
recyclerView.itemAnimator = animator
recyclerViewDragDropManager?.attachRecyclerView(recyclerView)
2019-12-01 15:27:01 +00:00
adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
checkIsEmpty()
}
})
}
2020-08-11 18:29:44 +00:00
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
2020-08-20 09:52:38 +00:00
val menuRes =/* if (playlist is AbsCustomPlaylist)
2020-08-11 22:20:22 +00:00
R.menu.menu_smart_playlist_detail
2020-08-20 09:52:38 +00:00
else*/ R.menu.menu_playlist_detail
2020-08-11 22:20:22 +00:00
inflater.inflate(menuRes, menu)
2019-12-01 15:27:01 +00:00
}
2020-08-11 22:20:22 +00:00
override fun onOptionsItemSelected(item: MenuItem): Boolean {
2020-08-20 20:02:40 +00:00
return PlaylistMenuHelper.handleMenuClick(requireActivity(), playlist, item)
2020-08-11 22:20:22 +00:00
}
2019-12-01 15:27:01 +00:00
private fun checkForPadding() {
2020-08-11 18:29:44 +00:00
val height = dipToPix(52f)
recyclerView.setPadding(0, 0, 0, height.toInt())
2019-12-01 15:27:01 +00:00
}
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))
}
2020-08-21 14:19:15 +00:00
override fun onPause() {
2019-12-01 15:27:01 +00:00
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()
}
2020-08-11 22:20:22 +00:00
private fun showEmptyView() {
2019-12-01 15:27:01 +00:00
empty.visibility = View.VISIBLE
emptyText.visibility = View.VISIBLE
}
2020-07-20 19:05:48 +00:00
fun songs(songs: List<Song>) {
2020-08-20 09:52:38 +00:00
progressIndicator.hide()
2020-07-20 19:05:48 +00:00
if (songs.isNotEmpty()) {
adapter.swapDataSet(songs)
} else {
showEmptyView()
}
2019-12-01 15:27:01 +00:00
}
2020-08-11 18:29:44 +00:00
}