diff --git a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt index 13df0c5e6..4626bea77 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -120,6 +120,8 @@ class AlbumDetailFragment : Fragment() { binding.albumArtist.setBackgroundResource(R.drawable.ui_ripple) } + // TODO: Make DetailFragment scroll to song if navigated from CompactPlaybackFragment + Log.d(this::class.simpleName, "Fragment created.") return binding.root diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt index f39438efc..e000356fa 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -162,6 +162,18 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { } } + playbackModel.navToPlayingSong.observe(viewLifecycleOwner) { + if (it) { + findNavController().navigate( + MainFragmentDirections.actionShowAlbum( + playbackModel.song.value!!.album.id, true + ) + ) + + playbackModel.doneWithNavToPlayingSong() + } + } + Log.d(this::class.simpleName, "Fragment created.") return binding.root diff --git a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt index 93780d6da..b0bb1d542 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt @@ -42,10 +42,17 @@ class CompactPlaybackFragment : Fragment() { binding.song = MusicStore.getInstance().songs[0] binding.playbackModel = playbackModel - binding.root.setOnClickListener { - findNavController().navigate( - MainFragmentDirections.actionGoToPlayback() - ) + binding.root.apply { + setOnClickListener { + findNavController().navigate( + MainFragmentDirections.actionGoToPlayback() + ) + } + + setOnLongClickListener { + playbackModel.navigateToPlayingSong() + true + } } // --- VIEWMODEL SETUP --- diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt index babb2ef93..ec299676c 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt @@ -23,7 +23,6 @@ import org.oxycblt.auxio.ui.toColor class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { private val playbackModel: PlaybackViewModel by activityViewModels() - // TODO: Implement nav to artists/albums override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -78,6 +77,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { } // Make marquee scroll work + // TODO: Add nav here as well binding.playbackSong.isSelected = true binding.playbackSeekBar.setOnSeekBarChangeListener(this) @@ -91,7 +91,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { binding.song = it binding.playbackSeekBar.max = it.seconds.toInt() } else { - Log.d(this::class.simpleName, "No song played anymore, leaving.") + Log.d(this::class.simpleName, "No song is being played, leaving.") findNavController().navigateUp() } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt index 6087284e6..6498bc579 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -16,7 +16,6 @@ import org.oxycblt.auxio.playback.state.PlaybackMode import org.oxycblt.auxio.playback.state.PlaybackStateManager // A ViewModel that acts as an intermediary between the UI and PlaybackStateManager -// TODO: Implement User Queue // TODO: Implement Persistence through a Database class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { // Playback @@ -56,6 +55,9 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { private val mIsSeeking = MutableLiveData(false) val isSeeking: LiveData get() = mIsSeeking + private val mNavToPlayingSong = MutableLiveData(false) + val navToPlayingSong: LiveData get() = mNavToPlayingSong + val formattedPosition = Transformations.map(mPosition) { it.toDuration() } @@ -206,6 +208,14 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { mIsSeeking.value = value } + fun navigateToPlayingSong() { + mNavToPlayingSong.value = true + } + + fun doneWithNavToPlayingSong() { + mNavToPlayingSong.value = false + } + // --- OVERRIDES --- override fun onCleared() { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index c08e44d11..6a04fcee7 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -75,6 +75,7 @@ class PlaybackStateManager private constructor() { field = value callbacks.forEach { it.onLoopUpdate(value) } } + private var mIsInUserQueue = false val song: Song? get() = mSong val parent: BaseModel? get() = mParent @@ -194,6 +195,8 @@ class PlaybackStateManager private constructor() { if (!mIsPlaying) { mIsPlaying = true } + + mIsInUserQueue = false } fun setPosition(position: Long) { @@ -220,6 +223,8 @@ class PlaybackStateManager private constructor() { updatePlayback(mUserQueue[0]) mUserQueue.removeAt(0) + mIsInUserQueue = true + forceUserQueueUpdate() } else { if (mIndex < mQueue.lastIndex) { @@ -239,7 +244,7 @@ class PlaybackStateManager private constructor() { } fun prev() { - if (mIndex > 0) { + if (mIndex > 0 && !mIsInUserQueue) { mIndex = mIndex.dec() }