From ee6e43029093a1fbf0abb447509e5a30980a883e Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 14 Jul 2023 12:35:12 +0300 Subject: [PATCH] Add queue counter --- .../java/org/oxycblt/auxio/MainFragment.kt | 18 +++++++++++++++--- .../auxio/playback/queue/QueueViewModel.kt | 7 +++++++ .../res/layout-w600dp-land/fragment_main.xml | 1 + app/src/main/res/values/strings.xml | 2 ++ media | 2 +- 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index 48e38cf5d..4e5c7ab56 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -31,12 +31,9 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.NavController import androidx.navigation.NavDestination import androidx.navigation.findNavController -import com.google.android.material.R as MR import com.google.android.material.bottomsheet.BackportBottomSheetBehavior import com.google.android.material.shape.MaterialShapeDrawable import dagger.hilt.android.AndroidEntryPoint -import kotlin.math.max -import kotlin.math.min import org.oxycblt.auxio.databinding.FragmentMainBinding import org.oxycblt.auxio.detail.DetailViewModel 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.PlaybackViewModel import org.oxycblt.auxio.playback.queue.QueueBottomSheetBehavior +import org.oxycblt.auxio.playback.queue.QueueViewModel import org.oxycblt.auxio.ui.ViewBindingFragment import org.oxycblt.auxio.util.collectImmediately 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.systemBarInsetsCompat 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. @@ -69,6 +70,7 @@ class MainFragment : private val playbackModel: PlaybackViewModel by activityViewModels() private val listModel: ListViewModel by activityViewModels() private val detailModel: DetailViewModel by activityViewModels() + private val queueModel: QueueViewModel by activityViewModels() private var sheetBackCallback: SheetBackPressedCallback? = null private var detailBackCallback: DetailBackPressedCallback? = null private var selectionBackCallback: SelectionBackPressedCallback? = null @@ -155,6 +157,7 @@ class MainFragment : collectImmediately(listModel.selected, selectionBackCallback::invalidateEnabled) collectImmediately(playbackModel.song, ::updateSong) collectImmediately(playbackModel.openPanel.flow, ::handlePanel) + collectImmediately(queueModel.index, queueModel.queueSize, ::updateQueuePosition) } override fun onStart() { @@ -311,6 +314,15 @@ class MainFragment : 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() { val binding = requireBinding() val playbackSheetBehavior = diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueViewModel.kt index 5b1edce73..a6493d33a 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueViewModel.kt @@ -19,10 +19,14 @@ package org.oxycblt.auxio.playback.queue import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted 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.music.MusicParent 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. */ val index: StateFlow get() = _index + /** Size of the current queue */ + val queueSize: StateFlow = + _queue.map { it.size }.stateIn(viewModelScope, SharingStarted.Lazily, _queue.value.size) init { playbackManager.addListener(this) diff --git a/app/src/main/res/layout-w600dp-land/fragment_main.xml b/app/src/main/res/layout-w600dp-land/fragment_main.xml index e7213924f..95d7f43f8 100644 --- a/app/src/main/res/layout-w600dp-land/fragment_main.xml +++ b/app/src/main/res/layout-w600dp-land/fragment_main.xml @@ -51,6 +51,7 @@ app:layout_constraintStart_toEndOf="@+id/playback_panel_fragment"> %1$s, %2$s + + %1$s (%2$d/%3$d) %d Selected diff --git a/media b/media index 316763308..8712967a7 160000 --- a/media +++ b/media @@ -1 +1 @@ -Subproject commit 316763308d3143c75270103c85cf2d984bfa34a0 +Subproject commit 8712967a789192d60d2207451cd5ed2b3191999e