#66: Fixed behavior on queue shuffling, clearing and end of queue on no-repeat.

This commit is contained in:
Antoine POPINEAU 2020-09-02 12:04:42 +02:00
parent 50c8dac297
commit b87766dad2
No known key found for this signature in database
GPG Key ID: A78AC64694F84063
4 changed files with 47 additions and 17 deletions

View File

@ -6,6 +6,7 @@ import android.graphics.*
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.view.* import android.view.*
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.github.apognu.otter.R import com.github.apognu.otter.R
@ -61,12 +62,12 @@ class TracksAdapter(private val context: Context?, private val favoriteListener:
holder.artist.text = track.artist.name holder.artist.text = track.artist.name
context?.let { context?.let {
holder.itemView.background = context.getDrawable(R.drawable.ripple) holder.itemView.background = ContextCompat.getDrawable(context, R.drawable.ripple)
} }
if (track == currentTrack || track.current) { if (track == currentTrack || track.current) {
context?.let { context?.let {
holder.itemView.background = context.getDrawable(R.drawable.current) holder.itemView.background = ContextCompat.getDrawable(context, R.drawable.current)
} }
} }

View File

@ -104,6 +104,10 @@ class MediaControlsManager(val context: Service, private val scope: CoroutineSco
} }
} }
fun remove() {
NotificationManagerCompat.from(context).cancel(AppContext.NOTIFICATION_MEDIA_CONTROL)
}
private fun action(icon: Int, title: String, id: Long): NotificationCompat.Action { private fun action(icon: Int, title: String, id: Long): NotificationCompat.Action {
return MediaButtonReceiver.buildMediaButtonPendingIntent(context, id).run { return MediaButtonReceiver.buildMediaButtonPendingIntent(context, id).run {
NotificationCompat.Action.Builder(icon, title, this).build() NotificationCompat.Action.Builder(icon, title, this).build()

View File

@ -185,7 +185,10 @@ class PlayerService : Service() {
is Command.PreviousTrack -> skipToPreviousTrack() is Command.PreviousTrack -> skipToPreviousTrack()
is Command.Seek -> seek(command.progress) is Command.Seek -> seek(command.progress)
is Command.ClearQueue -> queue.clear() is Command.ClearQueue -> {
queue.clear()
player.stop()
}
is Command.ShuffleQueue -> queue.shuffle() is Command.ShuffleQueue -> queue.shuffle()
is Command.PlayRadio -> { is Command.PlayRadio -> {
@ -389,7 +392,20 @@ class PlayerService : Service() {
when (playbackState) { when (playbackState) {
Player.STATE_READY -> mediaControlsManager.updateNotification(queue.current(), true) Player.STATE_READY -> mediaControlsManager.updateNotification(queue.current(), true)
Player.STATE_BUFFERING -> EventBus.send(Event.Buffering(true)) Player.STATE_BUFFERING -> EventBus.send(Event.Buffering(true))
Player.STATE_ENDED -> EventBus.send(Event.PlaybackStopped) Player.STATE_ENDED -> {
setPlaybackState(false)
queue.current = 0
player.seekTo(0, C.TIME_UNSET)
ProgressBus.send(0, 0, 0)
}
Player.STATE_IDLE -> {
setPlaybackState(false)
return EventBus.send(Event.PlaybackStopped)
}
} }
if (playbackState != Player.STATE_BUFFERING) EventBus.send(Event.Buffering(false)) if (playbackState != Player.STATE_BUFFERING) EventBus.send(Event.Buffering(false))
@ -398,13 +414,14 @@ class PlayerService : Service() {
false -> { false -> {
EventBus.send(Event.Buffering(false)) EventBus.send(Event.Buffering(false))
if (playbackState == Player.STATE_READY) { Build.VERSION_CODES.N.onApi(
mediaControlsManager.updateNotification(queue.current(), false) { stopForeground(STOP_FOREGROUND_DETACH) },
{ stopForeground(false) }
)
Build.VERSION_CODES.N.onApi( when (playbackState) {
{ stopForeground(STOP_FOREGROUND_DETACH) }, Player.STATE_READY -> mediaControlsManager.updateNotification(queue.current(), false)
{ stopForeground(false) } Player.STATE_IDLE -> mediaControlsManager.remove()
)
} }
} }
} }

View File

@ -178,26 +178,34 @@ class QueueManager(val context: Context) {
metadata = mutableListOf() metadata = mutableListOf()
datasources.clear() datasources.clear()
current = -1 current = -1
persist()
} }
fun shuffle() { fun shuffle() {
if (metadata.size == 0) return if (metadata.size < 2) return
if (current == -1) { if (current == -1) {
replace(metadata.shuffled()) replace(metadata.shuffled())
} else { } else {
val track = metadata[current] move(current, 0)
val shuffled = metadata.filter { it != track }.shuffled() current = 0
shuffled.forEach { val shuffled =
metadata.remove(it) metadata
.drop(1)
.shuffled()
while (metadata.size > 1) {
datasources.removeMediaSource(metadata.size - 1)
metadata.removeAt(metadata.size - 1)
} }
append(shuffled) append(shuffled)
current = 0
} }
persist()
EventBus.send(Event.QueueChanged) EventBus.send(Event.QueueChanged)
} }
} }