diff --git a/CHANGELOG.md b/CHANGELOG.md index 73fa088dd..821a75dd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## dev +#### What's Improved +- Improved bottom sheet code to prevent clipping issues + +#### What's Fixed +- Fixed incorrect font being used in the queue title + ## 2.6.0 #### What's New diff --git a/app/src/main/java/org/oxycblt/auxio/home/EdgeFrameLayout.kt b/app/src/main/java/org/oxycblt/auxio/home/EdgeFrameLayout.kt index 7cda03709..ab26b0967 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/EdgeFrameLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/EdgeFrameLayout.kt @@ -22,7 +22,6 @@ 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 /** @@ -37,12 +36,9 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr clipToPadding = false } - override fun dispatchApplyWindowInsets(insets: WindowInsets): WindowInsets { - return onApplyWindowInsets(insets) - } - override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets { - updatePadding(bottom = insets.systemBarInsetsCompat.bottom) + // Save a layout by simply moving the view bounds upwards + translationY = -insets.systemBarInsetsCompat.bottom.toFloat() return insets } } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSheetBehavior.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSheetBehavior.kt index b2c96e648..f6aa8b653 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSheetBehavior.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSheetBehavior.kt @@ -22,7 +22,10 @@ import android.util.AttributeSet import android.view.MotionEvent import android.view.View import androidx.coordinatorlayout.widget.CoordinatorLayout +import org.oxycblt.auxio.R +import org.oxycblt.auxio.settings.Settings import org.oxycblt.auxio.ui.AuxioSheetBehavior +import org.oxycblt.auxio.util.getDimen /** * The coordinator layout behavior used for the playback sheet, hacking in the many fixes required @@ -33,6 +36,9 @@ class PlaybackSheetBehavior(context: Context, attributeSet: AttributeS AuxioSheetBehavior(context, attributeSet) { init { isHideable = true + if (Settings(context).roundMode) { + sheetBackgroundDrawable.setCornerSize(context.getDimen(R.dimen.size_corners_medium)) + } } // Hack around issue where the playback sheet will try to intercept nested scrolling events diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueDragCallback.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueDragCallback.kt index 01f940341..728fe2d0d 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueDragCallback.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueDragCallback.kt @@ -130,7 +130,7 @@ class QueueDragCallback(private val playbackModel: QueueViewModel) : ItemTouchHe recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder - ): Boolean = + ) = playbackModel.moveQueueDataItems( viewHolder.bindingAdapterPosition, target.bindingAdapterPosition) diff --git a/app/src/main/java/org/oxycblt/auxio/ui/AuxioSheetBehavior.kt b/app/src/main/java/org/oxycblt/auxio/ui/AuxioSheetBehavior.kt index 11d6186d5..fcc0dd0ab 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/AuxioSheetBehavior.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/AuxioSheetBehavior.kt @@ -18,7 +18,6 @@ package org.oxycblt.auxio.ui import android.content.Context -import android.graphics.drawable.ColorDrawable import android.graphics.drawable.LayerDrawable import android.os.Build import android.util.AttributeSet @@ -73,12 +72,12 @@ abstract class AuxioSheetBehavior(context: Context, attributeSet: Attr child.apply { // Sometimes the sheet background will fade out, so guard it with another // colorSurface drawable to prevent content overlap. - background = - LayerDrawable( - arrayOf( - ColorDrawable( - context.getAttrColorCompat(R.attr.colorSurface).defaultColor), - sheetBackgroundDrawable)) + val guardDrawable = + MaterialShapeDrawable(sheetBackgroundDrawable.shapeAppearanceModel).apply { + fillColor = context.getAttrColorCompat(R.attr.colorSurface) + } + + background = LayerDrawable(arrayOf(guardDrawable, sheetBackgroundDrawable)) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { // Shadows aren't disabled by default, do that. diff --git a/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetContentBehavior.kt b/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetContentBehavior.kt index bac1ae091..922cf1307 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetContentBehavior.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetContentBehavior.kt @@ -24,6 +24,7 @@ import android.view.WindowInsets import androidx.coordinatorlayout.widget.CoordinatorLayout import com.google.android.material.bottomsheet.NeoBottomSheetBehavior import kotlin.math.abs +import kotlin.math.max import org.oxycblt.auxio.util.coordinatorLayoutBehavior import org.oxycblt.auxio.util.replaceSystemBarInsetsCompat import org.oxycblt.auxio.util.systemBarInsetsCompat @@ -62,15 +63,7 @@ class BottomSheetContentBehavior(context: Context, attributeSet: Attri if (consumed != lastConsumed) { lastConsumed = consumed - - val insets = lastInsets - if (insets != null) { - child.dispatchApplyWindowInsets(insets) - } - lastInsets?.let(child::dispatchApplyWindowInsets) - measureContent(parent, child, consumed) - layoutContent(child) return true } @@ -85,21 +78,19 @@ class BottomSheetContentBehavior(context: Context, attributeSet: Attri parentHeightMeasureSpec: Int, heightUsed: Int ): Boolean { - val dep = dep ?: return false - val behavior = dep.coordinatorLayoutBehavior as NeoBottomSheetBehavior - val consumed = behavior.calculateConsumedByBar() - if (consumed == Int.MIN_VALUE) { - return false - } + val contentWidthSpec = + View.MeasureSpec.makeMeasureSpec(parent.measuredWidth, View.MeasureSpec.EXACTLY) + val contentHeightSpec = + View.MeasureSpec.makeMeasureSpec(parent.measuredHeight, View.MeasureSpec.EXACTLY) - measureContent(parent, child, consumed) + child.measure(contentWidthSpec, contentHeightSpec) return true } override fun onLayoutChild(parent: CoordinatorLayout, child: V, layoutDirection: Int): Boolean { super.onLayoutChild(parent, child, layoutDirection) - layoutContent(child) + child.layout(0, 0, child.measuredWidth, child.measuredHeight) if (!setup) { child.setOnApplyWindowInsetsListener { v, insets -> @@ -112,9 +103,9 @@ class BottomSheetContentBehavior(context: Context, attributeSet: Attri } val bars = insets.systemBarInsetsCompat + val newBottom = max(bars.bottom, consumed) - insets.replaceSystemBarInsetsCompat( - bars.left, bars.top, bars.right, (bars.bottom - consumed).coerceAtLeast(0)) + insets.replaceSystemBarInsetsCompat(bars.left, bars.top, bars.right, newBottom) } setup = true @@ -123,20 +114,6 @@ class BottomSheetContentBehavior(context: Context, attributeSet: Attri return true } - private fun measureContent(parent: View, child: View, consumed: Int) { - val contentWidthSpec = - View.MeasureSpec.makeMeasureSpec(parent.measuredWidth, View.MeasureSpec.EXACTLY) - val contentHeightSpec = - View.MeasureSpec.makeMeasureSpec( - parent.measuredHeight - consumed, View.MeasureSpec.EXACTLY) - - child.measure(contentWidthSpec, contentHeightSpec) - } - - private fun layoutContent(child: View) { - child.layout(0, 0, child.measuredWidth, child.measuredHeight) - } - private fun NeoBottomSheetBehavior<*>.calculateConsumedByBar(): Int { val offset = calculateSlideOffset() if (offset == Float.MIN_VALUE || peekHeight < 0) { diff --git a/app/src/main/java/org/oxycblt/auxio/ui/recycler/AuxioRecyclerView.kt b/app/src/main/java/org/oxycblt/auxio/ui/recycler/AuxioRecyclerView.kt index 84b8b8e6a..acc103b5d 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/recycler/AuxioRecyclerView.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/recycler/AuxioRecyclerView.kt @@ -27,7 +27,11 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import org.oxycblt.auxio.util.systemBarInsetsCompat -/** A [RecyclerView] that automatically applies insets to itself. */ +/** + * A [RecyclerView] that automatically applies insets to itself. + * + * TODO: Correctly handle edge-to-edge regarding scroll effects and saved scroll positions. + */ open class AuxioRecyclerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) :