Add queue counter
This commit is contained in:
parent
124726693e
commit
ee6e430290
5 changed files with 26 additions and 4 deletions
|
|
@ -31,12 +31,9 @@ import androidx.fragment.app.activityViewModels
|
||||||
import androidx.navigation.NavController
|
import androidx.navigation.NavController
|
||||||
import androidx.navigation.NavDestination
|
import androidx.navigation.NavDestination
|
||||||
import androidx.navigation.findNavController
|
import androidx.navigation.findNavController
|
||||||
import com.google.android.material.R as MR
|
|
||||||
import com.google.android.material.bottomsheet.BackportBottomSheetBehavior
|
import com.google.android.material.bottomsheet.BackportBottomSheetBehavior
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.math.max
|
|
||||||
import kotlin.math.min
|
|
||||||
import org.oxycblt.auxio.databinding.FragmentMainBinding
|
import org.oxycblt.auxio.databinding.FragmentMainBinding
|
||||||
import org.oxycblt.auxio.detail.DetailViewModel
|
import org.oxycblt.auxio.detail.DetailViewModel
|
||||||
import org.oxycblt.auxio.list.ListViewModel
|
import org.oxycblt.auxio.list.ListViewModel
|
||||||
|
|
@ -46,6 +43,7 @@ import org.oxycblt.auxio.playback.OpenPanel
|
||||||
import org.oxycblt.auxio.playback.PlaybackBottomSheetBehavior
|
import org.oxycblt.auxio.playback.PlaybackBottomSheetBehavior
|
||||||
import org.oxycblt.auxio.playback.PlaybackViewModel
|
import org.oxycblt.auxio.playback.PlaybackViewModel
|
||||||
import org.oxycblt.auxio.playback.queue.QueueBottomSheetBehavior
|
import org.oxycblt.auxio.playback.queue.QueueBottomSheetBehavior
|
||||||
|
import org.oxycblt.auxio.playback.queue.QueueViewModel
|
||||||
import org.oxycblt.auxio.ui.ViewBindingFragment
|
import org.oxycblt.auxio.ui.ViewBindingFragment
|
||||||
import org.oxycblt.auxio.util.collectImmediately
|
import org.oxycblt.auxio.util.collectImmediately
|
||||||
import org.oxycblt.auxio.util.context
|
import org.oxycblt.auxio.util.context
|
||||||
|
|
@ -55,6 +53,9 @@ import org.oxycblt.auxio.util.getDimen
|
||||||
import org.oxycblt.auxio.util.logD
|
import org.oxycblt.auxio.util.logD
|
||||||
import org.oxycblt.auxio.util.systemBarInsetsCompat
|
import org.oxycblt.auxio.util.systemBarInsetsCompat
|
||||||
import org.oxycblt.auxio.util.unlikelyToBeNull
|
import org.oxycblt.auxio.util.unlikelyToBeNull
|
||||||
|
import kotlin.math.max
|
||||||
|
import kotlin.math.min
|
||||||
|
import com.google.android.material.R as MR
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A wrapper around the home fragment that shows the playback fragment and high-level navigation.
|
* A wrapper around the home fragment that shows the playback fragment and high-level navigation.
|
||||||
|
|
@ -69,6 +70,7 @@ class MainFragment :
|
||||||
private val playbackModel: PlaybackViewModel by activityViewModels()
|
private val playbackModel: PlaybackViewModel by activityViewModels()
|
||||||
private val listModel: ListViewModel by activityViewModels()
|
private val listModel: ListViewModel by activityViewModels()
|
||||||
private val detailModel: DetailViewModel by activityViewModels()
|
private val detailModel: DetailViewModel by activityViewModels()
|
||||||
|
private val queueModel: QueueViewModel by activityViewModels()
|
||||||
private var sheetBackCallback: SheetBackPressedCallback? = null
|
private var sheetBackCallback: SheetBackPressedCallback? = null
|
||||||
private var detailBackCallback: DetailBackPressedCallback? = null
|
private var detailBackCallback: DetailBackPressedCallback? = null
|
||||||
private var selectionBackCallback: SelectionBackPressedCallback? = null
|
private var selectionBackCallback: SelectionBackPressedCallback? = null
|
||||||
|
|
@ -155,6 +157,7 @@ class MainFragment :
|
||||||
collectImmediately(listModel.selected, selectionBackCallback::invalidateEnabled)
|
collectImmediately(listModel.selected, selectionBackCallback::invalidateEnabled)
|
||||||
collectImmediately(playbackModel.song, ::updateSong)
|
collectImmediately(playbackModel.song, ::updateSong)
|
||||||
collectImmediately(playbackModel.openPanel.flow, ::handlePanel)
|
collectImmediately(playbackModel.openPanel.flow, ::handlePanel)
|
||||||
|
collectImmediately(queueModel.index, queueModel.queueSize, ::updateQueuePosition)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
|
|
@ -311,6 +314,15 @@ class MainFragment :
|
||||||
playbackModel.openPanel.consume()
|
playbackModel.openPanel.consume()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateQueuePosition(index: Int, size: Int) {
|
||||||
|
requireBinding().queueTitle.text = getString(
|
||||||
|
R.string.fmt_label_with_counter,
|
||||||
|
getString(R.string.lbl_queue),
|
||||||
|
index + 1,
|
||||||
|
size
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
private fun tryOpenPlaybackPanel() {
|
private fun tryOpenPlaybackPanel() {
|
||||||
val binding = requireBinding()
|
val binding = requireBinding()
|
||||||
val playbackSheetBehavior =
|
val playbackSheetBehavior =
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,14 @@
|
||||||
package org.oxycblt.auxio.playback.queue
|
package org.oxycblt.auxio.playback.queue
|
||||||
|
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.SharingStarted
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
|
import kotlinx.coroutines.flow.stateIn
|
||||||
import org.oxycblt.auxio.list.adapter.UpdateInstructions
|
import org.oxycblt.auxio.list.adapter.UpdateInstructions
|
||||||
import org.oxycblt.auxio.music.MusicParent
|
import org.oxycblt.auxio.music.MusicParent
|
||||||
import org.oxycblt.auxio.music.Song
|
import org.oxycblt.auxio.music.Song
|
||||||
|
|
@ -55,6 +59,9 @@ class QueueViewModel @Inject constructor(private val playbackManager: PlaybackSt
|
||||||
/** The index of the currently playing song in the queue. */
|
/** The index of the currently playing song in the queue. */
|
||||||
val index: StateFlow<Int>
|
val index: StateFlow<Int>
|
||||||
get() = _index
|
get() = _index
|
||||||
|
/** Size of the current queue */
|
||||||
|
val queueSize: StateFlow<Int> =
|
||||||
|
_queue.map { it.size }.stateIn(viewModelScope, SharingStarted.Lazily, _queue.value.size)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
playbackManager.addListener(this)
|
playbackManager.addListener(this)
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@
|
||||||
app:layout_constraintStart_toEndOf="@+id/playback_panel_fragment">
|
app:layout_constraintStart_toEndOf="@+id/playback_panel_fragment">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
android:id="@+id/queue_title"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="64dp"
|
android:layout_height="64dp"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
|
|
|
||||||
|
|
@ -391,6 +391,8 @@
|
||||||
Do not use "and" or equivalents.
|
Do not use "and" or equivalents.
|
||||||
-->
|
-->
|
||||||
<string name="fmt_list">%1$s, %2$s</string>
|
<string name="fmt_list">%1$s, %2$s</string>
|
||||||
|
<!-- As in a label with position and total count -->
|
||||||
|
<string name="fmt_label_with_counter">%1$s (%2$d/%3$d)</string>
|
||||||
|
|
||||||
<!-- As in an amount of items that are selected -->
|
<!-- As in an amount of items that are selected -->
|
||||||
<string name="fmt_selected">%d Selected</string>
|
<string name="fmt_selected">%d Selected</string>
|
||||||
|
|
|
||||||
2
media
2
media
|
|
@ -1 +1 @@
|
||||||
Subproject commit 316763308d3143c75270103c85cf2d984bfa34a0
|
Subproject commit 8712967a789192d60d2207451cd5ed2b3191999e
|
||||||
Loading…
Reference in a new issue