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 package org.oxycblt.auxio
import android.animation.ValueAnimator
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewTreeObserver import android.view.ViewTreeObserver
import android.view.WindowInsets import android.view.WindowInsets
import androidx.activity.BackEventCompat import androidx.activity.BackEventCompat
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.isInvisible import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.navigation.fragment.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.coordinatorLayoutBehavior
import org.oxycblt.auxio.util.getAttrColorCompat import org.oxycblt.auxio.util.getAttrColorCompat
import org.oxycblt.auxio.util.getDimen import org.oxycblt.auxio.util.getDimen
import org.oxycblt.auxio.util.isUnder
import org.oxycblt.auxio.util.lazyReflectedMethod import org.oxycblt.auxio.util.lazyReflectedMethod
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.navigateSafe import org.oxycblt.auxio.util.navigateSafe
@ -232,19 +229,6 @@ class MainFragment :
addCallback(viewLifecycleOwner, requireNotNull(detailBackCallback)) addCallback(viewLifecycleOwner, requireNotNull(detailBackCallback))
addCallback(viewLifecycleOwner, requireNotNull(sheetBackCallback)) 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() { override fun onStop() {
@ -522,49 +506,14 @@ class MainFragment :
} }
} }
private var scrimAnimator: ValueAnimator? = null
private fun updateSpeedDial(open: Boolean) { private fun updateSpeedDial(open: Boolean) {
requireNotNull(speedDialBackCallback) { "SpeedDialBackPressedCallback was not available" } requireNotNull(speedDialBackCallback) { "SpeedDialBackPressedCallback was not available" }
.invalidateEnabled(open) .invalidateEnabled(open)
val binding = requireBinding() val binding = requireBinding()
logD(open) binding.mainScrim.isInvisible = !open
binding.mainScrim.isVisible = open binding.sheetScrim.isInvisible = !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
} }
private fun handleShow(show: Show?) { 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() { override fun handleOnBackPressed() {
val binding = requireBinding() val binding = requireBinding()
if (binding.homeNewPlaylistFab.isOpen) { if (binding.homeNewPlaylistFab.isOpen) {

View file

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

View file

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

View file

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