Completely refactor PlaybackBarLayout into PlaybackLayout, which now
not only handles the bar behavior but also allows for one to slide
up the bar layout into the full playback layout. This was largely
adapted from umano's AndroidSlidingUpPanel, albeit heavily minified
and mixed with the previous window inset tricks of the previous layout.
There are still some tweaks to be made, but this implementation seems
to be really good.
Refactor sorting again to support free-floating ascending/descending
values on every single sort mode. This enables greater freedom in how
users can sort their music and allows me to finally get rid of the
old legacy sematic sorting modes that chose their ascending/decending
order depending on how they wanted it.
Improve playback persistence in the following ways:
1. Shift the boundary of PlaybackStateManager and PlaybackStateDatabase
so that the reading and searching phases both occur at the same time,
which is more efficient.
2. Improve music hashing so that conflicts are minimized [this also
helps the future playlists addition]
3. Generally improve code style
Refactor the way music models are constructed to achieve the following:
- Add a unified interface for resolving display names of artists
- Disambiguate the role of Header in the music objects
- Eliminate the need to load strings in with a context when creating
Header instances
Move the main loading response code to MainFragment and add a new
method for other objects to be notified of the progress of the
music loading process. There's probably a better way to do this,
but kotlin coroutines are so complex that I don't know where I
would start. This also adds some enhancements, such as the error
message now showing in more parts of the app and SearchFragment
now re-running the query if the MusicStore instance is loaded.
Make MusicLoader instantiation fully asynchronous. This implementation
changes a lot about Auxio. For one, the loading screen is now gone.
However, many parts of the app now run under the fact that MusicStore
might not be available. However, I don't think there will be too much bugs
from it. Some more changes will be made to improve this implementation.
Finally add tab customization. This implementation is a
bit ugly, but I had to futureproof it for playlists and I'm
planning to clean up a lot of the duplicate code across the app.
This addition notably allows a default tab to be set, which is
something that was widely requested in #12. This UI rework finally
allows it to be added.
Return to the "four seperate list fragments" system when it comes to
HomeFragment. This reduces code complexity [no more massive when
chains] and allows me to customize the content of each fragment without
adding special cases.
Re-add the play/shuffle options to the song list, now as a header. This
seems to be the best option UX-wise, but the implementation is really
I think the best option regarding that is to extend this idiom to all
lists or split these fragments up. Both are reasonable.
Refactor music loading to be based off of songs entirely. This reduces
efficency but enables some nices fixes, notably:
1. Album artists now have basic support [You won't be able to see
specific artists, but they won't be fragmented anymore]
2. Samsung devices probably shouldn't get confused about artist names
anymore, like in #40
This should hopefully be the last time I need to refactor this horrible
system. Thank god.
Completely refactor the detail module. This is for a few reasons:
- Prevent data regeneration every time a fragment re-creates.
- Make DetailModel follow the customs of other ViewModels.
- Simplify layouts into a single detail item to reduce code
complexity.
Currently sorting doesn't work, but that is still being worked out
as the legacy SortMode continues to be phased out of Auxio.
Do the final utility refactor, placing custom views into a .ui
submodule and the general utils into a new .util module. This
system seems to stick well.
Remove the janky requestFocus/clearFocus called on SearchFragment
and replace them with InputMethodManager calls. This is generally
more user friendly, especially when returning to search from
navigation.
Move the AndroidUtils file into the root Auxio directory, renaming it
to AuxioUtils as well. This also changes some methods to be extension
methods instead of argument functions.
Actually bother to add license boilerplate. Even though I've written
the entirety of Auxio, the boilerplate will be under "Auxio Project"
instead, as I don't want to share my real name.
Refactor styles again, this time trying to seperate the more
layout-specific attributes so that layouts become more re-usable.
This also updates the naming conventions of styles.
Make fast-scroller truncation more aggressive, mostly because on my new
ROM it seems like display calculations become a little wonky and cause
slight indicator cutoff. May as well add padding then so that
indicators [and the thumb by extension] actually fit and won't get
clipped.
Yet another dependency upgrade churn:
Android Plugin -> 4.2.2
Material -> 1.4.0
Androidx Core -> 1.6.0
Apparently material deprecated a bunch of BottomNavigationView's stuff
for no good reason. Okay.
Update the README to update the current state of Auxio, uodate the
ADDITIONS document to reflect which features have been rejected,
and remove the black mode question from the FAQ.
Remove the default [a.k.a SortMode.NONE] option from the library view.
It was effectively useless in every single library mode and was
functionally equivelent to SortMode.ALPHA_DOWN. Other SortModes might
come to take it's place, but likely only for albums.
Add a fast-scroller to the library view. This makes long lists of
items such as albums easier to scroll through, but also requires
pre-sorting of artists to make sure that unintended behavior does
not occur. A future commit may improve the sort options here so that
this does not need to occur.
Use the native MediaStore sort of using the characters after an article
[if present] everywhere when sorting is done. Yes, this is still dumb
and non-local, but if I want to add fast-scrolling to the library view
I will have to keep consistency across each sort.
Create a seperate ActionHeader object for headers with actions attached alongside a new viewholder to accompany it.
This allows action headers to be created easier without creating your own viewholder.
Use unique-ish hashes in the playback state system instead of the less efficent and less reliable string system.
This cuts save times in ~half and improves restore times by ~1/3.
Yeah, this is like the 4th time I've changed this system but unless I have some major loader refactor I
think this wont change again.
Do some post-setting refactor cleanup:
- Make some extension functions for SettingsManager for convienence
- Remove dead code from before the int migration
- Update semantics here and there
Update the structure of the settings system to do several things:
- Finally use int preferences everywhere instead of the mix of strings & ints from before
- Create a new preference named `IntListPreference` that enables the use of integers in list preferences
- Actually centralize array values and default values into a single integers xml
- Isolate all the new migration code into a single file
- Refreshed the int tables used by data objects [DB version has been updated, will not update when other changes]
The only preference not migrated is doAtEnd since that is being planned to be retired in a future LoopMode update.
Both improve and use dialogs
- The AlertDialog style now properly colors dialogs with the primary coler
- The accent & blacklist dialogs are now based on AlertDialog for their buttons, reducing layout complexity
Fix an issue where the playback restore process would only search the list of songs for the currently playing song, running the risk of picking the wrong song with the same name.