list: clear selection before navigating back

When the back button is pressed, clear the current selection before
navigating back.

This is something I was planning to do but then completely forgot about
when implementing multi-select.

Resolves #316.
This commit is contained in:
Alexander Capehart 2023-01-07 08:19:12 -07:00
parent 6fa53ab873
commit dc73f96ba8
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
13 changed files with 27 additions and 21 deletions

View file

@ -5,6 +5,7 @@
#### What's Improved #### What's Improved
- Added ability to edit previously played or currently playing items in the queue - Added ability to edit previously played or currently playing items in the queue
- Added support for date values formatted as "YYYYMMDD" - Added support for date values formatted as "YYYYMMDD"
- Pressing the button will now clear the current selection before navigating back
#### What's Fixed #### What's Fixed
- Fixed unreliable ReplayGain adjustment application in certain situations - Fixed unreliable ReplayGain adjustment application in certain situations

View file

@ -403,6 +403,11 @@ class MainFragment :
return return
} }
// Clear out any prior selections.
if (selectionModel.consume().isNotEmpty()) {
return
}
// Then try to navigate out of the explore navigation fragments (i.e Detail Views) // Then try to navigate out of the explore navigation fragments (i.e Detail Views)
binding.exploreNavHost.findNavController().navigateUp() binding.exploreNavHost.findNavController().navigateUp()
} }
@ -427,6 +432,7 @@ class MainFragment :
isEnabled = isEnabled =
queueSheetBehavior?.state == NeoBottomSheetBehavior.STATE_EXPANDED || queueSheetBehavior?.state == NeoBottomSheetBehavior.STATE_EXPANDED ||
playbackSheetBehavior.state == NeoBottomSheetBehavior.STATE_EXPANDED || playbackSheetBehavior.state == NeoBottomSheetBehavior.STATE_EXPANDED ||
selectionModel.selected.value.isNotEmpty() ||
exploreNavController.currentDestination?.id != exploreNavController.currentDestination?.id !=
exploreNavController.graph.startDestinationId exploreNavController.graph.startDestinationId
} }

View file

@ -37,7 +37,6 @@ import org.oxycblt.auxio.music.MusicMode
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.Sort import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.playback.PlaybackSettings
import org.oxycblt.auxio.util.* import org.oxycblt.auxio.util.*
/** /**

View file

@ -33,11 +33,9 @@ import org.oxycblt.auxio.list.ListFragment
import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.MusicMode
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.Sort import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.playback.PlaybackSettings
import org.oxycblt.auxio.util.collect import org.oxycblt.auxio.util.collect
import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
@ -48,7 +46,8 @@ import org.oxycblt.auxio.util.unlikelyToBeNull
* A [ListFragment] that shows information about an [Artist]. * A [ListFragment] that shows information about an [Artist].
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class ArtistDetailFragment : ListFragment<Music, FragmentDetailBinding>(), DetailAdapter.Listener<Music> { class ArtistDetailFragment :
ListFragment<Music, FragmentDetailBinding>(), DetailAdapter.Listener<Music> {
private val detailModel: DetailViewModel by activityViewModels() private val detailModel: DetailViewModel by activityViewModels()
// Information about what artist to display is initially within the navigation arguments // Information about what artist to display is initially within the navigation arguments
// as a UID, as that is the only safe way to parcel an artist. // as a UID, as that is the only safe way to parcel an artist.
@ -130,8 +129,8 @@ class ArtistDetailFragment : ListFragment<Music, FragmentDetailBinding>(), Detai
} else { } else {
// When configured to play from the selected item, we already have an Artist // When configured to play from the selected item, we already have an Artist
// to play from. // to play from.
playbackModel.playFromArtist(item, playbackModel.playFromArtist(
unlikelyToBeNull(detailModel.currentArtist.value)) item, unlikelyToBeNull(detailModel.currentArtist.value))
} }
} }
else -> error("Unexpected datatype: ${item::class.simpleName}") else -> error("Unexpected datatype: ${item::class.simpleName}")

View file

@ -131,7 +131,8 @@ class DetailViewModel(application: Application) :
* The [MusicMode] to use when playing a [Song] from the UI, or null to play from the currently * The [MusicMode] to use when playing a [Song] from the UI, or null to play from the currently
* shown item. * shown item.
*/ */
val playbackMode: MusicMode? get() = playbackSettings.inParentPlaybackMode val playbackMode: MusicMode?
get() = playbackSettings.inParentPlaybackMode
init { init {
musicStore.addListener(this) musicStore.addListener(this)

View file

@ -34,11 +34,9 @@ import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.MusicMode
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.Sort import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.playback.PlaybackSettings
import org.oxycblt.auxio.util.collect import org.oxycblt.auxio.util.collect
import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
@ -49,7 +47,8 @@ import org.oxycblt.auxio.util.unlikelyToBeNull
* A [ListFragment] that shows information for a particular [Genre]. * A [ListFragment] that shows information for a particular [Genre].
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class GenreDetailFragment : ListFragment<Music, FragmentDetailBinding>(), DetailAdapter.Listener<Music> { class GenreDetailFragment :
ListFragment<Music, FragmentDetailBinding>(), DetailAdapter.Listener<Music> {
private val detailModel: DetailViewModel by activityViewModels() private val detailModel: DetailViewModel by activityViewModels()
// Information about what genre to display is initially within the navigation arguments // Information about what genre to display is initially within the navigation arguments
// as a UID, as that is the only safe way to parcel an genre. // as a UID, as that is the only safe way to parcel an genre.
@ -129,8 +128,8 @@ class GenreDetailFragment : ListFragment<Music, FragmentDetailBinding>(), Detail
} else { } else {
// When configured to play from the selected item, we already have an Artist // When configured to play from the selected item, we already have an Artist
// to play from. // to play from.
playbackModel.playFromArtist(item, playbackModel.playFromArtist(
unlikelyToBeNull(detailModel.currentArtist.value)) item, unlikelyToBeNull(detailModel.currentArtist.value))
} }
} }
else -> error("Unexpected datatype: ${item::class.simpleName}") else -> error("Unexpected datatype: ${item::class.simpleName}")

