Do a couple of UI changes I thought of over this week:
- Make the detail header text neutral, mostly so I can make it so that
the accent only corresponds to active thingsd
- Remove the vanity elevation from the cover images. This is mostly to
abide by Material Design.
- Move the about screen to it's own menu slot on the main fragment.
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.
Remove the ducking fadeout code from AudioReactor. This is mostly
because:
1. Android 12 now does this automatically
2. It caused a ton of annoying bugs
Make the seekbar more touchable by increasing it's height. This should
have no measurable impact since I did some layout black magic and made
the rest of the layout slightly inset into the SeekBar's bounds. This
is not a nice solution. Hopefully I'll be able to make a dedicated view
with a Seeker with the same insetting things later on.
Give up and add more material elements such as neutral toolbar colors
and rounded corners. This is largely for stylistic cohesion. I will
keep rounded corners to a minimum though, rounding album covers is a
crime against humanitity.
Refactor the styling again to make all styles start with the Auxio
prefix. Also try to phase out the usage of layout_width and
layout_height in most places, since those can cause a lot of
frustration if they aren't used in the layout they are expected in.
Remove the notification colorizing option. It's simply causing too many
bugs for it to be usable, especially on Android 11 with it's insane
behavior regarding album cover loading.
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.
Fix an issue where in certain cases a playing item would not be
highlighted if it was being re-played. This was solved my simply
adding a check for if the new item was equal and ignoring it if
it is.
Re-add sorting to HomeFragment, except heavily improved. The major
improvement here is the addition of song sorting, which was a heavily
requested feature judging by #16. The setting does not save yet and
is not present in the detail fragments, but it is still a major
milestone for the new home ui.
Drop the Bridge theme and completely migrate to material. This is for
two reasons:
- To make Material You less painful
- Improve coloring [Dark mode, other colors, etc].
Most of the previous UI elements were kept [no rounded corners], but
did come at the cost of removing the hint tagline from the search bar
since there was simply no good way to integrate it. There are also
some other miscellanious issues [Weird selection menus, dividers are
not migrated still], but those will be fixed in future commits.
Make HomeFragment's AppBarLayout lift when the data scrolls. This
was something I wanted to do initially, but kept running into issues
with. Turns out the addition of my custom AppBarLayout made this pretty
trivial all things considered. The entire app now follows this idiom.
Brighten the dark theme somewhat. This is for two reasons:
- To make colorOnSurface stick out less like a sore thumb
- To be more in line with other material apps
- To make the dark theme differ from the black theme more
Black theme remains unchanged, so if one wants a much darker theme,
then they can use that.
Use colorOnSurface for the first time ever. I decided to pick a color
that was as non-intrusive as possible that was still differentiateable,
and I think it looks like a net improvement. It will probably be
tweaked a bit in the future as I expand it to other elevated views.
Make playback/about UIs follow the new liftOnScroll and edge-to-edge
idioms. This finally allows me to collapse a lot of duplicate code
into MainActivity and in general reduce code mess.
Make a hack layout that fixes the problem of the lift state not
actually following the RecyclerView state. This should remove the
need for all the fragile fixes for this UI idiom.
Once again fix annoying issues that arise from the quirks of phone
landscape mode. A lot of these fixes can be re-rolled back into the
edge-to-edge code eventually, but it requires fitsSystemWindows to
be phased out entirely.
Improve the search UI by making it edge-to-edge and adding the
liftOnScroll idiom. It does come with the caveat of walking on
eggshells to get the liftOnScroll code working, but its okay. It
may be improved in the future.
Make settings follow both edge-to-edge and the liftOnScroll idioms.
This has some minor issues with state, but these should be fixed when
I'm able to make a smooth transition for theme changes.
Auxio would usually open links by trying to walk through the app
chooser/default app situation themselves, mostly for compat purposes.
This method was not only broken in Android 11 with the addition of
the QUERY_ALL_PACKAGES permission, but it also seems to be made
obsolete since the android system seems to handle the app choser
pretty well in 11+. As a result, we replace the link opening code on
that version with a plain startActivity call and keep the old compat
code for older versions.
Resolves#47.
Make the queue UI follow the liftOnScroll idiom that is already used
in the detail views. This also tweaks the edge-to-edge behavior so
that this view properly works.
Fix two annoying appbar issues:
- Appbar will collapse if the navigation sequence is too fast
- Tab ripple would paint over the indicator unless the ripple was unbounded [???]
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.
Add a nice elevation effect to queue dragging operations. This has no
purpose outside of looking nicer. Luckily it doesn't effect queue
behavior at all.
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.
Remove the SHOW_ALL variant from DisplayMode, replacing it with null
in SearchFragment where it was initially used. This allows all the
home pager fragments to be combined into a single HomeListFragment
that simply chooses a DisplayMode.
By default, ViewPager2's sensitivity can result in vertical scroll
actions being registered as horizontal scroll actions, which is bad
for UX. Fix that by reflecting into the internal RecyclerView and
changing the touch slope value.
Merge LibraryFragment, SongsFragment, and others into a new fragment
called HomeFragment. This is the beginning of the Auxio UI overhaul.
This has caused some regressions here and there, but these will be
rectified over time.
Fix a problem where the colorize notification option would never have
any effect on Android 11 since the system would default to the media
session if there was no icon.
Move the progress bar to the bottom of CompactPlaybackFragment in both
orientations. Doesn't look the nicest right now, but will be when the
new home fragment is created.
Fix a plethora of style issues that lead to a worse touch experience.
I tried to optimize these solutions so that they didn't reduce the layout
density too much. More updates may have to be made in the future.
The pre-Android 12 padding option was removed previously, but I've
decided to re-add it for stylistic cohesion with the material design
of those versions.
Fix a crash in the accent dialog that would occur because Android
Couldn't decipher the module path to the layout manager. Even though
this worked perfectly fine before moving the module. Why.
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.
Tweak some dimens so that they line up with the 8dp grid. This doesn't
apply to all of them since some of them are fined-tuned [such as the
fast-scroller]. The latter would likely be migrated in the later UI
overhaul.
Add two new widget forms. The compact widget form shows the cover art
[this time with a proper aspect ratio] but no controls. The mini form
only shows the metadata. This seems to work well enough and provides
more choices with how one wants to decorate their homescreen with
Auxio's widgets.
Redesign the loading UI to be in line with the rest of Auxio and the
upcoming Android 12 splash screen [sort of]. This also updates the
header and button designs so that the layout heirarchy is better/more
information dense.
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.
Fix an issue in the responsive layout backport where padding was not
factored into the calculations. This was the original issue that I
thought I fixed in e81d4b6d, but this fix seems to work alot better
from the launchers I tested [Trebuchet/Launcher3, Lawnchair].
Fix some problems with the Pre-12 widget responsiveness backport, most
notably the wrong layout being chosen on more dense launcher grids.
Also change the default widget size from 2x2 to 3x2 so that it's more
readable.
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.
Post widget responsive behavior back to Android 11 and below. This is
not the nicest solution [mostly since the UI flickers when resizing],
but it seems to work well enough.
The plans for widgets have changed somewhat. Instead of 4 or so
variants, there will instead be one unified widget that chooses
different layouts depending on its size. The first one added is the
full widget, which shows more controls as long as theres enough
space.
Simplify the PlaybackNotification code to not have to pass Context for
an argument when it could simply be a private variable. This is okay,
as PlaybackNotification only lives as long as PlaybackService does.
Modify the minimal wdiget so that it can work on Android 11 and below.
Was not actually that hard, mostly changing layouts around all things
considered. This also splits up the default view and the main widget
views, which makes managing UI state much easier.
Use viewLifecycleOwner for all fragments that rely on databinding. This
should solve some possible memory leaks, as viewLifecycleOwner is tied
to the lifecycle of the fragment views instead of the fragments them
selves.
Add the first widget implementation, the minimal widget. This took a
good 2 days of hacking and frustration to get the first prototype
working. And even then, its currently scoped to android 12 until I'm
able to port them. The implementation is still quite rough, but should
become manageable over time. More widgets will come.
Fix a problem where given two albums with the same year, like this:
Album 1 [2018]
- Song 1
- Song 2
Album 2 [2018]
- Song 3
- Song 4
getSortedArtistSongs would incorrectly drop songs that came from
any albums that came after Album 1, resulting in this:
Song 1 [Album 1]
Song 2 [Album 1]
This was caused by a quirk in toSortedMap that would drop any
map entries that corresponded to a previous sorted entry. We now
get and sort the entries directly instead, which fixes the issue.
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.
Add preliminary compat for android 12 [API 31]. More changes may be
needed as time goes on, but its close enough to platform stability
to the point where its needed.
Add a new option to pause playback whenever a song loops [e.g while in
LoopMode.TRACK]. This does mean that we can no longer use exoplayer's
native looping system, but it doesn't seem to be that much of an issue.
Resolves#29.
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.
Improve the black theme selection color by merging it with the dark
theme selection coler. This makes the selection color both more
noticable and reduces the style complexity that came from having to
manage two different selection colors.
ExoPlayer's online functionality will cause the library to request the
ACCESS_NETWORK_STATE permission. We don't need this since we use
ExoPlayer for local playback only. For simplicity [and to remove a
weird suspicious permission, we just disable it]
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.
Make the fast scroller respond to changes in the RecyclerView data.
This again prepares it for use in the library with it's sorting and
item configuration.
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.
Finally add black theme support to Auxio. This is abit of a janky
implementation since I had to add an extra set of accents, but it
shouldn't be as big of a problem after the styles refactoring.
Support for black android components is not implemented yet, but
will be eventually.
Completely redesign the about UI to remove its dependency on
bottomsheetdialogfragment. That object is such a hassle to deal with an
is the epitome of everything wrong with this horrible platform. This
design will enable further about extensions in the future.
Make PlaybackSessionConnector also take events from ExoPlayer as it
used to with MediaSessionConnector. This improves reliability
somewhat at the cost of making the code even more hideous.
Fix some issues with PlaybackSessionConnector that resulted in the
position being stuck when a new song was played, alongside simplifying
the connector code to an extent.
Create a custom session connector that connects between
PlaybackStateManager and MediaSession. The previous session connector
that was part of the exoplayer library turned out to cause bugs that
could cause the covert art not to show on the lock screen and to not
be recognized as proper player controls. This new connector
[once complete] should fix these issues.
Instead of using @color/background directly, use ?attr/colorSurface
so that changes can be made to the theming easier. This also
resolves some more minor issues regarding certain widget's
backgrounds.
Change most of the external layout/drawable code to use
colorControlHighlight instead of selection_color so that control
over which kind of selection color is used is more fine-grained.
Remove the fixAnimInfoLeak hack since it seems that issue was fixed in the new android plugin, and once again modify with the styles to get the dialogs to use the correct style again.
Another day another magic flag I need to fiddle with to get this busted android app working. This platform sucks so much.
Update the auxio icon to be cleaner, make the debug icon more noticable compared to the mainline icon, and move all v26+ adaptive icons to drawable-anydpi-v26, as that is only where they are needed.
Upgrade the detail sorting system to:
- Persist beyond the app lifecycle [as other sort modes do]
- Be used when creating a queue for a genre/artist/album
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.
Do two things to the margin and padding system:
- Remove the redundant padding/margin dimens and replace it with a unified "spacing" dimen namespace
- Make most margin and padding dimens follow the divisible-by-8 rule in material design
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.
Finally move the app from AppCompat the Material Bridge theme. This does a couple things:
- Removes need for runtime styling of material widgets used before
- Allows for a better dialog style [But only after a ton of tinkering and weird hacks]
- Makes theming slightly easier [After all the dumb migration bugs and technicalities are fixed]
I never want to do something like this again. UI styling on android is a nightmare.
Change the loop behavior to something that is actually sensible,
with [ ] looping the whole playlist and [ 1 ] looping the song.
This also removes the "Do on end" setting. A new stop option may
be reintroduced, however.
This resolves issue #13.
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
Fix some problems where PlaybackStateDatabase wouldn't downgrade [Problem when hopping between dev builds with db changes] and with assertBackgroundThread being public.
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
Completely refactor the blacklist dialog to not only use the Storage Access Framework, but also to completely eliminate the material dialogs dependency.
Fix two more fast scrolling issues:
- Fixed size of the view would cut off larger fonts
- Thumb would briefly show when the view would initially start
This custom view was a mistake, but anything for less kbs.
Drop the old IndicatorFastScroll library from Auxio and replace it with a hyper-specialized variant designed specifically for Auxio.
This not only eliminates a source of hacks/problems/bloat, it also removes a dependency on jcenter (Which is shutting down soon)
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.
Unify the calls to getSystemService to a custom function that uses the ContextCompat getSystemService instead of the clunky vanilla getSystemService code.
(Maybe) fix an issue where AudioFocus might cause the playback to start again after being paused by the user, possibly caused by a audiofocus loss being labeled transient even if it wasnt.
Fix a bug where PlaybackStateManager would try to restore the parent from a full list of items, which raises the possibility for the incorrect parent to be chosen.