#66: Fixed behavior on queue shuffling, clearing and end of queue on no-repeat.
This commit is contained in:
parent
50c8dac297
commit
b87766dad2
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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) {
|
|
||||||
mediaControlsManager.updateNotification(queue.current(), false)
|
|
||||||
|
|
||||||
Build.VERSION_CODES.N.onApi(
|
Build.VERSION_CODES.N.onApi(
|
||||||
{ stopForeground(STOP_FOREGROUND_DETACH) },
|
{ stopForeground(STOP_FOREGROUND_DETACH) },
|
||||||
{ stopForeground(false) }
|
{ stopForeground(false) }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
when (playbackState) {
|
||||||
|
Player.STATE_READY -> mediaControlsManager.updateNotification(queue.current(), false)
|
||||||
|
Player.STATE_IDLE -> mediaControlsManager.remove()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue