diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a3c820ea..2a43bb930 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -204,7 +204,7 @@ to when using gesture navigation - Fixed issue where the scroll thumb would briefly display on the Songs UI - Fixed issue where fast scrolling could be triggered outside the bounds of the indicators - Fixed issue where the wrong playing item would be highlighted if the names were identical -- Fixed a crash when the thumb was moved above the fast scroller [Backported to 1.3.3, included in this release officially] +- Fixed a crash when the thumb was moved above the fast scroller [Back-ported to 1.3.3, included in this release officially] #### Dev/Meta - Migrated fully to material design diff --git a/app/src/main/java/org/oxycblt/auxio/accent/Accent.kt b/app/src/main/java/org/oxycblt/auxio/accent/Accent.kt index 97205cb44..e496f8193 100644 --- a/app/src/main/java/org/oxycblt/auxio/accent/Accent.kt +++ b/app/src/main/java/org/oxycblt/auxio/accent/Accent.kt @@ -101,7 +101,7 @@ private val ACCENT_PRIMARY_COLORS = arrayOf( /** * The data object for an accent. In the UI this is known as a "Color Scheme." * This can be nominally used to gleam some attributes about a given color scheme, but this - * is not recommended. Attributes are usually the better option in nearly all cases. + * is not recommended. Attributes are the better option in nearly all cases. * * @property name The name of this accent * @property theme The theme resource for this accent diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt index 6a073aff6..954215565 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt @@ -5,7 +5,7 @@ import android.content.Context import android.util.AttributeSet import android.view.View import android.view.ViewGroup -import androidx.annotation.StyleRes +import androidx.annotation.AttrRes import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout @@ -28,7 +28,7 @@ import java.lang.Exception class DetailAppBarLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - @StyleRes defStyleAttr: Int = -1 + @AttrRes defStyleAttr: Int = 0 ) : EdgeAppBarLayout(context, attrs, defStyleAttr) { private var mTitleView: AppCompatTextView? = null private var mRecycler: RecyclerView? = null @@ -109,7 +109,7 @@ class DetailAppBarLayout @JvmOverloads constructor( titleView?.alpha = it.animatedValue as Float } - duration = resources.getInteger(R.integer.app_bar_elevation_anim_duration).toLong() + duration = resources.getInteger(R.integer.detail_app_bar_title_anim_duration).toLong() start() } diff --git a/app/src/main/java/org/oxycblt/auxio/home/FloatingActionButtonContainer.kt b/app/src/main/java/org/oxycblt/auxio/home/FloatingActionButtonContainer.kt index 863306dc9..9f38464dd 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/FloatingActionButtonContainer.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/FloatingActionButtonContainer.kt @@ -22,6 +22,7 @@ import android.content.Context import android.util.AttributeSet import android.view.WindowInsets import android.widget.FrameLayout +import androidx.annotation.AttrRes import androidx.core.view.updatePadding import org.oxycblt.auxio.util.systemBarInsetsCompat @@ -32,7 +33,7 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat class FloatingActionButtonContainer @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = -1 + @AttrRes defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { init { clipToPadding = false 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 77a1ec5e2..bd08de937 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 @@ -32,6 +32,7 @@ import android.view.ViewGroup import android.view.WindowInsets import android.widget.FrameLayout import android.widget.TextView +import androidx.annotation.AttrRes import androidx.appcompat.widget.AppCompatTextView import androidx.core.math.MathUtils import androidx.core.view.isInvisible @@ -77,7 +78,7 @@ import kotlin.math.abs class FastScrollRecyclerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = -1 + @AttrRes defStyleAttr: Int = 0 ) : RecyclerView(context, attrs, defStyleAttr) { /** Callback to provide a string to be shown on the popup when an item is passed */ var popupProvider: ((Int) -> String)? = null diff --git a/app/src/main/java/org/oxycblt/auxio/music/Models.kt b/app/src/main/java/org/oxycblt/auxio/music/Models.kt index c42b7a6c7..1e3f80386 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Models.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Models.kt @@ -28,7 +28,7 @@ import androidx.annotation.StringRes // --- MUSIC MODELS --- /** - * The template for all items in Auxio. + * The base for all items in Auxio. */ sealed class Item { /** A unique ID for this item. ***THIS IS NOT A MEDIASTORE ID!** */ @@ -36,7 +36,7 @@ sealed class Item { } /** - * A [Item] variant that represents a music item. + * [Item] variant that represents a music item. * @property name */ sealed class Music : Item() { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarView.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarView.kt index 695170e97..caf863c05 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarView.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarView.kt @@ -41,7 +41,7 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat class PlaybackBarView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = -1 + defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr) { private val binding = ViewPlaybackBarBinding.inflate(context.inflater, this, true) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackButton.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackButton.kt index 523f2a2b6..b05777b81 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackButton.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackButton.kt @@ -5,6 +5,7 @@ import android.graphics.Canvas import android.graphics.Matrix import android.graphics.RectF import android.util.AttributeSet +import androidx.annotation.AttrRes import androidx.appcompat.widget.AppCompatImageButton import org.oxycblt.auxio.R import org.oxycblt.auxio.util.getDimenSizeSafe @@ -25,7 +26,7 @@ import org.oxycblt.auxio.util.getDrawableSafe class PlaybackButton @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = -1 + @AttrRes defStyleAttr: Int = 0 ) : AppCompatImageButton(context, attrs, defStyleAttr) { private val iconSize = context.getDimenSizeSafe(R.dimen.size_playback_icon) private val centerMatrix = Matrix() @@ -33,7 +34,7 @@ class PlaybackButton @JvmOverloads constructor( private val matrixDst = RectF() private val indicatorDrawable = context.getDrawableSafe(R.drawable.ui_indicator) - var hasIndicator = false + private var hasIndicator = false set(value) { field = value invalidate() diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSeekBar.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSeekBar.kt index 274995005..4fae1f8e0 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSeekBar.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSeekBar.kt @@ -42,7 +42,7 @@ import org.oxycblt.auxio.util.stateList class PlaybackSeekBar @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleRes: Int = -1 + defStyleRes: Int = 0 ) : ConstraintLayout(context, attrs, defStyleRes), Slider.OnChangeListener, Slider.OnSliderTouchListener { private val binding = ViewSeekBarBinding.inflate(context.inflater, this, true) private val isSeeking: Boolean get() = binding.playbackDurationCurrent.isActivated diff --git a/app/src/main/java/org/oxycblt/auxio/settings/pref/IntListPreference.kt b/app/src/main/java/org/oxycblt/auxio/settings/pref/IntListPreference.kt index 6b163b8c2..78bdc08b4 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/pref/IntListPreference.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/pref/IntListPreference.kt @@ -18,25 +18,28 @@ package org.oxycblt.auxio.settings.pref -import android.annotation.SuppressLint import android.content.Context import android.content.res.TypedArray import android.util.AttributeSet import androidx.preference.DialogPreference +import androidx.preference.Preference import org.oxycblt.auxio.R -import androidx.preference.R as prefR class IntListPreference @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = prefR.attr.dialogPreferenceStyle, + defStyleAttr: Int = androidx.preference.R.attr.dialogPreferenceStyle, defStyleRes: Int = 0 ) : DialogPreference(context, attrs, defStyleAttr, defStyleRes) { + // Reflect into Preference to get the (normally inaccessible) default value. + private val defValueField = Preference::class.java.getDeclaredField("mDefaultValue").apply { + isAccessible = true + } + val entries: Array val values: IntArray - private var currentValue: Int? = null - private val defValue: Int + private val defValue: Int get() = defValueField.get(this) as Int init { val prefAttrs = context.obtainStyledAttributes( @@ -49,8 +52,6 @@ class IntListPreference @JvmOverloads constructor( prefAttrs.getResourceId(R.styleable.IntListPreference_entryValues, -1) ) - defValue = prefAttrs.getInt(prefR.styleable.Preference_defaultValue, Int.MIN_VALUE) - prefAttrs.recycle() summaryProvider = IntListSummaryProvider() @@ -96,7 +97,6 @@ class IntListPreference @JvmOverloads constructor( } } - @SuppressLint("PrivateResource") private inner class IntListSummaryProvider : SummaryProvider { override fun provideSummary(preference: IntListPreference): CharSequence { val index = getValueIndex() @@ -105,7 +105,8 @@ class IntListPreference @JvmOverloads constructor( return entries[index] } - return context.getString(prefR.string.not_set) + // Usually an invalid state, don't bother translating + return "" } } } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/EdgeAppBarLayout.kt b/app/src/main/java/org/oxycblt/auxio/ui/EdgeAppBarLayout.kt index 8ecaf814a..f30302ca0 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/EdgeAppBarLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/EdgeAppBarLayout.kt @@ -24,7 +24,7 @@ import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver import android.view.WindowInsets -import androidx.annotation.StyleRes +import androidx.annotation.AttrRes import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.res.ResourcesCompat import androidx.core.view.updatePadding @@ -41,7 +41,7 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat open class EdgeAppBarLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - @StyleRes defStyleAttr: Int = -1 + @AttrRes defStyleAttr: Int = 0 ) : AppBarLayout(context, attrs, defStyleAttr) { private var scrollingChild: View? = null private val tConsumed = IntArray(2) diff --git a/app/src/main/java/org/oxycblt/auxio/ui/EdgeCoordinatorLayout.kt b/app/src/main/java/org/oxycblt/auxio/ui/EdgeCoordinatorLayout.kt index 7e41af3fe..84341f7be 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/EdgeCoordinatorLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/EdgeCoordinatorLayout.kt @@ -21,6 +21,7 @@ package org.oxycblt.auxio.ui import android.content.Context import android.util.AttributeSet import android.view.WindowInsets +import androidx.annotation.AttrRes import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.children @@ -33,7 +34,7 @@ import androidx.core.view.children class EdgeCoordinatorLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = -1 + @AttrRes defStyleAttr: Int = 0 ) : CoordinatorLayout(context, attrs, defStyleAttr) { override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets { for (child in children) { diff --git a/app/src/main/java/org/oxycblt/auxio/ui/EdgeRecyclerView.kt b/app/src/main/java/org/oxycblt/auxio/ui/EdgeRecyclerView.kt index 8f8fc4b1d..3a273a55b 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/EdgeRecyclerView.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/EdgeRecyclerView.kt @@ -21,6 +21,7 @@ package org.oxycblt.auxio.ui import android.content.Context import android.util.AttributeSet import android.view.WindowInsets +import androidx.annotation.AttrRes import androidx.core.view.updatePadding import androidx.recyclerview.widget.RecyclerView import org.oxycblt.auxio.util.systemBarInsetsCompat @@ -31,7 +32,7 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat class EdgeRecyclerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = -1 + @AttrRes defStyleAttr: Int = 0 ) : RecyclerView(context, attrs, defStyleAttr) { override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets { updatePadding(bottom = insets.systemBarInsetsCompat.bottom) diff --git a/app/src/main/res/drawable/ui_large_unbounded_ripple.xml b/app/src/main/res/drawable/ui_large_unbounded_ripple.xml index 3c999556f..8daf5be74 100644 --- a/app/src/main/res/drawable/ui_large_unbounded_ripple.xml +++ b/app/src/main/res/drawable/ui_large_unbounded_ripple.xml @@ -1,4 +1,4 @@ + android:radius="24dp" /> diff --git a/app/src/main/res/drawable/ui_unbounded_ripple.xml b/app/src/main/res/drawable/ui_unbounded_ripple.xml index 3118661f4..0b98cc5db 100644 --- a/app/src/main/res/drawable/ui_unbounded_ripple.xml +++ b/app/src/main/res/drawable/ui_unbounded_ripple.xml @@ -1,4 +1,4 @@ + android:radius="20dp" /> diff --git a/app/src/main/res/layout-land/fragment_playback.xml b/app/src/main/res/layout-land/fragment_playback.xml index 6a5d9cee3..eee455511 100644 --- a/app/src/main/res/layout-land/fragment_playback.xml +++ b/app/src/main/res/layout-land/fragment_playback.xml @@ -122,7 +122,6 @@ - - + android:layout_margin="@dimen/spacing_medium"> 已加载 %d 首曲目 - %d 首歌曲 "%d 首歌曲" - %d 张专辑 "%d 张专辑" diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 8b2794cad..f29dcde96 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,6 +1,7 @@ + 4dp 8dp 16dp 24dp @@ -16,9 +17,6 @@ 192dp 256dp - 20dp - 24dp - 32dp 32dp diff --git a/app/src/main/res/values/settings.xml b/app/src/main/res/values/integers.xml similarity index 96% rename from app/src/main/res/values/settings.xml rename to app/src/main/res/values/integers.xml index 691e1e77a..ef9360ddf 100644 --- a/app/src/main/res/values/settings.xml +++ b/app/src/main/res/values/integers.xml @@ -1,5 +1,7 @@ + 150 + @string/set_theme_auto diff --git a/app/src/main/res/values/styles_ui.xml b/app/src/main/res/values/styles_ui.xml index 9f41449fb..95c53941b 100644 --- a/app/src/main/res/values/styles_ui.xml +++ b/app/src/main/res/values/styles_ui.xml @@ -151,10 +151,6 @@ - - diff --git a/fastlane/metadata/android/en-US/changelogs/1.txt b/fastlane/metadata/android/en-US/changelogs/1.txt index a443dae23..79589920f 100644 --- a/fastlane/metadata/android/en-US/changelogs/1.txt +++ b/fastlane/metadata/android/en-US/changelogs/1.txt @@ -1,5 +1,5 @@ - Redesigned the detail UIs -- Navigation is much more fluid and straightfoward +- Navigation is much more fluid and straightforward - Search has been moved to a dedicated tab - Added search filtering - Fixed issue where audio focus would resume playback when it shouldn't diff --git a/info/ADDITIONS.md b/info/ADDITIONS.md index 3681bdbcf..68b127a22 100644 --- a/info/ADDITIONS.md +++ b/info/ADDITIONS.md @@ -7,7 +7,7 @@ These will likely be accepted as long as they do not cause too much harm to the ## New Customizations/Options While I do like adding new behavior/UI customizations, these will be looked at more closely as certain additions can cause harm to the apps UI/UX while not providing alot of benefit. These tend to be accepted however. -## Feature Addtions and UI Changes +## Feature Additions and UI Changes These arent as likely to be accepted. As I said, I do not want Auxio to become overly bloated with features that are rarely used, therefore I only tend to accept features that: - Benefit **my own** usage @@ -22,6 +22,6 @@ Feel free to fork Auxio to add your own feature set however. - Recently added list [#18] (Out of scope) - Lyrics [#19] (Out of scope) - Tag editing [#33] (Out of scope) -- Gapless Playback [#35] (Technical issues) +- Gapless Playback [#35] (Technical issues, may change in the future) - Reduce leading instrument [#45] (Technical issues, Out of scope) - Opening music through a provider [#30] (Out of scope) diff --git a/info/ARCHITECTURE.md b/info/ARCHITECTURE.md index 5ef8a9bb6..16248789f 100644 --- a/info/ARCHITECTURE.md +++ b/info/ARCHITECTURE.md @@ -52,13 +52,13 @@ is separated into three phases: - Set up the UI - Set up ViewModel instances and LiveData observers -`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 +`findViewById` is to **only** be used when interfacing with non-Auxio views. Otherwise, view-binding should be +used in all cases. If one needs to keep track of a view-binding outside of `onCreateView`, then one can declare a binding `by memberBinding(BindingClass::inflate)` in order to have a binding that properly disposes itself on lifecycle events. At times it may be more appropriate to use a `View` instead of a full blown fragment. This is okay as long as -viewbinding is still used. +view-binding is still used. When creating a ViewHolder for a `RecyclerView`, one should use `BaseViewHolder` to standardize the binding process and automate some code shared across all ViewHolders. The only exceptions to this case are for ViewHolders that