From b3ef43b37e10e9bda6e717d9020780cbd589a8fa Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Tue, 22 Aug 2023 07:27:28 -0600 Subject: [PATCH] playback: start cleaning up pager impl Fix some immediate compile issues and some style nitpicks. This breaks the system a bit, but I don't think I will have enough time to debug fully for the forseeable future, so I want to get this out now. --- CHANGELOG.md | 3 + .../auxio/playback/PlaybackPanelFragment.kt | 26 ++---- .../playback/pager/PlaybackPageListener.kt | 30 ------ .../{pager => ui}/PlaybackPagerAdapter.kt | 91 +++++++------------ 4 files changed, 44 insertions(+), 106 deletions(-) delete mode 100644 app/src/main/java/org/oxycblt/auxio/playback/pager/PlaybackPageListener.kt rename app/src/main/java/org/oxycblt/auxio/playback/{pager => ui}/PlaybackPagerAdapter.kt (56%) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3645510f..c2509c153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## dev +#### What's New +- Added ability to rewind/skip tracks by swiping back/forward + #### What's Fixed - Fixed app restart being required when changing intelligent sorting or music separator settings diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt index c0b901c3b..9738f1de3 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt @@ -39,12 +39,12 @@ import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentPlaybackPanelBinding import org.oxycblt.auxio.detail.DetailViewModel import org.oxycblt.auxio.list.ListViewModel +import org.oxycblt.auxio.list.adapter.UpdateInstructions import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.playback.pager.PlaybackPageListener -import org.oxycblt.auxio.playback.pager.PlaybackPagerAdapter import org.oxycblt.auxio.playback.queue.QueueViewModel import org.oxycblt.auxio.playback.state.RepeatMode +import org.oxycblt.auxio.playback.ui.PlaybackPagerAdapter import org.oxycblt.auxio.playback.ui.StyledSeekBar import org.oxycblt.auxio.ui.ViewBindingFragment import org.oxycblt.auxio.util.collectImmediately @@ -67,7 +67,7 @@ class PlaybackPanelFragment : ViewBindingFragment(), Toolbar.OnMenuItemClickListener, StyledSeekBar.Listener, - PlaybackPageListener { + PlaybackPagerAdapter.Listener { private val playbackModel: PlaybackViewModel by activityViewModels() private val detailModel: DetailViewModel by activityViewModels() private val queueModel: QueueViewModel by activityViewModels() @@ -111,27 +111,13 @@ class PlaybackPanelFragment : } // cover carousel adapter - coverAdapter = PlaybackPagerAdapter(this, viewLifecycleOwner) + coverAdapter = PlaybackPagerAdapter(this) binding.playbackCoverPager.apply { adapter = coverAdapter registerOnPageChangeCallback(OnCoverChangedCallback(queueModel)) val recycler = VP_RECYCLER_FIELD.get(this@apply) as RecyclerView recycler.isNestedScrollingEnabled = false } - // Set up marquee on song information, alongside click handlers that navigate to each - // respective item. - binding.playbackSong.apply { - isSelected = true - setOnClickListener { navigateToCurrentSong() } - } - binding.playbackArtist.apply { - isSelected = true - setOnClickListener { navigateToCurrentArtist() } - } - binding.playbackAlbum.apply { - isSelected = true - setOnClickListener { navigateToCurrentAlbum() } - } binding.playbackSeekBar.listener = this @@ -189,7 +175,7 @@ class PlaybackPanelFragment : } private fun updateQueue(queue: List) { - coverAdapter?.update(queue, queueModel.queueInstructions.flow.value) + coverAdapter?.update(queue, UpdateInstructions.Diff) } private fun updateQueuePosition(position: Int) { @@ -250,7 +236,7 @@ class PlaybackPanelFragment : } override fun navigateToMenu() { - binding?.playbackToolbar?.showOverflowMenu() + // TODO } private class OnCoverChangedCallback(private val viewModel: QueueViewModel) : diff --git a/app/src/main/java/org/oxycblt/auxio/playback/pager/PlaybackPageListener.kt b/app/src/main/java/org/oxycblt/auxio/playback/pager/PlaybackPageListener.kt deleted file mode 100644 index a47c88494..000000000 --- a/app/src/main/java/org/oxycblt/auxio/playback/pager/PlaybackPageListener.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2023 Auxio Project - * PlaybackPageListener.kt is part of Auxio. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.oxycblt.auxio.playback.pager - -interface PlaybackPageListener { - - fun navigateToCurrentArtist() - - fun navigateToCurrentAlbum() - - fun navigateToCurrentSong() - - fun navigateToMenu() -} diff --git a/app/src/main/java/org/oxycblt/auxio/playback/pager/PlaybackPagerAdapter.kt b/app/src/main/java/org/oxycblt/auxio/playback/ui/PlaybackPagerAdapter.kt similarity index 56% rename from app/src/main/java/org/oxycblt/auxio/playback/pager/PlaybackPagerAdapter.kt rename to app/src/main/java/org/oxycblt/auxio/playback/ui/PlaybackPagerAdapter.kt index f171677cc..622dacc11 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/pager/PlaybackPagerAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/ui/PlaybackPagerAdapter.kt @@ -16,78 +16,50 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.playback.pager +package org.oxycblt.auxio.playback.ui -import android.view.View import android.view.ViewGroup import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import kotlin.jvm.internal.Intrinsics -import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.ItemPlaybackSongBinding import org.oxycblt.auxio.list.adapter.FlexibleListAdapter +import org.oxycblt.auxio.list.recycler.DialogRecyclerView import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.resolveNames import org.oxycblt.auxio.util.inflater -class PlaybackPagerAdapter( - private val listener: PlaybackPageListener, - private val lifecycleOwner: LifecycleOwner -) : FlexibleListAdapter(CoverViewHolder.DIFF_CALLBACK) { - +/** @author Koitharu, Alexander Capehart (OxygenCobalt) */ +class PlaybackPagerAdapter(private val listener: Listener) : FlexibleListAdapter(CoverViewHolder.DIFF_CALLBACK) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CoverViewHolder { - return CoverViewHolder.from(parent, listener).also { - lifecycleOwner.lifecycle.addObserver(it) - } + return CoverViewHolder.from(parent) } override fun onBindViewHolder(holder: CoverViewHolder, position: Int) { - holder.bind(getItem(position)) + holder.bind(getItem(position), listener) } override fun onViewRecycled(holder: CoverViewHolder) { holder.recycle() super.onViewRecycled(holder) } + + interface Listener { + fun navigateToCurrentArtist() + fun navigateToCurrentAlbum() + fun navigateToCurrentSong() + fun navigateToMenu() + } } -class CoverViewHolder -private constructor( - private val binding: ItemPlaybackSongBinding, - private val listener: PlaybackPageListener -) : RecyclerView.ViewHolder(binding.root), DefaultLifecycleObserver, View.OnClickListener { - +class CoverViewHolder private constructor(private val binding: ItemPlaybackSongBinding) : + RecyclerView.ViewHolder(binding.root), DefaultLifecycleObserver { init { - binding.playbackSong.setOnClickListener(this) - binding.playbackArtist.setOnClickListener(this) - binding.playbackAlbum.setOnClickListener(this) - binding.playbackCover.setOnClickListener(this) - } - - override fun onClick(v: View) { - when (v.id) { - R.id.playback_album -> listener.navigateToCurrentAlbum() - R.id.playback_artist -> listener.navigateToCurrentArtist() - R.id.playback_song -> listener.navigateToCurrentSong() - R.id.playback_cover -> listener.navigateToMenu() - } - } - - override fun onResume(owner: LifecycleOwner) { - super.onResume(owner) - setSelected(true) - } - - override fun onPause(owner: LifecycleOwner) { - super.onPause(owner) - setSelected(false) - } - - override fun onDestroy(owner: LifecycleOwner) { - super.onDestroy(owner) - owner.lifecycle.removeObserver(this) + binding.root.layoutParams = + RecyclerView.LayoutParams( + RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.MATCH_PARENT) } /** @@ -95,17 +67,27 @@ private constructor( * * @param item The new [Song] to bind. */ - fun bind(item: Song) { - binding.playbackCover.bind(item) + fun bind(item: Song, listener: PlaybackPagerAdapter.Listener) { val context = binding.root.context - binding.playbackSong.text = item.name.resolve(context) - binding.playbackArtist.text = item.artists.resolveNames(context) - binding.playbackAlbum.text = item.album.name.resolve(context) + // binding.playbackCover.bind(item) + binding.playbackSong.apply { + text = item.name.resolve(context) + setOnClickListener { listener.navigateToCurrentSong() } + } + binding.playbackArtist.apply { + text = item.artists.resolveNames(context) + setOnClickListener { listener.navigateToCurrentArtist() } + } + binding.playbackAlbum.apply { + text = item.album.name.resolve(context) + setOnClickListener { listener.navigateToCurrentAlbum() } + } setSelected(true) } fun recycle() { // Marquee elements leak if they are not disabled when the views are destroyed. + // TODO: Move to TextView impl to avoid having to deal with lifecycle here setSelected(false) } @@ -122,11 +104,8 @@ private constructor( * @param parent The parent to inflate this instance from. * @return A new instance. */ - fun from(parent: ViewGroup, listener: PlaybackPageListener) = - CoverViewHolder( - ItemPlaybackSongBinding.inflate(parent.context.inflater, parent, false), - listener - ) + fun from(parent: ViewGroup) = + CoverViewHolder(ItemPlaybackSongBinding.inflate(parent.context.inflater)) /** A comparator that can be used with DiffUtil. */ val DIFF_CALLBACK =