View file

@ -43,7 +43,8 @@ import org.oxycblt.auxio.util.inflater
* @param listener A [DetailAdapter.Listener] to bind interactions to. * @param listener A [DetailAdapter.Listener] to bind interactions to.
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class ArtistDetailAdapter(private val listener: Listener<Music>) : DetailAdapter(listener, DIFF_CALLBACK) { class ArtistDetailAdapter(private val listener: Listener<Music>) :
DetailAdapter(listener, DIFF_CALLBACK) {
override fun getItemViewType(position: Int) = override fun getItemViewType(position: Int) =
when (differ.currentList[position]) { when (differ.currentList[position]) {
// Support an artist header, and special artist albums/songs. // Support an artist header, and special artist albums/songs.

View file

@ -41,7 +41,8 @@ import org.oxycblt.auxio.util.inflater
* @param listener A [DetailAdapter.Listener] to bind interactions to. * @param listener A [DetailAdapter.Listener] to bind interactions to.
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class GenreDetailAdapter(private val listener: Listener<Music>) : DetailAdapter(listener, DIFF_CALLBACK) { class GenreDetailAdapter(private val listener: Listener<Music>) :
DetailAdapter(listener, DIFF_CALLBACK) {
override fun getItemViewType(position: Int) = override fun getItemViewType(position: Int) =
when (differ.currentList[position]) { when (differ.currentList[position]) {
// Support the Genre header and generic Artist/Song items. There's nothing about // Support the Genre header and generic Artist/Song items. There's nothing about

View file

@ -65,7 +65,8 @@ class HomeViewModel(application: Application) :
get() = _genresList get() = _genresList
/** The [MusicMode] to use when playing a [Song] from the UI. */ /** The [MusicMode] to use when playing a [Song] from the UI. */
val playbackMode: MusicMode get() = playbackSettings.inListPlaybackMode val playbackMode: MusicMode
get() = playbackSettings.inListPlaybackMode
/** /**
* A list of [MusicMode] corresponding to the current [Tab] configuration, excluding invisible * A list of [MusicMode] corresponding to the current [Tab] configuration, excluding invisible

View file

@ -37,7 +37,6 @@ import org.oxycblt.auxio.music.MusicMode
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.Sort import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.playback.PlaybackSettings
import org.oxycblt.auxio.playback.formatDurationMs import org.oxycblt.auxio.playback.formatDurationMs
import org.oxycblt.auxio.playback.secsToMs import org.oxycblt.auxio.playback.secsToMs
import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.collectImmediately

View file

@ -25,7 +25,6 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.oxycblt.auxio.home.HomeSettings
import org.oxycblt.auxio.music.* import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.playback.state.* import org.oxycblt.auxio.playback.state.*
import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.context
@ -84,7 +83,8 @@ class PlaybackViewModel(application: Application) :
get() = _genrePlaybackPickerSong get() = _genrePlaybackPickerSong
/** The current action to show on the playback bar. */ /** The current action to show on the playback bar. */
val currentBarAction: ActionMode get() = playbackSettings.barAction val currentBarAction: ActionMode
get() = playbackSettings.barAction
/** /**
* The current audio session ID of the internal player. Null if no [InternalPlayer] is * The current audio session ID of the internal player. Null if no [InternalPlayer] is

View file

@ -35,10 +35,8 @@ import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.MusicMode
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.PlaybackSettings
import org.oxycblt.auxio.util.* import org.oxycblt.auxio.util.*
/** /**

View file

@ -56,7 +56,8 @@ class SearchViewModel(application: Application) :
get() = _searchResults get() = _searchResults
/** The [MusicMode] to use when playing a [Song] from the UI. */ /** The [MusicMode] to use when playing a [Song] from the UI. */
val playbackMode: MusicMode get() = playbackSettings.inListPlaybackMode val playbackMode: MusicMode
get() = playbackSettings.inListPlaybackMode
init { init {
musicStore.addListener(this) musicStore.addListener(this)