Redocument the music module.
Much of it's documentation has drifted from reality as changes were
made, this commit completely redoes the documentation in order to
fix that.
Redocument the detail, home, image, and list modules.
Much of this project's documentation has drifted from actual
functionality, and newer code is pretty sparely documented.
This commit seeks to rectify that by redocumenting every source
file in this project.
Remove childish wording/diatribes from the codebase that were added
when I was younger.
I'm an adult now. I have to make this repository at least somewhat
professional.
More miscellanious tweaks I can't categorize since I have no time.
It's mostly attempts at improving animation visuals an failing. Really
want to switch to material animations once I can finally get the things
working.
Animate the check mark and background change when a item is selected.
This produces a nicer UX overall. If possible, I'm planning to also
port this to the other indicators in ImageGroup, albeit doing that is
signifigantly harder.
Redefine the meaning of activation across the app to align with the SDK
documentation.
According to the documentation:
- Activation -> A permanent kind of selection initiated by the user.
This means playback states, item selection, etc.
- Selection -> A transient kind of selection that can be added or
removed without user input. This includes things such as playing
indicators.
Redefine usages of selection and activation across the app to align
with this.
Make artist images sort by count instead of by name.
I've recently added a few singles in my library that have been
cluttering the previous artist image algorithm with non-ideal
covers. Instead of sorting by name (Which was really an artifact
of the old MediaStore engine anyway), sort by the amount of songs
of each album instead, which hopefully should weight images less
towards singles and more towards albums (And especially albums
the user likes).
Unify the "Show Covers" and "Ignore MediaStore Covers" settings under an
new "Album covers" setting.
This will make it easier to extend to new forms of album cover
collection.
Add semi-complete support for multiple artists.
This changeset completely reworks the music linker to add the following
new behaviors:
1. Artists are now derived from both artist and album artist tags,
with them being linked to songs and albums respectively
2. Albums and songs can now have multiple artists that can be distinct
from eachother
3. Previous Genre picking infrastructure has been removed and replaced
with artist picking infrastructure. "Play from genre" has been retired
entirely.
This is a clean break to the previous artist model and may not work
with all libraries. Steps to migrate the music library will be added
to the changelog.
Resolves#195.
Add a dialog for picking a genre from several choices.
This basically completes multi-genre support in Auxio, save more
internal reworks.
Note that it is extremely likely that the "Play from genre" setting
will be removed soon. This feature has made me realize that such does
not many any real sense, as genres are more semantically similar to
playlists than artists or albums. This implementation only exists to
make multi-artist support an easy plug-and-play operation.
Resolves#201
Make UID structure dependent on the music mode.
This involves replacing the "tag" value with more structured fields and
appending the int code of the music mode to the UUID rather than making
it part of the UID's "tag". UIDs aren't quite a UUID, so this is
allowed.
Merge DisplayMode and PlaybackMode into a new class called MusicMode.
Both of these datatypes represented similar things, and thus it's much
easier to make them the same datatype. Moreover, it makes the
forthcoming addition of the music selector much easier if the same
datatype was tied to the representation of music.
This commit also moves around things around the project to be slightly
more coherent.
Phase out the dumb hack TaskGuard class in favor of yield.
For some reason, I was under the impression that yield was horribly
slow. It's not, I was just using it wrong. So now TaskGuard is no
longer needed.
Refactor all Backend instances into a new package called extractor and
a new structure called "Layer".
Layers are no longer generalized into an interface. Instead, they build
on eachother in order to produce a correct output of raw songs.
One of these layers is a stub class to eventually implement caching.
This changeset also phases out the "Ignore MediaStore tags" setting, as
it is no longer needed.
Completely rework the ID system to pave the way to MusicBrainz ID
support and greatly increase ID integrity in general.
This changeset removes the old ID field, an emulation of a polynomial
hash that was used in all items, and replaces it with a new type called
UID that is specific to Music. Other types just use plain equals now,
and most instances of "id" to check for equality in the app have either
been inlined into an equals override or removed outright.
The new UID format is as follows:
datatype/format:uuid
Datatype is a tag that is just the lowercase tag name. For example,
"song". Format is the program that created the UID. auxio will be an
md5 hash, and musicbrainz will the a musicbrainz ID extracted from a
file. UUID is the uuid itself.
This is much more reliable and extendable than the old ID format. This
will also be the last time I break compat with old ID formats. From now
on, a legacy UID field will not be included to enable backwards compat,
when the time comes for a breaking change.
Make adapter instances handle span sizes.
This supercedes the hackier solution where the fragments would have to
reference adapter data in order to determine span size. Not anymore.
Make the playing indicator animate when playback is ongoing.
Previously state issues stopped me from doing this, but apparently this
time I miraculously got it working. Yay.
Resolves#218.
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.
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.
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 release type support to the media indexer.
This allows EPs, Singles, and Albums to be distinguished from
eachother. Auxio's implementation will use the MusicBrainz tag for
ID3v2 (Falling back to GRP1, as that is used sometimes), and will use
RELEASETYPE for vorbis comments.
Add an abstraction over the generation system called GenerationGuard.
This allows cheap cooperative threading to be implemented consistently
in many places.
Use the @Synchronized annotation instead of synchronized.
Makes my ability to manage thread-safety on the shared objects much
easier. Because I don't have to think about what I should guard
and what I shouldn't.
Improve the indexer callback system to be more coherent and efficient.
This delegates the old Callback role to a new singular Callback and
Controller roles. IndexerService also handles the loading process
more gracefully, reducing the amount of time music loads take.
Make notification updates entirely reliant on the MediaSession.
Android 11 and onwards automatically populate the notification with the
MediaSession state. This apparently conflicts with updating the
notification in some cases, resulting in the incorrect song being
shown. Fix this by not populating the notification from Android 11
onward and only posting it when the MediaSession state was set.
Resolves#179.
Rework the rounded covers option into a new "Round Mode" option.
This commit extends the rounded corners configuration to now the
widget, thus making the setting apply now to covers, the bar, and
the widget configuration. This makes a naming change useful.
Completely rework Auxio's iconography based on the new material symbols
icon set.
This does the following:
1. Switches the sharp + filled icon style to an outlined + round icon
style.
2. Removes 32dp icons from everywhere except the playback panel.
This does not:
1. Actually handle optical sizes right. This is going to take some more
work to make it harmonious with the current UI.
2. Update margins in some places to be harmonious with the new icons.
This is also going to take some more work to do properly.