diff --git a/app/src/main/java/com/github/libretube/extensions/Round.kt b/app/src/main/java/com/github/libretube/extensions/Round.kt new file mode 100644 index 000000000..0be63d173 --- /dev/null +++ b/app/src/main/java/com/github/libretube/extensions/Round.kt @@ -0,0 +1,9 @@ +package com.github.libretube.extensions + +import kotlin.math.pow +import kotlin.math.roundToInt + +fun Float.round(decimalPlaces: Int): Float { + return (this * 10.0.pow(decimalPlaces.toDouble())).roundToInt() / 10.0.pow(decimalPlaces.toDouble()) + .toFloat() +} diff --git a/app/src/main/java/com/github/libretube/ui/sheets/PlaybackSpeedSheet.kt b/app/src/main/java/com/github/libretube/ui/sheets/PlaybackSpeedSheet.kt index 43f28e6b2..c0d19d559 100644 --- a/app/src/main/java/com/github/libretube/ui/sheets/PlaybackSpeedSheet.kt +++ b/app/src/main/java/com/github/libretube/ui/sheets/PlaybackSpeedSheet.kt @@ -6,6 +6,7 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.FragmentManager import com.github.libretube.databinding.PlaybackBottomSheetBinding +import com.github.libretube.extensions.round import com.google.android.exoplayer2.PlaybackParameters import com.google.android.exoplayer2.Player import com.google.android.material.bottomsheet.BottomSheetDialogFragment @@ -31,11 +32,11 @@ class PlaybackSpeedSheet( binding.pitch.value = player.playbackParameters.pitch binding.speed.addOnChangeListener { _, value, _ -> - onChange(value, binding.pitch.value) + onChange(value, binding.pitch.value.round(2)) } binding.pitch.addOnChangeListener { _, value, _ -> - onChange(binding.speed.value, value) + onChange(binding.speed.value.round(2), value) } } diff --git a/app/src/main/java/com/github/libretube/ui/sheets/PlayingQueueSheet.kt b/app/src/main/java/com/github/libretube/ui/sheets/PlayingQueueSheet.kt index 1292b7377..13d4fc695 100644 --- a/app/src/main/java/com/github/libretube/ui/sheets/PlayingQueueSheet.kt +++ b/app/src/main/java/com/github/libretube/ui/sheets/PlayingQueueSheet.kt @@ -1,5 +1,6 @@ package com.github.libretube.ui.sheets +import android.annotation.SuppressLint import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -7,23 +8,24 @@ import android.view.ViewGroup import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.github.libretube.databinding.BottomSheetBinding +import com.github.libretube.databinding.QueueBottomSheetBinding import com.github.libretube.ui.adapters.PlayingQueueAdapter import com.github.libretube.util.PlayingQueue import com.google.android.material.bottomsheet.BottomSheetDialogFragment class PlayingQueueSheet : BottomSheetDialogFragment() { - private lateinit var binding: BottomSheetBinding + private lateinit var binding: QueueBottomSheetBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = BottomSheetBinding.inflate(layoutInflater) + binding = QueueBottomSheetBinding.inflate(layoutInflater) return binding.root } + @SuppressLint("NotifyDataSetChanged") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -31,6 +33,35 @@ class PlayingQueueSheet : BottomSheetDialogFragment() { val adapter = PlayingQueueAdapter() binding.optionsRecycler.adapter = adapter + binding.shuffle.setOnClickListener { + val streams = PlayingQueue.getStreams() + val currentIndex = PlayingQueue.currentIndex() + val current = streams[currentIndex] + + streams.shuffle() + streams.remove(current) + streams.add(currentIndex, current) + PlayingQueue.setStreams(streams) + + adapter.notifyDataSetChanged() + } + + binding.clear.setOnClickListener { + val streams = PlayingQueue.getStreams() + val index = PlayingQueue.currentIndex() + + while (index >= PlayingQueue.size()) { + streams.removeAt(index) + } + + PlayingQueue.setStreams(streams) + adapter.notifyDataSetChanged() + } + + binding.bottomControls.setOnClickListener { + dialog?.dismiss() + } + val callback = object : ItemTouchHelper.SimpleCallback( ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.LEFT diff --git a/app/src/main/java/com/github/libretube/util/PlayingQueue.kt b/app/src/main/java/com/github/libretube/util/PlayingQueue.kt index 887185ae8..18d60b7d4 100644 --- a/app/src/main/java/com/github/libretube/util/PlayingQueue.kt +++ b/app/src/main/java/com/github/libretube/util/PlayingQueue.kt @@ -74,6 +74,11 @@ object PlayingQueue { fun getStreams() = queue + fun setStreams(streams: List) { + queue.clear() + queue.addAll(streams) + } + fun remove(index: Int) = queue.removeAt(index) fun move(from: Int, to: Int) = queue.move(from, to) diff --git a/app/src/main/res/drawable/ic_shuffle.xml b/app/src/main/res/drawable/ic_shuffle.xml new file mode 100644 index 000000000..67d78b7a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_shuffle.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/queue_bottom_sheet.xml b/app/src/main/res/layout/queue_bottom_sheet.xml new file mode 100644 index 000000000..aeeb9863c --- /dev/null +++ b/app/src/main/res/layout/queue_bottom_sheet.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file