main: simplify speed dial management
This commit is contained in:
parent
7d8efce28b
commit
b020285e9f
4 changed files with 37 additions and 80 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -77,6 +77,11 @@
|
||||||
android:focusable="true"
|
android:focusable="true"
|
||||||
app:layout_behavior="org.oxycblt.auxio.playback.PlaybackBottomSheetBehavior">
|
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
|
<androidx.fragment.app.FragmentContainerView
|
||||||
android:id="@+id/playback_bar_fragment"
|
android:id="@+id/playback_bar_fragment"
|
||||||
android:name="org.oxycblt.auxio.playback.PlaybackBarFragment"
|
android:name="org.oxycblt.auxio.playback.PlaybackBarFragment"
|
||||||
|
@ -124,14 +129,15 @@
|
||||||
android:layout_weight="1" />
|
android:layout_weight="1" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
|
||||||
<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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue