Merge branch 'scroll-queue-to-current' into 'develop'

Open queue scrolled to current track.

Closes #128

See merge request funkwhale/funkwhale-android!191
pipelines/28335
Ryan Harg 2023-01-04 13:28:44 +00:00
commit 7a01dc3a64
4 zmienionych plików z 18 dodań i 5 usunięć

Wyświetl plik

@ -50,7 +50,9 @@ class QueueFragment : BottomSheetDialogFragment() {
return super.onCreateDialog(savedInstanceState).apply { return super.onCreateDialog(savedInstanceState).apply {
setOnShowListener { setOnShowListener {
findViewById<View>(com.google.android.material.R.id.design_bottom_sheet)?.let { findViewById<View>(com.google.android.material.R.id.design_bottom_sheet)?.let {
BottomSheetBehavior.from(it).skipCollapsed = true val behavior = BottomSheetBehavior.from(it)
behavior.skipCollapsed = true
behavior.state = BottomSheetBehavior.STATE_EXPANDED
} }
} }
} }
@ -100,10 +102,10 @@ class QueueFragment : BottomSheetDialogFragment() {
CommandBus.send(Command.ClearQueue) CommandBus.send(Command.ClearQueue)
} }
refresh() refresh(true)
} }
private fun refresh() { private fun refresh(scroll: Boolean) {
lifecycleScope.launch(Main) { lifecycleScope.launch(Main) {
RequestBus.send(Request.GetQueue).wait<Response.Queue>()?.let { response -> RequestBus.send(Request.GetQueue).wait<Response.Queue>()?.let { response ->
binding.included.let { included -> binding.included.let { included ->
@ -120,6 +122,11 @@ class QueueFragment : BottomSheetDialogFragment() {
} }
} }
} }
if (scroll) {
RequestBus.send(Request.GetCurrentTrackIndex).wait<Response.CurrentTrackIndex>()?.let { sresp ->
binding.included.queue.scrollToPosition(sresp.index)
}
}
} }
} }
} }
@ -128,7 +135,7 @@ class QueueFragment : BottomSheetDialogFragment() {
lifecycleScope.launch(Main) { lifecycleScope.launch(Main) {
EventBus.get().collect { message -> EventBus.get().collect { message ->
if (message is Event.QueueChanged) { if (message is Event.QueueChanged) {
refresh() refresh(false)
} }
} }
} }
@ -136,7 +143,7 @@ class QueueFragment : BottomSheetDialogFragment() {
lifecycleScope.launch(Main) { lifecycleScope.launch(Main) {
CommandBus.get().collect { command -> CommandBus.get().collect { command ->
if (command is Command.RefreshTrack) { if (command is Command.RefreshTrack) {
refresh() refresh(false)
} }
} }
} }

Wyświetl plik

@ -240,6 +240,8 @@ class PlayerService : Service() {
RequestBus.get().collect { request -> RequestBus.get().collect { request ->
if (request is Request.GetCurrentTrack) { if (request is Request.GetCurrentTrack) {
request.channel?.trySend(Response.CurrentTrack(queue.current()))?.isSuccess request.channel?.trySend(Response.CurrentTrack(queue.current()))?.isSuccess
} else if (request is Request.GetCurrentTrackIndex) {
request.channel?.trySend(Response.CurrentTrackIndex(queue.currentIndex()))?.isSuccess
} else if (request is Request.GetState) { } else if (request is Request.GetState) {
request.channel?.trySend(Response.State(player.playWhenReady))?.isSuccess request.channel?.trySend(Response.State(player.playWhenReady))?.isSuccess
} else if (request is Request.GetQueue) { } else if (request is Request.GetQueue) {

Wyświetl plik

@ -167,6 +167,8 @@ class QueueManager(val context: Context) {
return metadata.getOrNull(current) return metadata.getOrNull(current)
} }
fun currentIndex(): Int = (if (current == -1) 0 else current)
fun clear() { fun clear() {
metadata = mutableListOf() metadata = mutableListOf()
dataSources.clear() dataSources.clear()

Wyświetl plik

@ -61,6 +61,7 @@ sealed class Request(var channel: Channel<Response>? = null) {
object GetState : Request() object GetState : Request()
object GetQueue : Request() object GetQueue : Request()
object GetCurrentTrack : Request() object GetCurrentTrack : Request()
object GetCurrentTrackIndex : Request()
object GetDownloads : Request() object GetDownloads : Request()
} }
@ -68,6 +69,7 @@ sealed class Response {
class State(val playing: Boolean) : Response() class State(val playing: Boolean) : Response()
class Queue(val queue: List<Track>) : Response() class Queue(val queue: List<Track>) : Response()
class CurrentTrack(val track: Track?) : Response() class CurrentTrack(val track: Track?) : Response()
class CurrentTrackIndex(val index: Int) : Response()
class Downloads(val cursor: DownloadCursor) : Response() class Downloads(val cursor: DownloadCursor) : Response()
} }