Fix issues stemming from how ExoPlayer apparently doesn't send a
playWhenReady event after being stopped.
This ended up breaking AudioEffect integration and notification
posting. I really don't know why player.stop() doesn't do this.
Shift the queue index backwards if the current song at the end of a
queue is removed.
Without this, the index becomes OOB and makes the queue be interpreted
as entirely empty when it actually isn't, which is compounded by a
remove-1 update intruction leading to a RecyclerView inconsistency
crash.
Fix a few problems with the current comparison algorithm:
1. It wasn't actually comparing the raw music information, only the
UIDs, which was redundant.
2. The comparison in the main music loading process occurred on the
main thread, which causes massive freeze-up issues.
Resolves#457.
Use a real mdc drag handle on the queue sheet.
The accessibility functions won't even be enabled, but that
would need to be communicated in a special way anyway.
Fix a visual error where adding to queue would visually place items
next to the starting index rather than at the end.
This was a result of forgetting to update the Add instructions returned
by Queue.addToNext to return the end of the queue rather than the
current index, which completely broke the queue visual.
Resolves#435.
Log whenever a listener is added/removed.
This might make it easier to track concurrency issues stemming from
listener dispatch and addition occuring at the same time.
Make the app UI properly handle album covers that are not 1:1, instead
of just cropping them.
This required switching to Coil's rounded corners transformation
outright so that the non-1:1 image can sit inside the CoverView in a
way that actually looks good
I'm pretty confident this will work, but there might be some edge cases
since coil's transformation is really finicky.
Resolves#355.
Refactor StyledImageView and ImageGroup into a new class called
CoverView.
This new view is more sensibly designed and should be capable of
handling non-square album covers when implemented.
Add a real playlist naming dialog and UX flow.
This is a bit rough at the moment since theres a good amount of nuance
here. Should improve as the playlist implementation continues to grow
more fleshed out.
Unwind the picker abstraction into smaller dialog packages.
While this increases repetition, it will make the playlist dialog
implementations much less shoddy.
Refactor the music name implementation to do the following:
1. Unify normal and sort names under a single datatype
2. Handle arbitrary-length digit strings
3. Ignore puncutation regardless of the intelligent sort
configuration, as it is trivially localizable.
Resolves#423.
Co-authored by: ChatGPT-3.5
Move everything over to the media3 library instead of ExoPlayer.
Media3 is worse in every way. It labels half of ExoPlayer as "unsafe"
because it thinks that it's garbage uwu "helpful" abstractions are
perfectly servicable when in reality they are a pile of garbage filled
with insane performance issues, race conditions, and a seeming lack
of awareness to the sheer absurdity of android's media APIs. It is
absolutely horrible, but ExoPlayer will stop being maintained soon
and I will have to move over for further maintenance.
Refactor the weird picker god module into specific sub-impls in
playback and a new navigation package.
I cannot keep this unified. The needs are too different among each
picker. Better to keep it separate, especially in preparation for
the playlist dialogs.
If the user clicks on the playback bar in any context, including the
queue view, open the playback panel.
This adds another means to closing the queue that does not involve
swiping.
Resolves#402.
Refactor the disjoint Library and Playlist setup into two new
DeviceLibrary and UserLibrary implementations.
This makes the API surface a bit less disjoint than prior.
Unify Indexer and MusicRepository into a single class.
This is meant to create a single dependency on PlaylistDatabase and
reduce the amount of orchestration.
Due to a sudden pivot to starting from repository backwards with
playlists, there were some half-baked changesets lying around that
I forgot to revert. Do that.
Add the boilerplate code for the playlist system.
Any functionality is runtime only and is not integrated in-app. Plan is
to build the UI scaffold first followed by the backing playlist.
Broadcast the audiofx session when playing/pausing rather than starting
and stopping.
This is apparently the more correct way to do this.
Resolves#391.
Add fine-grained updates to the queue view.
Should do the following:
1. Make queue updates faster (no diff calculation)
2. Resolve some bugs regarding duplicate queue items.
3. Finally complete the new list framework.
Resolves#350Resolves#335Resolves#380
Re-add the fine-grained updates that were removed prior due to state
concerns.
This time they should be safe enough to use, as the differ has been
fully vendored. The change is not complete enough however, as the queue
view has not been properly ported to use these updates just yet.