home: clean up hacky overlay impl
Should have a lesser likelihood of crashing outright, hopefully.
This commit is contained in:
parent
c4143e7d95
commit
cdd08e7f99
2 changed files with 31 additions and 24 deletions
|
@ -25,6 +25,7 @@ import android.view.WindowInsets
|
|||
import androidx.activity.OnBackPressedCallback
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.isInvisible
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.view.updatePadding
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.navigation.findNavController
|
||||
|
@ -33,7 +34,9 @@ import com.google.android.material.R as MR
|
|||
import com.google.android.material.bottomsheet.BackportBottomSheetBehavior
|
||||
import com.google.android.material.shape.MaterialShapeDrawable
|
||||
import com.google.android.material.transition.MaterialFadeThrough
|
||||
import com.leinardi.android.speeddial.SpeedDialOverlayLayout
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import java.lang.reflect.Field
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import org.oxycblt.auxio.databinding.FragmentMainBinding
|
||||
|
@ -56,6 +59,7 @@ 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.lazyReflectedField
|
||||
import org.oxycblt.auxio.util.logD
|
||||
import org.oxycblt.auxio.util.navigateSafe
|
||||
import org.oxycblt.auxio.util.systemBarInsetsCompat
|
||||
|
@ -153,6 +157,9 @@ class MainFragment :
|
|||
}
|
||||
}
|
||||
|
||||
binding.mainScrim.setOnClickListener { homeModel.setSpeedDialOpen(false) }
|
||||
binding.sheetScrim.setOnClickListener { homeModel.setSpeedDialOpen(false) }
|
||||
|
||||
// --- VIEWMODEL SETUP ---
|
||||
// This has to be done here instead of the playback panel to make sure that it's prioritized
|
||||
// by StateFlow over any detail fragment.
|
||||
|
@ -161,7 +168,7 @@ class MainFragment :
|
|||
collect(detailModel.toShow.flow, ::handleShow)
|
||||
collectImmediately(detailModel.editedPlaylist, detailBackCallback::invalidateEnabled)
|
||||
collectImmediately(homeModel.showOuter.flow, ::handleShowOuter)
|
||||
collectImmediately(homeModel.speedDialOpen, speedDialBackCallback::invalidateEnabled)
|
||||
collectImmediately(homeModel.speedDialOpen, ::handleSpeedDialState)
|
||||
collectImmediately(listModel.selected, selectionBackCallback::invalidateEnabled)
|
||||
collectImmediately(playbackModel.song, ::updateSong)
|
||||
collectImmediately(playbackModel.openPanel.flow, ::handlePanel)
|
||||
|
@ -336,6 +343,13 @@ class MainFragment :
|
|||
homeModel.showOuter.consume()
|
||||
}
|
||||
|
||||
private fun handleSpeedDialState(open: Boolean) {
|
||||
requireNotNull(speedDialBackCallback) { "SpeedDialBackPressedCallback was not available" }
|
||||
.invalidateEnabled(open)
|
||||
requireBinding().mainScrim.isVisible = open
|
||||
requireBinding().sheetScrim.isVisible = open
|
||||
}
|
||||
|
||||
private fun updateSong(song: Song?) {
|
||||
if (song != null) {
|
||||
tryShowSheets()
|
||||
|
@ -519,4 +533,9 @@ class MainFragment :
|
|||
isEnabled = open
|
||||
}
|
||||
}
|
||||
|
||||
private companion object {
|
||||
val SPEED_DIAL_OVERLAY_ANIMATION_DURATION_FIELD: Field by
|
||||
lazyReflectedField(SpeedDialOverlayLayout::class, "mAnimationDuration")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
package org.oxycblt.auxio.home
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.MenuItem
|
||||
|
@ -124,6 +125,7 @@ class HomeFragment :
|
|||
|
||||
override fun getSelectionToolbar(binding: FragmentHomeBinding) = binding.homeSelectionToolbar
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
override fun onBindingCreated(binding: FragmentHomeBinding, savedInstanceState: Bundle?) {
|
||||
super.onBindingCreated(binding, savedInstanceState)
|
||||
|
||||
|
@ -146,25 +148,18 @@ class HomeFragment :
|
|||
|
||||
// --- UI SETUP ---
|
||||
|
||||
binding.root.rootView.apply {
|
||||
// Stock bottom sheet overlay won't work with our nested UI setup, have to replicate
|
||||
// it ourselves.
|
||||
findViewById<View>(R.id.main_scrim).setOnClickListener {
|
||||
homeModel.setSpeedDialOpen(false)
|
||||
}
|
||||
|
||||
binding.root.rootView.apply {
|
||||
post {
|
||||
findViewById<View>(R.id.main_scrim).setOnTouchListener { _, event ->
|
||||
handleSpeedDialBoundaryTouch(event)
|
||||
}
|
||||
|
||||
findViewById<View>(R.id.sheet_scrim).setOnClickListener {
|
||||
homeModel.setSpeedDialOpen(false)
|
||||
}
|
||||
|
||||
findViewById<View>(R.id.sheet_scrim).setOnTouchListener { _, event ->
|
||||
handleSpeedDialBoundaryTouch(event)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
binding.homeAppbar.addOnOffsetChangedListener(this)
|
||||
binding.homeNormalToolbar.apply {
|
||||
|
@ -616,13 +611,6 @@ class HomeFragment :
|
|||
private fun updateSpeedDial(open: Boolean) {
|
||||
val binding = requireBinding()
|
||||
|
||||
binding.root.rootView.apply {
|
||||
// Stock bottom sheet overlay won't work with our nested UI setup, have to replicate
|
||||
// it ourselves.
|
||||
findViewById<View>(R.id.main_scrim).isClickable = open
|
||||
findViewById<View>(R.id.sheet_scrim).isClickable = open
|
||||
}
|
||||
|
||||
if (open) {
|
||||
binding.homeNewPlaylistFab.open(true)
|
||||
} else {
|
||||
|
|
Loading…
Reference in a new issue