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.
Separate the header information into it's own adapter, and concatenate
it with the prior adapter.
This way, it can be updated separately without a jarring list update.
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.
Make sorting direction (ascending/descending) explicit in the UI and in
the code.
Instead of a boolean flag, two distinct "ascending" and "descending"
options are used instead. This should be much clearer.
Start injecting shared object instances.
This is not a 100% conversion, as certain portions of the code are not
really ready for 100% DI constructors just yet.
Parallelize music loading.
- Queries over Media DB and Cache are ran parallel
- MediaStoreExtractor can now continue extracting songs independent
of MetadataExtractor's task pool capacity
- Library and Cache are saved in parallel
Resolves#343.
This should result in some pretty signifigant performance gains
due to the operations now being ran in parallel instead of
sequentially.
Hide the MusicStore implementation behind an interface, transforming it
into a new MusicRepository class.
This is in preparation for dependency injection.
Split off the song property extraction code into a music package class.
This is part of an initiative to remove non-parameter uses of contexts
in ViewModels.
Disable the new instructions-based system for now.
The way I was doing reflection was likely far too unsafe and prone to
bugs. I'll want to do it some other way.
Completely rework the detail list implementations so that resorting the
song list causes a replace operation instead of a diff operation.
This finally makes the list experience consistent across the app.
Redesign the header component to be more aligned with M3 guidelines.
This includes moving the divider to the top when reasonable, using a
smaller font size, and using a tinted coloration to separate itself
from the list contents.
Make list instructions generic in preparation for the detail list
update.
Detail views need their own instructions datatype, so this is meant to
allow that to be implemented without issue.
Just pre-emptively add support for TXXX variations of the non-standard
vorbis artist fields to the ID3v2 parser.
I'd imagine the naming convention will be similar between them, so why
not.
Make all adapters relying on diffing unified into a DiffAdapter
superclass that can then accurately respond to the new
UpdateInstructions data.
UpdateInstructions is still not fully used everywhere, but will be
soon.
Like the library package, move out tag information (Date/Album.Type)
into a separate package.
Date never really made sense as base-package information.
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.
Decouple the settings god object into feature-specific settings.
This should make testing settings-dependent code much easier, as it no
longer requires a context.
Make all list listeners operate on generic values.
Wanted to do this for awhile, but couldn't figure out how to get the
listener to work with sub-typed listeners until I learned what the in
keyword actually does. This removes a ton of type-checking boilerplate
that it's not even funny.
Fix a crash that would occur when trying to add music dirs without a
file manager to handle it.
Some users apparently disable the built-in file manager under the
assumption that the same intents will work with other file managers.
They do not, and so we need to handle that case and let the user know.
Band-aid a crash that would occur when the library is somehow
unavailable in the detail view. Now, if it's unavailable, the
app simple navigates away.
Not sure how this is happening, but I'd imagine it's some caching
shenanigans I need to fix by using volatile on any shared field.