PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/activities/PlayingQueueActivity.kt

203 lines
7.4 KiB
Kotlin
Raw Normal View History

2020-10-06 08:46:04 +00:00
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
2019-04-20 05:29:45 +00:00
package code.name.monkey.retromusic.activities
2018-12-06 08:52:57 +00:00
2019-03-25 12:43:43 +00:00
import android.content.res.ColorStateList
2018-12-06 08:52:57 +00:00
import android.os.Bundle
2019-05-22 15:15:17 +00:00
import android.view.MenuItem
2019-12-01 15:27:01 +00:00
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
2018-12-06 08:52:57 +00:00
import code.name.monkey.retromusic.R
2019-04-20 05:29:45 +00:00
import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
import code.name.monkey.retromusic.adapter.song.PlayingQueueAdapter
2020-05-20 20:28:38 +00:00
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.surfaceColor
2019-05-20 19:38:43 +00:00
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.MusicUtil
2020-08-13 08:24:36 +00:00
import code.name.monkey.retromusic.util.ThemedFastScroller
2019-12-08 16:43:20 +00:00
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator
2018-12-06 08:52:57 +00:00
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager
2019-12-08 16:43:20 +00:00
import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager
import com.h6ah4i.android.widget.advrecyclerview.touchguard.RecyclerViewTouchActionGuardManager
2018-12-06 08:52:57 +00:00
import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils
import kotlinx.android.synthetic.main.activity_playing_queue.*
2018-12-06 08:52:57 +00:00
2019-10-29 16:16:05 +00:00
open class PlayingQueueActivity : AbsMusicServiceActivity() {
2018-12-06 08:52:57 +00:00
2019-12-01 15:27:01 +00:00
private var wrappedAdapter: RecyclerView.Adapter<*>? = null
private var recyclerViewDragDropManager: RecyclerViewDragDropManager? = null
2019-12-08 16:43:20 +00:00
private var recyclerViewSwipeManager: RecyclerViewSwipeManager? = null
private var recyclerViewTouchActionGuardManager: RecyclerViewTouchActionGuardManager? = null
2019-12-01 15:27:01 +00:00
private var playingQueueAdapter: PlayingQueueAdapter? = null
private lateinit var linearLayoutManager: LinearLayoutManager
private fun getUpNextAndQueueTime(): String {
val duration = MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.position)
return MusicUtil.buildInfoString(
resources.getString(R.string.up_next),
MusicUtil.getReadableDurationString(duration)
)
}
2019-12-01 15:27:01 +00:00
override fun onCreate(savedInstanceState: Bundle?) {
2019-12-05 18:18:54 +00:00
setDrawUnderStatusBar()
2019-12-01 15:27:01 +00:00
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_playing_queue)
setStatusbarColorAuto()
2019-12-05 18:18:54 +00:00
setNavigationbarColorAuto()
2019-12-01 15:27:01 +00:00
setTaskDescriptionColorAuto()
setLightNavigationBar(true)
setupToolbar()
setUpRecyclerView()
clearQueue.setOnClickListener {
MusicPlayerRemote.clearQueue()
}
checkForPadding()
2019-12-01 15:27:01 +00:00
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
android.R.id.home -> {
onBackPressed()
true
}
else -> super.onOptionsItemSelected(item)
}
}
private fun setUpRecyclerView() {
2019-12-08 16:43:20 +00:00
recyclerViewTouchActionGuardManager = RecyclerViewTouchActionGuardManager()
2019-12-01 15:27:01 +00:00
recyclerViewDragDropManager = RecyclerViewDragDropManager()
2019-12-08 16:43:20 +00:00
recyclerViewSwipeManager = RecyclerViewSwipeManager()
val animator = DraggableItemAnimator()
animator.supportsChangeAnimations = false
2019-12-01 15:27:01 +00:00
playingQueueAdapter = PlayingQueueAdapter(
2019-12-30 11:01:50 +00:00
this,
2020-04-25 07:27:05 +00:00
MusicPlayerRemote.playingQueue.toMutableList(),
2019-12-30 11:01:50 +00:00
MusicPlayerRemote.position,
R.layout.item_queue
2019-12-01 15:27:01 +00:00
)
wrappedAdapter = recyclerViewDragDropManager?.createWrappedAdapter(playingQueueAdapter!!)
2019-12-08 16:43:20 +00:00
wrappedAdapter = wrappedAdapter?.let { recyclerViewSwipeManager?.createWrappedAdapter(it) }
2019-12-01 15:27:01 +00:00
linearLayoutManager = LinearLayoutManager(this)
2019-12-08 16:43:20 +00:00
recyclerView.layoutManager = linearLayoutManager
recyclerView.adapter = wrappedAdapter
recyclerView.itemAnimator = animator
recyclerViewTouchActionGuardManager?.attachRecyclerView(recyclerView)
recyclerViewDragDropManager?.attachRecyclerView(recyclerView)
recyclerViewSwipeManager?.attachRecyclerView(recyclerView)
2019-12-01 15:27:01 +00:00
linearLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.position + 1, 0)
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (dy > 0) {
clearQueue.shrink()
} else if (dy < 0) {
clearQueue.extend()
}
}
})
2020-08-21 18:01:52 +00:00
ThemedFastScroller.create(recyclerView)
2019-12-01 15:27:01 +00:00
}
private fun checkForPadding() {
2019-12-01 15:27:01 +00:00
}
override fun onQueueChanged() {
if (MusicPlayerRemote.playingQueue.isEmpty()) {
finish()
return
}
checkForPadding()
2019-12-01 15:27:01 +00:00
updateQueue()
updateCurrentSong()
}
override fun onMediaStoreChanged() {
updateQueue()
updateCurrentSong()
}
private fun updateCurrentSong() {
toolbar.subtitle = getUpNextAndQueueTime()
2019-12-01 15:27:01 +00:00
}
override fun onPlayingMetaChanged() {
updateQueuePosition()
}
private fun updateQueuePosition() {
playingQueueAdapter?.setCurrent(MusicPlayerRemote.position)
resetToCurrentPosition()
toolbar.subtitle = getUpNextAndQueueTime()
2019-12-01 15:27:01 +00:00
}
private fun updateQueue() {
playingQueueAdapter?.swapDataSet(MusicPlayerRemote.playingQueue, MusicPlayerRemote.position)
resetToCurrentPosition()
}
private fun resetToCurrentPosition() {
recyclerView.stopScroll()
linearLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.position + 1, 0)
}
override fun onPause() {
if (recyclerViewDragDropManager != null) {
recyclerViewDragDropManager!!.cancelDrag()
}
super.onPause()
}
override fun onDestroy() {
if (recyclerViewDragDropManager != null) {
recyclerViewDragDropManager!!.release()
recyclerViewDragDropManager = null
}
2019-12-08 16:43:20 +00:00
if (recyclerViewSwipeManager != null) {
recyclerViewSwipeManager?.release()
recyclerViewSwipeManager = null
}
2019-12-01 15:27:01 +00:00
if (wrappedAdapter != null) {
WrapperAdapterUtils.releaseAll(wrappedAdapter)
wrappedAdapter = null
}
playingQueueAdapter = null
super.onDestroy()
}
private fun setupToolbar() {
toolbar.subtitle = getUpNextAndQueueTime()
2020-05-20 20:28:38 +00:00
toolbar.setBackgroundColor(surfaceColor())
2020-02-22 12:10:12 +00:00
setSupportActionBar(toolbar)
2020-05-20 20:28:38 +00:00
clearQueue.backgroundTintList = ColorStateList.valueOf(accentColor())
2019-12-01 15:27:01 +00:00
ColorStateList.valueOf(
2020-05-20 20:28:38 +00:00
MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(accentColor()))
2019-12-01 15:27:01 +00:00
).apply {
clearQueue.setTextColor(this)
clearQueue.iconTint = this
}
}
2020-10-06 08:46:04 +00:00
}