Commit graph

925 commits

Author SHA1 Message Date
OxygenCobalt
e41645ee28
widgets: rework button appearance
Further rework the button layout to be alike to other modern widgets.

This changeset transforms the play button into a FAB-ish thing,
makes spacing coherent between the uses of each layout, and adds
spacers to make the buttons layout in a more appealing way.
2022-07-01 12:25:59 -06:00
OxygenCobalt
e883336b04
music: rework library update process [#176]
Update the library update process to be on a co-routine, updating
callbacks on the main thread.

For some insane reason, the Main dispatcher used normally when
loading music just disappears sometimes. This leads to unpleasent
crashes as callbacks expect to be called on the app thread, not
any background threads.

Fix this by forcing the Main dispatcher during the update process.
This requires the music update process to also run on a background
thread, albeit that will be useful for automatic rescanning late ron.
2022-07-01 08:54:42 -06:00
OxygenCobalt
090a1713dd
ui: rework iconography
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.
2022-06-30 21:09:21 -06:00
OxygenCobalt
9a17806da1
ui: rework module structure
Rework the ui module structure to subdivide related groups of elements.
2022-06-29 11:41:49 -06:00
OxygenCobalt
249ddae269
ui: rework bottom sheet layout method
Rework the bottom sheet layout process to accomodate the new rounded
corners and be far more efficient.

This removes the weird content layout code and moves it into the inset
code, which not only allows content to show in the corners, but also
allows us to minimize the amount of layouts that we normally perform.
2022-06-29 11:17:50 -06:00
OxygenCobalt
c7c4473247
ui: make bottom sheet follow rounded corners
Make BottomSheetLayout apply rounded corners when rounded covers is
enabled.

Draggable elements should be rounded, not straight, so this simply
makes this consistent. It does have one visual error as it stands,
stemming from the layout code allocating space for the bar and thus
clipping certain content. I hope to fix this soon.
2022-06-29 09:10:50 -06:00
OxygenCobalt
67ef667080
home: do not collect immediately on recreate
Do not use collectImmediately when recreating tabs in the home menu.

This resulted in an issue where the ViewPager would not update to
reflect the new tab layout.
2022-06-27 14:50:33 -06:00
OxygenCobalt
5b70295330
ui: fix bottom sheet issues
Fix several issues with the bottom sheet implementation, mostly
relating to what occurs when the bar is hidden.

Previously, if the bar was hidden and then re-shown, it would not be
visible, and you could override a hidden event with another tap. These
are now both resolved by removing a stray visibility assignment and
replacing the old drag checks with a new isDraggable attribute.

In the future, I hope to abuse BottomSheetBehavior into not being a
pile of garbage and replace this system once and for all.
2022-06-27 10:28:17 -06:00
OxygenCobalt
c3721266b5
playback: use isactive in replaygain [#174]
Override isActive to control when the ReplayGain engine should
manipulate audio.

This makes the system much more efficient, as we can side-step a
useless copy when ReplayGain shouldn't be applied.
2022-06-26 19:19:28 -06:00
OxygenCobalt
efd24a4fee
detail: fix broken album menu
Fix broken menu items in the album detail view.

No idea why this happened. Probably a mistake while I was redoing the
menus previously.
2022-06-24 09:07:18 -06:00
OxygenCobalt
149da883fe
playback: make state db sync
Add synchronized calls to PlaybackStateDatabase to resolve future race
conditions.
2022-06-23 15:27:41 -06:00
OxygenCobalt
d5c0ccfce0
ui: remove titlemidlarge style
Remove the TitleMidLarge style, replacing it with more Material3
attributes.

This finally removes all of the non-standard text styles. There is
still the two TitleMedium styles, but this is considered okay.

In the playback view, TitleMidLarge has become TitleLarge, which
honestly works quite well, as the same text styles are used in the
detail views.
2022-06-23 11:22:29 -06:00
OxygenCobalt
50ba3358e1
info: expose weblate
Fully expose Auxio's Weblate project to the public.
2022-06-23 07:47:38 -06:00
OxygenCobalt
3fcd7e1a63
all: general cleanup
A bunch of changes that accumulated that I'm too lazy to split into
good commits.
2022-06-22 18:38:57 -06:00
OxygenCobalt
630950ea5d
playback: force LTR on timeline controls
Force LTR on timeline controls, as per the Material Design guidelines.

The guidelines state that while "directional" UIs should be LTR/RTL
depending on locale, "timeline" UIs should always by LTR, as the
direction of time is universal. Auxio did not do this, and so the
timeline controls would be RTL on other elements. Fix this by forcing
LTR on the UI elements that correspond to timelines.

Now, this is not the best system. To ensure that the rest of the layout
remains sane, much of the directional views have to be wrapped in a
redundant layout, which is somewhat in-efficient. However, the impact
seems to be at least negligable.
2022-06-22 12:38:00 -06:00
OxygenCobalt
55f9d4c819
ui: rework sorting again
Rework Sort again into a new class that leverages a better Mode design
and static comparator instances.

This somewhat improves efficiency, but is also far easier to work with
and has far less footguns with adding new sorts.
2022-06-22 11:08:58 -06:00
OxygenCobalt
86010e896e
music: remove redundant null checks
Remove more redundant null checks in MediaStoreBackend.

Again, no need to check if there is no issue where they might be null.
2022-06-22 09:05:22 -06:00
OxygenCobalt
7edd8002f1
deps: update exoplayer to 2.18.0
Update ExoPlayer to 2.18.0 and fix all of the breaking changes.
2022-06-21 11:42:17 -06:00
OxygenCobalt
16eccee8e5
all: add collection utils
Add new shortcut utilities for collecting StateFlows in a safe manner.

The priamry addition here is collectImmediately. collectImmediately
just calls block with the existing value initially, which helps remove
a good amount of bugs regarding state initialization. Sure, it is a bit
inefficient given that it will also initialize on startup, but this is
okay.

The other utilities are the same, but simply remove the launch
boilerplate.
2022-06-21 10:51:56 -06:00
OxygenCobalt
8465cda637
playback: allow customization of detail playback
Add a new "Detail playback mode" option that allows one to configure
what selecting a song will do in an album/artist/genre.

This is mostly a clone of the prior setting, just in a new context.

Resolves #164.
2022-06-21 09:13:57 -06:00
OxygenCobalt
787a0df595
playback: fix remember shuffle regression
Fix a regression that broke the Remember Shuffle option.
2022-06-20 16:10:23 -06:00
OxygenCobalt
b041fe68d0
ui: add util for fragment objects
Add a utility to easily work with lifecycle-dependent fragment objects.

This reduces the code duplication required to maintain objects that
would leak after the destruction of a fragment. We normally would not
do this as a delegate, as that usually entails some lifecycle wizardry
that can easily break and crash the app in esoteric situations.
However, this this just extends the normal lifecycle without watching
any state, it seems to be pretty safe to use.
2022-06-20 12:03:57 -06:00
OxygenCobalt
bd92ba2175
settings: improve preference management
Rework the preference classes to reduce the horrible bloat of the
recursivelyHandlePreference function.

This was mostly implementing new methods into IntListPreference and
adding a new preference to represent the weird, "generic" dialogs that
are used at points. While some preferences still need to be tweaked in
recursivelyHandlePreference, it is nowhere near as bad as it was prior.
2022-06-20 11:12:55 -06:00
OxygenCobalt
532a30325a
settings: revamp settingsmanager into settings
Revamp the shared object SettingsManager into a standalone utility
called Settings.

This makes many things easier in Auxio. It completely unifies the key
format that we use (Android Strings instead of Java consts), eliminates
the pretty dumb initialization method that we use, and eliminates the
dubiousness of holding a Context-related utility in a global field.

The only cost was having to migrate even more ViewModels to Android
ViewModels. Whatever.
2022-06-20 09:12:19 -06:00
OxygenCobalt
ba48cdad29
playback: make state manager lock
Add synchronized calls to all mutations in PlaybackStateManager.

I mean, it is global mutable state modified on several threads. This is
the safest option to remove a bunch of horrible bugs.
2022-06-19 16:43:41 -06:00
OxygenCobalt
b8cc153f07
playback: add controller role
Add a controller role to PlaybackStateManager.

The controller manages the internal player, and acts as an intermediary
between other internal objects that want to modify the player, but
don't actually have access to it.

This makes a bunch of future changes far easier.
2022-06-19 16:23:40 -06:00
OxygenCobalt
29fe849565
playback: add shuffle shortcut
Add a shortcut to shuffle all songs.

This is likely the only static shortcut Auxio will have. Top tracks
and recently added are completely useless for me, so I will never
add them. I may add more dynamic shortcuts for recently played items,
however.

Note that we use a basic black shuffle icon here. I will not add icon
customization to these shortcuts.
2022-06-18 11:20:22 -06:00
OxygenCobalt
20e7b25808
queue: fix visual issue with transition
Fix a visual issue with the queue animation where the playback view
will still slightly show.

This was caused by the lack of a background in the queue fragment UI.
2022-06-18 08:46:10 -06:00
OxygenCobalt
eaad3d04b8
ui: improve tablet ux
Remove some UI breakages and tweak the UI to be better for tablet
users.
2022-06-17 16:30:14 -06:00
OxygenCobalt
09442c475f
image: fix seam appearing on some images
Fix an issue where a seam might appear on some covers when rounded
covers was enabled.

This was caused by a poor usage of clipToOutline. Replace with simply
stacking existing image instances on top of eachother.
2022-06-17 10:37:54 -06:00
OxygenCobalt
cf8e887f9a
all: use compat when stopping foreground services
Use ServiceCompat.stopForeground instead of stopForeground.

This is preliminary preparation for Android 13. I can only change SDK
versions however when the Android Gradle Plugin makes a new release
though.
2022-06-16 15:35:16 -06:00
OxygenCobalt
30087b847a
music: fix incorrect dir migration
Fix an issue with the excluded -> music dir migration where the
starting separator would not be removed.
2022-06-16 12:16:01 -06:00
OxygenCobalt
46a5cf293a
info: update documentation
Update the general documentation for the app.
2022-06-16 11:57:00 -06:00
OxygenCobalt
49e3c51bb6
ui: fix rtl issues
Fix minor RTL issues across the app. Except for the controls. I have
zero idea how to fix that.
2022-06-16 11:00:17 -06:00
OxygenCobalt
668006724b
ui: make default accent dynamic on api 31
Make the default accent the dynamic accent on API 31.

This is to make Auxio's Material You support obvious to the user.
2022-06-15 20:09:23 -06:00
OxygenCobalt
e6f6d1ccf8
image: remove animated indicator
Remove the animated indicator, replacing it with a static one.

I wish I could have kept this, but once again android is a sh******ed
mess and makes it impossible to dynamically animate something depending
on the playing state. It will restart the animation, ignore calls to
stop, or just flat out now run the code path in the first place due to
race conditions.
2022-06-15 16:11:41 -06:00
OxygenCobalt
fb86b58a53
music: further separate backends
Further separate backend implementations to remove redundant tasks.

Generally, if I have not encountered an issue where a field is not
present/sane, I don't want to put in a "well, maybe" fallback, as
that would tank performance. Only do it when we need to.
2022-06-15 11:47:02 -06:00
OxygenCobalt
90976e318d
util: add reflection utilities
Add lazyReflectedMethod and lazyReflectedField, utility methods that
make handling reflection a bit easier.

This is mostly a readability change.
2022-06-15 11:24:47 -06:00
OxygenCobalt
3d8d2e0975
all: update logging
Improve logging use across the app.
2022-06-15 11:06:10 -06:00
OxygenCobalt
2f85d694d1
ui: remove actionmenu for menufragment
Introduce MenuFragment in order to replace ActionMenu.

ActionMenu was a terrible class filled with hacks. Introduce a new
fragment called MenuFragment that enables the same features, plus:
1. Requiring consumers the specify the menu, which prevents issues
from one-size-fits-all menus (unless absolutely necessary)
2. Fixing an issue where multiple menus appear at once
2022-06-15 10:05:08 -06:00
OxygenCobalt
5d1eaf72dd
detail: add queue actions to artist/genre
Add play next/add to queue actions to artists and genres, as the queue
system now makes their UX reasonable.
2022-06-14 17:40:33 -06:00
OxygenCobalt
8adf5e978d
music: dont make path parsing redundant
Don't do API 21 path parsing on API 29.

There's no need yet, so it's better to skip the step and make the
loading process more efficient.
2022-06-14 13:33:10 -06:00
OxygenCobalt
6fc4d46de5
music: switch excluded system to storagevolume
Switch the excluded directory system to StorageVolume.

This finally removes dependence on the in-house Volume constructs, and
also completely extends fully music folder selection support to all
versions that Auxio supports.

This is possibly one of the most invasive and risky reworks I have done
with Auxio's music loader, but it's also somewhat exciting, as no other
music player I know of handles Volumes like I do.
2022-06-14 10:12:05 -06:00
OxygenCobalt
ab1ff416e1
music: use storage volume
Leverage StorageVolume when working with file paths.

StorageVolume is android's navive API for handling external volumes.
Ideally, we would want to replace our built-in volume class with this
new API, however doing so is somewhat complicated as some methods only
exist on newer API levels. This is only the first step until we are
able to migrate the excluded directory system to this as well.
2022-06-13 14:36:13 -06:00
OxygenCobalt
107f7bee27
all: add viewmodel contexts where useful
Make some ViewModel instances AndroidViewModels in order to make some
code less insane.

I don't like doing this, as I want to keep ViewModel instances clean of
android things, but this just makes a lot of functionality easier to
implement.
2022-06-13 12:07:34 -06:00
OxygenCobalt
e914da4bd1
music: default to codecs in format
Only show codecs in the "format" field, if we are able to extract them.

This is primarily for consistency, as there is no way for us to
determine the container format outside of an extension (which could not
be sane).
2022-06-13 09:41:52 -06:00
OxygenCobalt
cb8c3306eb
all: minor cleanup
Do some minor housecleaning across the app.
2022-06-12 21:02:15 -06:00
OxygenCobalt
ad87c72cd6
image: fix error on api 21
Fix an API 21-specific bug that could result in covers not loading when
quality covers was enabled.

This stemmed from a use of `use` on MediaMetadataRetriever, which
relied on an interface not present on the class on API 21.
2022-06-12 17:31:22 -06:00
OxygenCobalt
9b13b4c94e
music: revamp excluded into music dirs
Completely rework the excluded directory system into a new
"Music Folders" system.

This is implemented alongside a new "Include" mode. This mode
allows the user to restrict music indexing to a parsicular folder.
I've been reluctant to add this feature, as having two separate
options seemed bad. This resolves it by effectively packing whether
to include/exclude directories into a single option.

Resolves #154.
2022-06-12 15:55:25 -06:00
OxygenCobalt
53f3d0faef
playback: add song menu to panel
Add a non-queue version of the song menu to the playback panel.

While the original UI flow of clicking on each TextView to navigate
to a particular item is still present, this simply makes the action
more clear to a first-time user.
2022-06-12 12:03:29 -06:00
OxygenCobalt
5f0518d983
detail: heavily improve format handling
Heavily improve the way Auxio handles shows formats in the song
properties view.

This is composed of the following:
- Using ExoPlayer to find a format-specific mime type before having to
fall back to other solutions
- Keeping around the format and extension mime types so that each is
picked in the best circumstances
- Using MediaFormat to also retrieve a format-specific mime type in the
case that ExoPlayer parsing is disabled
- Adding special names for the most common formats
2022-06-12 11:47:49 -06:00
OxygenCobalt
8e56459f8b
ui: fix auxio icon on api 21
Remove scientific notation from the auxio icon, allowing me to
reintroduce it to the notification icon.

API 21 does not support scientific notation in vector drawables, so we
need to remove them from the icon for it to not crash the system ui.
2022-06-12 09:35:23 -06:00
OxygenCobalt
5d124ce771
ui: use scroll indicators
Use basic scroll indicators when a dialog shows a list.

Mostly for material guidelines. Excluded dialogs and int pref dialog
have not been modified, as I am still working on revamping those.
2022-06-12 09:31:59 -06:00
OxygenCobalt
47437c355d
music: eliminate odd songs with no size
Remove malformed songs that have a size of 0 bytes, but are still
present in MediaStore.

This issue only seems to occur when files are transferred via MTP, but
are not loaded due to storage issues.
2022-06-11 16:30:01 -06:00
OxygenCobalt
c95edfa28b
detail: complete song detail view
Complete a song detail view, shown when the "View properties" option in
the song menu is selected.

Resolves #144.
2022-06-11 16:25:46 -06:00
OxygenCobalt
7373451912
music: add support for file properties
Add support for file size, format, and parent directory values to the
MediaStore backend.

I hope that this handles API boundaries properly, especially regarding
path parsing. As a side-note, I have learned of a way to extend
external volume support to even earlier versions. Maybe.
2022-06-11 16:21:16 -06:00
OxygenCobalt
3f85678d99
detail: add framework for song details
Add the basic framework for a song detail view.
2022-06-11 13:29:06 -06:00
OxygenCobalt
277e5a151f
playback: use more efficient no-op w/replaygain
When ReplayGain is not needed, use ByteBuffer.put in favor of a for
loop when doing a simple copy.

ByteBuffer.put is highly optimized and far more efficient than a for
loop.
2022-06-11 09:27:55 -06:00
OxygenCobalt
d42f5970f1
image: fix indicator <api 22
Redo the paths and remove scientific notation from the indicator to
make it work below API 22.

The fact that studio does not have a built-in vector editor of any
kind that properly handles the edge-cases is shameful.
2022-06-10 15:45:00 -06:00
OxygenCobalt
d80c49f11f
image: add image group
Add a new view called ImageGroup that will handle all advanced image
hacks from now on.

This includes the indicator (which is now animated), any selection
indicators, and the weirdness of the album song image. All of that
is now handled by ImageGroup. This is the culmination of probably
a day and a half of wrangling with android insanity and having to
remove a lot of what I liked about the indicator in order to make
this work on a basic level.

The only major bug I am currently aware of with this is that the
indicator is bugged out on Lollipop devices due to bad vectors.
Again.

I never want to do this again. I cannot believe that adding a basic
indicator took this long and required so much stupid hacks and
inefficient code. And then google wonders why android apps are so
visually unappealing and janky and laggy. Hm. Must be that devs aren't
using the brand new FooBarBlasterFlow library!
2022-06-10 11:57:50 -06:00
OxygenCobalt
ffe7298665
ui: add image playing indicator
Add a playing indicator to cover art.

This is simply to improve the general aestethics of this view. Of
course, the current way I implement this is incredibly stupid and I
plan to replace it.
2022-06-10 09:48:51 -06:00
OxygenCobalt
1d66907862
ui: remove edge-to-edge option
Remove the edge-to-edge option, as it turned out to be useless
with #149.
2022-06-09 17:03:38 -06:00
OxygenCobalt
84295dcf25
ui: completely rework icon management
Completely rework the way Auxio handles icons.

This is mostly two changes:
1. Removing ImageButton/StyledImageButton for MaterialButton. This is
done by abusing MaterialButton's theming options to make it only show
an icon.
2. Standardizing icon sizes into small, medium, and large categories.
Small is the default, Medium and Large are for edge-cases like the
playback icons which look horrible at 24dp.
3. Abusing the Toolbar to make it follow Material 3 guidelines. This
mostly involved removing the strange icon sizing and correctly padding
the view.
4. Reworking the playback bar to use more, smaller icons, making it
more like a Toolbar in the process (which I like).
2022-06-09 10:12:48 -06:00
OxygenCobalt
a56d5849db
ui: update bar styles
Update the styles of LinearProgressIndicator and Slider to be similar
across the entirety of the app.
2022-06-08 09:59:28 -06:00
OxygenCobalt
6f625da125
ui: supply view to windowinsetdcompat calls
Supply a view to WindowInsetsCompat.toWindowInsetsCompat through all
calls in the app.

This does nothing, but it would resolve future bugs if I were to use
the most exotic window inset types.
2022-06-08 09:48:14 -06:00
OxygenCobalt
7d4b953019
playback: pick larger inset out of bar/gesture
On the playback par, pick the larger inset out of the system bar
insets or system gesture insets.

This is to fix an issue where android just does not provide correct
gesture insets on Android 12L, and [maybe???] fix what is going on
in #149.
2022-06-08 09:33:14 -06:00
OxygenCobalt
a6c321cfa5
home: make toolbar collapse
Make the home toolbar collapse on scroll.

I was planning to implement this back in 2.0.0, but visual bugs stopped
me. Now, knowing how much space the the Toolbar + Tab combination takes
up on smaller devices, I think it would be better to have this in
general.
2022-06-08 09:31:57 -06:00
OxygenCobalt
cc2561f20f
ui: rework primitive backing data into sync
Rework PrimitiveBackingData into SyncBackingData.

Google says that you should not use DiffUtil on the main thread, as it
is far too slow. In practice, the time it takes to diff is negligable,
even more so when costly diffs are filled in with a replace call
instead. Not only that, but switching to a synced list differ fixees
the horrible nightmare that is the queue adapter. Generally a win-win
for most use-cases in Auxio.
2022-06-07 20:03:02 -06:00
OxygenCobalt
f85f366144
ui: change adapter animations
Rework the submitList animation to be less resource intensive and nicer
looking (at the cost of scroll positioning)

notifyDatasetChanged is slow and has no animation, but list diffing is
chaotic and basically useless outside of search. However, clearing the
adapter and then populating it with new items seems to work quite well,
albeit with the scroll position being lost sadly. Switch to that.
2022-06-07 19:14:54 -06:00
OxygenCobalt
d15055cc29
music: improve exoplayer tag management
Extend the range of tags Auxio is capable of recognizing, removing some
edge-cases in the process.

This is mostly three changes:
1. Auxio no longer tolerates tracks/discs/years that are 0. These are
usually never valid.
2. Auxio now has support for original date/year values. This are niche
tags, but I was inspired to implement it by this HN discussion at
https://news.ycombinator.com/item?id=31659799 simply because it
differentiates Auxio.
3. Auxio can handle the more esoteric tag variations in vorbis, such
as "YEAR" or "ALBUM ARTIST".
2022-06-07 17:50:11 -06:00
OxygenCobalt
c929357d76
ui: add edge-to-edge toggle
Add a toggle for edge-to-edge mode.

Normally we would want to enable edge-to-edge by default (in fact, we
still do). However, some phones (once again, samsung) don't provide
Auxio with actual window insets. As a result, we need to add a toggle
so that it can be disabled on busted devices.

Did you know that even when Auxio has it's edge-to-edge functionality
busted, Samsung Music works just fine? Very interesting.

Resolves #149.
2022-06-07 17:14:02 -06:00
OxygenCobalt
bd683ca09a
ui: use compat edge-to-edge
Use androidx compat tools when setting up edge-to-edge and applying
window insets.

This is mostly a readability tweak ahead of making edge-to-edge a
setting.
2022-06-07 13:41:13 -06:00
OxygenCobalt
1482333adc
music: remove version-specific display name hacks
Remove the version-specific display name hacks added previously.

Turns out RELATIVE_PATH only includes the directory structure. Oh.
Since this invalidates the purpose of version-specific display name
hacks, we just remove it.
2022-06-07 10:02:20 -06:00
OxygenCobalt
a6599eec2a
music: do not use future callback with exoplayer
Do not add a callback to a MetadataRetriever call in ExoPlayerBackend.

This fixes an issue where if an error occurs while a future completes,
the app will crash entirely. This is because Futures run on a different
Executor and thus exceptions will not bubble up to Indexer.
2022-06-07 10:01:13 -06:00
OxygenCobalt
8d7aa7936b
detail: respond to automatic rescanning
Make the detail UIs respond to automatic rescanning events.

This currently has no effect, but is instead a preparation step for the
seamless addition of automatic rescanning.
2022-06-06 20:05:12 -06:00
OxygenCobalt
0a18883a6a
music: replace loading with indexing
Replace all in-code instances of music loading with music indexing,
primarily for clarity.
2022-06-05 19:30:45 -06:00
OxygenCobalt
fb3c32b14c
music: split display name fix across versions
When having to fall back to an alternative displayName field, use
the version-specific RELATIVE_PATH and DATA fields when necessary.
2022-06-05 19:11:58 -06:00
OxygenCobalt
dd00c70488
music: do not auto-index unless indeterminate
Make IndexerService only auto-index music when there is no library AND
no loading has occured.

This resolves an issue where if IndexerService dies after a failed
index, IndexerService would try to index music regardless, as there was
no library present.
2022-06-05 11:47:04 -06:00
OxygenCobalt
f3a7813f5e
music: add support for excluding other volumes
Add support for excluding directories on other volumes, at least from
Android Q onwards.

Previously, Auxio only supported excluding the primary volume. This was
mostly out of laziness, as the excluded directory implementation was
shamelessly copied from Phonograph. This commit completely refactors
the excluded directory system, dumpstering the old database (which was
overkill anyway) for a new system based on SharedPreferences that is
actually capable of handling external volumes.

Now, limitations regarding external volumes still apply below Android
Q, as the VOLUME_NAME field does not exist on those versions. However,
this should resolve at least one major complaint regarding the
excluded directory system. Now theres just all of the other complaints.

Resolves #134.
2022-06-05 11:35:26 -06:00
OxygenCobalt
7673fa4a40
detail: do not cache viewholder pos for highlight
Fix an issue with highlighting in the detail UIs taht stemmed from the
ViewHolder position being cached.

Resorting could have changed the ViewHolder position, so caching it
will result in ViewHolders being incorrectly updated.
2022-06-04 13:51:59 -06:00
OxygenCobalt
b2ad54eef3
image: make bitmap provider use generation system
Make BitmapProvider leverage the generation system used in Indexer.

This helps reduce the surface for instruction-by-instruction race
conditions.
2022-06-04 13:42:16 -06:00
OxygenCobalt
882e24bd12
music: improve genre parsing
Rework genre parsing to properly align with the ID3v2 standard.

The ID3v2 genre specification is weirdly complex. Auxio ignored most
of that and just parsed out the most common cases for genres (digits
and (digits)). For the sake of completeness, rework Auxio's genre
parser to handle the weirder cases like RX/CR, multiple values,
and escaping, with an implementation roughly based on Mutagen's
genre parser.
2022-06-04 11:15:54 -06:00
OxygenCobalt
09392ef381
music: improve indexer state management
Improve Indexer's state management by splitting up the current loading
state and the last response.

This is intended to resolve a bug where if the UI task and
IndexerService are both killed, the Indexer state would become
indeterminate and the library would not show. Resolve this by keeping
track of whatever the last completed state was and falling back to it
whenever the loading process is canceled.
2022-06-04 10:12:31 -06:00
OxygenCobalt
08caa01dca
music: add indexer service
Add a dedicated service towards the loading of the music library.

This new service was created for two reasons:
1. Music loading is slow and resource-intensive, so putting it on the
ViewModel layer just didn't seem right and made it vulnerable to the
OS simply stopping the loading process.
2. For automatic rescanning [#72], there must be something watching
the music library and waiting for a change in the background. This
would require a service as that is probably the least insane way to
do that kind of background work.

I have no garuntees how viable the service might be. If anything, it
might be halted by some insane android restriction or issue that
makes it more or less impossible to use for most apps, and I will have
to largely drop truly automatic rescanning.
2022-06-03 20:12:27 -06:00
OxygenCobalt
e3708bf5f5
music: rework loading management
Rework loading management into a new object, Indexer, which should act
as the base for all future loading changes.

Indexer tries to solve a two issues with music loading:
1. The issue of what occurs when tasks must be restarted or cancelled,
which is common with music loading.
2. Trying to find a good strategy to mediate between service and
ViewModel components in a sensible manner.

Indexer also rolls in a lot of the universal music loading code
alongside this, as much of MusicStore's loading state went unused
by app components and only raised technical challenges when reworking
it.
2022-06-03 16:03:08 -06:00
OxygenCobalt
66b95cef42
deps: upgrade
AndroidX core -> 1.8.0
Material Components -> 1.6.1
2022-06-03 14:15:23 -06:00
OxygenCobalt
b0ec6faa33
Version 2.3.1
Ready for version 2.3.1 of Auxio.
2022-06-03 10:44:10 -06:00
OxygenCobalt
a396101bd0
detail: clean up adapters
Clean up the adapter implementations by removing redundant code.
2022-06-02 19:59:51 -06:00
OxygenCobalt
490c291a14
image: rework genre ordering
Rework genre ordering to be alphabetical based on album, but without
all of the mosaic being taken up by one artist.

With the ordering changes that were done previously, genre images
greatly differed compared to previously. May as well use this breakage
as an oppertunity to improve genre ordering. In this case, we want to
order albums alphabetically, as usual, but we also want to prevent
one artist from taking up the whole mosaic. Fix that by deduplicating
artists in the set of grouped albums.
2022-06-02 19:49:57 -06:00
OxygenCobalt
5bc5afa162
fastlane: fix image metadata
Fix slight screenshot discrepancies where shot7 would show the old
song sub-heading.
2022-06-02 17:05:42 -06:00
OxygenCobalt
bb1d660eae
music: add loading progress indicator
Add an indicator to gague the current music loading progress.

This is actually a lot harder to implement than it might seem, not only
due to UI state issues, but also due to the fact that MusicStore needs
to keep it's state sane across a myriad of possible events that could
occur while loading music. This system seems like a good stopgap until
a full service-backed implementation can be created.
2022-06-02 15:16:32 -06:00
OxygenCobalt
14c9bbd4f9
all: cleanup
Miscellanious clean-up.
2022-06-02 13:57:29 -06:00
OxygenCobalt
e73d10070b
all: use notifyItemChanged everywhere
Apply the notifyItemChanged fix everywhere by making it an explicit
part of the RecyclerView framework.

This way, implementing future selection and rewrite behavior will be
much easier, as the payload argument is available in every adapter
implementation.
2022-06-02 10:42:33 -06:00
OxygenCobalt
10afae0bfc
detail: fix highlighting issues
Fix two major highlighting bugs based around the janky and stupid way
I would handle highlighting previously.

Previously, I would index the views of a RecyclerView in order to
highlight viewholders. In retrospect this was a pretty bad idea,
as viewholders could be in a weird limbo state where they are bound,
but not accessible. I mean, it's in the name. It's a Recycling View.

Fortunately, google actually knew what they were doing and provided
a way to mutate viewholders at runtime using notifyItemChanged.
And the API actually makes sense! Wow! Migrate all detail adapters
to a system that uses notifyItemChanged instead of the terrible
pre-existing system.
2022-06-02 10:20:31 -06:00
OxygenCobalt
182b08ab65
playback: fix state restore regression
Fix a state restore issue that would cause the parent to restore
incorrectly.

At some point, I accidentally used the index for the PlaybackMode field
when restoring the playbackState. This resulted in the playback mode
effectively reverting to ALL_SONGS and causing a number of subtle
issues.
2022-06-02 09:20:31 -06:00
OxygenCobalt
07127403ff
music: fix minor indexer issues
Further refine the Indexer and ExoPlayerBackend implementations.

These fixes were primarily focused on ensuring stable grouping through
stable sorting order, and more graceful handling of edge cases in
ExoPlayerBackend.
2022-06-01 15:50:49 -06:00
OxygenCobalt
a64a4864bd
playback: fix gadgetbridge regression [#62]
Fix a regression where media button controls would no longer work
with GadgetBridge.

In 4a79de4, I assumed that my code was redundant, as there should be
some kind of reciever handling media button events already. I was
completely wrong. Re-add the reciever code (with extra checks) to
make controls work again.
2022-06-01 12:05:38 -06:00
OxygenCobalt
a65d37c421
all: switch to stateflow
Switch from LiveData to StateFlow.

While LiveData is a pretty good data storage/observer mechanism, it has
a few flaws:
- Values are always nullable in LiveData, even if you make them
non-null.
- LiveData can only be mutated on Dispatchers.Main, which frustrates
possible additions like a more fine-grained music status system.
- LiveData's perks are exclusive to ViewModels, which made coupling
with shared objects somewhat cumbersome.

StateFlow solves all of these by being a native coroutine solution with
proper android bindings. Use it instead.
2022-06-01 11:46:00 -06:00
OxygenCobalt
caaeaca494
home: rework loading screen
Move the loading screen into the home view.

Previously, we would use a Snackbar to track the music loading state.
This ended up being a pretty stupid and buggy idea, and would get even
worse with the new music loader changes. Instead, we re-implement the
loading screen into the home view to generally be more sane and
extendable compared to previously.
2022-05-29 20:07:07 -06:00
OxygenCobalt
f52fa7f338
music: cleanup implementation
Clean up the indexer implementation even further.
2022-05-29 10:09:49 -06:00