main: simplify speed dial management

This commit is contained in:
Alexander Capehart 2024-07-22 19:06:39 -06:00
parent 7d8efce28b
commit b020285e9f
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
4 changed files with 37 additions and 80 deletions

View file

@ -18,17 +18,15 @@
package org.oxycblt.auxio
import android.animation.ValueAnimator
import android.os.Bundle
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewTreeObserver
import android.view.WindowInsets
import androidx.activity.BackEventCompat
import androidx.activity.OnBackPressedCallback
import androidx.core.view.ViewCompat
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
@ -67,7 +65,6 @@ import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.coordinatorLayoutBehavior
import org.oxycblt.auxio.util.getAttrColorCompat
import org.oxycblt.auxio.util.getDimen
import org.oxycblt.auxio.util.isUnder
import org.oxycblt.auxio.util.lazyReflectedMethod
import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.navigateSafe
@ -232,19 +229,6 @@ class MainFragment :
addCallback(viewLifecycleOwner, requireNotNull(detailBackCallback))
addCallback(viewLifecycleOwner, requireNotNull(sheetBackCallback))
}
// Stock bottom sheet overlay won't work with our nested UI setup, have to replicate
// it ourselves.
requireBinding().root.rootView.apply {
findViewById<View>(R.id.main_scrim).setOnTouchListener { v, event ->
v.performClick()
handleSpeedDialBoundaryTouch(event)
}
findViewById<View>(R.id.sheet_scrim).setOnTouchListener { v, event ->
v.performClick()
handleSpeedDialBoundaryTouch(event)
}
}
}
override fun onStop() {
@ -522,49 +506,14 @@ class MainFragment :
}
}
private var scrimAnimator: ValueAnimator? = null
private fun updateSpeedDial(open: Boolean) {
requireNotNull(speedDialBackCallback) { "SpeedDialBackPressedCallback was not available" }
.invalidateEnabled(open)
val binding = requireBinding()
logD(open)
binding.mainScrim.isVisible = open
binding.sheetScrim.isVisible = open
if (open) {
binding.homeNewPlaylistFab.open(true)
} else {
binding.homeNewPlaylistFab.close(true)
}
}
private fun handleSpeedDialBoundaryTouch(event: MotionEvent): Boolean {
val binding = binding ?: return false
if (binding.homeNewPlaylistFab.isOpen &&
binding.homeNewPlaylistFab.isUnder(event.x, event.y)) {
// Convert absolute coordinates to relative coordinates
val offsetX = event.x - binding.homeNewPlaylistFab.x
val offsetY = event.y - binding.homeNewPlaylistFab.y
// Create a new MotionEvent with relative coordinates
val relativeEvent =
MotionEvent.obtain(
event.downTime,
event.eventTime,
event.action,
offsetX,
offsetY,
event.metaState)
// Dispatch the relative MotionEvent to the target child view
val handled = binding.homeNewPlaylistFab.dispatchTouchEvent(relativeEvent)
// Recycle the relative MotionEvent
relativeEvent.recycle()
return handled
}
return false
binding.mainScrim.isInvisible = !open
binding.sheetScrim.isInvisible = !open
}
private fun handleShow(show: Show?) {
@ -793,7 +742,7 @@ class MainFragment :
}
}
private inner class SpeedDialBackPressedCallback() : OnBackPressedCallback(false) {
private inner class SpeedDialBackPressedCallback : OnBackPressedCallback(false) {
override fun handleOnBackPressed() {
val binding = requireBinding()
if (binding.homeNewPlaylistFab.isOpen) {

View file

@ -85,7 +85,7 @@ class ThemedSpeedDialView : SpeedDialView {
context, MR.attr.motionEasingStandardInterpolator, FastOutSlowInInterpolator())
private val matDuration =
MotionUtils.resolveThemeDuration(context, MR.attr.motionDurationMedium2, 300)
MotionUtils.resolveThemeDuration(context, MR.attr.motionDurationMedium2, 350)
init {
// Work around ripple bug on Android 12 when useCompatPadding = true.

View file

@ -77,6 +77,11 @@
android:focusable="true"
app:layout_behavior="org.oxycblt.auxio.playback.PlaybackBottomSheetBehavior">
<FrameLayout
android:id="@+id/playback_panels"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/playback_bar_fragment"
android:name="org.oxycblt.auxio.playback.PlaybackBarFragment"
@ -124,14 +129,15 @@
android:layout_weight="1" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
<View
android:id="@+id/sheet_scrim"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -22,6 +22,12 @@
app:navGraph="@navigation/inner"
tools:layout="@layout/fragment_home" />
<View
android:id="@+id/main_scrim"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="invisible" />
<org.oxycblt.auxio.home.EdgeFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -56,11 +62,6 @@
</FrameLayout>
<View
android:id="@+id/main_scrim"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<View
android:id="@+id/main_sheet_scrim"
android:layout_width="match_parent"
@ -137,7 +138,8 @@
<View
android:id="@+id/sheet_scrim"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"
android:visibility="invisible" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>