docs: update metadata
Update metadata in preperation for 2.0.0.
|
@ -41,6 +41,7 @@ I primarily built Auxio for myself, but you can use it too, I guess.
|
||||||
- Genres/Artists/Albums/Songs support
|
- Genres/Artists/Albums/Songs support
|
||||||
- Intuitive queue system
|
- Intuitive queue system
|
||||||
- Reliable playback state persistence
|
- Reliable playback state persistence
|
||||||
|
- Material You (Android 12+ only)
|
||||||
- Edge-to-edge (Oreo+ Only)
|
- Edge-to-edge (Oreo+ Only)
|
||||||
- Embedded covers support
|
- Embedded covers support
|
||||||
- Search Functionality
|
- Search Functionality
|
||||||
|
@ -52,7 +53,6 @@ I primarily built Auxio for myself, but you can use it too, I guess.
|
||||||
|
|
||||||
- Playlists
|
- Playlists
|
||||||
- Liked songs
|
- Liked songs
|
||||||
- Improved tablet layouts
|
|
||||||
- More notification actions
|
- More notification actions
|
||||||
- And other things, probably
|
- And other things, probably
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,8 @@ import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.Button
|
|
||||||
import androidx.activity.OnBackPressedCallback
|
import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.core.content.res.ResourcesCompat
|
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
import androidx.navigation.findNavController
|
import androidx.navigation.findNavController
|
||||||
|
@ -106,12 +104,11 @@ class MainFragment : Fragment(), PlaybackLayout.ActionCallback {
|
||||||
musicModel.loaderResponse.observe(viewLifecycleOwner) { response ->
|
musicModel.loaderResponse.observe(viewLifecycleOwner) { response ->
|
||||||
// Handle the loader response.
|
// Handle the loader response.
|
||||||
when (response) {
|
when (response) {
|
||||||
// OK, start restoring playback now
|
// Ok, start restoring playback now
|
||||||
is MusicStore.Response.Ok -> playbackModel.setupPlayback(requireContext())
|
is MusicStore.Response.Ok -> playbackModel.setupPlayback(requireContext())
|
||||||
|
|
||||||
// Error, show the error to the user
|
// Error, show the error to the user
|
||||||
is MusicStore.Response.Err -> {
|
is MusicStore.Response.Err -> {
|
||||||
|
|
||||||
logD("Received Error")
|
logD("Received Error")
|
||||||
|
|
||||||
val errorRes = when (response.kind) {
|
val errorRes = when (response.kind) {
|
||||||
|
@ -124,13 +121,6 @@ class MainFragment : Fragment(), PlaybackLayout.ActionCallback {
|
||||||
binding.root, getString(errorRes), Snackbar.LENGTH_INDEFINITE
|
binding.root, getString(errorRes), Snackbar.LENGTH_INDEFINITE
|
||||||
)
|
)
|
||||||
|
|
||||||
snackbar.view.apply {
|
|
||||||
// Change the font family to semibold
|
|
||||||
findViewById<Button>(
|
|
||||||
com.google.android.material.R.id.snackbar_action
|
|
||||||
).typeface = ResourcesCompat.getFont(requireContext(), R.font.inter_semibold)
|
|
||||||
}
|
|
||||||
|
|
||||||
when (response.kind) {
|
when (response.kind) {
|
||||||
MusicStore.ErrorKind.FAILED, MusicStore.ErrorKind.NO_MUSIC -> {
|
MusicStore.ErrorKind.FAILED, MusicStore.ErrorKind.NO_MUSIC -> {
|
||||||
snackbar.setAction(R.string.lbl_retry) {
|
snackbar.setAction(R.string.lbl_retry) {
|
||||||
|
|
|
@ -48,7 +48,6 @@
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/about_auxio_icon"
|
android:id="@+id/about_auxio_icon"
|
||||||
style="@style/Widget.Auxio.Image.Small"
|
style="@style/Widget.Auxio.Image.Small"
|
||||||
android:layout_marginStart="@dimen/spacing_medium"
|
|
||||||
android:layout_marginTop="@dimen/spacing_medium"
|
android:layout_marginTop="@dimen/spacing_medium"
|
||||||
android:contentDescription="@string/desc_auxio_icon"
|
android:contentDescription="@string/desc_auxio_icon"
|
||||||
android:src="@mipmap/ic_launcher"
|
android:src="@mipmap/ic_launcher"
|
||||||
|
@ -75,8 +74,8 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/spacing_small"
|
android:layout_marginTop="@dimen/spacing_small"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:paddingStart="@dimen/spacing_small"
|
android:paddingStart="@dimen/spacing_medium"
|
||||||
android:paddingEnd="@dimen/spacing_small"
|
android:paddingEnd="@dimen/spacing_medium"
|
||||||
android:text="@string/info_app_desc"
|
android:text="@string/info_app_desc"
|
||||||
android:textAppearance="@style/TextAppearance.Auxio.BodyLarge"
|
android:textAppearance="@style/TextAppearance.Auxio.BodyLarge"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
|
|
@ -164,5 +164,12 @@
|
||||||
<string name="def_playback">Keine Musik wird gespielt</string>
|
<string name="def_playback">Keine Musik wird gespielt</string>
|
||||||
<string name="def_widget_song">Liedname</string>
|
<string name="def_widget_song">Liedname</string>
|
||||||
<string name="def_widget_artist">Künstlername</string>
|
<string name="def_widget_artist">Künstlername</string>
|
||||||
|
<string name="set_lib_tabs">Bibliothektabs</string>
|
||||||
|
<string name="set_lib_tabs_desc">Sichtbarkeit und Ordnung der Bibliothektabs ändern</string>
|
||||||
|
<string name="lbl_sort_name">Name</string>
|
||||||
|
<string name="desc_shuffle_all">Alle Lieder zufällig</string>
|
||||||
|
<string name="desc_clear_queue_item">Lied in der Warteschlange löschen</string>
|
||||||
|
<string name="desc_tab_handle">Tab versetzen</string>
|
||||||
|
<string name="def_artist">Unbekannter Künstler</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
|
@ -152,4 +152,5 @@
|
||||||
<item quantity="one">%d Álbum</item>
|
<item quantity="one">%d Álbum</item>
|
||||||
<item quantity="other">%d Álbumes</item>
|
<item quantity="other">%d Álbumes</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="def_artist">Artista desconocido</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -150,4 +150,5 @@
|
||||||
<item quantity="one">%d Album</item>
|
<item quantity="one">%d Album</item>
|
||||||
<item quantity="other">%d Albums</item>
|
<item quantity="other">%d Albums</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="def_artist">Onbekend Artist</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -120,7 +120,7 @@
|
||||||
<string name="desc_shuffle_all">Shuffle all songs</string>
|
<string name="desc_shuffle_all">Shuffle all songs</string>
|
||||||
|
|
||||||
<string name="desc_clear_user_queue">Clear queue</string>
|
<string name="desc_clear_user_queue">Clear queue</string>
|
||||||
<string name="desc_clear_queue_item">Remove this queue item</string>
|
<string name="desc_clear_queue_item">Remove this queue song</string>
|
||||||
<string name="desc_queue_handle">Move this queue song</string>
|
<string name="desc_queue_handle">Move this queue song</string>
|
||||||
<string name="desc_tab_handle">Move this tab</string>
|
<string name="desc_tab_handle">Move this tab</string>
|
||||||
<string name="desc_clear_search">Clear search query</string>
|
<string name="desc_clear_search">Clear search query</string>
|
||||||
|
|
3
fastlane/metadata/android/en-US/changelogs/9.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
Auxio has a new look derived from Material You, with a new music loader that supports album artists, a completely revamped sorting system, greater library customization, and a more streamlined and cohesive user experience.
|
||||||
|
|
||||||
|
For more information, please read the full changelog at https://github.com/oxygencobalt/Auxio/releases/
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 245 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 160 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 257 KiB |
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 137 KiB |
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 133 KiB |
Before Width: | Height: | Size: 225 KiB After Width: | Height: | Size: 296 KiB |
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 146 KiB |
Before Width: | Height: | Size: 282 KiB After Width: | Height: | Size: 254 KiB |
|
@ -9,7 +9,7 @@ Auxio has a couple of core systems or concepts that should be understood when wo
|
||||||
#### Package Structure
|
#### Package Structure
|
||||||
|
|
||||||
Auxio's package structure is strictly feature-oriented. For example, playback code is exclusively in the `playback` package,
|
Auxio's package structure is strictly feature-oriented. For example, playback code is exclusively in the `playback` package,
|
||||||
detail code is exclusively in the `detail` package. Sub-packages can be related to the code it contains, such as `detail.recycler`
|
and detail code is exclusively in the `detail` package. Sub-packages can be related to the code it contains, such as `detail.recycler`
|
||||||
for the detail UI adapters, or they can be related to a sub-feature, like `playback.queue` for the queue UI.
|
for the detail UI adapters, or they can be related to a sub-feature, like `playback.queue` for the queue UI.
|
||||||
|
|
||||||
A full run-down of Auxio's current package structure as of the latest version is shown below.
|
A full run-down of Auxio's current package structure as of the latest version is shown below.
|
||||||
|
@ -54,7 +54,7 @@ is separated into three phases:
|
||||||
|
|
||||||
- Create variables [Bindings, Adapters, etc]
|
- Create variables [Bindings, Adapters, etc]
|
||||||
- Set up the UI
|
- Set up the UI
|
||||||
- Set up LiveData observers
|
- Set up ViewModel instances and LiveData observers
|
||||||
|
|
||||||
`findViewById` is to **only** be used when interfacing with non-Auxio views. Otherwise, viewbinding should be
|
`findViewById` is to **only** be used when interfacing with non-Auxio views. Otherwise, viewbinding should be
|
||||||
used in all cases. If one needs to keep track of a viewbinding outside of `onCreateView`, then one can declare
|
used in all cases. If one needs to keep track of a viewbinding outside of `onCreateView`, then one can declare
|
||||||
|
@ -110,12 +110,14 @@ Other data types represent a specific UI configuration or state:
|
||||||
|
|
||||||
#### Music Access
|
#### Music Access
|
||||||
|
|
||||||
All music on a system is asynchronously indexed into the shared object `MusicStore`. Because of this, **`MusicStore` may not be available at all times**.
|
All music on a system is asynchronously loaded into the shared object `MusicStore`. Because of this, **`MusicStore` may not be available at all times**.
|
||||||
|
|
||||||
- ViewModels should try to await or gracefully exit if music is not available
|
- ViewModels should try to await or gracefully exit the called method if `MusicStore` is not available
|
||||||
- In the case that a ViewModel needs a `MusicStore` instance to function, an instance can be required. This should be done sparingly.
|
- In the case that a ViewModel needs a `MusicStore` instance to function, an instance can be required. This should be done sparingly.
|
||||||
- Other shared objects that rely on `MusicStore` [like `PlaybackStateManager`] will no-op if music is not available.
|
- Other shared objects that rely on `MusicStore` [like `PlaybackStateManager`] will no-op if music is not available.
|
||||||
|
|
||||||
|
If the loading status needs to be shown in a UI, `MusicViewModel` can be used to observe the current music loader response.
|
||||||
|
|
||||||
#### Playback System
|
#### Playback System
|
||||||
|
|
||||||
Auxio's playback system is somewhat unorthodox, as it avoids much of the android-provided APIs in favor of a more controllable and sensible system.
|
Auxio's playback system is somewhat unorthodox, as it avoids much of the android-provided APIs in favor of a more controllable and sensible system.
|
||||||
|
@ -145,8 +147,7 @@ that UIs can use to interact with the playback state.
|
||||||
|
|
||||||
`PlaybackService`'s job is to use the playback state to manage the ExoPlayer instance, the notification, the widget, and also modify the state depending on
|
`PlaybackService`'s job is to use the playback state to manage the ExoPlayer instance, the notification, the widget, and also modify the state depending on
|
||||||
system events, such as when a button is pressed on a headset. It should **never** be bound to, mostly because there is no need given that
|
system events, such as when a button is pressed on a headset. It should **never** be bound to, mostly because there is no need given that
|
||||||
`PlaybackViewModel` exposes the same data in a much safer fashion. `PlaybackService` also controls the `PlaybackSessionConnector`, `AudioReactor`,
|
`PlaybackViewModel` exposes the same data in a much safer fashion.
|
||||||
and `WidgetController` classes, which manage the `MediaSession`, Audio Focus, and Widgets respectively.
|
|
||||||
|
|
||||||
#### Data Integers
|
#### Data Integers
|
||||||
|
|
||||||
|
@ -199,7 +200,7 @@ To prevent any strange bugs, all integer representations must be unique. A table
|
||||||
0xA10F | Sort.Year
|
0xA10F | Sort.Year
|
||||||
```
|
```
|
||||||
|
|
||||||
Some datatypes [like `Tab` and `Sort`] have even more fine-grained integer representations for other information. More information can be found in
|
Some datatypes [like `Tab` and `Sort`] have even more fine-grained integer representations for other data. More information can be found in
|
||||||
the documentation for these datatypes.
|
the documentation for these datatypes.
|
||||||
|
|
||||||
## Package-by-package rundown
|
## Package-by-package rundown
|
||||||
|
@ -258,7 +259,7 @@ This package contains the components for the "home" UI in Auxio, or the UI that
|
||||||
- The base package contains the top-level components that manage the FloatingActionButton, AppBar, and ViewPager instances.
|
- The base package contains the top-level components that manage the FloatingActionButton, AppBar, and ViewPager instances.
|
||||||
- The `fastscroll` package contains the fast scroll component used in each list of music
|
- The `fastscroll` package contains the fast scroll component used in each list of music
|
||||||
- The `list` package contains the individual fragments for each list of music. These are all placed in the top-level ViewPager instance.
|
- The `list` package contains the individual fragments for each list of music. These are all placed in the top-level ViewPager instance.
|
||||||
- The `tabs` package contains the data representation of an individual library tab and the UI's for editing them.
|
- The `tabs` package contains the data representation of an individual library tab and the UIs for editing them.
|
||||||
|
|
||||||
#### `.music`
|
#### `.music`
|
||||||
|
|
||||||
|
@ -270,7 +271,7 @@ data objects have to inherit `BaseModel` so that they can be placed alongside `M
|
||||||
This module not only contains the playback system described above, but also multiple other components:
|
This module not only contains the playback system described above, but also multiple other components:
|
||||||
|
|
||||||
- `queue` contains the Queue UI and it's fancy item transitions
|
- `queue` contains the Queue UI and it's fancy item transitions
|
||||||
- `state` contains the core playback state system
|
- `state` contains the core playback state and persistence system
|
||||||
- `system` contains the system-facing playback system
|
- `system` contains the system-facing playback system
|
||||||
|
|
||||||
The most important part of this module is `PlaybackLayout`, which is a custom `ViewGroup` that implements the playback bar and it's ability to
|
The most important part of this module is `PlaybackLayout`, which is a custom `ViewGroup` that implements the playback bar and it's ability to
|
||||||
|
|
|
@ -28,8 +28,8 @@ ability to be extended to music sources outside of local files. You can read mor
|
||||||
#### What formats does Auxio support?
|
#### What formats does Auxio support?
|
||||||
|
|
||||||
As per the [Supported ExoPlayer Formats](https://exoplayer.dev/supported-formats.html), Auxio supports
|
As per the [Supported ExoPlayer Formats](https://exoplayer.dev/supported-formats.html), Auxio supports
|
||||||
MP4, MP3, MKA, OGG, WAV, MPEG, ACC on all versions of Android. FLAC files are supported on Android 8.1
|
MP4, MP3, MKA, OGG, WAV, MPEG, ACC on all versions of Android. However, FLAC files can only be played
|
||||||
or newer, on lower versions Auxio must be patched with the [FLAC Extension](https://github.com/google/ExoPlayer/tree/release-v2/extensions/flac).
|
on Android 8.1 and above. Below that, Auxio must be patched with the [FLAC Extension](https://github.com/google/ExoPlayer/tree/release-v2/extensions/flac).
|
||||||
|
|
||||||
#### Why are accents lighter/less saturated in dark mode?
|
#### Why are accents lighter/less saturated in dark mode?
|
||||||
|
|
||||||
|
|