Commit graph

1356 commits

Author SHA1 Message Date
OxygenCobalt
36bb729e67
music: add additional album types
Add compilation and soundtrack album type support.

I find use in these, so implement them.
2022-07-19 10:50:27 -06:00
OxygenCobalt
24062aa623
music: update album type display
Only display album types within the artist and album detail menus.

Displaying it elsewhere cluttered the UI somewhat.
2022-07-19 10:28:19 -06:00
OxygenCobalt
30920b399a
info: update faq
Update FAQ.md to reflect the changes to the media indexer in the next
release.
2022-07-18 11:40:57 -06:00
OxygenCobalt
4781d250bf
music: implement album types in UI
Implement album type displays in the album detail, artist detail, and
album item views.

Resolves #158.
2022-07-18 11:16:39 -06:00
OxygenCobalt
5df8edf912
music: add basic release type support [#158]
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.
2022-07-18 10:54:08 -06:00
OxygenCobalt
f838fc8b0e
widget: update preview
Update the widget preview to reflect the new filled buttons.
2022-07-18 10:16:39 -06:00
OxygenCobalt
276f067152
ui: update material components
Update MDC to the alpha version in order to use some extra features.

I was planning to switch to the new MaterialSwitch, but alpha03 has
this insane crippling issue with ripples that blocks such. Use alpha02
and prep the app for the addition of the switch.
2022-07-18 10:06:26 -06:00
OxygenCobalt
10362b9efc
music: lowercase names when hashing
Lowercase music names when hashing them to prevent drift stemming from
grouping.

The addition of the song may change the case of an artist if such
mitigations are in effect. To prevent such from invalidating music
hashes, we take the lowercase of every name hashed.
2022-07-17 16:11:16 -06:00
OxygenCobalt
51b9b0e734
widgets: dont use system padding in size compat
Don't take the app widget host padding into account when trying to
calculate the widget sizing.

Doing such produces bad results, at least on my devices. At least, it
does now for some reason.
2022-07-17 16:05:53 -06:00
OxygenCobalt
7f07764b68
playback: fix delayed actions not working
Fix an issue on some devices where the delayed actions system would
not work on startup.

Apparently onStart can be called several times with the same intent.
No, I am not joking. What the actual hell. This would cause any
delayed action other than Restore to be overwritten. The only hard
rule about android is that there are no rules. I hate this platform
so much.
2022-07-17 16:00:17 -06:00
OxygenCobalt
9ca4f70315
music: add id3v2.3 full date support [#159]
Add support for the ID3v2.3 TDAT and TIME frames to the ExoPlayer
parser.
2022-07-17 14:18:18 -06:00
OxygenCobalt
ad45b3edb3
search: dont compare genre sort names
Don't compare genre sort names when searching.

Genre names are identical to genre sort names, remove the useless
comparisons.
2022-07-17 10:44:21 -06:00
OxygenCobalt
e881178c4c
ui: fill in transport icons [#187]
Fill in the play/skip icons, as it just looks a bit nicer that way.

This does violate the design guidelines a little, but who cares.
2022-07-17 10:43:11 -06:00
OxygenCobalt
863929fb64
ui: do not enforce contrast after api 29
Set the enforce*BarContrast methods to false above API 29, so we can
use fully transparent navigation and status bars.

Previously, we used a mostly transparent color for such, but now, we
can use a completely transparent color without it being changed to
match contrast.
2022-07-15 21:09:16 -06:00
OxygenCobalt
4d283bc91d
ui: fix app theme
Make the app theme (Shows before activity startup) the blue theme
instead of the default material purple.
2022-07-15 12:13:47 -06:00
OxygenCobalt
adc4055b2c
music: update hashing
Update id hashing to correctly handle null artists and take discs
and durations into account.

Note that we try not to hash values only obtained with the ExoPlayer
parser, as those could feasibly change if the setting was toggled,
thus causing the playback state to wipe.
2022-07-15 11:44:23 -06:00
OxygenCobalt
9f8ce49d70
search: add sort and file name to comparison
Make the search algorithm take in account the raw sort name and file
name when searching.

This allows the user to search for a particular song without typing in
a unicode/non-ideal title, instead typing in a latinized sort name or
suitable file name.

This does make Auxio's search a bit more fuzzy, but it still gets the
job done.

Resolves #184.
Related to #172.
2022-07-15 11:32:24 -06:00
OxygenCobalt
d4f74784ba
music: add date class
Add a new Date class to represent both years and more fine-grained
dates extracted using the ExoPlayer metadata system.

In-app, the year is still shown, but sorting will use the new precision
when present. The MediaSession will also post an RFC 3339 formatted
date with this new precision, as the MediaSession documentation states
I should. No clue if the latter will cause any bugs with naive metadata
UIs in other apps.

Resolves #159.
2022-07-15 10:23:01 -06:00
OxygenCobalt
7833ec4460
music: make field utils functions
Make some field utils functions, as they do work.
2022-07-14 11:43:28 -06:00
OxygenCobalt
969c0c69b7
music: add sort tag support [#172]
Implement sort tag support in the ExoPlayer backend.

Sort tags for grouping is still derived from the templates. Album
artist sort tags are only picked if one is present. System might be
a bit buggy at the moment given that it messes with grouping/sorting
a little.

Resolves #172.
2022-07-13 20:18:12 -06:00
OxygenCobalt
f0d6e13b53
revert "detail: add date added sort [#181]"
Actually, this is not a good idea. No use as far as I am aware, and it
may semantically conflict with playlists.

This reverts commit 3d1dd2a79f.
2022-07-13 15:53:14 -06:00
OxygenCobalt
3d1dd2a79f
detail: add date added sort [#181]
Add a Last Added sort option to the artist and genre detail views.

This completes the last-added implementation.
2022-07-13 15:50:40 -06:00
OxygenCobalt
a2afd3a4b7
music: add date added to albums [#181]
Added date added sorting to albums as well.

This implementation picks the earliest song in an album that was added
to the library and then uses that for sorting.
2022-07-13 15:50:30 -06:00
OxygenCobalt
e8f94564b7
music: prepare sort tags
Prepare support for sort tags by reworking how sortName is structured.

Instead of rawName and sortName, music must now implement rawName and
rawSortName. rawSortName will be checked first, followed by will
falling back to rawName.withoutArticle. This allows hard-coded tags to
be neatly implemented while avoiding an immediate copy.
2022-07-13 15:50:20 -06:00
OxygenCobalt
9921a39784
music: enable quality tags
Actually enable quality tags now.

Now that 2.5.0 is out, I can finally focus on the new metadata system.
2022-07-13 14:27:35 -06:00
OxygenCobalt
f014a2a48d
home: add last added sorting [#181]
Add a "Last Added" sorting option to the home UI's song list.

I don't know if there is any demand for last added in other contexts.
That will be resolved later.
2022-07-13 14:20:35 -06:00
OxygenCobalt
634fcb4273
Version 2.5.0
Ready for version 2.5.0 of Auxio.
2022-07-13 11:56:21 -06:00
OxygenCobalt
8a4aee9ab1
all: optimize previews
Optimize widget previous and app screenshots to reduce load times and
APK size.
2022-07-13 11:45:13 -06:00
OxygenCobalt
a24b4cf447
info: update screenshots
Update app screenshots for 2.5.0.
2022-07-13 10:58:20 -06:00
Weblate (bot)
66cdd9d2f5
Translations update from Hosted Weblate (#180)
* Translated using Weblate (German)

Currently translated at 100.0% (189 of 189 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/de/

* Translated using Weblate (Czech)

Currently translated at 100.0% (193 of 193 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/cs/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (193 of 193 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/nl/

* Translated using Weblate (Turkish)

Currently translated at 97.4% (188 of 193 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/tr/

* Translated using Weblate (Russian)

Currently translated at 67.8% (131 of 193 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/ru/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/

* Added translation using Weblate (Japanese)

* Translated using Weblate (Czech)

Currently translated at 100.0% (197 of 197 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/cs/

* Translated using Weblate (Czech)

Currently translated at 100.0% (198 of 198 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/cs/

* Translated using Weblate (Turkish)

Currently translated at 95.9% (190 of 198 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/tr/

Co-authored-by: qwerty287 <ndev@web.de>
Co-authored-by: Fjuro <fjuro@seznam.cz>
Co-authored-by: 2hot2exist <pyramidex@protonmail.ch>
Co-authored-by: metezd <itoldyouthat@protonmail.com>
Co-authored-by: Егор Ермаков <eg.ermakov2016@yandex.ru>
2022-07-13 15:27:38 +00:00
OxygenCobalt
08423d5e93
info: update ARCHITECTURE
Update the ARCHITECTURE document to reflect the architectural changes
made in 2.5.0.
2022-07-13 09:27:11 -06:00
OxygenCobalt
ce7dd48f02
all: clean up resources
Clean up resource implementations, removing useless attributes and
simplifying layouts.
2022-07-12 13:13:08 -06:00
OxygenCobalt
ae00a308fe
all: fix version-specific issues
Fix a few version-specific issues so that I don't make a critical
blunder like I did in 2.4.0.
2022-07-12 12:13:49 -06:00
OxygenCobalt
f3aca45690
settings: remove excluded dir migration code
Remove the excluded directory migration code, as it causes far more
issues than it fixes.

Due to an unfixable logic bug that occurs when trying to read the
setting, Auxio will always try to migrate the database when there is
no music folders, causing a hang in some situations. Fix it by just
removing the migration.
2022-07-12 09:59:08 -06:00
OxygenCobalt
60b637e1ce
all: cleanup
Semi-major code cleanup.
2022-07-11 11:29:34 -06:00
OxygenCobalt
caa755c12f
ui: add service/notification abstractions
Add additional abstractions for service foreground states and their
notifications.
2022-07-09 13:16:41 -06:00
OxygenCobalt
a63b3791d2
util: add guard abstraction
Add an abstraction over the generation system called GenerationGuard.

This allows cheap cooperative threading to be implemented consistently
in many places.
2022-07-09 11:17:15 -06:00
OxygenCobalt
f9a61c8ef7
music: remove dead code
Remove dead code from a vain attempt to leverage DATE_TAKEN.
2022-07-09 10:19:55 -06:00
OxygenCobalt
201f132686
detail: fix song deletion issue
Fix an issue where the song dialog would not properly close when the
song it corresponded to was deleted.
2022-07-09 10:18:45 -06:00
OxygenCobalt
35f05ed902
ui: fix insane background issue
Fix an issue where the background will remain the system default theme
because...reasons.

I don't even know what I did wrong.
2022-07-09 09:00:36 -06:00
OxygenCobalt
6f8dc3c311
music: hide quality tags for now
Hide the new quality tags option for now.

This is not because I wanted to, but rather because of me wanting to
reduce the amount of bugs I will likely be thrown due to the release
of automatic rescanning.
2022-07-08 16:48:28 -06:00
OxygenCobalt
3a7768ad22
music: add automatic rescanning
Add automatic rescanning, for real.

This is the culmination of 6 months of work to make Auxio respond to
music updates and to research the most versatile implementation of
such. Is it the best system? No. It's actually a bit messy by necessity
in order to prevent bugs. Does it work well? Yes.

This will not be enabled by default, as it does require a battery
draining foreground service and is generally not useful for most
circumstances.

So glad to be done with this.

Resolves #72.
2022-07-08 16:42:23 -06:00
OxygenCobalt
94f2d28936
music: rework indexer thread safety
Move the switch from IO to Main to within Indexer itself, through
withContext.

This is much easier to work with than the previous system of a separate
"update" coroutine, which isn't really needed anymore given that I no
longer need to do IO work when sanitizing the playback state.
2022-07-07 16:47:21 -06:00
OxygenCobalt
29cc680c34
revert playback: save state when sanitizing
Edge case I thought existed did not. PlaybackService must have saved
before dying, and thus if it did not foreground after a sanitization,
the saved state would still sanitize in a similar manner.
2022-07-07 16:14:47 -06:00
OxygenCobalt
a217bde713
playback: save state during sanitize
Save, but do not read the playback state when sanitizing.

Turns out there is an edge-case where we want to save the state. Still
keep the runtime sanitization, as that greatly reduces the time it
takes to rescan the library.
2022-07-07 15:07:23 -06:00
OxygenCobalt
41ff92a587
deps: upgrade
Update deps:
Kotlin -> 1.7.10
Navigation -> 2.5.0
Lifecycle -> 2.5.0
Activity -> 1.5.0
Fragment -> 1.5.0
2022-07-07 12:08:17 -06:00
OxygenCobalt
e0a05ef486
playback: make sanitization runtime
Do not save the playback state when sanitizing.

After some thought, there is no situation where re-saving the playback
state is desirable. A previously saved state will be consistent with
a sanitized state, and there is no need to save when the service is
active. Thus, save on speed and reduce insane race conditions by just
sanitizing the current runtime state and not saving at all.
2022-07-07 11:58:25 -06:00
OxygenCobalt
83d6c529e2
all: misc ui reworks
Miscellanious UI reworks that accumulated over the past few days.
2022-07-07 10:40:18 -06:00
OxygenCobalt
1730a73eac
settings: add option to force-restore state
Add an option to restore the previous playback state.

This allows me to avoid having to use force stop to restore a previous
state.
2022-07-04 14:22:49 -06:00
OxygenCobalt
a15bc79cc9
music: more hypothetical fixes
Fix a bunch of more hypothetical issues that could occur with runtime
rescanning. It's still global mutable concurrent state though. Sigh.
2022-07-04 11:20:02 -06:00
OxygenCobalt
b1a8544b73
ui: make toolbar fix dedicated class
Make the toolbar spacing fixes a dedicated class.

This resolves an issue on lollipop devices where the ripple would be
clipped.
2022-07-03 16:23:53 -06:00
OxygenCobalt
9647b53f78
ui: remove ripple resources
Remove the ripple resources and replace them with their system
counterparts.

This is to remove redundancy in-app and make the widget more consistent
with other android widgets.
2022-07-03 15:44:56 -06:00
OxygenCobalt
b3cac19ee4
ui: use grade instead of indicator
Finally unify all icon activation states under the new grade modifier
in Material Symbols.

This provides similar clarify to the dot/greyed state, but without
inconsistent meanings. The shuffle icon did have to be bolded a little
more though, as the grade did not seem to do much.
2022-07-03 15:29:42 -06:00
OxygenCobalt
4f8fc8008c
music: rework loading ui flow
Rework the UI flow for music loading to be more coherent with runtime
rescanning.

The loading progress is now shown as a card on the bottom of the
screen. This way, app use is not completely crippled when the app has
to rescan the music library, albeit the shuffle button still has to
be disabled during this period.
2022-07-03 14:53:21 -06:00
OxygenCobalt
e1c55d5ddc
ui: revert rounded bottom sheet
Revert the optional rounded corners on the bottom sheet.

It was causing too many bugs to be a sensible addition. I will only add
it if Google moves WindowInset application to layout time AND only on
devices with the stretch overscroll implemented.
2022-07-03 11:29:01 -06:00
Weblate (bot)
81c616a2aa
Translations update from Hosted Weblate (#169)
* Translated using Weblate (German)

Currently translated at 100.0% (187 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/de/

* Translated using Weblate (Italian)

Currently translated at 100.0% (187 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/it/

* Translated using Weblate (German)

Currently translated at 100.0% (187 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/de/

* Translated using Weblate (French)

Currently translated at 53.4% (100 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/fr/

* Translated using Weblate (German)

Currently translated at 94.7% (18 of 19 strings)

Translation: Auxio/Metadata
Translate-URL: https://hosted.weblate.org/projects/auxio/metadata/de/

* Translated using Weblate (Czech)

Currently translated at 100.0% (187 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/cs/

* Translated using Weblate (Turkish)

Currently translated at 37.4% (70 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/tr/

* Translated using Weblate (Turkish)

Currently translated at 37.4% (70 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/tr/

* Translated using Weblate (German)

Currently translated at 100.0% (19 of 19 strings)

Translation: Auxio/Metadata
Translate-URL: https://hosted.weblate.org/projects/auxio/metadata/de/

* Translated using Weblate (German)

Currently translated at 100.0% (187 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/de/

* Translated using Weblate (Turkish)

Currently translated at 97.3% (182 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/tr/

* Translated using Weblate (Turkish)

Currently translated at 97.3% (182 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/tr/

* Translated using Weblate (Czech)

Currently translated at 100.0% (19 of 19 strings)

Translation: Auxio/Metadata
Translate-URL: https://hosted.weblate.org/projects/auxio/metadata/cs/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (19 of 19 strings)

Translation: Auxio/Metadata
Translate-URL: https://hosted.weblate.org/projects/auxio/metadata/tr/

* Translated using Weblate (Spanish)

Currently translated at 72.7% (136 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/es/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (187 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/zh_Hans/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 60.9% (114 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/pt_BR/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.7% (18 of 19 strings)

Translation: Auxio/Metadata
Translate-URL: https://hosted.weblate.org/projects/auxio/metadata/pt_BR/

* Translated using Weblate (Indonesian)

Currently translated at 45.9% (86 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/id/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 78.0% (146 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/pt_BR/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (19 of 19 strings)

Translation: Auxio/Metadata
Translate-URL: https://hosted.weblate.org/projects/auxio/metadata/pt_BR/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (187 of 187 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/id/

* Translated using Weblate (Indonesian)

Currently translated at 94.7% (18 of 19 strings)

Translation: Auxio/Metadata
Translate-URL: https://hosted.weblate.org/projects/auxio/metadata/id/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 80.4% (152 of 189 strings)

Translation: Auxio/Strings
Translate-URL: https://hosted.weblate.org/projects/auxio/strings/pt_BR/

Co-authored-by: Konstantin Tutsch <konstantin.tutsch@disroot.org>
Co-authored-by: Enrico D'Ortenzio <enrico2588@gmail.com>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Fjuro <fjuro@seznam.cz>
Co-authored-by: metezd <itoldyouthat@protonmail.com>
Co-authored-by: arif <others.superset@simplelogin.co>
Co-authored-by: qwerty287 <ndev@web.de>
Co-authored-by: Rodrigo Hernández <alex_werehog@hotmail.com>
Co-authored-by: Clyde Johanson <johnson.hu95@gmail.com>
Co-authored-by: Luiz-bro <luiznneto1@gmail.com>
Co-authored-by: Adam Adrian <4.adam.adrian@gmail.com>
2022-07-03 16:16:51 +00:00
OxygenCobalt
cd00950a5c
all: audit synchronized usages
Audit usages of Synchronized throughout the app to prevent deadlocks.

This is primarily composed of not making long-running work
synchronized, instead only making mutations and reads synchronized.
This does cause minor issues, such as during a sanitization event
the playback state could be feasibly saved, changed, and then restored
back to the previous state unintentionally. However, preventing
deadlocks is generally better than trying to fix those.
2022-07-03 09:12:19 -06:00
OxygenCobalt
3bdf7b136e
music: enable quality tags [#128]
Enable the ExoPlayer parser in the UI.

Now that runtime rescanning is implemented, this feature can also be
finally enabled.

Resolves #128.
2022-07-02 20:37:55 -06:00
OxygenCobalt
d6f166a3ee
all: use synchronized annotation
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.
2022-07-02 17:28:51 -06:00
OxygenCobalt
73e10c9519
music: enable runtime rescanning [#72]
Finally enable runtime rescanning, opening the door for a ton of new
features and automatic rescanning later on.

More work needs to be done on making the shared mutable state in-app
safer to use.
2022-07-02 17:15:21 -06:00
OxygenCobalt
bbf3b1778b
music: improve indexer callback impl
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.
2022-07-02 15:31:01 -06:00
OxygenCobalt
49a964705b
playback: sync mediasession and notif
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.
2022-07-02 14:04:21 -06:00
OxygenCobalt
3663396b97
ui: remove windowinsetscompat
Remove WindowInsetsCompat from the project, as it is a pile of garbage.

WindowInsetsCompat refuses to actually update the correct fields when
you transform it back into a WindowInsets. This makes it impossible to
use in Auxio. The fact that Google decided to make such an
overengineered wrapper to some version-specific methods is an absolute
joke. All you needed were some extension functions, but no, let's make
an entire wrapper class filled with so many gotchas as to be unusable.
2022-07-02 10:19:46 -06:00
OxygenCobalt
631120dafc
search: actually commit filter mode to settings
Turns out the filter mode was also not being committed to settings.

I have no idea how this slipped into production.
2022-07-01 20:39:23 -06:00
OxygenCobalt
8b8eebdd95
search: fix mismatched filter ids
Fix an issue were (at some point) the filter ID for display modes was
swapped out for drawable IDs.
2022-07-01 20:26:20 -06:00
OxygenCobalt
217ced8ade
ui: rework rounded covers into round mode
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.
2022-07-01 20:06:54 -06:00
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
a81b90a81f
widgets: update control layout
Rework the widget control layouts to add additional controls and to
have more consistent padding.
2022-06-29 11:35: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
316a0e719c
ui: rework typography
Completely rework app typography.

Today I found out that inter has a tool that allowed you to generate
line spacings for a particular font size. Several hours later, I
regenerated the entirety of Auxio's typography to use this new system.

Moreso, I also tried to eliminate some of the non-standard text styles
that I was using prior. That failed. Mostly there's two edge-cases
regarding title bolding and the playback view that I simply cannot
work through right now, since M3's typography system is horribly
restrictive.
2022-06-21 20:19:52 -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
3d19794d63
ui: remove medium button style
Remove the temporary 28dp hack that was applied to the playback bar.

This finally puts the playback bar in line with all other icon
components. The playback panel is still weird, but that's okay since
it's a full screen view and the buttons can take up more space.

Since I absolutely hate change, I had to effectively frog-boil myself
in order to do this, first downsizing the icon from 32dp to 28dp, and
then from 28dp down to 24dp. I can't believe I care about this so much.
2022-06-17 09:30:20 -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
f187900d0c
Version 2.4.0
Ready for version 2.4.0 of Auxio.
2022-06-16 15:07:44 -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
543a3ebffb
ui: fix toolbar state not persisting
Fix an issue where the collapsing toolbar would not preserve it's state
when navigating.

Apparently you need to add an ID to a view to get it's state to be
restored. There is no warning for this at all. Android, everyone.
2022-06-13 10:40:28 -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
eba9945f59
Merge branch 'dev' of github.com:ktutsch/Auxio into ktutsch-dev
Update German Translations.
2022-06-11 16:36:36 -06:00
OxygenCobalt
483d26d155
settings: make rounded covers independent
Make it so that the rounded covers option is not dependent on the show
covers option.

Rounded covers has no relation to whether to show covers (at least not
anymore with the new cover style), so it makes no sense to disable it
when show covers is turned off.

Resolves #152.
2022-06-11 16:31:23 -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
Konstantin Tutsch
1e8476b55c
Quality improvements for hectic German translations 2022-06-11 19:24:07 +02: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
244c8ec404
Merge branch 'patch-1' of github.com:Fjuro/Auxio into Fjuro-patch-1
Update Czech translations.
2022-06-04 13:12:40 -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
Fjuro
67d1668b1d
Update values-cs/strings.xml 2022-06-04 09:47:25 +02: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
9aa09620fe
Merge branch 'patch-1' of github.com:qwerty287/Auxio into qwerty287-patch-1
Improve German translations.
2022-06-02 10:48:01 -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
qwerty287
4a2c07f0e5
Improve German translation
Fix some typos in the German translation.
2022-06-02 10:36:33 +02: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
6b06afdef5
Merge branch 'patch-1' of github.com:yurical/Auxio into yurical
Add Korean translations.
2022-05-29 20:09:09 -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
Yurical
ba10e0e3e1 add Korean translation
This commit adds Korean translation for Auxio, including app
translations and F-Droid descriptions.
2022-05-30 08:09:42 +09:00
OxygenCobalt
f52fa7f338
music: cleanup implementation
Clean up the indexer implementation even further.
2022-05-29 10:09:49 -06:00
OxygenCobalt
48289ef006
all: make callbacks initialize impls
Make addCallback calls (or similar) initalize the caller by calling the
specific callback methods.

This is primarily intended as a fix to an issue where the music library
would actually reload during a warm start. This is extremely bad, but I
hope it doesn't make the app too unusable until the next version.
2022-05-28 20:00:10 -06:00
OxygenCobalt
47726c3e02
music: add exoplayer backend [#128]
Add an ExoPlayer-based metadata backend.

This backend finally allows Auxio to parse metadata internally, which
has been a highly requested feature given how many unfixable MediaStore
issues it would fix.

However, this is not fully ready for production yet. The loading
process becomes much larger with manual parsing, the current
implementation still allocates picture metadata (terrible for
efficiency), and there is no good indicator in the app to keep
track of music loading.

As a result, this backend is disabled until it can be fully integrated
into Auxio's architecture.
2022-05-28 19:52:23 -06:00
OxygenCobalt
87bdf50d39
music: clean implementation
Clean up the music implementation heavily, removing redundant code and
splitting off some code into utilities.
2022-05-28 14:49:18 -06:00
OxygenCobalt
2576fb26ba
music: introduce backend system
Move out the MediaStoreCompat interface into a full interface called
Backend.

In preparation for direct metadata parsing, it would be useful to
create some kind of object system to properly handle the capabilities
of each metadata indexing mode. Backend fulfills that by allowing
each object to implement their own query and then loading routine.

This system is designed somewhat strangely. This is firstly because
the ExoPlayer metadata backend will have to plug in to the original
MediaStore backend, so making methods more granular allows the
ExoPlayer backend to avoid some of the stupid inefficiencies from
the actual MediaStore backend, such as the genre loading process.
We also want to separate the steps of loading music in order to
more adequately show the current loading process to the user in
a future change.
2022-05-28 13:13:19 -06:00
OxygenCobalt
c6d7d8fe39
playback: implement "safe" slider wrapper
Implement a safe slider wrapper that does not crash with invalid values
as often.

Slider is a terrible component that is not designed with Auxio's
use-case in the slightest. Instead of gracefully degrading with invalid
values, it just crashes the entire app, which is horrible for UX.

Since SeekBar is a useless buggy version-specific sh******ed mess too,
we have no choice but to wrap Slider in a safe view layout that
hopefully hacks with the input enough to not crash the app when doing
simple seeking actions.

I hate android so much.

Resolves #140.
2022-05-27 14:34:14 -06:00
OxygenCobalt
852630ab38
Version 2.3.0
Ready for version 2.3.0 of Auxio.
2022-05-26 16:33:47 -06:00
OxygenCobalt
df4ecc0137
sort: add disc number sorting to other sorts
Add disc number sorting to sorts that originally sorted by track.

Forgot to add disc sorting to the other sort modes when adding disc
number support. Fix that.
2022-05-26 15:58:35 -06:00
OxygenCobalt
c0da3673c2
fastlane: update screenshots
Update app screenshots for 2.3.0. Notably, a new album screenshot has
been added showcasing the new disc functionality.
2022-05-26 15:51:17 -06:00
OxygenCobalt
f34ea7f863
deps: upgrade deps
Once again
Gradle -> 7.4.2
Spotless -> 6.6.1
Ktfmt -> 0.67
2022-05-26 10:29:41 -06:00
OxygenCobalt
b59ef1a746
info: update architecture
Update architecture to reflect the new changes made in 2.3.0.
2022-05-26 10:03:41 -06:00
OxygenCobalt
1a02aaad4b
music: use correct version impl for discs
Create separate routines to parse disc and track numbers in the most
optimal manner.

On API 30 (Android R) and above, ensure that we are using the superior
CD_TRACK_NUMBER and DISC_NUMBER database fields, while below API 30,
stick with the normal TRACK field.
2022-05-25 16:38:57 -06:00
OxygenCobalt
ae62572760
strings: update german translations
Update german translations for the strings I can translate at least
okay.
2022-05-25 13:20:50 -06:00
OxygenCobalt
444e4299d6
widgets: revert most widget changes
Revert the introduction of the thin/tiny widgets, but keep the new
cover layout I created while working on them.

There is simply no way I can cram controls and metadata within the
size bucket that the thin widget occupies. I have decided to give up
and revert the widget to it's old form.

I understand why the thin widget is not appealing. However, the sizing
at which a widget can properly accomodate a taller widget is just too
precise and not really large enough to justify it's existance.
2022-05-25 11:03:59 -06:00
OxygenCobalt
4c74879cf1
playback: use gesture insets on panel
Also use the gesture insets on playback panel.

Turns out when the panel uses normal insets, the playback panel is
extremely close to the system bars. Fix this by using the bigger
gesture insets.

Resolves #137.
2022-05-24 17:24:21 -06:00
OxygenCobalt
b320f4b1bd
widgets: add thin widget
Rework the smallest widgets to have no textual metadata, alongside
adding a new widget size class.

Turns out the last tiny widget redesign made the controls far too
small. Instead, remove the textual metadata and make these widgets
more akin to the small and wide widgets. This also introduces a new
side class alongside that with more controls, again to make it
similar to the other size classes.
2022-05-24 17:12:48 -06:00
OxygenCobalt
e1e032d254
ui: re-add accent customization >api 31
Re-add accent customization on Android 12 and above.

Previously, I disabled accent customization since I thought they were
more or less useless with the new Material You dynamic colors system.
Turns out I severely underestimated how horribly OEMs would botch the
dynamic colors system. Guess I was blinded by my adherence to the pixel
line. Re-add the accent customization for those who do not have a good
dynamic color palette at all.

Resolves #131.
2022-05-24 12:52:09 -06:00
OxygenCobalt
eb293022e8
widgets: rework tiny widget
Rework the tiny widget to cram even more information into it.

The tiny widget is nominally meant for edge cases like exceptionally
small screens or landscape mode, but apparently it's triggered on some
devices in normal use because of platform fragmentation and OEM insanity.

Update the tiny widget layout with some new buttons in order to make it
more usable in mnormal use. This is still nowehre near ideal. For
example, when triggering the layout on my device, it ends up squishing
the buttons. But it should probably work better outside of those edge
cases.
2022-05-24 10:08:12 -06:00
OxygenCobalt
485c35d74c
all: hack around more lollipop issues
Hack around more insane lollipop bugs, such as:

- The angular auxio icon crashing the system UI
- Optimized icons being corrupted
- Setting image alpha not working properly

I really wish I could drop support for this horrible version, but I
either have to wait for a major library to drop support or for the
usage numbers to reach 1%.
2022-05-22 17:12:49 -06:00
OxygenCobalt
594fa3597e
playback: add delayed action system
Replace the hodge-podge framework of state restoration and URI playing
with a single "delayed action" system.

Auxio's initialization routine is a total cluster----. This is mostly
because it involves multiple asynchronous operations such as music
loading, state restore, and service starting which tend to make it
highly prone to race conditions and other insanity.

In particular, the way Auxio would attempt to restore playback and
handle file opening was a spaghetti pile of bad API boundaries and
dubious UI code. This has not changed. I want to move this routine
to the service, but it's lifecycle is also sh------ed to such an
extent where that would be nearly impossible. Instead, this commit
introduces a new "delayed action" system that bites the bullet and
allowes PlaybackViewModel to accept a context and an action in
return for initializing playback...eventually.

I tried my best to eliminate as much memory leaks as I physically
could here, but could only go so far. Still though, even this insane
system is better than the UI-level LiveData shenanigans I did
previously, and actually works compared to the broken android
components that google keeps wanting you to use.
2022-05-22 11:55:17 -06:00
OxygenCobalt
1ac55c534e
detail: add duration sort
Add the duration sort to the detail views.
2022-05-22 10:01:16 -06:00
OxygenCobalt
2c7dd1241b
style: remove android string references
Remove references to android system strings, in favor of in-house
translations.

Previously Auxio would use the `android.R.string.ok` and
`android.R.string.cancel` strings to represent Ok and Cancel
respectively, but these system strings are actually untranslated on
some devices, so it is better for i18n if we use our own strings
for such.
2022-05-22 09:56:25 -06:00
OxygenCobalt
21fccf1f31
playback: add pre-amp customization
Implement a UI frontend for customizing the ReplayGain pre-amp value.

This finally completes Auxio's ReplayGain implementation. Not only
that, it also shows how Auxio can use positive ReplayGain values,
unlike other apps.

As a side-note, this also fiddles with the dialog style somewhat.
I got carried away.

Resolves #114.
2022-05-22 09:32:23 -06:00
OxygenCobalt
519de0e1d5
playback: add framework for handling pre-amp
Implement an internal setting for a ReplayGain pre-amp setting.

Pre-amp is a lot like above reference volume regarding Auxio's
ReplayGain implementation, where I want to implement it in order
to allow ReplayGain to graduate from being labeled "experimental".

No UI frontend has been implemented just yet.
2022-05-21 16:34:20 -06:00
OxygenCobalt
2d7dbd19cd
ui: rework custom ui components
Refactor the package structure and implementation of custom UI
components.
2022-05-21 14:52:08 -06:00
OxygenCobalt
61839405ce
home: hide tabs when there is only one
Hide the tab selector when there is only one tab.

This is mostly to remove a redundant UI element that has no purpose
when only one list is shown.
2022-05-20 20:01:14 -06:00
OxygenCobalt
28feebcec3
sort: add duration and count sorts
Add sorting modes for duration and song count.

This was requested previously in the now-closed UI/UX changes
megathread, however I have only gotten to it now.
2022-05-20 18:33:56 -06:00
OxygenCobalt
059652d2f1
all: fix misc issues
Fix miscellanious issues with documentation and the playback system
2022-05-20 11:30:56 -06:00
OxygenCobalt
9edc113ebb
Merge branch 'enricocid-it_translations' into dev
Update italian translations
2022-05-19 19:32:42 -06:00
OxygenCobalt
28cedd1240
music: attempt to handle bad DISPLAY_NAME [#120]
Add recovery code to the music indexer in the case that Android doesn't
provide the DISPLAY_NAME field.

Nominally this should never happen, but OEMs will OEM and apparently
this does happen on some devices. Try to recover by grokking DATA for
a file name.
2022-05-19 17:37:19 -06:00
OxygenCobalt
0b9141d474
sort: rework implementation
Rework the sort implementation to allow Auxio to leverage it's sorting
capabilities in a more powerful manner.

This is mostly the removal of stupid redunant methods and the change of
Sort overrides to sort in-place. This just gives us the option to avoid
full blown list copies in cases where such is reasonable.
2022-05-19 17:16:33 -06:00
OxygenCobalt
c522af546c
detail: add full disc number support
Finalize the disc number implementation within Auxio.

This is probably one of the most widely-requested features outside
of playlisting. This implementation also adds some more fine grained
sorting modes for disc numbers in particular, which actually removes
some of the quirkiness of the Sort class.

Resolves #96.
2022-05-19 16:43:01 -06:00
OxygenCobalt
04f254f91b
music: add disc number indexing
Change the indexer to parse out the disc number field from
AudioColumns.TRACK.

On newer versions, I hope to further modify the loader to use
the API 30+ CD_TRACK_NUMBER field, as it is more versatile than
TRACK.
2022-05-18 20:03:45 -06:00
OxygenCobalt
6f2a0d66c6
detail: add framework for disc number items
Add the UI and data components for a disc number value within the album
detail view.

This is the first-step of a multi-step addition to finally implement
disc numbers.
2022-05-18 17:30:50 -06:00
OxygenCobalt
5381e9f9a2
playback: remove media button reciever impl
Make MediaButtonReceiver an empty class without any behavior.

The previous manner in which Auxio would handle media button events
was actually bad, as in certain cases (like a rewind or if there was
no song playing) Auxio would actually crash, as the service would
not start a foreground state in time.

Fix this by removing that functionality. This should hopefully still
retain the current state.
2022-05-17 06:29:55 -06:00
OxygenCobalt
4a79de455a
playback: rework service components
Try to rework the playback service components to reduce race conditions
and improve readability.

This changeset has gone through a number of changes. I originally
wanted to unify all cover loading under a single "Component Manager",
but this turned out to be stupid given that the three service components
are different in nearly every way. Instead I just reworked them all
individually by introducing a new less-data race-prone image loading
framework, and moving around a bunch of code I was planning to move
around.
2022-05-16 20:37:42 -06:00
Enrico D'Ortenzio
e785f5a3a5
Update it translations 2022-05-15 16:03:16 +02:00
OxygenCobalt
d296a3aed9
all: rework formatting
Do some miscellanious formatting reworks.

1. Remove all instances of m in favor of _. _ is only used when names
collide or if something should be internal.
2. Make fragments apply their own click listeners.
3. Remove instances of inc/dec and replace them with the more
straightfoward + 1 or - 1.
2022-05-11 19:03:56 -06:00
OxygenCobalt
1a9e55e73b
about: add full library statistics
Split off the "songs loaded" about item into it's own card called
"library statistics"

This card includes the song, album, artist, and genre counts,
alongside a total duration of the music library. This is just more
informative and useful to the user.

Resolves #121.
2022-05-04 20:20:47 -06:00
OxygenCobalt
ac6a471318
playback: fix index bug
Fix some index bugs by using inc/dec instead of ++/--.
2022-05-02 18:35:26 -06:00
OxygenCobalt
e451bc9859
playback: rework state restore
Rework state restore to be more coherent and in line with the new
member layout of the general

This primarily involves making the index the primary database attribute
in favor of song, with the old song id field becoming a sanity check
field.
2022-05-02 17:43:01 -06:00
OxygenCobalt
1e7a439c31
deps: switch material to 1.6.0-rc01
Switch material components to the more stable 1.6.0-rc01. Have to deal
with android complaining, but whatever.
2022-05-01 17:54:37 -06:00
enricocid
ece5dc06c0 Italian translations
Signed-off-by: enricocid <enrico2588@gmail.com>
2022-05-01 21:44:13 +02:00
OxygenCobalt
a645c3a217
deps: upgrade deps
aaaaaaa
coil -> 2.0.0-rc03
material -> 1.7.0-alpha01
leakcanary -> 2.9.1
navigation -> 2.4.2
kotlin -> 1.6.21
agp -> 7.1.3
2022-04-29 20:14:17 -06:00
OxygenCobalt
d57f980148
playback: cleanup components
Fix miscellanious bugs and clean the component code.

Currently the components are in a strange state. They are a big ball of
mud with inconsistent lifecycles and callbacks. I want to find a way to
unify them under a single lifecycle, but the competing nature of them
makes this extremely difficult.
2022-04-29 19:53:58 -06:00
OxygenCobalt
6adc5f8715
playback: fix service state issues
Fix a bunch of miscellanious state issues with the playback fragment.
2022-04-29 16:17:26 -06:00
OxygenCobalt
8e849feb7d
playback: rename loopmode to repeatmode
Rename LoopMode to RepeatMode, which is generally much clearer
than the previous name.

This changes all non-breaking instances of "loop" in the app with
"repeat".
2022-04-29 14:52:33 -06:00
OxygenCobalt
c80af01d5c
playback: rework fields
Rework the playback fields.

The new fields are more coherent, better-named, and less prone to state
failure.
2022-04-29 14:29:56 -06:00
OxygenCobalt
2bdbe212df
playback: decouple fields and callback
Decouple the callback notifying code and the field code. This makes
code more reasonable for future changes.
2022-04-29 12:07:14 -06:00
OxygenCobalt
60367c45c3
nit: fix typos
Fix miscellanious typos.
2022-04-28 22:03:15 -06:00
OxygenCobalt
3d03bf9b7e
playback: fix position polling bug
Fix a bug where position polling would stop when the audio focus
state changed.
2022-04-28 20:04:10 -06:00
OxygenCobalt
bcec9272d3
Merge branch 'dev' of github.com:OxygenCobalt/Auxio into dev 2022-04-28 19:59:11 -06:00
OxygenCobalt
3d70028bd2
playback: remove playbackmode field
Remove the useless PlaybackMode field.

Parent does the same job, but better.
2022-04-28 19:58:39 -06:00
User_Name
21335859b2
updated translation 2022-04-09 01:34:59 +03:00
OxygenCobalt
180faa6f50
music: rework callback configuration
Rework the asynchronous aspects of MusicStore to rely on a more
conventional callback system.

In preparation for automatic rescanning, it would be more elegant
for music consumers to use a callback, so that updates can be
registered easier than if a co-routine continued to be used.
Convert MusicStore to this new model and rework the accesses of
MusicStore in-app to line up with this new system.
2022-04-07 20:18:25 -06:00
OxygenCobalt
3a19d822ce
music: rework name heirarchy
Once again rework the naming system for music, this time with it being
much easier to localize (hopefully).
2022-04-03 12:54:29 -06:00
OxygenCobalt
ab194c14c2
ui: create viewmodel for navigation
Create a ViewModel for the more complicated navigation pathways.

Normally, navigation was fragmented along a complicated stretch of
fragment hacks and DetailViewModel's navToItem attitbute, both of which
were not really that ideal. Dumpster them for a single, unified
viewmodel for the more complicated navigation situations. This removes
much of the duplicate navigation logic and is likely much more
maintainable for future situations.
2022-04-02 20:21:06 -06:00
OxygenCobalt
74f5962844
ui: rework cover style
Rework the style of all album covers in the app to be more in line with
the new track number style.

This is mostly comprised of adding a new background to all cover views
and rescaling error icons to be smaller than they would normally be.
This also includes a change in the cover/track background color from
colorSurfaceVariant to colorOnSurfaceInverse, which seems to provide
the best visibility in all cases.

These changes also apply to the track number views.
2022-04-02 18:18:10 -06:00
OxygenCobalt
e387e72b2c
detail: update album song layout
Update the album song layout to be more alike to other songs.

Recently I migrated the TextView in the album songs to use 48dp sizing,
like the other song views. However, this resulted in a lot of empty
space that felt off. Fix this by adding a light background to the track
number, which fills the room it takes up a bit more. It also hopefully
primes the track number to take an indicator once multi-select is
added.
2022-03-29 20:08:57 -06:00
OxygenCobalt
0107d9ff32
playback: remove extraneous encodings
Remove extraneous encodings from ReplayGainAudioProcessor.

According to the ExoPlayer developers, an AudioProcessor is only
provided 16-bit PCM data. This makes all of the other encodings I
had implemented in ReplayGainAudioProcessor useless, as their
cases would never run. Remove those extraneous encodings and just
just 16-bit PCM.
2022-03-29 06:27:42 -06:00
OxygenCobalt
59a56090e8
playback: add positive replaygain values
Implement support for positive ReplayGain values.

Turns out the blocker for this with the new AudioProcessor was that
I did not properly clamp PCM data when I manipulated the data,
resulting in target samples like 75491 being truncated to lower
values like 9955, which resulted in popping. This is a niche addition,
but also puts Auxio in a category that no other (FOSS) android music
player currently occupies. Yay.

Resolves #115.
2022-03-28 19:58:25 -06:00
OxygenCobalt
b4abad26cd
playback: migrate replaygain to audioprocessor
Create an AudioProcessor implementation for ReplayGain.

Now that ExoPlayer handles AudioFocus, the ReplayGain implementation
would conflict with the changes that ducking would make to the volume.
To fix this, migrate the ReplayGain implementation to a dedicated
audio processor. This not only resolves this system, but also opens the
door for positive ReplayGain values in the future. Currently however,
our method for modifying the bitstream results in popping with values
above the reference volume, so some more work must be done in that
regard.
2022-03-27 20:33:01 -06:00
OxygenCobalt
b748d73abb
playback: rework audio focus
Rework audio focus to rely on the native ExoPlayer implementation
instead of a custom implementation.

Previously, we avoided ExoPlayer's AudioFocus system as it never
played after a transient lost. A few versions later now through,
now it does, so we may as well switch to it. This does introduce
a bug where ReplayGain functionality will conflict with audio
focus, but I hope to eliminate this with #115 as I switch to
an AudioProcessor instead of a callback.
2022-03-27 11:51:58 -06:00
OxygenCobalt
e54a58c612
ui: audit null safety
Audit null safety to remove extraneous and stupid calls while
optimizing certain checks here and there.

This commit is primarily centered around the introduction of a new
utility: unlikelyToBeNull. This call uses requireNotNull on debug
builds and !! on release builds, which allows for bug catching in
an easier manner on normal builds while also allowing for
optimizations on the release builds.
2022-03-27 11:23:07 -06:00
OxygenCobalt
05a5ef5c3f
ui: migrate esoteric adapters to framework
Migrate all esoteric adapters to the new RecyclerView framework.

One of the shortcomings with the previous RecyclerView utilities was
how more esoteric adapters with data that does not implement Item
could not use the utlities. The new system, by comparison, is capable
of taking any type of data, so we can no migrate all of the esoteric
adapters to the new system.
2022-03-27 09:59:35 -06:00
OxygenCobalt
2406c371db
widgets: work around new coil scaling behavior
Fix an issue where album covers fail to load when not explicitly
specifying a size.

At some point, Coil changed some internal scaling logic to depend on
this weird pseudo-screen size value that caused the bitmap to fail
to load only on in widget creation process. Who knows why. Fix this
by explicitly specifying the size in all cases.
2022-03-26 11:43:48 -06:00
OxygenCobalt
8100f294d7
recycler: spin off data into separate class
Spin off the data instances into their own class called BackingData.

This is to isolate the sane adapters that rely on one type of diffing
from the insane adapters that use synchronous and asynchronous diffing
simultaniously. It also allows some of the more esoteric adapters to
implement their own backing data without much trouble or leaky
abstractions.
2022-03-26 11:32:54 -06:00
OxygenCobalt
ee1a234e76
ui: rework base adapter class
Completely rework the base adapter class to require less boilerplate
and properly handle cases such as diffing. The major adapters have
been migrated to this system, but the other adapters have not been
changed so far.

This is only part 1 of a multi-part rework, as this is an incredibly
complex system.
2022-03-26 10:16:36 -06:00
OxygenCobalt
595a982d59
all: cleanup
Clean up the project after the previous changes and update some
dependencies.
2022-03-23 12:27:49 -06:00
OxygenCobalt
d79592e029
all: remove databinding
Remove databinding entirely.

Databinding was a terrible idea for Auxio. I rarely leveraged it, and
when I did, it produced messy code and bloated build times. Dumpster it
for just viewbinding, which is good. This reduces building times by
nearly 2/3, and generally makes the codebase more coherent and usable.
2022-03-23 10:59:01 -06:00
OxygenCobalt
95057ec357
all: move all fragments to ViewBindingFragment
Move all fragment instances to the new ViewBindingFragment paradigm,
which should help immensely with reducing memory leaks from list
bindings and to really alleviate the overloaded onCreate functions.
2022-03-23 09:18:08 -06:00
OxygenCobalt
8f38ed6ee5
playback: rework view implementations
Rework the playback views to follow the new idioms I want to use for
Auxio.

This change mostly consists of flattening away some of the custom
views, removing databinding, and using a general viewbinding
fragment that I hope to extend to the entire app.
2022-03-21 20:15:42 -06:00
OxygenCobalt
e4d4266e35
playback: rework playback slide up implementation
Rework the playback slide up implementation to be more straightfoward.

This is really composed of stylistic improvements, very little in
actual behavior changes. This does re-introduce a regression when
nothing is playing where the scroll position will become off when
rotating, but that desynchronization happens often so unless I were
to completely migrate both the panel and the bar to a view, I don't
really see it as an issue.
2022-03-20 12:33:49 -06:00
OxygenCobalt
608112a7ac
all: migrate to centralized constant table
Migrate to a centralized constant table for easier management.

Previously, Auxio would tie constants to the class itself, which
led to a largely disjointed system that relied on an internal table
so that it would stay sane. This commit moves all of those constants
to a single table for easier usage and management.
2022-03-19 20:05:57 -06:00
OxygenCobalt
9be97bb329
Merge branch 'dev' of https://github.com/kontillion/Auxio into kontillion-dev
Updated German translation
2022-03-19 18:48:50 -06:00
OxygenCobalt
9c07ad2d34
sort: completely rework class
Completely refactor the Sort class to be more efficient and
straightforward.

The original Sort class had *major* shortcomings, it was slow,
poorly organized, and relied on abusing compareBy to implement
special things like article sort. This rework eliminates all of
that in favor of a new system relying on custom comparators and
chaining to achieve something much faster and maintainable.
2022-03-19 15:44:11 -06:00
OxygenCobalt
90f10f2a84
home: clean up fast scroller
Clean up the fast scroller implementation to remove dead code and
be more coherent in general.
2022-03-19 10:59:13 -06:00
Konstantin Tutsch
67f90a9494
Improved language quality of german translation 2022-03-17 20:53:43 +01:00
Konstantin Tutsch
4f4b493fb6
Added german translation for headset autoplay feature 2022-03-17 20:50:53 +01:00
Konstantin Tutsch
c00b078fcf
Updated German translation
Translation for rounded covers and the restart button
2022-03-17 16:12:11 +01:00
OxygenCobalt
484f5c8490
Merge branch 'dev' of https://github.com/cccClyde/Auxio into cccClyde-dev
Update strings translation for zh-rCN.
2022-03-15 06:25:47 -06:00
OxygenCobalt
0417a77b33
music: make resolvedName standard
Make resolvedName the standard name to use across all music items.

Previously, the way Auxio differentiated between names in UIs was to
use name for normal items and resolvedName for parents. This was odd
and disjointed, as it muddled the meanings of the two fields and lead
to a lot of bugs. Fix this by making resolvedName *the* standard name
to use across all music items, even in ones that don't have to resolve
their name.
2022-03-13 20:22:19 -06:00
OxygenCobalt
2ff7d93263
all: view cleanup
Do even more cleanup regarding views.
2022-03-13 18:56:24 -06:00
OxygenCobalt
33da09a08a
all: switch to spotless
Switch to the spotless linter with ktfmt used as a backend instead of
ktlint.

This switch was done for two reasons:
1. ktfmt is more thorough than ktlint
2. License headers can be added more effectively with spotless than
the default Android Studio behavior.

Dump all of the changes now so I don't have to deal with it over a long
period of time. I don't care.
2022-03-13 17:38:19 -06:00
OxygenCobalt
627ab97948
all: cleanup
A bunch of small changes that have accrued over the last week due to
having more or less no time to work on Auxio.
2022-03-13 16:42:03 -06:00
Clyde
2d9d986697
Update strings.xml
Update translations for zh-rCN
2022-03-12 09:03:37 +08:00
Clyde
b662d2e59d
Merge branch 'OxygenCobalt:dev' into dev 2022-03-12 08:47:34 +08:00
OxygenCobalt
82247775ac
Version 2.2.2
Ready for version 2.2.2 of Auxio.
2022-03-08 16:19:02 -07:00
OxygenCobalt
3293637cfd
all: minor cleanup
Do some minor cleanup before the next release.
2022-03-08 16:13:59 -07:00
OxygenCobalt
7b5c49a5b3
ui: disable default actions in drag helpers
Disable the default long-press action in the ItemTouchHelper usages.

ItemTouchHelper provides a long-press action to start an item drag by
default. However, because Auxio adds a drag handle on top of this
action, this actually results in a conflict with the default behavior
in certain cases. Replace it with a custom version of the long-press
action within the viewholders themselves.
2022-03-07 08:33:49 -07:00
OxygenCobalt
d3d6d18d5d
music: fix crash below android 8 [#95]
Fix a crash that stemmed from the use of the API 30+ database field
CD_TRACK_NUMBER.

I switched to CD_TRACK_NUMBER in 1e39ceb to fix [#88], however I did
not realize that CD_TRACK_NUMBER was actually only supported on API
30 onwards. This led to a load failure on versions before API 30.
2022-03-07 07:18:15 -07:00
OxygenCobalt
b5b8767f46
playback: fix crash with state restore [#89]
Fix an esoteric crash with queue synchronization during the playback
restore process.

Auxio will attempt to re-synchronize the queue index whenever it is
desynchronized, however during the check for if it's desynchronized,
Auxio would do a direct index of the queue, which could result in a
crash in situations where the desynchronized index is outside of the
queue bounds.

Fix this by replacing that unprotected access with a protected access,
which not only fixes the crash but also still correctly detects
desynchronization in that case.

Resolves #89.
2022-03-06 19:25:48 -07:00
OxygenCobalt
1b791074ec
playback: replace headset focus with headset autoplay
Turn the headset focus setting into the headset autoplay setting.

The way auxio handles headsets is...odd. Sometimes the MediaSession
handles it and Auxio could not care less, and sometimes Auxio actually
needs to handle it. As a result, the idea of being able to disable
headset focus is more or less moot because it will only apply to some
devices and not others.

On the other end, the way Auxio automatically begins playback once a
headset is plugged in is also quite weird. It only works on wired
headsets, and when it does, it overrides all other apps that might
also be playing audio. It's not to say that it's a bad feature, but
it's also one that I don't want to make the defualt. Auxio should
still play along within the confines of Android's expectations, after
all.

Replacing the existing "Headset focus" setting with a new "Headset
autoplay" setting solves both of these issues, as it prevents a
mis-guided disabling of the setting that doesn't actually disable
the feature and it relegates the quirky autoplay behavior to an
setting not enabled by default.
2022-03-05 20:34:12 -07:00
OxygenCobalt
6d003c308b
playback: fix headset focus autoplay issue
Fix an issue where headset focus would result in unexpected playback
whenever the service started.

AudioManager.ACTION_HEADSET_PLUG seems to always fire when the initial
BroadcastReceiver is set up, which results in a weird bug where if a
wired headset is connected while PlaybackService is started, playback
will start immediately, which was not user friendly.

I fear that this may result in an edge case that results in headset
focus not firing in an unrelated situation, which in that case I would
be forced to remove headset autoplay entirely (or at least relegate it
to a quirk option).
2022-03-03 18:47:55 -07:00
OxygenCobalt
1e39ceb9fc
music: add more failsafes to loading process
Add even more checks and guards to the music loading process to ensure
proper metadata loading.

Auxio has always had issues handling track numbers and years, mostly
with ensuring their validity. This change resolves them by more or less
surrounding them with gobs of null-checks and fallible parsing
routines, which should help avoid frustrating bugs and crashes with
metadata in the future.

Resolves #88.
Resolves #84.
2022-03-01 19:52:28 -07:00
OxygenCobalt
dbe0bd1bb3
ui: revert list item changes
Revert the removal of the song/artist values from list items for now.

The current plan of removing extraneous values from songs and albums
only works if I add multi-select and a dedicated menu button, but that
is still in the air, and in general I want feedback before I go ahead.
Aside from reverting the previous changes, this actually standardizes
all item descriptions under a single bullet point formatting system,
instead of the mix of commas and bullet points that existed beforehand.
2022-02-28 19:27:57 -07:00
OxygenCobalt
a408cc629d
strings: remove redundant spanish translation
Remove the strings.xml.old file in the spanish translations.

This was generated from vim when #87 was created. It's redundant, so
remove it.
2022-02-28 19:01:12 -07:00
n-berenice
88f815ed9f Redone from scratch
Previous file was too incomplete and had too many mistakes in order to be fixed, fully redone.
2022-02-28 22:12:56 -03:00
OxygenCobalt
d7babcba71
ui: remove album name from song items
Remove the album name from the main song item in favor of a duration
value.

Auxio has traditionally used "Artist . Album" for song items. However,
this had some shortcomings:
1. The way the artist and album names are packed probably results in
truncation on small screens, which I doubt is very helpful.
2. All other items in Auxio have only one specific "subject" per line,
which makes the song items a bit of an outlier since it has two (the
artist and the album)
3. The empty space available could be used for another UI element,
such as a duration or maybe a menu button in the future.

For consistency, this also removes the song count from all album items
as well.
2022-02-25 08:12:26 -07:00
OxygenCobalt
c5be39774a
ui: remove memberBinding [#80]
Remove all usages of memberBinding from the app.

For some reason, certain devices running Android 10 and lower will
have a lifecycle race condition whenever the theme is mis-matched.
This ends up resulting in an invalid state whenever memberBinder was
used. Since we can't replace memberBinder with a better solution,
just dumpster the whole thing. This platform is so god damn broken,
jesus christ.

Resolves #80.
2022-02-24 19:31:48 -07:00
OxygenCobalt
fc4c7714a2
deps: upgrade
Wheeeeeee
ExoPlayer -> 2.17.0
Coil -> 2.0.0-alpha09
Ktlint -> 0.44.0
2022-02-24 15:17:31 -07:00
OxygenCobalt
9171f9a3b4
coil: make mosaics use squareframetransform
Change createMosaic to use SquareFrameTransform.

This should help fix a theoretical bug where non-1:1 album covers will
be oddly stretched in a generated mosaic, as all album covers will be
forcefully cropped to a 1:1 ratio.
2022-02-24 14:58:59 -07:00
OxygenCobalt
61dbfe3185
coil: make rounded images more nuanced
Create a custom view for rounded images, making them more nuanced in
the process.

The previous method for applying rounded images in-app was generally
clunky and fragile. Introduce a new custom view that actually takes a
cornerRadius attribute from the ImageView itself that then applies it
whenever the user enables the setting. This also allows rounded images
to be more nuanced, as typical 8dp elevation can be used for small
views and a more fitting 16dp radius can be used for large views.
2022-02-23 17:42:34 -07:00
OxygenCobalt
280b582efa
home: rework fab adaptiveness
Rework how the fab's adaptive functionality works.

Handle fab adaptiveness by using a style instead of a fully custom
view. This helps eliminate a usage of private resources.
2022-02-23 16:13:59 -07:00
OxygenCobalt
87035805d2
ui: general cleanup
Clean up a bunch of UI issues that have accumulated.
2022-02-23 15:26:40 -07:00
OxygenCobalt
22258a3e6b
style: add disabled state to switches
Add a disabled state to the M3 switches.
2022-02-22 17:44:56 -07:00
OxygenCobalt
35b75b5f81
music: rename BaseModel to Item
Rename BaseModel to Item to make the meaning of it clearer.
2022-02-22 17:44:36 -07:00
OxygenCobalt
3aaa2ab0e0
all: rework logging
Rework logging to be clearer and more standardized.

Rework all usages of lossing to follow a single unified style,
introducing a new "warn" option alongside this.
2022-02-22 17:24:51 -07:00
OxygenCobalt
e1dbe6c40c
coil: force all images to a 1:1 aspect ratio
Crop all images to a 1:1 aspect ratio.

Sometimes cover art will not be a square. I never realized this because
all covers in my music library are square. This led to many strange bugs
that I would rather avoid, so create a new transformation that crops the
image to a 1:1 aspect ratio.

The reason why we use a transformation is that it won't be dependent on
the actual state of the ImageView, which is what would happen if we
used ScaleType.CENTER_CROP. In the case that we use a very weird hacky
ImageView like in the widgets, doing such would result in any cropping
not actually working correctly. It's better to do it in the
Transformation stage simply to ensure consistency.
2022-02-21 20:00:30 -07:00
OxygenCobalt
6fc3c9374c
style: rework dynamic colors
Allow the material library to handle dynamic colors.

Turns out I was mis-understanding how DynamicColor themes were meant to
be used by the material library. Turns out you can just inherit from it
and it will work perfectly fine. Refactor the V31 styles to remove our
insane shims and finally fix the slapdash dynamic color usage across
the main theme and widgets.
2022-02-21 17:07:06 -07:00
OxygenCobalt
9304e58190
playback: rework playback icon visibility
Add a circular indicator to playback icons.

Sometimes it can be too difficult to tell apart the active and inactive
states of the shuffle/loop icons. However, there is really no good way
to improve the contrast on these icons without some kind of muddled UX
fragmentation, or god-awful design. Try to settle on the okay-est
version, which is to use colorPrimary with a dot indicator on views we
control, and use a more muddled semi-transparent icon on views we don't
control, like notifications and widgets.
2022-02-21 16:36:08 -07:00
OxygenCobalt
2a74ff906c
style: enable drop shadows before api 28
Re-enable drop shadows on the playback bar and queue items on API 27
and lower. This is mostly to make Auxio line up with the M3 styles as
a whole.
2022-02-19 11:06:10 -07:00
OxygenCobalt
f5478018c5
deps: upgrade deps
Round and round
Lifecycle -> 2.4.1
Media -> 1.5.0
Navigation -> 2.4.1// TODO: Downgrade back to 2.4.1 when it is out
2022-02-19 10:13:26 -07:00
OxygenCobalt
ddc6428455
Version 2.2.1
Ready for version 2.2.1 of Auxio.
2022-02-18 19:06:00 -07:00
OxygenCobalt
d4513293a7
all: cleanup
General app cleanup.
2022-02-18 19:03:25 -07:00
OxygenCobalt
83dc6cd4c9
app: expose file opening intents better [#78]
Copy-paste some extra fields onto the file opening intent filter as to
[hopefully] get Auxio to be recognized by OEM skins better.

Some OEM skins don't seem to do a basic query for an app that matches
the APP_MUSIC category. Instead, they do some insane query for apps
that match this specific file intent structure that Auxio does not fit
for whatever reason. Try to graft some manifest features from the MPV
android app to make Auxio correctly expose this. I have no idea if this
will actually do anything.
2022-02-15 19:27:44 -07:00
OxygenCobalt
5b57d77d02
playback: disable audio focus setting on api 31
Disable the ability to customize audio focus on Android 12 and up.

Android 12 automatically regulates audio streams even further than it
did in previous versions, to the point where the audio focus setting
no longer makes sense on that version. I may extend the removal to all
versions in the future.
2022-02-15 06:33:21 -07:00
OxygenCobalt
30ad7f99db
playback: fix headset focus bug
Fix an issue where headset focus would restart playback unexpectedly.

At some point during the broadcast refactor, I accidentally switched
the values of CONNECTED and DISCONNECTED when handling
AudioManager.ACTION_HEADSET_PLUG. This resulted in playback starting
for no reason in some situations.
2022-02-14 19:46:04 -07:00
OxygenCobalt
ec358a13e3
style: apply body typography
Use body typography in more places, reworking the letter spacing as to
make it more pleasent to use with the inter typeface.

This should hopefully be the last time I fret over typography.
Everything should line up in the way desired by M3.
2022-02-13 15:39:34 -07:00
OxygenCobalt
f377e144dd
style: remove elevation from toolbars
Remove the elevation component from all toolbars and the bottom bar.

Material3 states that top and bottom app bars should not cast a drop
shadow. Auxio ignored this and used one anyway. This largely stemmed
from incorrect use of the AppBarLayout styles, which were mostly just
incorrect M2 styles with a new background plastered over. Fix this
by creating a new style that inherits the proper M3 styles and then
using that on all AppBarLayout instances in the app.
2022-02-10 17:34:03 -07:00
OxygenCobalt
04bec3161f
music: modify model configuration
Do a couple things to the music models:
1. Make the genre field non-nullable. This is because I beleive I've
largely eliminated the genre bugs in previous versions and future ones
can be caught with a crash screen I plan to add.
2. Make the initial album grouping process use hashCode instead of a
pair of names. This just helps with loading speed in general, albeit I
am slightly worried that it may result in improper grouping if some
edge case appears.
2022-02-08 06:56:49 -07:00
OxygenCobalt
f4217a337a
style: tweak body typography
Apply body typography in new places in the app.

For awhile, Body and Title typography were used interchangeably, as
they occupy the same text size range. This commit defines the Body
text as to be used for one-line widgets or tertiary widgets, while
the Title text is defined to be used for multi-line or heading widgets.
2022-02-08 06:23:43 -07:00
OxygenCobalt
4a326cc4ff
all: fix sloppy code
Fix some dumb and sloppy code that I made in the rush to complete
2.2.0.
2022-02-07 20:08:18 -07:00
Clyde
245e0f5dc1
Update strings.xml
Update zh-rCN translations accordingly with the latest `strings.xml`.
2022-02-07 06:22:29 -07:00
Clyde
0a9c7124db
Update strings.xml
Update zh-rCN translations accordingly with the latest `strings.xml`.
2022-02-07 12:26:22 +08:00
OxygenCobalt
4d384f4cbd
Version 2.2.0
Ready for version 2.2.0 of Auxio.
2022-02-06 19:23:54 -07:00
OxygenCobalt
a51f1aa5b9
pref: fix application of m3 switches
Fix an issue with M3SwitchPreference where the switch would not update
properly.

When reacing M3SwitchPreference, I wanted to make an optimization
regarding updating the switch to M3, so I decided to make the
preference check if they have already applied the switch, and then
ignore it if that's the case. However, I ended up forgetting that
ViewHolders tend to need to be re-bound, which resulted in this
optimization leading to inconsistent application of the M3 switches.
Fix this by removing that optimization.
2022-02-06 19:20:29 -07:00
OxygenCobalt
d9e2d7f07a
docs: rework contribution info
Update the contribution information and templates.

The contribution information and templates were growing a bit stale,
given that they haven't gotten a refresh since ~1.3.0. This commit
reworks them to be more thorough and straightfoward.
2022-02-06 14:33:36 -07:00
OxygenCobalt
470187422a
docs: add changelog
Add a CHANGELOG document that keeps track of the past and current
release notes.

Making all of our releases rely on GitHub to keep track of them is not
really a good idea, so this document serves as a record of past release
changelogs just as a pre-caution. It also allows a live preview of the
next version whenever something is changed.
2022-02-06 14:01:03 -07:00
OxygenCobalt
8e0d27696d
detail: improve track number handling
Improve the way track numbers are handled in the album detail view.

Previously, Auxio would show track numbers by simplying stringifying
the integer and then showing it in a TextView. This was problematic for
two reasons:
- Numerics from other languages like Arabic would not be respected
- Invalid track numbers [e.g 0] would be shown regardless of the
situation.

This commit fixes that by placing all track numbers through a format
string first, and showing a generic song icon instead of a number
whenever the track number is 0.
2022-02-06 11:19:50 -07:00
OxygenCobalt
4b919b121a
util: rework context utilities
Completely rework the Context extensions for resources.

Previously, Auxio has used a strange hodge-podge of context extensions
and verbose code to get resources. Fix this by unifying most of the
resource accesses under a single, unified set of extensions. The only
ones excluded for now is the getString call, as that is used in far too
many places to effectively replace.
2022-02-06 10:45:40 -07:00
OxygenCobalt
bd099aee7b
deps: upgrade
Like a while loop with no escape
Navigation -> 2.5.0-alpha01 [workaround for AGP 7.1]
Preference -> 1.2.0
Fragment -> 1.4.1
2022-02-06 09:08:10 -07:00
OxygenCobalt
0209e526e1
all: general cleanup
Do some general code cleanup.
2022-02-06 09:01:51 -07:00
OxygenCobalt
4d22b99577
playback: re-add index correction
Re-add index correction, albeit with a new system that accomodates the
single queue mechanism.

The issue with using the previous queue mechanism for the single queue
was that it risked using the index of an incorrect duplicate song, as
the search would always start at index 0. Fix this by implementing a
sort of "wobbly" search that starts at the current index and moves back
and forth, checking the closest items first and the furthest items
last.
2022-02-05 11:40:45 -07:00
OxygenCobalt
685d3af12f
settings: remove 1.4.0 compatibility
Remove 1.4.0 setting migrations.

It's been nearly a year. Everyone should have migrated by now.
2022-02-05 11:01:03 -07:00
OxygenCobalt
b047b50411
settings: add option to force-reload the app
Add an option to force-reload the app.

Currently, Auxio will load music once and then never re-load it. This
is a really decision I made early on and now regret completely. The
only way to remedy this properly is to create an automatic rescanning
system, but that is a major technical undertaking that I want to save
for later.

Resolves #71.
2022-02-05 10:30:03 -07:00
OxygenCobalt
0a216def1b
strings: tweak arabic translations
Fix the plurals and audit RTL usages in the arabic translations.
2022-02-05 10:06:13 -07:00
OxygenCobalt
4774fbaa4e
Merge branch 'dev' of https://github.com/hasanpasha/Auxio into arabic-dev 2022-02-05 09:49:52 -07:00
OxygenCobalt
92ac7d9a9d
strings: rework russian translations
Improve the russian translations for this app.

These translations were proposed by lisiczka43 with the following
rationale:

"[use] less literal translations, [use] shorter wording to fit into UI
elements,  [correct] mistranslations, [improve] consistency of
terminolgy, [enforce] strict ё, [add] missing new strings"

Apparently the previous russian translations were quite Amateurish.
This should make them better.
2022-02-05 09:45:18 -07:00
OxygenCobalt
20245db261
style: update inter
Update the inter font to v3.19.
2022-02-05 09:23:37 -07:00
OxygenCobalt
b121b6428d
music: refactor music grouping
Completely refactor the way music is grouped up into artists and
albums.

The issue with previous attempts at implementing better artist
management was the reliance on MediaStore IDs in many parts of the
program. Dumpster this by merging the hash and ID values into a
single field that is garunteed to be unique enough. This allows songs
to be adequately grouped into case-insensitive artists while also
deduplicating albums that may have been split my MediaStore due to
heterogeneous formats.

Resolves #66.
2022-02-04 20:55:48 -07:00
hasanpasha
bdaa0519d8 add arabic tranlation 2022-02-04 14:49:54 +03:00
OxygenCobalt
6e00fd1129
music: merge duplicate albums [#66]
Move all duplicate checking to the album creation stage, adding a new
check for duplicate albums.

Album names can be similarly duplicated as artist names, most often
when one has an album consisting of multiple differing file formats.
This commit fixes that by grouping albums up by their ID as usual,
but then merging together albums that have the same (lowercase) album
name and (lowercase) artist name.
2022-02-03 20:05:20 -07:00
OxygenCobalt
433d623f14
strings: fix improper usage of plurals
Use a proper composition of the "many" and "other" fields in the plural
fields of specific languages.

In the french/czech plural configuration, both "many" and "other" are
used for string fields. The lint does not make this obvious, so in
d7f34e6 I ended up switching the "other" field to "many". This resulted
in some devices on those languages crashing. To fix this, we define
the "many" and "other" fields with the same value to avoid a crash.

Resolves #69.
2022-02-02 07:17:28 -07:00
OxygenCobalt
3c9ffd5946
style: re-add inter
Re-add the inter typeface.

It's not good design to have two similar typefaces, so I may as well
revert back to Inter once and for all. It's too good of a typeface
compared to the mess of Roboto and other native fonts.
2022-01-30 20:31:40 -07:00
OxygenCobalt
9514f17bc7
music: group artists case-insensitively [#66]
Group up album artists case-insensitively.

Music files from the same artist may format the artist differently, such as being
in uppercase/lowercase forms. If we have already built an artist that has a
functionally identical name to another artist, then simply merge the artists
instead of keeping them separate.
2022-01-30 17:29:42 -07:00
OxygenCobalt
50a2305f63
music: respect individual artist names [#66]
Modify the music loader to use the normal artist name when using song
titles while still retaining album artist functionality.

Oftentimes music files will be tagged as to use the artist tag to
specify performers, collaborators, and others, and then use the album
artist tag to group them up into a single artist. Previously, Auxio
would only use the album artist tag, which flattened the collaborator
information out for consistency. Resolve this by implementing a sort
of "resolved artist name" for songs that is used in the UI and nowhere
else. This seems to work well, but at the same time further ruins the
API surface for handling music objects. An acceptable price to pay
for a better UX.
2022-01-30 16:46:11 -07:00
OxygenCobalt
50f6f8f348
style: migrate body type to roboto
Migrate to the native roboto typeface on body elements.

Migrating to the native typeface saves on APK size, contributes to a
more native look and feel, and create a more compact UI for smaller
devices. Inter Semibold remains as the "Flair" type that distinguishes
Auxio from other apps.
2022-01-29 10:25:35 -07:00
OxygenCobalt
44c53d96f3
Version 2.1.0
Ready for version 2.1.0 of Auxio.
2022-01-28 19:22:18 -07:00
OxygenCobalt
d540773664
deps: fix aar issues
Fix insane build issues with the new aar system through means that I
really don't understand.
2022-01-27 19:41:25 -07:00
OxygenCobalt
5b5aa24f5c
deps: use aar
Bundle our custom ExoPlayer components into aar instead of directly
depending on the project. This just makes things far better regarding
ease of use and reproducible builds.
2022-01-27 15:05:45 -07:00
OxygenCobalt
f2e4a3a369
deps: move exoplayer to app
Move ExoPlayer from a top-level directory to srclibs.
2022-01-26 19:56:38 -07:00
OxygenCobalt
d7f34e6b94
all: migrate to api 32
Actually migrate to API 32 [Android 12L], co-inciding with the upgrade
of my studio install and the android gradle plugin. Alongside this, add
a bunch of fixes for lints that the new studio picked up.
2022-01-25 18:59:16 -07:00
OxygenCobalt
317b12579c
playback: expose media button receiver
Expose a custom MediaButtonReceiver that handles the media button
intent. This is not because I wanted to implement this. Some apps
like gadgetbridge just blindly query ACTION_MEDIA_BUTTON instead of
relying on the more modern MediaController API, which I expected
most apps would use instead.

Resolves #62.
2022-01-25 17:20:26 -07:00
OxygenCobalt
c9f789e388
revert "style: migrate to roboto"
I want to hold off with this migration actually. I feel like it's too
jarring of a change to be included as of right now.
This reverts commit 50170f202e.
2022-01-23 12:42:49 -07:00
OxygenCobalt
3de5fecf4a
coil: gracefully handle file handling failures
Wrap the basic fetchArt call in a try statement to prevent exceptions
from being unable to open a file from propagating outwards. This allows
us to safely degrade when creating mosaics.
2022-01-23 11:30:26 -07:00
OxygenCobalt
b04611c3be
playback: fix media intent detection [#62]
Some apps query for media apps by checking for apps that have a
BroadcastReciever that handles the ACTION_MEDIA_BUTTON intent. However,
Auxio does not have a custom media button reciever, instead relying on
the androidx media button reciever. This resulted in Auxio not showing
up in apps like GadgetBridge. Fix this by exposing the androidx media
button reciever in the manifest, which allows this app to be detected.
2022-01-23 11:04:27 -07:00
OxygenCobalt
c98d131316
style: implement m3 switches
Implement a facimile of the new Material 3/You switches in the settings
menu. There's no defined spec for this yet, so I just shamelessly ripped
the implementation from Doodle.
2022-01-23 10:56:34 -07:00
OxygenCobalt
50170f202e
style: migrate to roboto
Dumpster Inter in favor of Roboto. This is mostly for three reasons:
1. Reduces the insane typography setup that Auxio uses
2. Reduces total app size since .ttf files are pretty large and the
dynamic fonts feature was proprietary.
3. Creates a more cohesive look and feel given that nearly every
android app also uses Roboto.
2022-01-23 10:17:47 -07:00
OxygenCobalt
eadf4cc86d
detail: extend smart queue disabling to detail
Add the queue disabling functionality from 47fca78 to the album detail
fragment as well.
2022-01-21 19:59:00 -07:00
Clyde
c8f1fd1094
Update strings.xml
Complicated Simplified Chinese localization accroding to the latest strings from `/app/src/main/res/values/strings.xml`.
2022-01-21 15:00:22 +08:00
OxygenCobalt
47fca7819f
ui: disable queue adding if no playback
If theres no playback going on, disable the play next/add to queue
options, as they will have no effect. This mostly for QoL purposes.
2022-01-19 06:52:05 -07:00
OxygenCobalt
e5901fa9e2
playback: use gesture insets in playback layout
When using gesture navigation, swipe up events might conflict with the
slide up behavior of the playback layout. To fix this, inset the
playback bar based on the gesture insets instead of the system bar
insets.
2022-01-18 19:51:06 -07:00
OxygenCobalt
e4f2906767
deps: upgrade deps
Material -> 1.5.0 [Finally]
ConstraintLayout -> 2.1.3
2022-01-17 16:49:20 -07:00
OxygenCobalt
95e8b06f19
style: extend edge-to-edge on all versions
Extend edge-to-edge to versions below Android Oreo. This is done
through tinting the navigation bar colors on those versions,
circumventing the coloring issue.
2022-01-15 20:12:23 -07:00
OxygenCobalt
4dcc3c3b69
playback: fix queue adding with one-song queues
Fix an issue where with queues of one-song, adding another song with
"Play next" results in it going behind the current song. This stemmed
from a fix for a crash with empty queues, so instead of doing some
insane min/max logic we just check if the queue is empty and just don't
add the item if it is. It will only get overwritten anyway.
2022-01-13 20:24:02 -07:00
OxygenCobalt
ddf2757cb6
playback: add dynamic replaygain mode [#7]
Add a "Dynamic" replaygain mode inspired by the FooBar2000 plugin. This
will automatically determine whether the playback is in an album or not
and use the album gain or track gain accordingly.
2022-01-13 20:15:22 -07:00
OxygenCobalt
5359c819bd
prebuild: reformat
Reformat the prebuild file, which apparently decided to format
themselves with indents instead of spaces. Fun.
2022-01-09 19:00:55 -07:00
OxygenCobalt
2f190f1e0b
playback: use custom exoplayer
Use a custom ExoPlayer fork with the FLAC extension enabled. This
greatly improves the listening experience, as it enables metadata
support on OGG files and FLAC files to be played below API 27.
2022-01-09 12:27:18 -07:00
OxygenCobalt
5e3569d173
all: general cleanup
General cleanup. About to do another major playback change, so
push these changes now so they are not changed later.
2022-01-09 08:22:14 -07:00
OxygenCobalt
d4904136c0
search: open kb only when created
Make it so that the keyboard is only opened on the search view when
it's initially created instead of when it's loaded from the
backstack. This is just nice for overall UX.
2022-01-08 09:46:50 -07:00