From 2a74ff906c84e462fa15f8efc6c94058af1cc5b5 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sat, 19 Feb 2022 11:06:10 -0700 Subject: [PATCH] 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. --- CHANGELOG.md | 3 +++ .../org/oxycblt/auxio/playback/PlaybackLayout.kt | 11 +++++++++-- .../oxycblt/auxio/playback/queue/QueueAdapter.kt | 3 +++ .../auxio/playback/queue/QueueDragCallback.kt | 1 - .../main/java/org/oxycblt/auxio/util/ViewUtil.kt | 13 +++++++++++++ 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f4688ae8..c4d380b17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## dev [v2.2.2 or 2.3.0] +#### Dev/Meta +- Enabled elevation drop shadows below Android P for consistency + ## v2.2.1 #### What's Improved - Updated chinese translations [courtesy of cccClyde] diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackLayout.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackLayout.kt index 33fac4588..6d5a7a2ca 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackLayout.kt @@ -23,9 +23,11 @@ import org.oxycblt.auxio.BuildConfig import org.oxycblt.auxio.R import org.oxycblt.auxio.detail.DetailViewModel import org.oxycblt.auxio.music.Song +import org.oxycblt.auxio.util.disableDropShadowCompat import org.oxycblt.auxio.util.getAttrColorSafe -import org.oxycblt.auxio.util.getDimenSizeSafe +import org.oxycblt.auxio.util.getDimenSafe import org.oxycblt.auxio.util.getDrawableSafe +import org.oxycblt.auxio.util.pxOfDp import org.oxycblt.auxio.util.replaceSystemBarInsetsCompat import org.oxycblt.auxio.util.stateList import org.oxycblt.auxio.util.systemBarInsetsCompat @@ -98,6 +100,8 @@ class PlaybackLayout @JvmOverloads constructor( private var initMotionY = 0f private val tRect = Rect() + private val elevationNormal = context.getDimenSafe(R.dimen.elevation_normal) + /** See [isDragging] */ private val dragStateField = ViewDragHelper::class.java.getDeclaredField("mDragState").apply { isAccessible = true @@ -117,7 +121,7 @@ class PlaybackLayout @JvmOverloads constructor( playbackContainerBg = MaterialShapeDrawable.createWithElevationOverlay(context).apply { fillColor = context.getAttrColorSafe(R.attr.colorSurface).stateList - elevation = context.getDimenSizeSafe(R.dimen.elevation_normal).toFloat() + elevation = context.pxOfDp(elevationNormal).toFloat() } // The way we fade out the elevation overlay is not by actually reducing the elevation @@ -127,6 +131,8 @@ class PlaybackLayout @JvmOverloads constructor( background = (context.getDrawableSafe(R.drawable.ui_panel_bg) as LayerDrawable).apply { setDrawableByLayerId(R.id.panel_overlay, playbackContainerBg) } + + disableDropShadowCompat() } playbackBarView = PlaybackBarView(context).apply { @@ -535,6 +541,7 @@ class PlaybackLayout @JvmOverloads constructor( // Slowly reduce the elevation of the container as we slide up, eventually resulting in a // neutral color instead of an elevated one when fully expanded. playbackContainerBg.alpha = (outRatio * 255).toInt() + playbackContainerView.translationZ = elevationNormal * outRatio // Fade out our bar view as we slide up playbackBarView.apply { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt index 4d1984a3d..d61af2e03 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt @@ -37,6 +37,7 @@ import org.oxycblt.auxio.ui.ActionHeaderViewHolder import org.oxycblt.auxio.ui.BaseViewHolder import org.oxycblt.auxio.ui.DiffCallback import org.oxycblt.auxio.ui.HeaderViewHolder +import org.oxycblt.auxio.util.disableDropShadowCompat import org.oxycblt.auxio.util.inflater import org.oxycblt.auxio.util.logE import org.oxycblt.auxio.util.stateList @@ -132,6 +133,8 @@ class QueueAdapter( ).apply { fillColor = (binding.body.background as ColorDrawable).color.stateList } + + binding.root.disableDropShadowCompat() } @SuppressLint("ClickableViewAccessibility") 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 b18bbcca3..3b80f863e 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 @@ -86,7 +86,6 @@ class QueueDragCallback(private val playbackModel: PlaybackViewModel) : ItemTouc // themselves when being dragged. Too bad google's implementation of this doesn't even // work! To emulate it on my own, I check if this child is in a drag state and then animate // an elevation change. - val holder = viewHolder as QueueAdapter.QueueSongViewHolder if (shouldLift && isCurrentlyActive && actionState == ItemTouchHelper.ACTION_STATE_DRAG) { diff --git a/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt index 44b8056d3..5ca64eacc 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt @@ -22,6 +22,7 @@ import android.content.res.ColorStateList import android.graphics.Insets import android.graphics.Rect import android.os.Build +import android.view.View import android.view.WindowInsets import androidx.annotation.ColorRes import androidx.recyclerview.widget.GridLayoutManager @@ -62,6 +63,18 @@ fun RecyclerView.applySpans(shouldBeFullWidth: ((Int) -> Boolean)? = null) { */ fun RecyclerView.canScroll(): Boolean = computeVerticalScrollRange() > height +/** + * Disables drop shadows on a view programmatically in a version-compatible manner. + * This only works on Android 9 and above. Below that version, shadows will remain visible. + */ +fun View.disableDropShadowCompat() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val transparent = context.getColorSafe(android.R.color.transparent) + outlineAmbientShadowColor = transparent + outlineSpotShadowColor = transparent + } +} + /** * Resolve system bar insets in a version-aware manner. This can be used to apply padding to * a view that properly follows all the frustrating changes that were made between 8-11.