Make the corner radius of the queue sheet also sharp.
This is to ensure consistency with the playback sheet as it currently
stands. As soon as I can do only-inset content behavior and can thus
round the playback bar, I'll also re-round the queue bar.
Revert the changes I made in 0474940ee3
and return to the hybrid layout + inset system.
The big issue is edge effects and touch events. I need to properly
clamp edge effects to the padding, but that also requires me to use
stretch edge effects everywhere to prevent weird visual isuses. This
may happen in the future in RecyclerView 1.3.0, but development on such
has been minimal. Meanwhile, touch events will be intercepted by the
now overlapping view if one clicks the wrong portion of the bar.
Nothing I can do given how touch events are intercepted by the bottom
sheet, at least right now.
More feasible to keep the current system and mitigate whatever issues
are present there.
Update transitions in the home fragment to X-axis.
I noticed a visual issue in the detail transition in the existing
version stemming from how the main fragment's drawing is clipped by
the bottom sheet, resulting in a less-than-ideal Z-axis transition.
While I wanted to fix this by attempting to switch to inset based
bottom sheet management, I still need to wait for more changes in
order to successfully pull that off, and hence I'll be reverting it
soon.
Moving these transitions to X-axis prevents this visual issue while
still being roughly semantically similar.
Do not do a measure + inset method with BottomSheetContentBehavior,
instead, try to re-apply window insets to adapt with the bar instead.
This fixes a lot of view clipping issues that made motion transitions
non-ideal and prevented a rounded playback bar. Only remaining issue is
RecyclerView instances, which need to be further reworked to resolve
scroll issues and edge effect problems.
Remove the textSafe method, as it is functionally useless.
textSafe relied on a dumb 1.0.0 thing where I used wrap_content on
text views. Now it just causes relayouts for no good reason.
Fix lints that have accumulated over time.
Apparently Android Studio just...stopped using lints. For no reason. I
had to upgrade to the beta version to actually get lints.
Check if the playback state still has not been initialized once we
restore.
This prevents one from playing a song while the restore task is
on-going and then having it overwritten by the restored state.
Use MaterialFadeThrough in the search transition and a Z-axis
transition in the detail views.
This is more semantically correct than the previous transitions.
Remove useless id fields from Headers, replacing them with vlaues
related to their string resource.
String resources and disc numbers are more or less garunteed to be
unique in Auxio's context.
Indicate the currently playing item in the queue list.
The item is still disabled, however it's also simultaniously activated
now, which allows it to indicate that it is playing.
Add the ability to see (but not edit) previous items.
This completes the new playback UI I've been working on for about 2
weeks now. I pray that there is no insane unfixable bug with this,
please please please please please
Re-implement the queue, now leveraging a bottom sheet too.
This makes the queue much easier to open, and actually plays along with
the new transition system. I really hope this doesn't have a stupid
gotcha that ruins the UX. Please. Please. Please.
Use BottomSheetBehavior with the playback sheet.
This is the result of two weeks of painful hacking to get a working
implementation that did not immediately have a brain aneursym. It
also requires me to still vendor BottomSheetBehavior for the time
being. However, this greatly reduces technical issues on my end and
allows the addition of new playback UI concepts, while still
retaining the UI fluidity of prior.
Temporarily remove queue navigation, as it can no longer really fit
with the new transitions.
This will eventually be replaced with a queue bottom sheet, implying
that I can abuse one into working.
Rework the queue internally to decouple the queue from playback and
better respond to reshuffling.
This is being implemented under the assumption that I will be
implementing the sliding queue eventually.
Add the ability to jump to arbitrary points in the queue.
This comes at the cost of the long-press option to move items, since
they simply cannot co-exist without visual issues.
Hack around an issue where the notification position will not update if
one seeked while the player was paused.
This is the best implementation I can do that will not result in the
notification getting excessively rate-limited.
Expose the queue in the MediaSession, at least I hope.
The queue is still not mutable. Don't feel comfortable implementing that
until I rework the in-app queue UI.
Add an option to clear the currently saved playback state.
This does not clear playback entirely, but rather remove the saved
state so that it's not restored on the next startup. This is generally
the cleanest solution compared to allowing state restore to be toggled,
which opens up a bunch of race conditions.
Resolves#107.
Update id hashing to correctly handle null artists and take discs
and durations into account.
Note that we try not to hash values only obtained with the ExoPlayer
parser, as those could feasibly change if the setting was toggled,
thus causing the playback state to wipe.
Add a new Date class to represent both years and more fine-grained
dates extracted using the ExoPlayer metadata system.
In-app, the year is still shown, but sorting will use the new precision
when present. The MediaSession will also post an RFC 3339 formatted
date with this new precision, as the MediaSession documentation states
I should. No clue if the latter will cause any bugs with naive metadata
UIs in other apps.
Resolves#159.
Remove the excluded directory migration code, as it causes far more
issues than it fixes.
Due to an unfixable logic bug that occurs when trying to read the
setting, Auxio will always try to migrate the database when there is
no music folders, causing a hang in some situations. Fix it by just
removing the migration.
Move the switch from IO to Main to within Indexer itself, through
withContext.
This is much easier to work with than the previous system of a separate
"update" coroutine, which isn't really needed anymore given that I no
longer need to do IO work when sanitizing the playback state.
Edge case I thought existed did not. PlaybackService must have saved
before dying, and thus if it did not foreground after a sanitization,
the saved state would still sanitize in a similar manner.
Save, but do not read the playback state when sanitizing.
Turns out there is an edge-case where we want to save the state. Still
keep the runtime sanitization, as that greatly reduces the time it
takes to rescan the library.
Do not save the playback state when sanitizing.
After some thought, there is no situation where re-saving the playback
state is desirable. A previously saved state will be consistent with
a sanitized state, and there is no need to save when the service is
active. Thus, save on speed and reduce insane race conditions by just
sanitizing the current runtime state and not saving at all.