diff --git a/CHANGELOG.md b/CHANGELOG.md index dc0f8d378..0cc15b708 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## dev +## 3.0.1 #### What's New - Added support for album date ranges (ex. 2010 - 2013) @@ -12,10 +12,11 @@ - Added reset button to ReplayGain pre-amp configuration dialog #### What's Changed -- R128 Gain tags are now only used when playing OPUS files +- R128 ReplayGain tags are now only used when playing OPUS files #### What's Fixed - Fixed mangled multi-value ID3v2 tags when UTF-16 is used +- Fixed crash when playing certain MP3 files ## 3.0.0 diff --git a/README.md b/README.md index d1b95cc36..6ade65990 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@
-
-
+
+
@@ -79,7 +79,9 @@ Auxio relies on a custom version of ExoPlayer that enables some extra features.
Auxio accepts most contributions as long as they follow the [Contribution Guidelines](/.github/CONTRIBUTING.md).
-However, feature additions and major UI changes are less likely to be accepted. See [Accepted Additions](/info/ADDITIONS.md) for more information.
+However, feature additions and major UI changes are less likely to be accepted. See
+[Why Are These Features Missing?](https://github.com/OxygenCobalt/Auxio/wiki/Why-Are-These-Features-Missing%3F)
+for more information.
## License
diff --git a/app/build.gradle b/app/build.gradle
index ddeeaeb23..b0662424f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -12,8 +12,8 @@ android {
defaultConfig {
applicationId namespace
- versionName "3.0.0"
- versionCode 24
+ versionName "3.0.1"
+ versionCode 25
minSdk 21
targetSdk 33
diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt
index 36c138200..efa3d86f6 100644
--- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt
@@ -295,7 +295,13 @@ class HomeFragment :
// Update the scrolling view in AppBarLayout to align with the current tab's
// scrolling state. This prevents the lift state from being confused as one
// goes between different tabs.
- requireBinding().homeAppbar.liftOnScrollTargetViewId = getTabRecyclerId(tabMode)
+ requireBinding().homeAppbar.liftOnScrollTargetViewId =
+ when (tabMode) {
+ MusicMode.SONGS -> R.id.home_song_recycler
+ MusicMode.ALBUMS -> R.id.home_album_recycler
+ MusicMode.ARTISTS -> R.id.home_artist_recycler
+ MusicMode.GENRES -> R.id.home_genre_recycler
+ }
}
private fun handleRecreate(recreate: Boolean) {
@@ -313,6 +319,9 @@ class HomeFragment :
}
private fun updateIndexerState(state: Indexer.State?) {
+ // TODO: Make music loading experience a bit more pleasant
+ // 1. Loading placeholder for item lists
+ // 2. Rework the "No Music" case to not be an error and instead result in a placeholder
val binding = requireBinding()
when (state) {
is Indexer.State.Complete -> setupCompleteState(binding, state.result)
@@ -356,8 +365,6 @@ class HomeFragment :
}
is Indexer.NoMusicException -> {
logD("Updating UI to no music state")
- // TODO: Rework how empty libraries are treated to feel less jarring if
- // there was a previously loaded library
binding.homeIndexingStatus.text = context.getString(R.string.err_no_music)
// Configure the action to act as a reload trigger.
binding.homeIndexingAction.apply {
@@ -453,20 +460,6 @@ class HomeFragment :
reenterTransition = MaterialSharedAxis(axis, false)
}
- /**
- * Get the ID of the RecyclerView contained by [ViewPager2] tab represented with the given
- * [MusicMode].
- * @param tabMode The [MusicMode] of the tab.
- * @return The ID of the RecyclerView contained by the given tab.
- */
- private fun getTabRecyclerId(tabMode: MusicMode) =
- when (tabMode) {
- MusicMode.SONGS -> R.id.home_song_recycler
- MusicMode.ALBUMS -> R.id.home_album_recycler
- MusicMode.ARTISTS -> R.id.home_artist_recycler
- MusicMode.GENRES -> R.id.home_genre_recycler
- }
-
/**
* [FragmentStateAdapter] implementation for the [HomeFragment]'s [ViewPager2] instance.
* @param tabs The current tab configuration. This will define the [Fragment]s created.
diff --git a/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt b/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt
index 48fc32617..863d5b32a 100644
--- a/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt
+++ b/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt
@@ -71,26 +71,6 @@ class FastScrollRecyclerView
@JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) :
AuxioRecyclerView(context, attrs, defStyleAttr) {
- /** An interface to provide text to use in the popup when fast-scrolling. */
- interface PopupProvider {
- /**
- * Get text to use in the popup at the specified position.
- * @param pos The position in the list.
- * @return A [String] to use in the popup. Null if there is no applicable text for the popup
- * at [pos].
- */
- fun getPopup(pos: Int): String?
- }
-
- /** A listener for fast scroller interactions. */
- interface Listener {
- /**
- * Called when the fast scrolling state changes.
- * @param isFastScrolling true if the user is currently fast scrolling, false otherwise.
- */
- fun onFastScrollingChanged(isFastScrolling: Boolean)
- }
-
// Thumb
private val thumbView =
View(context).apply {
@@ -524,6 +504,26 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
else -> 0
}
+ /** An interface to provide text to use in the popup when fast-scrolling. */
+ interface PopupProvider {
+ /**
+ * Get text to use in the popup at the specified position.
+ * @param pos The position in the list.
+ * @return A [String] to use in the popup. Null if there is no applicable text for the popup
+ * at [pos].
+ */
+ fun getPopup(pos: Int): String?
+ }
+
+ /** A listener for fast scroller interactions. */
+ interface Listener {
+ /**
+ * Called when the fast scrolling state changes.
+ * @param isFastScrolling true if the user is currently fast scrolling, false otherwise.
+ */
+ fun onFastScrollingChanged(isFastScrolling: Boolean)
+ }
+
private companion object {
const val AUTO_HIDE_SCROLLBAR_DELAY_MILLIS = 1500
}
diff --git a/app/src/main/res/layout/item_music_dir.xml b/app/src/main/res/layout/item_music_dir.xml
index a68bf2fdc..f49006e95 100644
--- a/app/src/main/res/layout/item_music_dir.xml
+++ b/app/src/main/res/layout/item_music_dir.xml
@@ -25,6 +25,7 @@
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_gravity="center"
android:layout_marginEnd="@dimen/spacing_mid_large"
android:contentDescription="@string/desc_music_dir_delete"
app:icon="@drawable/ic_delete_24"
diff --git a/fastlane/metadata/android/en-US/changelogs/25.txt b/fastlane/metadata/android/en-US/changelogs/25.txt
new file mode 100644
index 000000000..5cc3dcac2
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/25.txt
@@ -0,0 +1,3 @@
+Auxio 3.0.0 massively improves the music library experience, with a new advanced music loader, a new unified artist model, and a new selection system that makes enqueueing music much simpler.
+This release adds some additional functionality and fixes a few regressions.
+For more information, see https://github.com/OxygenCobalt/Auxio/releases/tag/v3.0.1.
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
index 0d9401379..196da8418 100644
--- a/fastlane/metadata/android/en-US/full_description.txt
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -1,4 +1,4 @@
-Auxio is a local music player with a fast, reliable UI/UX without the many useless features present in other music players. Built off of Exoplayer, Auxio has superior library support and listening quality compared to other apps that use outdated android functionality. In short, It plays music.
+Auxio is a local music player with a fast, reliable UI/UX without the many useless features present in other music players. Built off of Exoplayer, Auxio has superior library support and listening quality compared to other apps that use outdated android functionality. In short, It plays music.
Features